6c757957db
DDC's codegen test copies those files to a local "gen" directory so that it can do stuff like splitting out the multitests before it compiles them to JS. I left all of that alone, so the rest of DDC's test infrastructure is unchanged. The very first step that builds the "gen" directory just copies from sdk/tests/..._strong/... instead and the rest is good to go. I did not move not_yet_strong_tests.dart somewhere more accessible yet because I'm not sure if kernel needs it or where it should go. I did not create any status files because DDC doesn't need them and there are no test suites for the new directories for the other platforms.
344 lines
9.8 KiB
Dart
344 lines
9.8 KiB
Dart
// Copyright (c) 2013, 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.
|
|
|
|
@JS()
|
|
library js_native_test;
|
|
|
|
import 'dart:async';
|
|
import 'dart:html';
|
|
import 'dart:typed_data' show ByteBuffer, Int32List;
|
|
import 'dart:indexed_db' show IdbFactory, KeyRange;
|
|
|
|
import 'package:js/js.dart';
|
|
import 'package:js/js_util.dart' as js_util;
|
|
import 'package:expect/minitest.dart';
|
|
|
|
_injectJs() {
|
|
final script = new ScriptElement();
|
|
script.type = 'text/javascript';
|
|
script.innerHtml = r"""
|
|
var x = 42;
|
|
|
|
var _x = 123;
|
|
|
|
var myArray = ["value1"];
|
|
|
|
function returnThis() {
|
|
return this;
|
|
}
|
|
|
|
function getTypeOf(o) {
|
|
return typeof(o);
|
|
}
|
|
|
|
function Foo(a) {
|
|
this.a = a;
|
|
}
|
|
|
|
Foo.b = 38;
|
|
|
|
Foo.prototype.bar = function() {
|
|
return this.a;
|
|
}
|
|
Foo.prototype.toString = function() {
|
|
return "I'm a Foo a=" + this.a;
|
|
}
|
|
|
|
var container = new Object();
|
|
container.Foo = Foo;
|
|
|
|
function checkMap(m, key, value) {
|
|
if (m.hasOwnProperty(key))
|
|
return m[key] == value;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
""";
|
|
document.body.append(script);
|
|
}
|
|
|
|
@JS()
|
|
external bool checkMap(m, String, value);
|
|
|
|
@JS('JSON.stringify')
|
|
external String stringify(o);
|
|
|
|
@JS('Node')
|
|
external get JSNodeType;
|
|
|
|
@JS('Element')
|
|
external get JSElementType;
|
|
|
|
@JS('Text')
|
|
external get JSTextType;
|
|
|
|
@JS('HTMLCanvasElement')
|
|
external get JSHtmlCanvasElementType;
|
|
|
|
@JS()
|
|
class Foo {
|
|
external Foo(num a);
|
|
|
|
external num get a;
|
|
external num bar();
|
|
}
|
|
|
|
@JS('Foo')
|
|
external get JSFooType;
|
|
|
|
@JS()
|
|
@anonymous
|
|
class ExampleTypedLiteral {
|
|
external factory ExampleTypedLiteral({a, b, JS$_c, JS$class});
|
|
|
|
external get a;
|
|
external get b;
|
|
external get JS$_c;
|
|
external set JS$_c(v);
|
|
// Identical to JS$_c but only accessible within the library.
|
|
external get _c;
|
|
external get JS$class;
|
|
external set JS$class(v);
|
|
}
|
|
|
|
@JS("Object.prototype.hasOwnProperty")
|
|
external get _hasOwnProperty;
|
|
|
|
bool hasOwnProperty(o, String name) {
|
|
return js_util.callMethod(_hasOwnProperty, 'call', [o, name]);
|
|
}
|
|
|
|
main() {
|
|
_injectJs();
|
|
|
|
group('js_util.jsify()', () {
|
|
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, isTrue);
|
|
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]));
|
|
expect(js_util.getProperty(js_util.getProperty(jsObject, 'b'), 'c'),
|
|
equals(object['b']['c']));
|
|
expect(js_util.getProperty(js_util.getProperty(jsObject, 'b'), 'd'),
|
|
equals(object['b']['d']));
|
|
expect(
|
|
js_util.callMethod(
|
|
js_util.getProperty(js_util.getProperty(jsObject, 'b'), '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);
|
|
});
|
|
});
|
|
|
|
group('js_util.newObject', () {
|
|
test('create', () {
|
|
expect(identical(js_util.newObject(), js_util.newObject()), isFalse);
|
|
});
|
|
|
|
test('callMethod', () {
|
|
var o = js_util.newObject();
|
|
expect(js_util.callMethod(o, 'toString', []), equals('[object Object]'));
|
|
expect(stringify(o), equals('{}'));
|
|
});
|
|
|
|
test('properties', () {
|
|
var o = js_util.newObject();
|
|
expect(js_util.hasProperty(o, 'foo bar'), isFalse);
|
|
expect(js_util.hasProperty(o, 'toString'), isTrue);
|
|
expect(hasOwnProperty(o, 'toString'), isFalse);
|
|
expect(hasOwnProperty(o, 'foo bar'), isFalse);
|
|
js_util.setProperty(o, 'foo bar', 42);
|
|
expect(hasOwnProperty(o, 'foo bar'), isTrue);
|
|
expect(js_util.getProperty(o, 'foo bar'), equals(42));
|
|
expect(js_util.hasProperty(o, 'foo bar'), isTrue);
|
|
expect(stringify(o), equals('{"foo bar":42}'));
|
|
});
|
|
});
|
|
|
|
group('hasProperty', () {
|
|
test('typed object', () {
|
|
var f = new Foo(42);
|
|
expect(js_util.hasProperty(f, 'a'), isTrue);
|
|
expect(js_util.hasProperty(f, 'toString'), isTrue);
|
|
js_util.setProperty(f, '__proto__', null);
|
|
expect(js_util.hasProperty(f, 'toString'), isFalse);
|
|
});
|
|
test('typed literal', () {
|
|
var l =
|
|
new ExampleTypedLiteral(a: 'x', b: 42, JS$_c: null, JS$class: true);
|
|
expect(js_util.hasProperty(l, 'a'), isTrue);
|
|
expect(js_util.hasProperty(l, 'b'), isTrue);
|
|
expect(js_util.hasProperty(l, '_c'), isTrue);
|
|
expect(l.JS$_c, isNull);
|
|
expect(js_util.hasProperty(l, 'class'), isTrue);
|
|
// JS$_c escapes to _c so the property JS$_c will not exist on the object.
|
|
expect(js_util.hasProperty(l, r'JS$_c'), isFalse);
|
|
expect(js_util.hasProperty(l, r'JS$class'), isFalse);
|
|
expect(l.JS$class, isTrue);
|
|
|
|
l = new ExampleTypedLiteral(a: null);
|
|
expect(js_util.hasProperty(l, 'a'), isTrue);
|
|
expect(js_util.hasProperty(l, 'b'), isFalse);
|
|
expect(js_util.hasProperty(l, '_c'), isFalse);
|
|
expect(js_util.hasProperty(l, 'class'), isFalse);
|
|
|
|
l = new ExampleTypedLiteral(JS$_c: 74);
|
|
expect(js_util.hasProperty(l, '_c'), isTrue);
|
|
expect(l.JS$_c, equals(74));
|
|
});
|
|
});
|
|
|
|
group('getProperty', () {
|
|
test('typed object', () {
|
|
var f = new Foo(42);
|
|
expect(js_util.getProperty(f, 'a'), equals(42));
|
|
expect(js_util.getProperty(f, 'toString') is Function, isTrue);
|
|
js_util.setProperty(f, '__proto__', null);
|
|
expect(js_util.getProperty(f, 'toString'), isNull);
|
|
});
|
|
|
|
test('typed literal', () {
|
|
var l = new ExampleTypedLiteral(a: 'x', b: 42, JS$_c: 7, JS$class: true);
|
|
expect(js_util.getProperty(l, 'a'), equals('x'));
|
|
expect(js_util.getProperty(l, 'b'), equals(42));
|
|
expect(js_util.getProperty(l, '_c'), equals(7));
|
|
expect(l.JS$_c, equals(7));
|
|
expect(js_util.getProperty(l, 'class'), isTrue);
|
|
expect(js_util.getProperty(l, r'JS$_c'), isNull);
|
|
expect(js_util.getProperty(l, r'JS$class'), isNull);
|
|
});
|
|
});
|
|
|
|
group('setProperty', () {
|
|
test('typed object', () {
|
|
var f = new Foo(42);
|
|
expect(js_util.getProperty(f, 'a'), equals(42));
|
|
js_util.setProperty(f, 'a', 100);
|
|
expect(f.a, equals(100));
|
|
expect(js_util.getProperty(f, 'a'), equals(100));
|
|
});
|
|
|
|
test('typed literal', () {
|
|
var l = new ExampleTypedLiteral();
|
|
js_util.setProperty(l, 'a', 'foo');
|
|
expect(js_util.getProperty(l, 'a'), equals('foo'));
|
|
expect(l.a, equals('foo'));
|
|
js_util.setProperty(l, 'a', l);
|
|
expect(identical(l.a, l), isTrue);
|
|
var list = ['arr'];
|
|
js_util.setProperty(l, 'a', list);
|
|
expect(identical(l.a, list), isTrue);
|
|
l.JS$class = 42;
|
|
expect(l.JS$class, equals(42));
|
|
js_util.setProperty(l, 'class', 100);
|
|
expect(l.JS$class, equals(100));
|
|
});
|
|
});
|
|
|
|
group('callMethod', () {
|
|
test('html object', () {
|
|
var canvas = new CanvasElement();
|
|
expect(
|
|
identical(canvas.getContext('2d'),
|
|
js_util.callMethod(canvas, 'getContext', ['2d'])),
|
|
isTrue);
|
|
});
|
|
|
|
test('typed object', () {
|
|
var f = new Foo(42);
|
|
expect(js_util.callMethod(f, 'bar', []), equals(42));
|
|
});
|
|
});
|
|
|
|
group('instanceof', () {
|
|
test('html object', () {
|
|
var canvas = new Element.tag('canvas');
|
|
expect(js_util.instanceof(canvas, JSNodeType), isTrue);
|
|
expect(js_util.instanceof(canvas, JSTextType), isFalse);
|
|
expect(js_util.instanceof(canvas, JSElementType), isTrue);
|
|
expect(js_util.instanceof(canvas, JSHtmlCanvasElementType), isTrue);
|
|
var div = new Element.tag('div');
|
|
expect(js_util.instanceof(div, JSNodeType), isTrue);
|
|
expect(js_util.instanceof(div, JSTextType), isFalse);
|
|
expect(js_util.instanceof(div, JSElementType), isTrue);
|
|
expect(js_util.instanceof(div, JSHtmlCanvasElementType), isFalse);
|
|
|
|
var text = new Text('foo');
|
|
expect(js_util.instanceof(text, JSNodeType), isTrue);
|
|
expect(js_util.instanceof(text, JSTextType), isTrue);
|
|
expect(js_util.instanceof(text, JSElementType), isFalse);
|
|
});
|
|
|
|
test('typed object', () {
|
|
var f = new Foo(42);
|
|
expect(js_util.instanceof(f, JSFooType), isTrue);
|
|
expect(js_util.instanceof(f, JSNodeType), isFalse);
|
|
});
|
|
|
|
test('typed literal', () {
|
|
var l = new ExampleTypedLiteral();
|
|
expect(js_util.instanceof(l, JSFooType), isFalse);
|
|
});
|
|
});
|
|
|
|
group('callConstructor', () {
|
|
test('html object', () {
|
|
var textNode = js_util.callConstructor(JSTextType, ['foo']);
|
|
expect(js_util.instanceof(textNode, JSTextType), isTrue);
|
|
expect(textNode is Text, isTrue);
|
|
expect(textNode.text, equals('foo'));
|
|
});
|
|
|
|
test('typed object', () {
|
|
Foo f = js_util.callConstructor(JSFooType, [42]);
|
|
expect(f.a, equals(42));
|
|
});
|
|
});
|
|
}
|