# 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:
  example_0.1.0:
    example_0.1.0/a.dart: |
      // @dart=2.9
      a() {
        la1();
      }
      la1() {
        print("Hello from v0.1.0");
      }
    example_0.1.0/b.dart: |
      // @dart=2.9
      import "a.dart";
      b() {
        a();
      }
    example_0.1.0/.packages: |
      example:.
  example_0.1.1:
    example_0.1.1/b.dart: |
      // @dart=2.9
      b() {
        print("Hello from v0.1.1");
      }
      bool example011 = true;
    example_0.1.1/.packages: |
      example:.
  foo_1:
    foo_1/foo.dart: |
      // @dart=2.9
      import "package:example/b.dart";
      foo() {
        print("Hello from foo");
        b();
      }
      bool foo1 = true;
    foo_1/.packages: |
      foo:.
      example:../example_0.1.0
  foo_2:
    foo_2/foo.dart: |
      // @dart=2.9
      import "package:example/b.dart";
      import "bar.dart";
      import "baz.dart";
      foo() {
        print("Hello from foo 2");
        bar();
        baz();
        b();
      }
      bool foo2 = true;
    foo_2/bar.dart: |
      // @dart=2.9
      bar() {
        print("hello from bar");
      }
    foo_2/baz.dart: |
      // @dart=2.9
      baz() {
        print("hello from baz");
      }
    foo_2/.packages: |
      foo:.
      example:../example_0.1.1
worlds:
  - entry: main.dart
    fromComponent: true
    sources:
      main.dart: |
        // @dart=2.9
        import "package:example/b.dart";
        main() {
          print("hello");
          b();
        }
      .packages: example:example_0.1.0
    modules:
      - example_0.1.0
    expectedLibraryCount: 3
    neededDillLibraries:
      # Needs 'b.dart' only!
      - package:example/b.dart
    expectedContent:
      org-dartlang-test:///main.dart:
        - Procedure main
      package:example/b.dart:
        - Procedure b
      package:example/a.dart:
        - Procedure a
        - Procedure la1
  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    sources:
      main.dart: |
        // @dart=2.9
        import "package:foo/foo.dart";
        main() {
          print("hello");
          foo();
        }
      .packages: |
        example:example_0.1.0
        foo:foo_1
    modules:
      - example_0.1.0
      - foo_1
    expectedLibraryCount: 4
    neededDillLibraries:
      - package:foo/foo.dart
    expectedContent:
      org-dartlang-test:///main.dart:
        - Procedure main
      package:example/b.dart:
        - Procedure b
      package:example/a.dart:
        - Procedure a
        - Procedure la1
      package:foo/foo.dart:
        - Procedure foo
        - Field foo1
  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    sources:
      main.dart: |
        // @dart=2.9
        import "package:foo/foo.dart";
        main() {
          print("hello");
          foo();
        }
      .packages: |
        example:example_0.1.1
        foo:foo_2
    modules:
      - example_0.1.1
      - foo_2
    expectedLibraryCount: 5
    neededDillLibraries:
      - package:foo/foo.dart
    expectedContent:
      org-dartlang-test:///main.dart:
        - Procedure main
      package:example/b.dart:
        - Procedure b
        - Field example011
      package:foo/foo.dart:
        - Procedure foo
        - Field foo2
      package:foo/bar.dart:
        - Procedure bar
      package:foo/baz.dart:
        - Procedure baz
