// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class NullAccessTest {

  static void testNullVariable() {
    int variable;
    bool exceptionCaught = false;
    bool wrongExceptionCaught = false;
    try {
      variable++;
    } on NoSuchMethodError catch (ex) {
      exceptionCaught = true;
    } catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.isTrue(exceptionCaught);
    Expect.isFalse(wrongExceptionCaught);
  }

  static int helperFunction(int parameter) {
    return parameter++;
  }

  static void testNullFunctionCall() {
    int variable;
    bool exceptionCaught = false;
    bool wrongExceptionCaught = false;
    try {
      variable = helperFunction(variable);
    } on NoSuchMethodError catch (ex) {
      exceptionCaught = true;
    } catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.isTrue(exceptionCaught);
    Expect.isFalse(wrongExceptionCaught);
  }

  static void testMain() {
    testNullVariable();
    testNullFunctionCall();
  }
}

main() {
  NullAccessTest.testMain();
}
