# 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
strong: false
worlds:
  - entry: main.dart
    errors: true
    warnings: false
    sources:
      main.dart: |
        library mainLibrary;
        import "b.dart" as b;

        main() {
          b.foo();
        }
      b.dart: |
        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: |
        library mainLibrary;

        main() {
          print("hello");
        }
      b.dart: |
        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