// Copyright (c) 2020, 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.
//
// Truncation and sign extension of small ints, tested with something else than
// equality.
//
// SharedObjects=ffi_test_functions

import 'dart:ffi';

import "package:expect/expect.dart";

import "dylib_utils.dart";

main() {
  variant1Negative();
  variant1Positive();
  variant2Negative();
  variant2Positive();
  variant3Negative();
}

/// `return x == 249 ? 1 : 0`.
///
/// This doesn't catch the error.
final regress40537 = ffiTestFunctions
    .lookupFunction<IntPtr Function(Uint8), int Function(int)>("Regress40537");

variant1Negative() {
  // 0xF9 =  -7 in 2s complement.
  // 0xF9 = 249 in unsinged.
  final result = regress40537(-7);
  print(result);
  Expect.equals(1, result);
}

variant1Positive() {
  // 0xF9 = 249 in unsinged.
  final result = regress40537(0xFFFFFFF9);
  print(result);
  Expect.equals(1, result);
}

/// `return x`.
///
/// This does.
final regress40537Variant2 =
    ffiTestFunctions.lookupFunction<IntPtr Function(Uint8), int Function(int)>(
        "Regress40537Variant2");

variant2Negative() {
  // The 32 bit representation of -7 is 0xFFFFFFF9.
  // Only the lowest byte, 0xF9, should be interpreted by calling convention,
  // or it should be truncated and zero extended before calling.
  final result = regress40537Variant2(-7);
  print(result);
  Expect.equals(249, result);
}

variant2Positive() {
  // Only the lowest byte, 0xF9, should be interpreted by calling convention,
  // or it should be truncated and zero extended before calling.
  final result = regress40537Variant2(0xFFFFFFF9);
  print(result);
  Expect.equals(249, result);
}

/// `return x`.
final regress40537Variant3 =
    ffiTestFunctions.lookupFunction<Uint8 Function(IntPtr), int Function(int)>(
        "Regress40537Variant3");

variant3Negative() {
  // This really passes -7 its intptr_t.
  final result = regress40537Variant3(-7);
  print(result);
  Expect.equals(249, result);
}

final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
