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

// Test that generic types in mixins are handled.

import 'package:expect/expect.dart';

class M<T> {
  T field = 0; /// 01: static type warning
}
class A<U> {}
class C1<V> = Object with M<V>;
class C2 = Object with M<int>;
class C3 = Object with M<String>;

main() {
  checkNoDynamicTypeError(() => new C1<int>());  /// 01: continued
  checkDynamicTypeError(() => new C1<String>()); /// 01: continued

  checkNoDynamicTypeError(() => new C2());       /// 01: continued

  checkDynamicTypeError(() => new C3());         /// 01: continued
}

/// Returns `true` if the program is running in checked mode.
bool inCheckedMode() {
  try {
    var i = 42;
    String s = i;
  } on TypeError catch (e) {
    return true;
  }
  return false;
}

/// Checks that a dynamic type error is thrown if and only if [f] is executed in
/// checked mode.
void checkDynamicTypeError(f(), [String message]) {
  message = message != null ? ': $message' : '';
  try {
    f();
    Expect.isFalse(inCheckedMode(),
      'Missing type error in checked mode$message.');
  } on TypeError catch (e) {
    Expect.isTrue(inCheckedMode(),
      'Unexpected type error in production mode.');
  }
}

/// Checks that no dynamic type error is thrown when [f] is executed regardless
/// of execution mode.
void checkNoDynamicTypeError(f(), [String message]) {
  message = message != null ? ': $message' : '';
  try {
    f();
  } on TypeError catch (e) {
    String mode = inCheckedMode() ? 'checked mode' : 'production mode';
    Expect.fail('Unexpected type error in $mode$message.');
  }
}
