# 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.
# Try out "trickery" in the module dependencies to force needing more or less
# dill libraries.

type: newworld
modules:
  moduleB:
    moduleB/b.dart: |
      // @dart=2.9
      import 'package:moduleC/c.dart';

      var bVar = 42;
      var bVarFromC = baz2;
      var mya2 = new A2();

      class A2 extends A3 {
        int bar = 42;
      }
    moduleB/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "moduleB",
            "rootUri": ".."
          },
          {
            "name": "moduleC",
            "rootUri": "../../moduleC"
          },
          {
            "name": "moduleD",
            "rootUri": "../../moduleD"
          }
        ]
      }
  moduleC:
    moduleC/c.dart: |
      // @dart=2.9
      import 'package:moduleD/d.dart';

      String baz = "42";
      String baz2 = baz3;

      class A3 {
        int foo = 42;
      }
    moduleC/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "moduleC",
            "rootUri": ".."
          },
          {
            "name": "moduleD",
            "rootUri": "../../moduleD"
          }
        ]
      }
  moduleD:
    moduleD/d.dart: |
      // @dart=2.9
      String baz3 = "baz3";
    moduleD/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "moduleD",
            "rootUri": ".."
          }
        ]
      }
worlds:
  - entry: a.dart
    fromComponent: true
    sources:
      a.dart: |
        // @dart=2.9
        import "package:moduleB/b.dart";

        var foo = bVar;
        var foo2 = bVarFromC;
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "moduleB",
              "rootUri": "../moduleB"
            },
            {
              "name": "moduleC",
              "rootUri": "../moduleC"
            },
            {
              "name": "moduleD",
              "rootUri": "../moduleD"
            }
          ]
        }
    modules:
      - moduleB
      - moduleC
      - moduleD
    expectedLibraryCount: 4
    neededDillLibraries:
      # Only b.dart needed.
      - package:moduleB/b.dart
    expectedContent:
      org-dartlang-test:///a.dart:
        - Field foo
        - Field foo2
      package:moduleB/b.dart:
        - Class A2
        - Field bVar
        - Field bVarFromC
        - Field mya2
      package:moduleC/c.dart:
        - Class A3
        - Field baz
        - Field baz2
      package:moduleD/d.dart:
        - Field baz3