# 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: |
      class Class4 {}
    module/.packages: |
      module:.
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;
          }
        }
      .packages: |
        module: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;
          }
        }
      .packages: |
        module: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
