// Copyright (c) 2014, 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';
import 'package:async_helper/async_helper.dart';

import "deferred_constraints_lib.dart" deferred as lib;
import "deferred_constraints_lib.dart" as lib2; //# type_annotation_non_deferred: ok

class F {}

class G2<T> {}

main() {
  lib.C a = null; //# type_annotation_null: compile-time error
  Expect.throws(() { //# new_before_load: compile-time error
    lib.C a = new lib.C(); //# new_before_load: continued
  }, (e) => e is Error); //# new_before_load: continued

  // In this case we do not defer C.
  lib2.C a1 = new lib2.C(); //# type_annotation_non_deferred: continued
  asyncStart();
  lib.loadLibrary().then((_) {
    lib.C a2 = new lib.C(); //# type_annotation1: dynamic type error, compile-time error
    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: dynamic type error, compile-time error
    G2<lib.C> a4 = new G2(); //# type_annotation_generic2: compile-time error
    G2<lib.C> a5 = new G2<lib.C>(); //# type_annotation_generic3: compile-time error
    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: dynamic type error, compile-time error
    var a6 = new lib.C(); //# new: ok
    var g1 = new lib.G<F>(); //# new_generic1: ok
    // new G2<lib.C>() does not give a dynamic type error because a malformed
    // type used as type-parameter is treated as dynamic.
    var g2 = new G2<lib.C>(); //# new_generic2: compile-time error
    var g3 = new lib.G<lib.C>(); //# new_generic3: compile-time error
    var instance = lib.constantInstance;
    Expect.throwsTypeError(() { //# is_check: compile-time error
      bool a7 = instance is lib.Const; //# is_check: continued
    }); //# is_check: continued
    Expect.throwsTypeError(() { //# as_operation: compile-time error
      instance as lib.Const; //# as_operation: continued
    }); //# as_operation: continued
    Expect.throwsTypeError(() { //# catch_check: compile-time error
      try { throw instance; } on lib.Const {} //# catch_check: continued
    }); //# catch_check: continued
    int i = lib.C.staticMethod(); //# static_method: ok
    asyncEnd();
  });
}

lib.C a9 = null; //# type_annotation_top_level: compile-time error
