// Copyright (c) 2022, 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.

import 'dart:ffi';

import 'package:expect/expect.dart';

void main() {
  final a = <int>[];
  final b = <int>[];
  for (int i = 0; i < 10; ++i) {
    // Several pointers for same call site.
    a.add(
      Pointer.fromFunction<Int Function()>(nativeToDartCallback, 0).address,
    );
    b.add(
      Pointer.fromFunction<Int Function()>(nativeToDartCallback, 1).address,
    );
  }

  ensureEqualEntries(a);
  ensureEqualEntries(b);

  // The two functions have different exceptional return and should have
  // therefore a different ffi trampoline.
  Expect.notEquals(a.first, b.first);
}

void ensureEqualEntries(List<int> entries) {
  final first = entries.first;
  for (int i = 1; i < entries.length; ++i) {
    Expect.equals(first, entries[i]);
  }
}

int nativeToDartCallback() => 42;
