# 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
    useExperimentalInvalidation: true
    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
    useExperimentalInvalidation: true
    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
    useExperimentalInvalidation: true
    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
