| OLD | NEW |
| (Empty) |
| 1 library tests; | |
| 2 | |
| 3 import 'dart:html'; | |
| 4 | |
| 5 import 'package:js/js.dart' as js; | |
| 6 import 'package:js/js_wrapping.dart' as jsw; | |
| 7 import 'package:unittest/unittest.dart'; | |
| 8 import 'package:unittest/html_config.dart'; | |
| 9 | |
| 10 abstract class _Person { | |
| 11 String firstname; | |
| 12 | |
| 13 String sayHello(); | |
| 14 } | |
| 15 class PersonMP extends jsw.MagicProxy implements _Person { | |
| 16 PersonMP(String firstname, String lastname) : | |
| 17 super(js.context.Person, [firstname, lastname]); | |
| 18 PersonMP.fromProxy(js.Proxy proxy) : super.fromProxy(proxy); | |
| 19 } | |
| 20 | |
| 21 class PersonTP extends jsw.TypedProxy { | |
| 22 static PersonTP cast(js.Proxy proxy) => proxy == null ? null : | |
| 23 new PersonTP.fromProxy(proxy); | |
| 24 | |
| 25 PersonTP(String firstname, String lastname) : | |
| 26 super(js.context.Person, [firstname, lastname]); | |
| 27 PersonTP.fromProxy(js.Proxy proxy) : super.fromProxy(proxy); | |
| 28 | |
| 29 set firstname(String firstname) => $unsafe.firstname = firstname; | |
| 30 String get firstname => $unsafe.firstname; | |
| 31 | |
| 32 List<PersonTP> get children => | |
| 33 jsw.JsArrayToListAdapter.castListOfSerializables($unsafe.children, | |
| 34 PersonTP.cast); | |
| 35 set father(PersonTP father) => $unsafe.father = father; | |
| 36 PersonTP get father => PersonTP.cast($unsafe.father); | |
| 37 | |
| 38 String sayHello() => $unsafe.sayHello(); | |
| 39 } | |
| 40 | |
| 41 class Color implements js.Serializable<String> { | |
| 42 static final RED = new Color._("red"); | |
| 43 static final BLUE = new Color._("blue"); | |
| 44 | |
| 45 final String _value; | |
| 46 | |
| 47 Color._(this._value); | |
| 48 | |
| 49 String toJs() => this._value; | |
| 50 operator ==(Color other) => this._value == other._value; | |
| 51 } | |
| 52 | |
| 53 main() { | |
| 54 useHtmlConfiguration(); | |
| 55 | |
| 56 test('TypedProxy', () { | |
| 57 js.scoped(() { | |
| 58 final john = new PersonTP('John', 'Doe'); | |
| 59 expect(john.firstname, equals('John')); | |
| 60 john.firstname = 'Joe'; | |
| 61 expect(john.firstname, equals('Joe')); | |
| 62 }); | |
| 63 }); | |
| 64 | |
| 65 test('MagicProxy', () { | |
| 66 js.scoped(() { | |
| 67 final john = new PersonMP('John', 'Doe'); | |
| 68 expect(john.firstname, equals('John')); | |
| 69 expect(john['firstname'], equals('John')); | |
| 70 john.firstname = 'Joe'; | |
| 71 expect(john.firstname, equals('Joe')); | |
| 72 expect(john['firstname'], equals('Joe')); | |
| 73 john['firstname'] = 'John'; | |
| 74 expect(john.firstname, equals('John')); | |
| 75 expect(john['firstname'], equals('John')); | |
| 76 }); | |
| 77 }); | |
| 78 | |
| 79 test('function call', () { | |
| 80 js.scoped(() { | |
| 81 final john = new PersonTP('John', 'Doe'); | |
| 82 expect(john.sayHello(), equals("Hello, I'm John Doe")); | |
| 83 }); | |
| 84 }); | |
| 85 | |
| 86 test('JsDateToDateTimeAdapter', () { | |
| 87 js.scoped(() { | |
| 88 final date = new DateTime.now(); | |
| 89 final jsDate = new jsw.JsDateToDateTimeAdapter(date); | |
| 90 expect(jsDate.millisecondsSinceEpoch, | |
| 91 equals(date.millisecondsSinceEpoch)); | |
| 92 jsDate.$unsafe.setFullYear(2000); | |
| 93 expect(jsDate.year, equals(2000)); | |
| 94 }); | |
| 95 }); | |
| 96 | |
| 97 group('JsArrayToListAdapter', () { | |
| 98 test('iterator', () { | |
| 99 js.scoped(() { | |
| 100 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 101 js.array(["e0", "e1", "e2"])); | |
| 102 | |
| 103 final iterator = m.iterator; | |
| 104 iterator.moveNext(); | |
| 105 expect(iterator.current, equals("e0")); | |
| 106 iterator.moveNext(); | |
| 107 expect(iterator.current, equals("e1")); | |
| 108 iterator.moveNext(); | |
| 109 expect(iterator.current, equals("e2")); | |
| 110 }); | |
| 111 }); | |
| 112 test('get length', () { | |
| 113 js.scoped(() { | |
| 114 final m1 = new jsw.JsArrayToListAdapter<String>.fromProxy(js.array([])); | |
| 115 expect(m1.length, equals(0)); | |
| 116 final m2 = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 117 js.array(["a", "b"])); | |
| 118 expect(m2.length, equals(2)); | |
| 119 }); | |
| 120 }); | |
| 121 test('add', () { | |
| 122 js.scoped(() { | |
| 123 final m = new jsw.JsArrayToListAdapter<String>.fromProxy(js.array([])); | |
| 124 expect(m.length, equals(0)); | |
| 125 m.add("a"); | |
| 126 expect(m.length, equals(1)); | |
| 127 expect(m[0], equals("a")); | |
| 128 m.add("b"); | |
| 129 expect(m.length, equals(2)); | |
| 130 expect(m[0], equals("a")); | |
| 131 expect(m[1], equals("b")); | |
| 132 }); | |
| 133 }); | |
| 134 test('clear', () { | |
| 135 js.scoped(() { | |
| 136 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 137 js.array(["a", "b"])); | |
| 138 expect(m.length, equals(2)); | |
| 139 m.clear(); | |
| 140 expect(m.length, equals(0)); | |
| 141 }); | |
| 142 }); | |
| 143 test('remove', () { | |
| 144 js.scoped(() { | |
| 145 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 146 js.array(["a", "b"])); | |
| 147 expect(m.length, equals(2)); | |
| 148 m.remove("a"); | |
| 149 expect(m.length, equals(1)); | |
| 150 expect(m[0], equals("b")); | |
| 151 }); | |
| 152 }); | |
| 153 test('operator []', () { | |
| 154 js.scoped(() { | |
| 155 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 156 js.array(["a", "b"])); | |
| 157 expect(() => m[-1], throwsA(isRangeError)); | |
| 158 expect(() => m[2], throwsA(isRangeError)); | |
| 159 expect(m[0], equals("a")); | |
| 160 expect(m[1], equals("b")); | |
| 161 }); | |
| 162 }); | |
| 163 test('operator []=', () { | |
| 164 js.scoped(() { | |
| 165 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 166 js.array(["a", "b"])); | |
| 167 expect(() => m[-1] = "c", throwsA(isRangeError)); | |
| 168 expect(() => m[2] = "c", throwsA(isRangeError)); | |
| 169 m[0] = "d"; | |
| 170 m[1] = "e"; | |
| 171 expect(m[0], equals("d")); | |
| 172 expect(m[1], equals("e")); | |
| 173 }); | |
| 174 }); | |
| 175 test('set length', () { | |
| 176 js.scoped(() { | |
| 177 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 178 js.array(["a", "b"])); | |
| 179 m.length = 10; | |
| 180 expect(m.length, equals(10)); | |
| 181 expect(m[5], equals(null)); | |
| 182 m.length = 1; | |
| 183 expect(m.length, equals(1)); | |
| 184 expect(m[0], equals("a")); | |
| 185 }); | |
| 186 }); | |
| 187 test('sort', () { | |
| 188 js.scoped(() { | |
| 189 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 190 js.array(["c", "a", "b"])); | |
| 191 m.sort(); | |
| 192 expect(m.length, equals(3)); | |
| 193 expect(m[0], equals("a")); | |
| 194 expect(m[1], equals("b")); | |
| 195 expect(m[2], equals("c")); | |
| 196 }); | |
| 197 }); | |
| 198 test('insert', () { | |
| 199 js.scoped(() { | |
| 200 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 201 js.array(["a", "b", "c"])); | |
| 202 m.insert(1, "d"); | |
| 203 expect(m.length, equals(4)); | |
| 204 expect(m[0], equals("a")); | |
| 205 expect(m[1], equals("d")); | |
| 206 expect(m[2], equals("b")); | |
| 207 expect(m[3], equals("c")); | |
| 208 }); | |
| 209 }); | |
| 210 test('removeAt', () { | |
| 211 js.scoped(() { | |
| 212 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 213 js.array(["a", "b", "c"])); | |
| 214 expect(m.removeAt(1), equals("b")); | |
| 215 expect(m.length, equals(2)); | |
| 216 expect(m[0], equals("a")); | |
| 217 expect(m[1], equals("c")); | |
| 218 expect(() => m.removeAt(2), throwsA(isRangeError)); | |
| 219 }); | |
| 220 }); | |
| 221 test('removeLast', () { | |
| 222 js.scoped(() { | |
| 223 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 224 js.array(["a", "b", "c", null])); | |
| 225 expect(m.removeLast(), isNull); | |
| 226 expect(m.removeLast(), equals("c")); | |
| 227 expect(m.removeLast(), equals("b")); | |
| 228 expect(m.removeLast(), equals("a")); | |
| 229 expect(m.length, equals(0)); | |
| 230 }); | |
| 231 }); | |
| 232 test('sublist', () { | |
| 233 js.scoped(() { | |
| 234 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 235 js.array(["a", "b", "c", null])); | |
| 236 final sl1 = m.sublist(2); | |
| 237 expect(sl1.length, equals(2)); | |
| 238 expect(sl1[0], equals("c")); | |
| 239 expect(sl1[1], isNull); | |
| 240 final sl2 = m.sublist(1, 3); | |
| 241 expect(sl2.length, equals(2)); | |
| 242 expect(sl2[0], equals("b")); | |
| 243 expect(sl2[1], equals("c")); | |
| 244 }); | |
| 245 }); | |
| 246 test('setRange', () { | |
| 247 js.scoped(() { | |
| 248 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 249 js.array(["a", "b", "c", null])); | |
| 250 m.setRange(1, 2, [null, null]); | |
| 251 expect(m.length, equals(4)); | |
| 252 expect(m[0], equals("a")); | |
| 253 expect(m[1], isNull); | |
| 254 expect(m[2], isNull); | |
| 255 expect(m[3], isNull); | |
| 256 m.setRange(3, 1, [null, "c", null], 1); | |
| 257 expect(m[0], equals("a")); | |
| 258 expect(m[1], isNull); | |
| 259 expect(m[2], isNull); | |
| 260 expect(m[3], equals("c")); | |
| 261 }); | |
| 262 }); | |
| 263 test('removeRange', () { | |
| 264 js.scoped(() { | |
| 265 final m = new jsw.JsArrayToListAdapter<String>.fromProxy( | |
| 266 js.array(["a", "b", "c", null])); | |
| 267 m.removeRange(1, 3); | |
| 268 expect(m.length, equals(2)); | |
| 269 expect(m[0], equals("a")); | |
| 270 expect(m[1], isNull); | |
| 271 }); | |
| 272 }); | |
| 273 | |
| 274 test('bidirectionnal serialization of Proxy', () { | |
| 275 js.scoped(() { | |
| 276 js.context.myArray = js.array([]); | |
| 277 final myList = new jsw.JsArrayToListAdapter<PersonTP>.fromProxy( | |
| 278 js.context.myArray, new jsw.TranslatorForSerializable<PersonTP>( | |
| 279 (p) => new PersonTP.fromProxy(p))); | |
| 280 | |
| 281 myList.add(new PersonTP('John', 'Doe')); | |
| 282 myList.add(null); | |
| 283 expect(myList[0].firstname, 'John'); | |
| 284 expect(myList[1], isNull); | |
| 285 }); | |
| 286 }); | |
| 287 | |
| 288 test('family', () { | |
| 289 js.scoped(() { | |
| 290 final father = new PersonTP("John", "Doe"); | |
| 291 final child1 = new PersonTP("Lewis", "Doe") | |
| 292 ..father = father; | |
| 293 final child2 = new PersonTP("Andy", "Doe") | |
| 294 ..father = father; | |
| 295 father.children.addAll([child1, child2]); | |
| 296 expect(father.children.length, 2); | |
| 297 expect(father.children.map((p) => p.firstname).join(","), "Lewis,Andy"); | |
| 298 expect(child1.father.firstname, "John"); | |
| 299 }); | |
| 300 }); | |
| 301 | |
| 302 test('bidirectionnal serialization of Serializable', () { | |
| 303 js.scoped(() { | |
| 304 js.context.myArray = js.array([]); | |
| 305 final myList = new jsw.JsArrayToListAdapter<Color>.fromProxy( | |
| 306 js.context.myArray, | |
| 307 new jsw.Translator<Color>( | |
| 308 (e) => e != null ? new Color._(e) : null, | |
| 309 (e) => e != null ? e.toJs() : null | |
| 310 ) | |
| 311 ); | |
| 312 | |
| 313 myList.add(Color.BLUE); | |
| 314 myList.add(null); | |
| 315 expect(myList[0], Color.BLUE); | |
| 316 expect(myList[1], isNull); | |
| 317 }); | |
| 318 }); | |
| 319 }); | |
| 320 | |
| 321 group('JsObjectToMapAdapter', () { | |
| 322 test('get keys', () { | |
| 323 js.scoped(() { | |
| 324 final m = new jsw.JsObjectToMapAdapter<int>.fromProxy( | |
| 325 js.map({"a": 1, "b": 2})); | |
| 326 final keys = m.keys; | |
| 327 expect(keys.length, equals(2)); | |
| 328 expect(keys, contains("a")); | |
| 329 expect(keys, contains("b")); | |
| 330 }); | |
| 331 }); | |
| 332 test('containsKey', () { | |
| 333 js.scoped(() { | |
| 334 final m = new jsw.JsObjectToMapAdapter.fromProxy( | |
| 335 js.map({"a": 1, "b": "c"})); | |
| 336 expect(m.containsKey("a"), equals(true)); | |
| 337 expect(m.containsKey("d"), equals(false)); | |
| 338 }); | |
| 339 }); | |
| 340 test('operator []', () { | |
| 341 js.scoped(() { | |
| 342 final m = new jsw.JsObjectToMapAdapter.fromProxy( | |
| 343 js.map({"a": 1, "b": "c"})); | |
| 344 expect(m["a"], equals(1)); | |
| 345 expect(m["b"], equals("c")); | |
| 346 }); | |
| 347 }); | |
| 348 test('operator []=', () { | |
| 349 js.scoped(() { | |
| 350 final m = new jsw.JsObjectToMapAdapter.fromProxy(js.map({})); | |
| 351 m["a"] = 1; | |
| 352 expect(m["a"], equals(1)); | |
| 353 expect(m.length, equals(1)); | |
| 354 m["b"] = "c"; | |
| 355 expect(m["b"], equals("c")); | |
| 356 expect(m.length, equals(2)); | |
| 357 }); | |
| 358 }); | |
| 359 test('remove', () { | |
| 360 js.scoped(() { | |
| 361 final m = new jsw.JsObjectToMapAdapter.fromProxy( | |
| 362 js.map({"a": 1, "b": "c"})); | |
| 363 expect(m.remove("a"), equals(1)); | |
| 364 expect(m["b"], equals("c")); | |
| 365 expect(m.length, equals(1)); | |
| 366 }); | |
| 367 }); | |
| 368 | |
| 369 test('bidirectionnal serialization of Proxy', () { | |
| 370 js.scoped(() { | |
| 371 final myMap = new jsw.JsObjectToMapAdapter<PersonTP>.fromProxy( | |
| 372 js.map({}), new jsw.TranslatorForSerializable<PersonTP>((p) => | |
| 373 new PersonTP.fromProxy(p))); | |
| 374 myMap["a"] = new PersonTP('John', 'Doe'); | |
| 375 expect(myMap["a"].firstname, 'John'); | |
| 376 }); | |
| 377 }); | |
| 378 }); | |
| 379 | |
| 380 test('retain/release', () { | |
| 381 PersonTP john; | |
| 382 js.scoped(() { | |
| 383 john = new PersonTP('John', 'Doe'); | |
| 384 }); | |
| 385 js.scoped((){ | |
| 386 expect(() => john.sayHello(), throws); | |
| 387 }); | |
| 388 js.scoped(() { | |
| 389 john = new PersonTP('John', 'Doe'); | |
| 390 js.retain(john); | |
| 391 }); | |
| 392 js.scoped((){ | |
| 393 expect(() => john.sayHello(), returnsNormally); | |
| 394 js.release(john); | |
| 395 }); | |
| 396 js.scoped((){ | |
| 397 expect(() => john.sayHello(), throws); | |
| 398 }); | |
| 399 }); | |
| 400 } | |
| OLD | NEW |