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

# Test FFI compilation. Do expression computation using a (converted to getter)
# field in the FFI-struct class.

type: newworld
worlds:
  - entry: main.dart
    sources:
      main.dart: |
        import 'lib.dart';

        Coordinate coordinate;

        main() {
          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
    expressionCompilation:
      uri: main.dart
      expression: print(coordinate.x)
