// Copyright (c) 2021, 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 the jsify functionality of the js_util library. @JS() library js_util_jsify_test; import 'package:js/js.dart'; import 'package:js/js_util.dart' as js_util; import 'package:expect/minitest.dart'; @JS() external void eval(String code); @JS() external bool checkMap(m, String, value); @JS() class Foo { external Foo(num a); external num get a; external num bar(); } main() { eval(r""" function Foo(a) { this.a = a; } Foo.prototype.bar = function() { return this.a; } function checkMap(m, key, value) { if (m.hasOwnProperty(key)) return m[key] == value; else return false; } """); test('convert a List', () { final list = [1, 2, 3, 4, 5, 6, 7, 8]; var array = js_util.jsify(list); expect(array is List, isTrue); expect(identical(array, list), isFalse); expect(array.length, equals(list.length)); for (var i = 0; i < list.length; i++) { expect(array[i], equals(list[i])); } }); test('convert an Iterable', () { final set = new Set.from([1, 2, 3, 4, 5, 6, 7, 8]); var array = js_util.jsify(set); expect(array is List, isTrue); expect(array.length, equals(set.length)); for (var i = 0; i < array.length; i++) { expect(set.contains(array[i]), isTrue); } }); test('convert a Map', () { var map = {'a': 1, 'b': 2, 'c': 3}; var jsMap = js_util.jsify(map); expect(jsMap is List, isFalse); expect(jsMap is Map, isFalse); for (var key in map.keys) { expect(checkMap(jsMap, key, map[key]), isTrue); } }); test('deep convert a complex object', () { dynamic object = { 'a': [ 1, [2, 3] ], 'b': {'c': 3, 'd': new Foo(42)}, 'e': null }; var jsObject = js_util.jsify(object); expect(js_util.getProperty(jsObject, 'a')[0], equals(object['a'][0])); expect(js_util.getProperty(jsObject, 'a')[1][0], equals(object['a'][1][0])); expect(js_util.getProperty(jsObject, 'a')[1][1], equals(object['a'][1][1])); var b = js_util.getProperty(jsObject, 'b'); expect(js_util.getProperty(b, 'c'), equals(object['b']['c'])); var d = js_util.getProperty(b, 'd'); expect(d, equals(object['b']['d'])); expect(js_util.getProperty(d, 'a'), equals(42)); expect(js_util.callMethod(d, 'bar', []), equals(42)); expect(js_util.getProperty(jsObject, 'e'), isNull); }); test('throws if object is not a Map or Iterable', () { expect(() => js_util.jsify('a'), throwsArgumentError); }); }