# Copyright (c) 2019, 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.

# Compile an application with errors in it, then - without fixing the errors -
# recompile. Make sure we still get errors. As long as we don't fix the error,
# we keep getting errors. Once we fix it, we no longer get errors.

type: newworld
strong: true
worlds:
  - entry: main.dart
    sources:
      .packages: mypackage:mypackage
      main.dart: |
        import "package:mypackage/a.dart";
      mypackage/a.dart: |
        import "package:mypackage/b.dart";

        class Foo<T> {}
        class Bar<T> extends Foo<T> {}
      mypackage/b.dart: |
        import "package:mypackage/a.dart";
        part "package:mypackage/c.dart";
      mypackage/c.dart: |
        part of "package:mypackage/b.dart";

        class Baz extends Bar<int> implements Foo<String> {}
    expectedLibraryCount: 3
    errors: true
  - entry: main.dart
    errors: true
    worldType: updated
    expectInitializeFromDill: false
    expectedLibraryCount: 3
  - entry: main.dart
    sources:
      .packages: mypackage:mypackage
      main.dart: |
        import "package:mypackage/a.dart";
      mypackage/a.dart: |
        import "package:mypackage/b.dart";

        class Foo<T> {}
        class Bar<T> extends Foo<T> {}
      mypackage/b.dart: |
        import "package:mypackage/a.dart";
        part "package:mypackage/c.dart";
      mypackage/c.dart: |
        part of "package:mypackage/b.dart";

        class Baz extends Bar<int> implements Foo<String> {}
    expectedLibraryCount: 3
    errors: true
  - entry: main.dart
    errors: true
    worldType: updated
    invalidate:
      - main.dart
    expectedLibraryCount: 3
  - entry: main.dart
    errors: false
    worldType: updated
    invalidate:
      - mypackage/c.dart
    sources:
      mypackage/b.dart: |
        import "package:mypackage/a.dart";
        part "package:mypackage/c.dart";
      mypackage/c.dart: |
        part of "package:mypackage/b.dart";

        class Baz extends Bar<int> {}
    expectedLibraryCount: 3
