# 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
strong: true
modules:
  module:
    module/lib1.dart: |
      import 'lib3.dart';

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

      class Class2 {
        void cl4() {
          Class4 class4 = new Class4();
          print(class4);
        }
      }
    module/lib3.dart: |
      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: |
        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
    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;
          }
        }
      .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
