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

// Requirements=nnbd-strong

// Test that external members returning numbers have correct semantics.

@JS()
library number_test;

import 'dart:js_interop';

import 'package:expect/expect.dart';
import 'package:expect/minitest.dart'; // ignore: deprecated_member_use_from_same_package

extension type IntE(int _) {}

extension type NullableIntE(int? _) {}

@JS()
external void eval(String code);

// Integer value.

@JS('integer')
external int get integerAsInt;

@JS('integer')
external IntE get integerAsIntE;

@JS('integer')
external double get integerAsDouble;

@JS('integer')
external num get integerAsNum;

@JS('integer')
external JSNumber get integerAsJSNumber;

// Integer value with nullable type.

@JS('integer')
external int? get integerAsNullInt;

@JS('integer')
external NullableIntE get integerAsNullableIntE;

@JS('integer')
external double? get integerAsNullDouble;

@JS('integer')
external num? get integerAsNullNum;

@JS('integer')
external JSNumber? get integerAsNullJSNumber;

// Float value.

@JS('float')
external int get floatAsInt;

@JS('float')
external IntE get floatAsIntE;

@JS('float')
external double get floatAsDouble;

@JS('float')
external num get floatAsNum;

@JS('float')
external JSNumber get floatAsJSNumber;

// Float value with nullable type.

@JS('float')
external int? get floatAsNullInt;

@JS('float')
external NullableIntE get floatAsNullableIntE;

@JS('float')
external double? get floatAsNullDouble;

@JS('float')
external num? get floatAsNullNum;

@JS('float')
external JSNumber? get floatAsNullJSNumber;

// Null value with non-nullable type.

@JS('nullVal')
external int get nullAsInt;

@JS('nullVal')
external IntE get nullAsIntE;

@JS('nullVal')
external double get nullAsDouble;

@JS('nullVal')
external num get nullAsNum;

@JS('nullVal')
external JSNumber get nullAsJSNumber;

// Null value with nullable type.

@JS('nullVal')
external int? get nullAsNullInt;

@JS('nullVal')
external NullableIntE get nullAsNullableIntE;

@JS('nullVal')
external double? get nullAsNullDouble;

@JS('nullVal')
external num? get nullAsNullNum;

@JS('nullVal')
external JSNumber? get nullAsNullJSNumber;

void main() {
  eval('''
    globalThis.integer = 0;
    globalThis.float = 0.5;
    globalThis.nullVal = null;
  ''');

  expect(integerAsInt, 0);
  expect(integerAsIntE, 0);
  expect(integerAsDouble, 0.0);
  expect(integerAsNum, 0);
  expect(integerAsJSNumber.toDartDouble, 0.0);
  expect(integerAsJSNumber.toDartInt, 0);

  expect(integerAsNullInt, 0);
  expect(integerAsNullableIntE, 0);
  expect(integerAsNullDouble, 0.0);
  expect(integerAsNullNum, 0);
  expect(integerAsNullJSNumber!.toDartDouble, 0.0);
  expect(integerAsNullJSNumber!.toDartInt, 0);

  Expect.throws(() => floatAsInt);
  Expect.throws(() => floatAsIntE);
  expect(floatAsDouble, 0.5);
  expect(floatAsNum, 0.5);
  expect(floatAsJSNumber.toDartDouble, 0.5);
  Expect.throws(() => floatAsJSNumber.toDartInt);

  Expect.throws(() => floatAsNullInt);
  Expect.throws(() => floatAsNullableIntE);
  expect(floatAsNullDouble, 0.5);
  expect(floatAsNullNum, 0.5);
  expect(floatAsNullJSNumber!.toDartDouble, 0.5);
  Expect.throws(() => floatAsNullJSNumber!.toDartInt);

  Expect.throws(() => nullAsInt);
  Expect.throws(() => nullAsIntE);
  Expect.throws(() => nullAsDouble);
  Expect.throws(() => nullAsNum);
  Expect.throws(() => nullAsJSNumber);

  expect(nullAsNullInt, null);
  expect(nullAsNullableIntE, null);
  expect(nullAsNullDouble, null);
  expect(nullAsNullNum, null);
  expect(nullAsNullJSNumber, null);
}
