# 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/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "example",
            "rootUri": ".."
          }
        ]
      }
  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/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "example",
            "rootUri": ".."
          }
        ]
      }
  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/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "foo",
            "rootUri": ".."
          },
          {
            "name": "example",
            "rootUri": "../../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/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "foo",
            "rootUri": ".."
          },
          {
            "name": "example",
            "rootUri": "../../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();
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "example",
              "rootUri": "../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();
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "example",
              "rootUri": "../example_0.1.0"
            },
            {
              "name": "foo",
              "rootUri": "../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();
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "example",
              "rootUri": "../example_0.1.1"
            },
            {
              "name": "foo",
              "rootUri": "../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
