# 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
strong: true
modules:
  example_0.1.0:
    example_0.1.0/a.dart: |
      a() {
        la1();
      }
      la1() {
        print("Hello from v0.1.0");
      }
    example_0.1.0/b.dart: |
      import "a.dart";
      b() {
        a();
      }
    example_0.1.0/.packages: |
      example:.
  example_0.1.1:
    example_0.1.1/b.dart: |
      b() {
        print("Hello from v0.1.1");
      }
      bool example011 = true;
    example_0.1.1/.packages: |
      example:.
  foo_1:
    foo_1/foo.dart: |
      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: |
      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: |
      bar() {
        print("hello from bar");
      }
    foo_2/baz.dart: |
      baz() {
        print("hello from baz");
      }
    foo_2/.packages: |
      foo:.
      example:../example_0.1.1
worlds:
  - entry: main.dart
    fromComponent: true
    sources:
      main.dart: |
        import "package:example/b.dart";
        main() {
          print("hello");
          b();
        }
      .packages: example:example_0.1.0
    modules:
      - example_0.1.0
    expectedLibraryCount: 3
    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: |
        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
    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: |
        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
    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
