// 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));
  });
}
