blob: f89588431b90f3ff9cb7d97e4290a26c1db32500 [file] [log] [blame]
// 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.
// Test operators through overloading and the ones defined in dart:js_interop.
import 'dart:js_interop';
import 'package:expect/expect.dart';
@JS()
extension type OperableExtType(JSObject _) {
external int operator [](int index);
external void operator []=(int index, int value);
}
void extensionTypeTest() {
final obj = OperableExtType(JSObject());
obj[4] = 5;
Expect.equals(5, obj[4]);
final arr = OperableExtType(JSArray());
arr[6] = 7;
Expect.equals(7, arr[6]);
}
@JS()
@staticInterop
class Operable {}
extension OperableExtension on Operable {
external int operator [](int index);
external void operator []=(int index, int value);
}
void staticInteropTest() {
final obj = JSObject() as Operable;
obj[4] = 5;
Expect.equals(5, obj[4]);
final arr = JSArray() as Operable;
arr[5] = 6;
Expect.equals(6, arr[5]);
}
@JS()
external bool isNaN(JSAny? number);
@JS()
external JSBigInt BigInt(String value);
extension on int {
JSBigInt get toBigInt => BigInt(this.toString());
}
int toInt(JSAny any) => (any as JSNumber).toDartInt;
void dartJsInteropOperatorsTest() {
// Arithmetic.
final i10 = 10.toJS;
Expect.equals(11, toInt(i10.add(1.toJS)));
Expect.equals(9, toInt(i10.subtract(1.toJS)));
Expect.equals(20, toInt(i10.multiply(2.toJS)));
Expect.equals(1, toInt(i10.divide(10.toJS)));
Expect.equals(0, toInt(i10.modulo(5.toJS)));
Expect.equals(100, toInt(i10.exponentiate(2.toJS)));
// Bitwise.
Expect.equals(5, toInt(i10.unsignedRightShift(1.toJS)));
// Comparison/relational.
final t = true.toJS;
final f = false.toJS;
// Equality attempts to coerce, whereas strict equality does not.
Expect.isTrue(t.equals(1.toJS).toDart);
Expect.isFalse(t.notEquals(1.toJS).toDart);
Expect.isFalse(t.strictEquals(1.toJS).toDart);
Expect.isTrue(t.strictNotEquals(1.toJS).toDart);
Expect.isFalse((t.and(f) as JSBoolean).toDart);
Expect.isTrue((t.or(f) as JSBoolean).toDart);
Expect.isFalse(t.not.toDart);
Expect.isTrue(t.isTruthy.toDart);
Expect.isFalse(i10.lessThan(i10).toDart);
Expect.isTrue(i10.lessThanOrEqualTo(i10).toDart);
Expect.isFalse(i10.greaterThan(i10).toDart);
Expect.isTrue(i10.greaterThanOrEqualTo(i10).toDart);
// Nulls.
Expect.equals(0, toInt(null.add(null)));
Expect.equals(0, toInt(null.subtract(null)));
Expect.equals(0, toInt(null.multiply(null)));
Expect.isTrue(isNaN(null.divide(null)));
Expect.isTrue(isNaN(null.modulo(null)));
Expect.equals(1, toInt(null.exponentiate(null)));
Expect.equals(0, toInt(null.unsignedRightShift(null)));
Expect.isTrue(null.equals(null).toDart);
Expect.isFalse(null.notEquals(null).toDart);
Expect.isTrue(null.strictEquals(null).toDart);
Expect.isFalse(null.strictNotEquals(null).toDart);
Expect.isNull(null.and(null));
Expect.isNull(null.or(null));
Expect.isTrue(null.not.toDart);
Expect.isFalse(null.isTruthy.toDart);
Expect.isFalse(null.lessThan(null).toDart);
Expect.isTrue(null.lessThanOrEqualTo(null).toDart);
Expect.isFalse(null.greaterThan(null).toDart);
Expect.isTrue(null.greaterThanOrEqualTo(null).toDart);
// Different types.
final b10 = 10.toBigInt;
Expect.equals(11.toBigInt, b10.add(1.toBigInt));
Expect.equals(9.toBigInt, b10.subtract(1.toBigInt));
Expect.equals(20.toBigInt, b10.multiply(2.toBigInt));
Expect.equals(1.toBigInt, b10.divide(10.toBigInt));
Expect.equals(0.toBigInt, b10.modulo(5.toBigInt));
Expect.equals(100.toBigInt, b10.exponentiate(2.toBigInt));
// Note that `unsignedRightShift` can not be used with BigInts and always
// returns a number.
Expect.equals(1, toInt(t.unsignedRightShift(f)));
final b1 = 1.toBigInt;
Expect.isTrue(b1.equals(t).toDart);
Expect.isFalse(b1.notEquals(t).toDart);
Expect.isFalse(b1.strictEquals(t).toDart);
Expect.isTrue(b1.strictNotEquals(t).toDart);
Expect.equals(b1, b10.and(b1));
Expect.equals(b10, b10.or(b1));
Expect.isFalse(b10.not.toDart);
Expect.isTrue(b10.isTruthy.toDart);
Expect.isFalse(b10.lessThan(b10).toDart);
Expect.isTrue(b10.lessThanOrEqualTo(b10).toDart);
Expect.isFalse(b10.greaterThan(b10).toDart);
Expect.isTrue(b10.greaterThanOrEqualTo(b10).toDart);
}
void main() {
extensionTypeTest();
staticInteropTest();
dartJsInteropOperatorsTest();
}