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

Side by Side Diff: test/event_test.dart

Issue 1282103003: fix inconsistent firing of events for extension fields (Closed) Base URL: git@github.com:dart-lang/dart-protobuf.git@fieldtype
Patch Set: tweak a comment Created 5 years, 4 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
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 /// Tests event delivery using PbEventMixin. 5 /// Tests event delivery using PbEventMixin.
6 library event_test; 6 library event_test;
7 7
8 import 'dart:typed_data' show Uint8List; 8 import 'dart:typed_data' show Uint8List;
9 9
10 import 'package:protobuf/protobuf.dart' show GeneratedMessage; 10 import 'package:protobuf/protobuf.dart'
11 show GeneratedMessage, Extension, ExtensionRegistry, FieldType;
11 import 'package:protobuf/src/protobuf/mixins/event_mixin.dart' 12 import 'package:protobuf/src/protobuf/mixins/event_mixin.dart'
12 show PbEventMixin, PbFieldChange; 13 show PbEventMixin, PbFieldChange;
13 import 'package:test/test.dart' show test, expect, predicate, same; 14 import 'package:test/test.dart' show test, expect, predicate, same;
14 15
15 import 'mock_util.dart' show MockMessage; 16 import 'mock_util.dart' show MockMessage;
16 17
17 class Rec extends MockMessage with PbEventMixin { 18 class Rec extends MockMessage with PbEventMixin {
18 get className => "Rec"; 19 get className => "Rec";
19 Rec create() => new Rec(); 20 Rec create() => new Rec();
20 } 21 }
21 22
23 Extension comment = new Extension("Rec", "comment", 5, FieldType.OS);
24
22 main() { 25 main() {
23 test('Events are sent when setting and clearing a non-repeated field', () { 26 test('Events are sent when setting and clearing a non-repeated field', () {
24 var log = makeLog(); 27 var log = makeLog();
25 var r = new Rec(); 28 var r = new Rec();
26 r.changes.listen((List<PbFieldChange> changes) { 29 r.changes.listen((List<PbFieldChange> changes) {
27 log.add(changes); 30 log.add(changes);
28 }); 31 });
29 32
30 r.val = 123; 33 r.val = 123;
31 r.deliverChanges(); 34 r.deliverChanges();
32 checkLog(log, [[[1, 42, 123]]]); 35 checkLog(log, [[[1, 42, 123]]]);
33 36
34 r.val = 456; 37 r.val = 456;
35 r.deliverChanges(); 38 r.deliverChanges();
36 checkLog(log, [[[1, 123, 456]]]); 39 checkLog(log, [[[1, 123, 456]]]);
37 40
38 r.val = 456; // no change 41 r.val = 456; // no change
39 r.deliverChanges(); 42 r.deliverChanges();
40 checkLog(log, []); 43 checkLog(log, []);
41 44
42 r.clearField(1); 45 r.clearField(1);
43 r.deliverChanges(); 46 r.deliverChanges();
44 checkLog(log, [[[1, 456, 42]]]); 47 checkLog(log, [[[1, 456, 42]]]);
45 48
46 r.clearField(1); 49 r.clearField(1); // no change
47 r.deliverChanges(); 50 r.deliverChanges();
48 checkLog(log, []); // no change 51 checkLog(log, []);
49 }); 52 });
50 53
51 test('Events are sent when creating and clearing a repeated field', () { 54 test('Events are sent when creating and clearing a repeated field', () {
52 var log = makeLog(); 55 var log = makeLog();
53 var r = new Rec(); 56 var r = new Rec();
54 r.changes.listen((List<PbFieldChange> changes) { 57 r.changes.listen((List<PbFieldChange> changes) {
55 log.add(changes); 58 log.add(changes);
56 }); 59 });
57 60
58 // Accessing a repeated field replaces the default, 61 // Accessing a repeated field replaces the default,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 log.add(changes); 150 log.add(changes);
148 }); 151 });
149 152
150 r.mergeFromBuffer(bytes); 153 r.mergeFromBuffer(bytes);
151 // The changes should not include the repeated message. 154 // The changes should not include the repeated message.
152 r.deliverChanges(); 155 r.deliverChanges();
153 checkLog(log, [ 156 checkLog(log, [
154 [[1, 42, 123], [2, '', "hello"], [3, "<msg>", "<msg>"], [4, [], [456]]] 157 [[1, 42, 123], [2, '', "hello"], [3, "<msg>", "<msg>"], [4, [], [456]]]
155 ]); 158 ]);
156 }); 159 });
160
161 test('Events are not sent (yet) for extensions', () {
162 var log = makeLog();
163 var r = new Rec();
164 r.changes.listen((List<PbFieldChange> changes) {
165 log.add(changes);
166 });
167
168 r.setExtension(comment, "hello");
169 expect(r.getExtension(comment), "hello");
170 r.deliverChanges();
171 checkLog(log, []);
172
173 r.clearExtension(comment);
174 r.deliverChanges();
175 checkLog(log, []);
176
177 r.setExtension(comment, "hello");
178 expect(r.getExtension(comment), "hello");
179 r.clear();
180 r.deliverChanges();
181 checkLog(log, []);
182
183 r.setExtension(comment, "hello");
184 expect(r.getExtension(comment), "hello");
185 r.clearField(comment.tagNumber);
186 r.deliverChanges();
187 checkLog(log, []);
188
189 var registry = new ExtensionRegistry()..add(comment);
190 r.mergeFromJson('{"5": "hello"}', registry);
191 expect(r.getExtension(comment), "hello");
192 r.clear();
193 r.deliverChanges();
194 checkLog(log, []);
195
196 var src = new Rec()..setExtension(comment, "hello");
197 r.mergeFromMessage(src);
198 expect(r.getExtension(comment), "hello");
199 r.clear();
200 r.deliverChanges();
201 checkLog(log, []);
202
203 Uint8List bytes = src.writeToBuffer();
204 r.mergeFromBuffer(bytes, registry);
205 expect(r.getExtension(comment), "hello");
206 r.clear();
207 r.deliverChanges();
208 checkLog(log, []);
209 });
210
157 } 211 }
158 212
159 List<List<PbFieldChange>> makeLog() => <List<PbFieldChange>>[]; 213 List<List<PbFieldChange>> makeLog() => <List<PbFieldChange>>[];
160 214
161 void checkLog(List<List<PbFieldChange>> log, List<List<List>> expected) { 215 void checkLog(List<List<PbFieldChange>> log, List<List<List>> expected) {
162 var actual = <List<List>>[]; 216 var actual = <List<List>>[];
163 for (var list in log) { 217 for (var list in log) {
164 actual.add(list.map(toTuple).toList()); 218 actual.add(list.map(toTuple).toList());
165 } 219 }
166 log.clear(); 220 log.clear();
167 expect(actual, expected); 221 expect(actual, expected);
168 } 222 }
169 223
170 void checkHasAllFields(Rec r, bool expected) { 224 void checkHasAllFields(Rec r, bool expected) {
171 expect(r.hasField(1), expected); 225 expect(r.hasField(1), expected);
172 expect(r.hasField(2), expected); 226 expect(r.hasField(2), expected);
173 expect(r.hasField(3), expected); 227 expect(r.hasField(3), expected);
174 expect(r.hasField(4), expected); 228 expect(r.hasField(4), expected);
175 } 229 }
176 230
177 List toTuple(PbFieldChange fc) { 231 List toTuple(PbFieldChange fc) {
178 fixValue(v) { 232 fixValue(v) {
179 if (v is GeneratedMessage) { 233 if (v is GeneratedMessage) {
180 return "<msg>"; 234 return "<msg>";
181 } 235 }
182 return v; 236 return v;
183 } 237 }
184 return [fc.tag, fixValue(fc.oldValue), fixValue(fc.newValue)]; 238 return [fc.tag, fixValue(fc.oldValue), fixValue(fc.newValue)];
185 } 239 }
OLDNEW
« lib/src/protobuf/generated_message.dart ('K') | « lib/src/protobuf/readonly_message.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698