# 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/.packages: |
      foo:.
  foo2:
    foo2/foo.dart: |
      // @dart=2.9
      var foo2 = true;
    foo2/.packages: |
      foo:.
worlds:
  - entry: main.dart
    fromComponent: true
    simulateTransformer: true
    sources:
      main.dart: |
        // @dart=2.9
        import "package:foo/foo.dart";
        main() {
          print(foo);
        }
      .packages: |
        foo: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);
        }
      .packages: |
        foo: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
