// 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.

import "package:expect/expect.dart";

// Tests that we can call functions through getters which return null.

const dynamic TOP_LEVEL_NULL = null;

var topLevel;

class CallThroughNullGetterTest {
  static void testMain() {
    testTopLevel();
    testField();
    testGetter();
    testMethod();
  }

  static void testTopLevel() {
    topLevel = null;
    Expect.throwsNoSuchMethodError(() => topLevel());
    Expect.throwsNoSuchMethodError(() => (topLevel)());
    Expect.throwsNoSuchMethodError(() => TOP_LEVEL_NULL());
    Expect.throwsNoSuchMethodError(() => (TOP_LEVEL_NULL)());
  }

  static void testField() {
    A a = new A();

    a.field = null;
    Expect.throwsNoSuchMethodError(() => a.field());
    Expect.throwsNoSuchMethodError(() => (a.field)());
  }

  static void testGetter() {
    A a = new A();

    a.field = null;
    Expect.throwsNoSuchMethodError(() => a.getter());
    Expect.throwsNoSuchMethodError(() => (a.getter)());
  }

  static void testMethod() {
    A a = new A();

    a.field = null;
    Expect.throwsNoSuchMethodError(() => a.method()());
  }
}

class A {
  A() {}
  var field;
  get getter {
    return field;
  }

  method() {
    return field;
  }
}

main() {
  CallThroughNullGetterTest.testMain();
}
