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

# Compile an application that's fine.
# Invalidate a file that's been updated and fine (and would pull in another
# library). Also invalidate another file that's been updated to produce a
# compile time error.
# Update again, fixing the error.
# The invalidation of the good file should still apply, i.e. the new library
# that it pulled in should be included.

type: newworld
strong: false
worlds:
  - entry: main.dart
    sources:
      main.dart: |
        import "b.dart";
        main() {
          print("hello");
          b();
        }
      b.dart: |
        b() {
          print("hello from b");
        }
      c.dart: |
        c() {
          print("hello from c");
        }
    expectedLibraryCount: 2
  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    checkInvalidatedFiles: false
    invalidate:
      - b.dart
      - main.dart
    sources:
      main.dart: |
        import "b.dart";
        import "nonexistin.dart";
        main() {
          print("hello");
          b();
        }
      b.dart: |
        import "c.dart";
        b() {
          print("hello from b");
          c();
        }
    errors: true
    expectedLibraryCount: 1
  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    checkInvalidatedFiles: false
    invalidate:
      - main.dart
    sources:
      main.dart: |
        import "b.dart";
        main() {
          print("hello");
          b();
        }
    expectedLibraryCount: 3