| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 import 'package:mdv_observe/mdv_observe.dart'; |
| 6 import 'package:unittest/unittest.dart'; |
| 7 import 'utils.dart'; |
| 8 |
| 9 main() { |
| 10 // TODO(jmesserly): need all standard Map API tests. |
| 11 |
| 12 group('observe length', () { |
| 13 ObservableMap map; |
| 14 List<ChangeRecord> changes; |
| 15 |
| 16 setUp(() { |
| 17 map = toObservable({'a': 1, 'b': 2, 'c': 3}); |
| 18 changes = null; |
| 19 map.changes.listen((records) { |
| 20 changes = records.where((r) => r.changes(_LENGTH)).toList(); |
| 21 }); |
| 22 }); |
| 23 |
| 24 test('add item changes length', () { |
| 25 map['d'] = 4; |
| 26 expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4}); |
| 27 deliverChangeRecords(); |
| 28 expectChanges(changes, [_lengthChange]); |
| 29 }); |
| 30 |
| 31 test('putIfAbsent changes length', () { |
| 32 map.putIfAbsent('d', () => 4); |
| 33 expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4}); |
| 34 deliverChangeRecords(); |
| 35 expectChanges(changes, [_lengthChange]); |
| 36 }); |
| 37 |
| 38 test('remove changes length', () { |
| 39 map.remove('c'); |
| 40 map.remove('a'); |
| 41 expect(map, {'b': 2}); |
| 42 deliverChangeRecords(); |
| 43 expectChanges(changes, [_lengthChange, _lengthChange]); |
| 44 }); |
| 45 |
| 46 test('remove non-existent item does not change length', () { |
| 47 map.remove('d'); |
| 48 expect(map, {'a': 1, 'b': 2, 'c': 3}); |
| 49 deliverChangeRecords(); |
| 50 expectChanges(changes, null); |
| 51 }); |
| 52 |
| 53 test('set existing item does not change length', () { |
| 54 map['c'] = 9000; |
| 55 expect(map, {'a': 1, 'b': 2, 'c': 9000}); |
| 56 deliverChangeRecords(); |
| 57 expectChanges(changes, []); |
| 58 }); |
| 59 |
| 60 test('clear changes length', () { |
| 61 map.clear(); |
| 62 expect(map, {}); |
| 63 deliverChangeRecords(); |
| 64 expectChanges(changes, [_lengthChange]); |
| 65 }); |
| 66 }); |
| 67 |
| 68 group('observe item', () { |
| 69 |
| 70 ObservableMap map; |
| 71 List<ChangeRecord> changes; |
| 72 |
| 73 setUp(() { |
| 74 map = toObservable({'a': 1, 'b': 2, 'c': 3}); |
| 75 changes = null; |
| 76 map.changes.listen((records) { |
| 77 changes = records.where((r) => r.changes('b')).toList(); |
| 78 }); |
| 79 }); |
| 80 |
| 81 test('putIfAbsent new item does not change existing item', () { |
| 82 map.putIfAbsent('d', () => 4); |
| 83 expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4}); |
| 84 deliverChangeRecords(); |
| 85 expectChanges(changes, []); |
| 86 }); |
| 87 |
| 88 test('set item to null', () { |
| 89 map['b'] = null; |
| 90 expect(map, {'a': 1, 'b': null, 'c': 3}); |
| 91 deliverChangeRecords(); |
| 92 expectChanges(changes, [_change('b')]); |
| 93 }); |
| 94 |
| 95 test('set item to value', () { |
| 96 map['b'] = 777; |
| 97 expect(map, {'a': 1, 'b': 777, 'c': 3}); |
| 98 deliverChangeRecords(); |
| 99 expectChanges(changes, [_change('b')]); |
| 100 }); |
| 101 |
| 102 test('putIfAbsent does not change if already there', () { |
| 103 map.putIfAbsent('b', () => 1234); |
| 104 expect(map, {'a': 1, 'b': 2, 'c': 3}); |
| 105 deliverChangeRecords(); |
| 106 expectChanges(changes, null); |
| 107 }); |
| 108 |
| 109 test('change a different item', () { |
| 110 map['c'] = 9000; |
| 111 expect(map, {'a': 1, 'b': 2, 'c': 9000}); |
| 112 deliverChangeRecords(); |
| 113 expectChanges(changes, []); |
| 114 }); |
| 115 |
| 116 test('change the item', () { |
| 117 map['b'] = 9001; |
| 118 map['b'] = 42; |
| 119 expect(map, {'a': 1, 'b': 42, 'c': 3}); |
| 120 deliverChangeRecords(); |
| 121 expectChanges(changes, [_change('b'), _change('b')]); |
| 122 }); |
| 123 |
| 124 test('remove other items', () { |
| 125 map.remove('a'); |
| 126 expect(map, {'b': 2, 'c': 3}); |
| 127 deliverChangeRecords(); |
| 128 expectChanges(changes, []); |
| 129 }); |
| 130 |
| 131 test('remove the item', () { |
| 132 map.remove('b'); |
| 133 expect(map, {'a': 1, 'c': 3}); |
| 134 deliverChangeRecords(); |
| 135 expectChanges(changes, [_change('b', isRemove: true)]); |
| 136 }); |
| 137 |
| 138 test('remove and add back', () { |
| 139 map.remove('b'); |
| 140 map['b'] = 2; |
| 141 expect(map, {'a': 1, 'b': 2, 'c': 3}); |
| 142 deliverChangeRecords(); |
| 143 expectChanges(changes, |
| 144 [_change('b', isRemove: true), _change('b', isInsert: true)]); |
| 145 }); |
| 146 }); |
| 147 |
| 148 test('toString', () { |
| 149 var map = toObservable({'a': 1, 'b': 2}); |
| 150 expect(map.toString(), '{a: 1, b: 2}'); |
| 151 }); |
| 152 |
| 153 group('change records', () { |
| 154 List<ChangeRecord> records; |
| 155 ObservableMap map; |
| 156 |
| 157 setUp(() { |
| 158 map = toObservable({'a': 1, 'b': 2}); |
| 159 records = null; |
| 160 map.changes.first.then((r) { records = r; }); |
| 161 }); |
| 162 |
| 163 test('read operations', () { |
| 164 expect(map.length, 2); |
| 165 expect(map.isEmpty, false); |
| 166 expect(map['a'], 1); |
| 167 expect(map.containsKey(2), false); |
| 168 expect(map.containsValue(2), true); |
| 169 expect(map.containsKey('b'), true); |
| 170 expect(map.keys.toList(), ['a', 'b']); |
| 171 expect(map.values.toList(), [1, 2]); |
| 172 var copy = {}; |
| 173 map.forEach((k, v) { copy[k] = v; }); |
| 174 expect(copy, {'a': 1, 'b': 2}); |
| 175 deliverChangeRecords(); |
| 176 |
| 177 // no change from read-only operators |
| 178 expect(records, null); |
| 179 }); |
| 180 |
| 181 test('putIfAbsent', () { |
| 182 map.putIfAbsent('a', () => 42); |
| 183 expect(map, {'a': 1, 'b': 2}); |
| 184 |
| 185 map.putIfAbsent('c', () => 3); |
| 186 expect(map, {'a': 1, 'b': 2, 'c': 3}); |
| 187 |
| 188 deliverChangeRecords(); |
| 189 expectChanges(records, [ |
| 190 _lengthChange, |
| 191 _change('c', isInsert: true), |
| 192 ]); |
| 193 }); |
| 194 |
| 195 test('[]=', () { |
| 196 map['a'] = 42; |
| 197 expect(map, {'a': 42, 'b': 2}); |
| 198 |
| 199 map['c'] = 3; |
| 200 expect(map, {'a': 42, 'b': 2, 'c': 3}); |
| 201 |
| 202 deliverChangeRecords(); |
| 203 expectChanges(records, [ |
| 204 _change('a'), |
| 205 _lengthChange, |
| 206 _change('c', isInsert: true) |
| 207 ]); |
| 208 }); |
| 209 |
| 210 test('remove', () { |
| 211 map.remove('b'); |
| 212 expect(map, {'a': 1}); |
| 213 |
| 214 deliverChangeRecords(); |
| 215 expectChanges(records, [ |
| 216 _change('b', isRemove: true), |
| 217 _lengthChange, |
| 218 ]); |
| 219 }); |
| 220 |
| 221 test('clear', () { |
| 222 map.clear(); |
| 223 expect(map, {}); |
| 224 |
| 225 deliverChangeRecords(); |
| 226 expectChanges(records, [ |
| 227 _change('a', isRemove: true), |
| 228 _change('b', isRemove: true), |
| 229 _lengthChange, |
| 230 ]); |
| 231 }); |
| 232 }); |
| 233 } |
| 234 |
| 235 |
| 236 const _LENGTH = const Symbol('length'); |
| 237 |
| 238 final _lengthChange = new PropertyChangeRecord(_LENGTH); |
| 239 |
| 240 _change(key, {isInsert: false, isRemove: false}) => |
| 241 new MapChangeRecord(key, isInsert: isInsert, isRemove: isRemove); |
| OLD | NEW |