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

type: newworld
worlds:
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    sources:
      main.dart: |
        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: |
        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: |
        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: |
        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: true
