| OLD | NEW |
| 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 Loading... |
| 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 } |
| OLD | NEW |