# 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 part, change a file,
# but don't change the outline.

type: newworld
worlds:
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    sources:
      main.dart: |
        // @dart=2.9
        part 'myPart.dart';

        class Foo {
          const Foo();
          @override
          toString() => 'Foo!';
        }

        main() async {
          await whatever();
          print(const Foo());
        }
      myPart.dart: |
        // @dart=2.9
        part of 'main.dart';
        whatever() async {
          await null;
          return "hello";
        }
    expectedLibraryCount: 1
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - myPart.dart
    sources:
      myPart.dart: |
        // @dart=2.9
        part of 'main.dart';
        whatever() async {
          await null;
          return "hello!!!";
        }
    expectedLibraryCount: 1
    expectsRebuildBodiesOnly: true
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    sources:
      main.dart: |
        // @dart=2.9
        part 'myPart.dart';

        class Foo {
          const Foo();
          @override
          toString() => 'Foo!';
        }

        main() async {
          await whatever();
          print(const Foo());
          print("Done!");
        }
    expectedLibraryCount: 1
    expectsRebuildBodiesOnly: true
