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

// @dart = 2.9

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();
}
