# 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 a number of modules.
# Compile again with changing modules.

type: newworld
modules:
  foo:
    foo/foo.dart: |
      // @dart=2.9
      var foo = true;
    foo/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "foo",
            "rootUri": ".."
          }
        ]
      }
  foo2:
    foo2/foo.dart: |
      // @dart=2.9
      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: |
        // @dart=2.9
        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
  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    simulateTransformer: true
    sources:
      main.dart: |
        // @dart=2.9
        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
