# 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.

type: newworld
worlds:
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    sources:
      main.dart: |
        import 'libA.dart';

        class Foo {
          final message;
          Foo(this.message);
          @override
          toString() { return '$message'; }
        }

        main() {
          Foo foo = new Foo("hello");
          whatever(foo);
          CompilationStrategy compilationStrategy = CompilationStrategy.direct;
          print(compilationStrategy);
        }

        enum CompilationStrategy { direct, toKernel, toData, fromData }
      libA.dart: |
        import 'main.dart';
        whatever(Foo foo) {
          print(foo);
        }
    expectedLibraryCount: 2
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    sources:
      main.dart: |
        import 'libA.dart';

        class Foo {
          final message;
          Foo(this.message);
          @override
          toString() { return '$message!'; }
        }

        main() {
          Foo foo = new Foo("hello");
          whatever(foo);
          CompilationStrategy compilationStrategy = CompilationStrategy.direct;
          print(compilationStrategy);
        }

        enum CompilationStrategy { direct, toKernel, toData, fromData }
    expectedLibraryCount: 2
    expectsRebuildBodiesOnly: true
