# 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: |
      import 'lib3.dart';

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

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

      class Class3b {
        String str() => throw '';
      }
    module/lib4.dart: |
      class Class4 {}
    module/.dart_tool/package_config.json: |
      {
        "configVersion": 2,
        "packages": [
          {
            "name": "module",
            "rootUri": ".."
          }
        ]
      }
worlds:
  - entry: compileme.dart
    fromComponent: true
    sources:
      compileme.dart: |
        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
    advancedInvalidation: modulesToLoad

  - entry: compileme.dart
    fromComponent: true
    expectInitializeFromDill: false
    outlineOnly: true
    skipOutlineBodyCheck: true
    sources:
      compileme.dart: |
        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
    advancedInvalidation: modulesToLoad
