# 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.
# Test FFI compilation. Because FFI is special we can't expect to only
# compile the changed files.

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

        main() {
          Coordinate coordinate = new Coordinate.allocate(42.0, 42.0, null);
          print(coordinate.x);
          print(coordinate.y);
          print(coordinate.next);
        }
      lib.dart: |
        // @dart=2.9
        import 'dart:ffi';
        class Coordinate extends Struct {
          @Double()
          double x;

          @Double()
          double y;

          Pointer<Coordinate> next;

          factory Coordinate.allocate(double x, double y, Pointer<Coordinate> next) {
            return null;
          }
        }
    expectedLibraryCount: 2
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    sources:
      main.dart: |
        // @dart=2.9
        import 'lib.dart';

        main() {
          Coordinate coordinate = new Coordinate.allocate(42.0, 42.0, null);
          print(coordinate.x);
          print(coordinate.y);
          print(coordinate.next);
          print("Done!");
        }
    expectedLibraryCount: 2
    expectsRebuildBodiesOnly: true
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - lib.dart
    sources:
      lib.dart: |
        // @dart=2.9
        import 'dart:ffi';
        class Coordinate extends Struct {
          @Double()
          double x;

          @Double()
          double y;

          Pointer<Coordinate> next;

          factory Coordinate.allocate(double x, double y, Pointer<Coordinate> next) {
            print("hello");
            return null;
          }
        }
    expectedLibraryCount: 2
    expectsRebuildBodiesOnly: false
