// Copyright (c) 2012, 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.

// When attempting to call a nonexistent static method, getter or setter, check
// that a NoSuchMethodError is thrown.

class C {}

class D {
  get hest => 1;  /// 04: continued
  set hest(val) {}  /// 05: continued
}

get fisk => 2; /// 09: continued
set fisk(val) {} /// 10: continued

expectNsme([void fun()]) {
  if (fun != null) {
    Expect.throws(fun, (e) => e is NoSuchMethodError);
  }
}

alwaysThrows() {
  throw new NoSuchMethodError(null, 'foo', [], {});
}

test01() {
  C.hest = 1;  /// 01: static type warning
}

test02() {
  C.hest;  /// 02: static type warning
}

test03() {
  C.hest();  /// 03: static type warning
}

test04() {
  D.hest = 1;  /// 04: static type warning
}

test05() {
  D.hest;  /// 05: static type warning
}

test06() {
  fisk = 1;  /// 06: static type warning
}

test07() {
  fisk;  /// 07: static type warning
}

test08() {
  fisk();  /// 08: static type warning
}

test09() {
  fisk = 1;  /// 09: static type warning
}

test10() {
  fisk;  /// 10: static type warning
}

main() {
  expectNsme(alwaysThrows);
  expectNsme(
    test01  /// 01: continued
  );
  expectNsme(
    test02  /// 02: continued
  );
  expectNsme(
    test03  /// 03: continued
  );
  expectNsme(
    test04  /// 04: continued
  );
  expectNsme(
    test05  /// 05: continued
  );
  expectNsme(
    test06  /// 06: continued
  );
  expectNsme(
    test07  /// 07: continued
  );
  expectNsme(
    test08  /// 08: continued
  );
  expectNsme(
    test09  /// 09: continued
  );
  expectNsme(
    test10  /// 10: continued
  );
}
