Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Side by Side Diff: pkg/serialization/test/serialization_test.dart

Issue 11820032: Make input/output formats pluggable, adapt to new libraries (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library serialization_test; 5 library serialization_test;
6 6
7 import 'dart:json' as json;
7 import 'package:unittest/unittest.dart'; 8 import 'package:unittest/unittest.dart';
8 import 'package:serialization/serialization.dart'; 9 import 'package:serialization/serialization.dart';
9 import 'package:serialization/src/serialization_helpers.dart'; 10 import 'package:serialization/src/serialization_helpers.dart';
10 import 'package:serialization/src/mirrors_helpers.dart'; 11 import 'package:serialization/src/mirrors_helpers.dart';
11 12
12 part 'test_models.dart'; 13 part 'test_models.dart';
13 14
14 main() { 15 main() {
15 var p1 = new Person(); 16 var p1 = new Person();
16 var a1 = new Address(); 17 var a1 = new Address();
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 }); 230 });
230 231
231 test('round-trip, flat format', () { 232 test('round-trip, flat format', () {
232 runRoundTripTestFlat(nodeSerializerReflective); 233 runRoundTripTestFlat(nodeSerializerReflective);
233 }); 234 });
234 235
235 test('round-trip using Maps', () { 236 test('round-trip using Maps', () {
236 runRoundTripTest(nodeSerializerUsingMaps); 237 runRoundTripTest(nodeSerializerUsingMaps);
237 }); 238 });
238 239
240 test('round-trip, flat format, using maps', () {
241 runRoundTripTestFlat(nodeSerializerUsingMaps);
242 });
243
239 test('round-trip with Node CustomRule', () { 244 test('round-trip with Node CustomRule', () {
240 runRoundTripTestFlat(nodeSerializerCustom); 245 runRoundTripTestFlat(nodeSerializerCustom);
241 }); 246 });
242 247
243 test('round-trip with Node CustomRule, to maps', () { 248 test('round-trip with Node CustomRule, to maps', () {
244 runRoundTripTest(nodeSerializerCustom); 249 runRoundTripTest(nodeSerializerCustom);
245 }); 250 });
246 251
247 test('eating your own tail', () { 252 test('eating your own tail', () {
248 // Create a meta-serializer, that serializes serializations, then 253 // Create a meta-serializer, that serializes serializations, then
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 expect(identical(m2.parent, m3.parent), isTrue); 307 expect(identical(m2.parent, m3.parent), isTrue);
303 }); 308 });
304 309
305 test("Constant values as fields", () { 310 test("Constant values as fields", () {
306 var s = new Serialization() 311 var s = new Serialization()
307 ..selfDescribing = false 312 ..selfDescribing = false
308 ..addRuleFor(a1, 313 ..addRuleFor(a1,
309 constructor: 'withData', 314 constructor: 'withData',
310 constructorFields: ["street", "Kirkland", "WA", "98103"], 315 constructorFields: ["street", "Kirkland", "WA", "98103"],
311 fields: []); 316 fields: []);
312 var out = s.write(a1); 317 String out = s.write(a1);
313 var newAddress = s.read(out); 318 var newAddress = s.read(out);
314 expect(newAddress.street, a1.street); 319 expect(newAddress.street, a1.street);
315 expect(newAddress.city, "Kirkland"); 320 expect(newAddress.city, "Kirkland");
316 expect(newAddress.state, "WA"); 321 expect(newAddress.state, "WA");
317 expect(newAddress.zip, "98103"); 322 expect(newAddress.zip, "98103");
318 }); 323 });
319 324
325 // test("Straight JSON format", () {
Jennifer Messerly 2013/01/11 02:21:53 what's the status of this test?
Alan Knight 2013/01/11 19:18:11 Oops. Restored.
326 // var s = new Serialization();
327 // var writer = s.newWriter(new SimpleJSONFormat());
328 // var out = writer.write(a1);
329 // var reconstituted = JSON.parse(out);
330 // expect(reconstituted.length, 4);
331 // expect(reconstituted[0], "Seattle");
332 // });
333
334 test("Straight JSON format, nested objects", () {
335 var p1 = new Person()..name = 'Alice'..address = a1;
336 var s = new Serialization()
337 ..addRuleFor(a1).configureForMaps()
338 ..addRuleFor(p1).configureForMaps();
339 var writer = s.newWriter(new SimpleJSONFormat(true));
340 var out = writer.write(p1);
341 var reconstituted = json.parse(out);
Jennifer Messerly 2013/01/11 02:21:53 it would be interesting to see the full JSON map h
Alan Knight 2013/01/11 19:18:11 Nice. Done.
342 expect(reconstituted.length, 5);
343 expect(reconstituted["name"], "Alice");
344 var address = reconstituted["address"];
345 expect(address.length, 5);
346 expect(address["street"], "N 34th");
347 });
348
349 test("Straight JSON format, round-trip", () {
350 // Note that we can't use the usual round-trip test because it has cycles.
351 var p1 = new Person()..name = 'Alice'..address = a1;
352 // Use maps for one rule, lists for the other.
353 var s = new Serialization()
354 ..addRuleFor(a1)
355 ..addRuleFor(p1).configureForMaps();
356 var writer = s.newWriter(new SimpleJSONFormat(true));
357 var out = writer.write(p1);
358 var reader = s.newReader(new SimpleJSONFormat(true));
359 var p2 = reader.read(out);
360 expect(p2.name, "Alice");
361 var a2 = p2.address;
362 expect(a2.street, "N 34th");
363 expect(a2.city, "Seattle");
364 });
365
366 test("Straight JSON format, round-trip with named objects", () {
367 // Note that we can't use the usual round-trip test because it has cycles.
368 var p1 = new Person()..name = 'Alice'..address = a1;
369 // Use maps for one rule, lists for the other.
370 var s = new Serialization()
371 ..addRule(new NamedObjectRule())
372 ..addRuleFor(a1)
373 ..addRuleFor(p1).configureForMaps()
374 ..namedObjects["foo"] = a1;
375 var writer = s.newWriter(new SimpleJSONFormat(true));
376 var out = writer.write(p1);
377 var reader = s.newReader(new SimpleJSONFormat(true));
378 var p2 = reader.read(out, {"foo" : 12});
379 expect(p2.name, "Alice");
380 var a2 = p2.address;
381 expect(a2, 12);
382 });
320 } 383 }
321 384
322 /****************************************************************************** 385 /******************************************************************************
323 * The end of the tests and the beginning of various helper functions to make 386 * The end of the tests and the beginning of various helper functions to make
324 * it easier to write the repetitive sections. 387 * it easier to write the repetitive sections.
325 ******************************************************************************/ 388 ******************************************************************************/
326 389
327 /** Create a Serialization for serializing Serializations. */ 390 /** Create a Serialization for serializing Serializations. */
328 Serialization metaSerialization() { 391 Serialization metaSerialization() {
329 // Make some bogus rule instances so we have something to feed rule creation 392 // Make some bogus rule instances so we have something to feed rule creation
(...skipping 18 matching lines...) Expand all
348 ..addRule(new NamedObjectRule()) 411 ..addRule(new NamedObjectRule())
349 ..addRule(new MirrorRule()); 412 ..addRule(new MirrorRule());
350 return meta; 413 return meta;
351 } 414 }
352 415
353 /** 416 /**
354 * Read back a simple object, assumed to be the only one of its class in the 417 * Read back a simple object, assumed to be the only one of its class in the
355 * reader. 418 * reader.
356 */ 419 */
357 readBackSimple(Serialization s, object, Reader reader) { 420 readBackSimple(Serialization s, object, Reader reader) {
358 var rule = s.rulesFor(object, null)[0]; 421 var rule = s.rulesFor(object, null).first;
359 reader.inflateForRule(rule); 422 reader.inflateForRule(rule);
360 var list2 = reader.allObjectsForRule(rule)[0]; 423 var list2 = reader.allObjectsForRule(rule).first;
361 return list2; 424 return list2;
362 } 425 }
363 426
364 /** 427 /**
365 * Set up a basic reader with some fake data. Hard-codes the assumption 428 * Set up a basic reader with some fake data. Hard-codes the assumption
366 * of how many rules there are. 429 * of how many rules there are.
367 */ 430 */
368 Reader setUpReader(aSerialization, sampleData) { 431 Reader setUpReader(aSerialization, sampleData) {
369 var reader = new Reader(aSerialization); 432 var reader = new Reader(aSerialization);
370 // We're not sure which rule needs the sample data, so put it everywhere 433 // We're not sure which rule needs the sample data, so put it everywhere
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 /** 526 /**
464 * Run a round-trip test on a simple of nodes, but using the flat format 527 * Run a round-trip test on a simple of nodes, but using the flat format
465 * rather than the maps. 528 * rather than the maps.
466 */ 529 */
467 runRoundTripTestFlat(serializerSetUp) { 530 runRoundTripTestFlat(serializerSetUp) {
468 Node n1 = new Node("1"), n2 = new Node("2"), n3 = new Node("3"); 531 Node n1 = new Node("1"), n2 = new Node("2"), n3 = new Node("3");
469 n1.children = [n2, n3]; 532 n1.children = [n2, n3];
470 n2.parent = n1; 533 n2.parent = n1;
471 n3.parent = n1; 534 n3.parent = n1;
472 var s = serializerSetUp(n1); 535 var s = serializerSetUp(n1);
473 var output = s.writeFlat(n2); 536 var output = s.write(n2, new SimpleFlatFormat());
474 expect(output is List, isTrue); 537 expect(output is List, isTrue);
475 var s2 = serializerSetUp(n1); 538 var s2 = serializerSetUp(n1);
476 var reader = new Reader(s2); 539 var reader = new Reader(s2, new SimpleFlatFormat());
477 var m2 = reader.readFlat(output); 540 var m2 = reader.read(output);
478 var m1 = m2.parent; 541 var m1 = m2.parent;
479 expect(m1 is Node, isTrue); 542 expect(m1 is Node, isTrue);
480 var children = m1.children; 543 var children = m1.children;
481 expect(m1.name,"1"); 544 expect(m1.name,"1");
482 var m3 = m1.children.last; 545 var m3 = m1.children.last;
483 expect(m2.name, "2"); 546 expect(m2.name, "2");
484 expect(m3.name, "3"); 547 expect(m3.name, "3");
485 expect(m2.parent, m1); 548 expect(m2.parent, m1);
486 expect(m3.parent, m1); 549 expect(m3.parent, m1);
487 expect(m1.parent, isNull); 550 expect(m1.parent, isNull);
488 } 551 }
489 552
490 /** Extract the state from [object] using the rules in [s] and return it. */ 553 /** Extract the state from [object] using the rules in [s] and return it. */
491 states(object, Serialization s) { 554 states(object, Serialization s) {
492 var rules = s.rulesFor(object, null); 555 var rules = s.rulesFor(object, null);
493 return rules.mappedBy((x) => x.extractState(object, doNothing)).toList(); 556 return rules.mappedBy((x) => x.extractState(object, doNothing)).toList();
494 } 557 }
495 558
496 /** A hard-coded rule for serializing Node instances. */ 559 /** A hard-coded rule for serializing Node instances. */
497 class NodeRule extends CustomRule { 560 class NodeRule extends CustomRule {
498 bool appliesTo(instance, _) => instance is Node; 561 bool appliesTo(instance, _) => instance.runtimeType == Node;
499 getState(instance) => [instance.parent, instance.name, instance.children]; 562 getState(instance) => [instance.parent, instance.name, instance.children];
500 create(state) => new Node(state[1]); 563 create(state) => new Node(state[1]);
501 setState(Node node, state) { 564 setState(Node node, state) {
502 node.parent = state[0]; 565 node.parent = state[0];
503 node.children = state[2]; 566 node.children = state[2];
504 } 567 }
505 } 568 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698