# 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, change a file, but don't change the outline.
# Have an export of getter, setter, method.

type: newworld
worlds:
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    sources:
      main.dart: |
        import "lib2.dart" show getter, setter, method, Bar;
        import "lib1.dart" show getter, setter, method, Bar;
        main() {
          Bar bar = new Bar();
          method();
          getter;
          setter = 42;
        }
      lib1.dart: |
        export "lib2.dart";
        class Foo {
          Foo() {

          }
        }
      lib2.dart: |
        String get getter => "hello";
        void set setter(int i) {}
        void method() {}
        class Bar {
          Bar() {

          }
        }
    expectedLibraryCount: 3
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - lib1.dart
    sources:
      lib1.dart: |
        export "lib2.dart";
        class Foo {
          Foo() {
            print("Foo!");
          }
        }
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - lib2.dart
    sources:
      lib2.dart: |
        String get getter => "hello";
        void set setter(int i) {}
        void method() {}
        class Bar {
          Bar() {
            print("hello!");
          }
        }
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    sources:
      main.dart: |
        import "lib2.dart" show getter, setter, method, Bar;
        import "lib1.dart" show getter, setter, method, Bar;
        main() {
          Bar bar = new Bar();
          method();
          getter;
          setter = 42;
          print("Done!");
        }
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true
