/*
 * 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.
 */
/**
 * @assertion Type dynamic has properties for every possible identifier. These
 * properties all have type dynamic.
 * @description Checks that accessing properties with all sort of names on a
 * dynamic variable and assigning the results (in case of getters) to local
 * variables of various types does not produce any static type warnings.
 * @static-clean
 * @issue #27495
 * @author iefremov
 */
import "../../../Utils/expect.dart";

typedef func();
typedef int func2(int x);

main() {
  dynamic x = null;
  try {
    String y = x.thebullshour;
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}

  try {
    int i = x.thaisofathens;
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}

  try {
    func f = x.razorsedge;
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}

  try {
    func2 f2 = x.andromeda;
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}

  try {
    x.thebullshour = "asfasf";
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}

  try {
    x.thaisofathens = 1;
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}

  try {
    x.razorsedge = () {};
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}

  try {
    x.andromeda = (int a) => (a * a);
    Expect.fail("NoSuchMethodError expected");
  } on NoSuchMethodError {}
}
