# 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: |
      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
    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: |
        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: |
        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
