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

Unified Diff: pkg/serialization/test/serialization_test.dart

Issue 11931030: Add a MapRule (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Changes from review comments 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/serialization/lib/src/serialization_rule.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/serialization/test/serialization_test.dart
diff --git a/pkg/serialization/test/serialization_test.dart b/pkg/serialization/test/serialization_test.dart
index 73e2e13340bb5731ada01110587c69f76593e213..9279ffa384b1b4061eac3681335582d0a3005254 100644
--- a/pkg/serialization/test/serialization_test.dart
+++ b/pkg/serialization/test/serialization_test.dart
@@ -47,15 +47,19 @@ main() {
// actually writing.
var w = new Writer(s);
w.write(p1);
- var flatPerson = w.states[3].first;
+ var personRule = s.rules.firstMatching(
+ (x) => x is BasicRule && x.type == reflect(p1).type);
+ var flatPerson = w.states[personRule.number].first;
var primStates = w.states.first;
expect(primStates.isEmpty, true);
expect(flatPerson["name"], "Alice");
var ref = flatPerson["address"];
expect(ref is Reference, true);
- expect(ref.ruleNumber, 4);
+ var addressRule = s.rules.firstMatching(
+ (x) => x is BasicRule && x.type == reflect(a1).type);
+ expect(ref.ruleNumber, addressRule.number);
expect(ref.objectNumber, 0);
- expect(w.states[4].first['street'], 'N 34th');
+ expect(w.states[addressRule.number].first['street'], 'N 34th');
});
test('exclude fields', () {
@@ -206,9 +210,11 @@ main() {
var w = new Writer(s);
w.trace = new Trace(w);
w.write(n1);
- expect(w.states.length, 4); // prims, lists, essential lists, basic
+ expect(w.states.length, 5); // prims, lists, essential lists, basic
var children = 0, name = 1, parent = 2;
- List rootNode = w.states[3].where((x) => x[name] == "1").toList();
+ var nodeRule = s.rules.firstMatching((x) => x is BasicRule);
+ List rootNode = w.states[nodeRule.number].where(
+ (x) => x[name] == "1").toList();
rootNode = rootNode.first;
expect(rootNode[parent], isNull);
var list = w.states[1].first;
@@ -372,6 +378,25 @@ main() {
expect(a2.city, "Seattle");
});
+ test("Straight JSON format, root is a Map", () {
+ // Note that we can't use the usual round-trip test because it has cycles.
+ var p1 = new Person()..name = 'Alice'..address = a1;
+ // Use maps for one rule, lists for the other.
+ var s = new Serialization()
+ ..addRuleFor(a1)
+ ..addRuleFor(p1).configureForMaps();
+ var format = new SimpleJsonFormat(storeRoundTripInfo: true);
+ var writer = s.newWriter(format);
+ var out = writer.write({"stuff" : p1});
+ var reader = s.newReader(format);
+ var p2 = reader.read(out)["stuff"];
+ expect(p2.name, "Alice");
+ var a2 = p2.address;
+ expect(a2.street, "N 34th");
+ expect(a2.city, "Seattle");
+ });
+
+
test("Straight JSON format, round-trip with named objects", () {
// Note that we can't use the usual round-trip test because it has cycles.
var p1 = new Person()..name = 'Alice'..address = a1;
@@ -389,6 +414,54 @@ main() {
var a2 = p2.address;
expect(a2, 12);
});
+
+ test("Maps", () {
+ var s = new Serialization()..selfDescribing = false;
+ var p1 = new Person()..name = 'Alice'..address = a1;
+ var data = new Map();
+ data["simple data"] = 1;
+ data[p1] = a1;
+ data[a1] = p1;
+ var formats = [new SimpleFlatFormat(), new SimpleMapFormat(),
+ new SimpleJsonFormat(storeRoundTripInfo: true)];
+ for (var eachFormat in formats) {
+ var output = s.write(data, eachFormat);
+ var reader = s.newReader(eachFormat);
+ var input = reader.read(output);
+ expect(input["simple data"], data["simple data"]);
+ var p2 = input.keys.firstMatching((x) => x is Person);
+ var a2 = input.keys.firstMatching((x) => x is Address);
+ if (eachFormat is SimpleJsonFormat) {
+ // JSON doesn't handle cycles, so these won't be identical.
+ expect(input[p2] is Address, isTrue);
+ expect(input[a2] is Person, isTrue);
+ var a3 = input[p2];
+ expect(a3.city, a2.city);
+ expect(a3.state, a2.state);
+ expect(a3.state, a2.state);
+ var p3 = input[a2];
+ expect(p3.name, p2.name);
+ expect(p3.rank, p2.rank);
+ expect(p3.address.city, a2.city);
+ } else {
+ expect(input[p2], same(a2));
+ expect(input[a2], same(p2));
+ }
+ }
+ });
+
+ test("Map with string keys stays that way", () {
+ var s = new Serialization()..addRuleFor(new Person());
+ var data = {"abc" : 1, "def" : "ghi"};
+ data["person"] = new Person()..name = "Foo";
+ var output = s.write(data, new SimpleMapFormat());
+ var mapRule = s.rules.firstMatching((x) => x is MapRule);
+ var map = json.parse(output)["data"][mapRule.number][0];
+ expect(map is Map, isTrue);
+ expect(map["abc"], 1);
+ expect(map["def"], "ghi");
+ expect(new Reader(s).asReference(map["person"]) is Reference, isTrue);
+ });
}
/******************************************************************************
@@ -413,10 +486,11 @@ Serialization metaSerialization() {
'constructorName',
'constructorFields', 'regularFields', []],
fields: [])
- ..addRuleFor(new Serialization()).setFieldWith('rules',
- (InstanceMirror s, List rules) {
+ ..addRuleFor(new Serialization(), constructor: "blank")
+ .setFieldWith('rules',
+ (InstanceMirror s, List rules) {
rules.forEach((x) => s.reflectee.addRule(x));
- })
+ })
..addRule(new NamedObjectRule())
..addRule(new MirrorRule());
return meta;
@@ -441,7 +515,7 @@ Reader setUpReader(aSerialization, sampleData) {
var reader = new Reader(aSerialization);
// We're not sure which rule needs the sample data, so put it everywhere
// and trust that the extra will just be ignored.
- reader.data = [[sampleData], [sampleData], [sampleData], [sampleData]];
+ reader.data = new List.filled(10, [sampleData]);
return reader;
}
@@ -574,4 +648,4 @@ class NodeRule extends CustomRule {
node.parent = state[0];
node.children = state[2];
}
-}
+}
« no previous file with comments | « pkg/serialization/lib/src/serialization_rule.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698