# 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 with a package and use it.
# Then update the package from .dart_tool/package_config.json but change nothing
# else and call computeDelta on the same compiler.
# The output should not include the old package.

type: newworld
worlds:
  - entry: main.dart
    sources:
      main.dart: |
        // @dart=2.9
        import "package:example/b.dart";
        main() {
          print("hello");
          b();
        }
      package_0.1.0/a.dart: |
        // @dart=2.9
        a() {
          la1();
        }
        la1() {
          print("v0.1.0");
        }
      package_0.1.0/b.dart: |
        // @dart=2.9
        import "a.dart";
        b() {
          a();
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "example",
              "rootUri": "../package_0.1.0"
            }
          ]
        }
    expectedLibraryCount: 3
  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    checkInvalidatedFiles: false
    invalidate:
      - .packages
    sources:
      package_0.1.1/b.dart: |
        // @dart=2.9
        b() {
          print("hello from v0.1.1");
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "example",
              "rootUri": "../package_0.1.1"
            }
          ]
        }
    expectedLibraryCount: 2
