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

# Test FFI compilation.

type: newworld
worlds:
  - entry: 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);
        }
      lib.dart: |
        import 'dart:ffi';

        final class Coordinate extends Struct {
          @Double()
          external double x;

          @Double()
          external double y;

          external Pointer<Coordinate> next;

          factory Coordinate.allocate(double x, double y, Pointer<Coordinate>? next) {
            throw '';
          }
        }
    expectedLibraryCount: 2
  - entry: main.dart
    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);
          done();
        }

        done() {
          print("Done!");
        }
    expectedLibraryCount: 2
    advancedInvalidation: outlineChange
