// Copyright (c) 2021, 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 "../utils.dart";
import "lib_a.dart" as libA;
import "lib_b.dart" as libB;

void main() {
  // When the name of the class is the same the error message should include
  // library URIs for the two classes.
  var a = libA.Animal();
  try {
    a as libB.Animal;
  } on TypeError catch (error) {
    var message = error.toString();
    expectStringContains(
        "Expected a value of type 'Animal' "
        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
        message);
    expectStringContains(
        "but got one of type 'Animal' "
        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
        message);
  }
  // Verify the libraries are properly ordered.
  var b = libB.Animal();
  try {
    b as libA.Animal;
  } on TypeError catch (error) {
    var message = error.toString();
    expectStringContains(
        "Expected a value of type 'Animal' "
        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
        message);
    expectStringContains(
        "but got one of type 'Animal' "
        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
        message);
  }

  // Shows library URIs when one of the types is nullable.
  try {
    b as libA.Animal?;
  } on TypeError catch (error) {
    var message = error.toString();
    expectStringContains(
        "Expected a value of type 'Animal?' "
        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_a.dart)",
        message);
    expectStringContains(
        "but got one of type 'Animal' "
        "(in org-dartlang-app:/tests/dartdevc/cast_error/lib_b.dart)",
        message);
  }

  // URIs are not displayed when the class names are different.
  try {
    a as String;
  } on TypeError catch (error) {
    var message = error.toString();
    expectStringContains(
        "Expected a value of type 'String', but got one of type 'Animal'",
        message);
  }
}
