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

// Test that type checks give consistent errors for the same types. In minified
// mode this checks that the minified class names are consistently tagged.

import 'package:expect/expect.dart';

class Plain {}

class Foo<U> {}

class Test<T> {
  @pragma('dart2js:noInline')
  asT(o) => o as T;

  @pragma('dart2js:noInline')
  asFooT(o) => o as Foo<T>;

  @pragma('dart2js:noInline')
  testT(o) {
    T result = o;
  }

  @pragma('dart2js:noInline')
  testFooT(o) {
    Foo<T> result = o;
  }
}

capture(action()) {
  try {
    action();
  } catch (e) {
    print('$e');
    return '$e';
  }
  Expect.fail('Action should have failed');
}

dynamic g;

casts() {
  g = Foo<String>();

  Expect.equals(
    capture(() => Test<Foo<Plain>>().asT(g)),
    capture(() => g as Foo<Plain>),
    "C1",
  );

  Expect.equals(
    capture(() => g as Foo<Plain>),
    capture(() => Test<Plain>().asFooT(g)),
    "C2",
  );

  Expect.equals(
    capture(() => Test<Plain>().asT(g)),
    capture(() => g as Plain),
    "C3",
  );

  g = Foo<Plain>();

  Expect.equals(
    capture(() => Test<Foo<String>>().asT(g)),
    capture(() => g as Foo<String>),
    "C4",
  );

  Expect.equals(
    capture(() => g as Foo<String>),
    capture(() => Test<String>().asFooT(g)),
    "C5",
  );

  g = Plain();

  Expect.equals(
    capture(() => Test<String>().asT(g)),
    capture(() => g as String),
    "C6",
  );

  Expect.equals(
    capture(() => Test<int>().asT(g)),
    capture(() => g as int),
    "C7",
  );

  Expect.equals(
    capture(() => Test<double>().asT(g)),
    capture(() => g as double),
    "C8",
  );

  Expect.equals(
    capture(() => Test<bool>().asT(g)),
    capture(() => g as bool),
    "C9",
  );

  Expect.equals(
    capture(() => Test<List>().asT(g)),
    capture(() => g as List),
    "C10",
  );
}

tests() {
  g = Foo<String>();

  Expect.equals(
    capture(() => Test<Foo<Plain>>().testT(g)),
    capture(() {
      Foo<Plain> x = g;
    }),
    "T1",
  );

  Expect.equals(
    capture(() {
      Foo<Plain> x = g;
    }),
    capture(() => Test<Plain>().testFooT(g)),
    "T2",
  );

  Expect.equals(
    capture(() => Test<Plain>().testT(g)),
    capture(() {
      Plain x = g;
    }),
    "T3",
  );

  g = Foo<Plain>();

  Expect.equals(
    capture(() => Test<Foo<String>>().testT(g)),
    capture(() {
      Foo<String> x = g;
    }),
    "T4",
  );

  Expect.equals(
    capture(() {
      Foo<String> x = g;
    }),
    capture(() => Test<String>().testFooT(g)),
    "T5",
  );

  g = Plain();

  Expect.equals(
    capture(() => Test<String>().testT(g)),
    capture(() {
      String x = g;
    }),
    "T6",
  );

  Expect.equals(
    capture(() => Test<int>().testT(g)),
    capture(() {
      int x = g;
    }),
    "T7",
  );

  Expect.equals(
    capture(() => Test<double>().testT(g)),
    capture(() {
      double x = g;
    }),
    "T8",
  );

  Expect.equals(
    capture(() => Test<bool>().testT(g)),
    capture(() {
      bool x = g;
    }),
    "T9",
  );

  Expect.equals(
    capture(() => Test<List>().testT(g)),
    capture(() {
      List x = g;
    }),
    "T10",
  );
}

main() {
  casts();
  tests();
}
