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

# Compile an application with a number of modules.
# Compile again with changing modules.

type: newworld
modules:
  foo:
    foo/foo.dart: |
      var foo = true;
    foo/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "foo",
            "rootUri": ".."
          }
        ]
      }
  foo2:
    foo2/foo.dart: |
      var foo2 = true;
    foo2/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "foo",
            "rootUri": ".."
          }
        ]
      }
worlds:
  - entry: main.dart
    fromComponent: true
    simulateTransformer: true
    sources:
      main.dart: |
        import "package:foo/foo.dart";
        main() {
          print(foo);
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "foo",
              "rootUri": "../foo"
            }
          ]
        }
    modules:
      - foo
    expectedLibraryCount: 2
    expectedContent:
      org-dartlang-test:///main.dart:
        - Procedure main
        - Field unique_SimulateTransformer
      package:foo/foo.dart:
        - Field foo
        - Field unique_SimulateTransformer
    neededDillLibraries:
      - package:foo/foo.dart
    advancedInvalidation: modulesToLoad
  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    simulateTransformer: true
    sources:
      main.dart: |
        import "package:foo/foo.dart";
        main() {
          print(foo2);
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "foo",
              "rootUri": "../foo2"
            }
          ]
        }
    modules:
      - foo2
    expectedLibraryCount: 2
    neededDillLibraries:
      - package:foo/foo.dart
    expectedContent:
      org-dartlang-test:///main.dart:
        - Procedure main
        - Field unique_SimulateTransformer
      package:foo/foo.dart:
        - Field foo2
        - Field unique_SimulateTransformer
    advancedInvalidation: modulesToLoad
