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

// Tests invoking JS operators through js_util.

@JS()
library js_util_operator_test;

import 'package:js/js.dart';
import 'package:js/js_util.dart' as js_util;
import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

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

@JS()
external Object? get undefinedObject;

@JS()
class Foo {
  external Foo();
}

main() {
  eval(r"""
    function Foo() {}
  """);

  test('typeofEquals', () {
    expect(js_util.typeofEquals(5, 'number'), isTrue);
    expect(js_util.typeofEquals(5, 'string'), isFalse);

    expect(js_util.typeofEquals('foo', 'string'), isTrue);
    expect(js_util.typeofEquals('foo', 'number'), isFalse);

    expect(js_util.typeofEquals(null, 'object'), isTrue);
    expect(js_util.typeofEquals(null, 'boolean'), isFalse);

    expect(js_util.typeofEquals(true, 'boolean'), isTrue);
    expect(js_util.typeofEquals(true, 'number'), isFalse);

    expect(js_util.typeofEquals(Foo(), 'object'), isTrue);
    expect(js_util.typeofEquals(Foo(), 'function'), isFalse);

    expect(js_util.typeofEquals(js_util.newObject(), 'object'), isTrue);
    expect(js_util.typeofEquals(js_util.newObject(), 'function'), isFalse);

    expect(js_util.typeofEquals([], 'object'), isTrue);
    expect(js_util.typeofEquals([], 'function'), isFalse);

    expect(js_util.typeofEquals(undefinedObject, 'undefined'), isTrue);
    expect(js_util.typeofEquals(undefinedObject, 'object'), isFalse);

    expect(
        js_util.typeofEquals(
            js_util.getProperty(js_util.globalThis, 'Foo'), 'function'),
        isTrue);
  });

  test('not', () {
    expect(js_util.not(true), isFalse);
    expect(js_util.not(false), isTrue);

    expect(js_util.not(null), isTrue);
    expect(js_util.not(''), isTrue);
    expect(js_util.not(0), isTrue);
    expect(js_util.not(undefinedObject), isTrue);

    expect(js_util.not([]), isFalse);
    expect(js_util.not({}), isFalse);
    expect(js_util.not(js_util.newObject()), isFalse);
    expect(js_util.not(Foo()), isFalse);
    expect(js_util.not('foo'), isFalse);
    expect(js_util.not(5), isFalse);
  });

  test('isTruthy', () {
    expect(js_util.isTruthy(true), isTrue);
    expect(js_util.isTruthy(false), isFalse);

    expect(js_util.isTruthy(null), isFalse);
    expect(js_util.isTruthy(''), isFalse);
    expect(js_util.isTruthy(0), isFalse);
    expect(js_util.isTruthy(undefinedObject), isFalse);

    expect(js_util.isTruthy([]), isTrue);
    expect(js_util.isTruthy({}), isTrue);
    expect(js_util.isTruthy(js_util.newObject()), isTrue);
    expect(js_util.isTruthy(Foo()), isTrue);
    expect(js_util.isTruthy('foo'), isTrue);
    expect(js_util.isTruthy(5), isTrue);
  });

  test('or', () {
    expect(js_util.or(true, false), isTrue);
    expect(js_util.or(true, true), isTrue);
    expect(js_util.or(false, true), isTrue);
    expect(js_util.or(false, false), isFalse);

    expect(js_util.or('foo', 'bar'), equals('foo'));
    expect(js_util.or(null, 'foo'), equals('foo'));
    expect(js_util.or(undefinedObject, 'foo'), equals('foo'));
    expect(js_util.or(0, 'foo'), equals('foo'));
    expect(js_util.or('', 'foo'), equals('foo'));
    expect(js_util.or([], 'bar'), equals([]));
    var o = js_util.newObject();
    expect(js_util.or(o, 'foo'), equals(o));
  });

  test('and', () {
    expect(js_util.and(true, false), isFalse);
    expect(js_util.and(true, true), isTrue);
    expect(js_util.and(false, true), isFalse);
    expect(js_util.and(false, false), isFalse);

    expect(js_util.and('foo', 'bar'), equals('bar'));
    expect(js_util.and(null, 'foo'), equals(null));
    // Should be undefined if we had JS types
    expect(js_util.and(undefinedObject, 'foo'), equals(null));
    expect(js_util.and(0, 'foo'), equals(0));
    expect(js_util.and([], 'bar'), equals('bar'));
    var o = js_util.newObject();
    expect(js_util.and(o, 'foo'), equals('foo'));
  });

  test('delete', () {
    var f = Foo();

    expect(js_util.delete(f, 'unknownProperty'), isTrue);

    expect(js_util.getProperty(f, 'a'), equals(null));
    js_util.setProperty(f, 'a', 'foo');
    expect(js_util.getProperty(f, 'a'), equals('foo'));
    expect(js_util.delete(f, 'a'), isTrue);
    expect(js_util.getProperty(f, 'a'), equals(null));
  });

  test('unsignedRightShift', () {
    expect(js_util.unsignedRightShift(9, 2), equals(2));
    expect(js_util.unsignedRightShift(-9, 2), equals(1073741821));

    expect(js_util.unsignedRightShift(1, 'a'), equals(1));
    expect(js_util.unsignedRightShift(1, null), equals(1));
    expect(js_util.unsignedRightShift(1, undefinedObject), equals(1));
    expect(js_util.unsignedRightShift(1, false), equals(1));
    expect(js_util.unsignedRightShift(1, []), equals(1));

    expect(js_util.unsignedRightShift('a', 1), equals(0));
    expect(js_util.unsignedRightShift(null, 1), equals(0));
    expect(js_util.unsignedRightShift(undefinedObject, 1), equals(0));
    expect(js_util.unsignedRightShift(false, 1), equals(0));
    expect(js_util.unsignedRightShift([], 1), equals(0));
  });
}
