# 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.md file.

# First compile a file (a) that imports a file (b) with errors in it.
# Then change a to not import b, but leave b as-is, thus rightfully only
# invalidating a. Compiling this should not result in any errors.

type: newworld
worlds:
  - entry: main.dart
    errors: true
    warnings: false
    sources:
      main.dart: |
        // @dart=2.9
        library mainLibrary;
        import "b.dart" as b;

        main() {
          b.foo();
        }
      b.dart: |
        // @dart=2.9
        library bLibrary;

        foo() {
          print("hello from b.dart foo!");
          print(new C());
        }

        class I<T> {}

        class A implements I<int> {}

        class B implements I<String> {}

        class C extends A implements B {}

    expectedLibraryCount: 2
  - entry: main.dart
    invalidate:
      - main.dart
    errors: false
    warnings: false
    sources:
      main.dart: |
        // @dart=2.9
        library mainLibrary;

        main() {
          print("hello");
        }
      b.dart: |
        // @dart=2.9
        library bLibrary;

        foo() {
          print("hello from b.dart foo!");
          print(new C());
        }

        class I<T> {}

        class A implements I<int> {}

        class B implements I<String> {}

        class C extends A implements B {}
    expectedLibraryCount: 1