# 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:
  module:
    module/lib1.dart: |
      // @dart=2.9
      import 'lib3.dart';

      class Class1 {
        Class3a get c3a {}
      }
    module/lib2.dart: |
      // @dart=2.9
      import 'lib4.dart';

      class Class2 {
        void cl4() {
          Class4 class4 = new Class4();
          print(class4);
        }
      }
    module/lib3.dart: |
      // @dart=2.9
      class Class3a {
        Class3b get c3b {}
      }

      class Class3b {
        String str() {}
      }
    module/lib4.dart: |
      // @dart=2.9
      class Class4 {}
    module/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "module",
            "rootUri": ".."
          }
        ]
      }
worlds:
  - entry: compileme.dart
    fromComponent: true
    sources:
      compileme.dart: |
        // @dart=2.9
        import 'package:module/lib1.dart';
        import 'package:module/lib2.dart';

        main() {
          Class2 class2 = new Class2();
          print(class2);
        }

        class Foo {
          Class1 class1() {
            Class1 class1 = new Class1();
            class1.c3a.c3b.str();
            return class1;
          }
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "module",
              "rootUri": "../module"
            }
          ]
        }
    modules:
      - module
    expectedLibraryCount: 5
    neededDillLibraries:
      - package:module/lib1.dart
      - package:module/lib2.dart
      - package:module/lib3.dart
    expectedContent:
      org-dartlang-test:///compileme.dart:
        - Class Foo
        - Procedure main
      package:module/lib1.dart:
        - Class Class1
      package:module/lib2.dart:
        - Class Class2
      package:module/lib3.dart:
        - Class Class3a
        - Class Class3b
      package:module/lib4.dart:
        - Class Class4
  - entry: compileme.dart
    fromComponent: true
    expectInitializeFromDill: false
    outlineOnly: true
    skipOutlineBodyCheck: true
    sources:
      compileme.dart: |
        // @dart=2.9
        import 'package:module/lib1.dart';
        import 'package:module/lib2.dart';

        main() {
          Class2 class2 = new Class2();
          print(class2);
        }

        class Foo {
          Class1 class1() {
            Class1 class1 = new Class1();
            class1.c3a.c3b.str();
            return class1;
          }
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "module",
              "rootUri": "../module"
            }
          ]
        }
    modules:
      - module
    expectedLibraryCount: 5
    neededDillLibraries:
      # This is the outline version. It doesn't use lib3.dart.
      - package:module/lib1.dart
      - package:module/lib2.dart
    expectedContent:
      org-dartlang-test:///compileme.dart:
        - Class Foo
        - Procedure main
      package:module/lib1.dart:
        - Class Class1
      package:module/lib2.dart:
        - Class Class2
      package:module/lib3.dart:
        - Class Class3a
        - Class Class3b
      package:module/lib4.dart:
        - Class Class4
