| import 'package:observable/observable.dart'; |
| import 'package:test/test.dart'; |
| |
| main() { |
| group('$MapDiffer', () { |
| final diff = const MapDiffer<String, String>().diff; |
| |
| test('should emit no changes for identical maps', () { |
| final map = new Map<String, String>.fromIterable( |
| new Iterable.generate(10, (i) => '$i'), |
| ); |
| expect(diff(map, map), ChangeRecord.NONE); |
| }); |
| |
| test('should emit no changes for maps with identical content', () { |
| final map1 = new Map<String, String>.fromIterable( |
| new Iterable.generate(10, (i) => '$i'), |
| ); |
| final map2 = new Map<String, String>.fromIterable( |
| new Iterable.generate(10, (i) => '$i'), |
| ); |
| expect(diff(map1, map2), ChangeRecord.NONE); |
| }); |
| |
| test('should detect insertions', () { |
| expect( |
| diff({ |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| }, { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| 'key-c': 'value-c', |
| }), |
| [ |
| new MapChangeRecord.insert('key-c', 'value-c'), |
| ], |
| ); |
| }); |
| |
| test('should detect removals', () { |
| expect( |
| diff({ |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| 'key-c': 'value-c', |
| }, { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| }), |
| [ |
| new MapChangeRecord.remove('key-c', 'value-c'), |
| ], |
| ); |
| }); |
| |
| test('should detect updates', () { |
| expect( |
| diff({ |
| 'key-a': 'value-a', |
| 'key-b': 'value-b-old', |
| }, { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b-new', |
| }), |
| [ |
| new MapChangeRecord('key-b', 'value-b-old', 'value-b-new'), |
| ], |
| ); |
| }); |
| }); |
| |
| group('$MapChangeRecord', () { |
| test('should reply an insertion', () { |
| final map1 = { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| }; |
| final map2 = { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| 'key-c': 'value-c', |
| }; |
| new MapChangeRecord.insert('key-c', 'value-c').apply(map1); |
| expect(map1, map2); |
| }); |
| |
| test('should replay a removal', () { |
| final map1 = { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| 'key-c': 'value-c', |
| }; |
| final map2 = { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b', |
| }; |
| new MapChangeRecord.remove('key-c', 'value-c').apply(map1); |
| expect(map1, map2); |
| }); |
| |
| test('should replay an update', () { |
| final map1 = { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b-old', |
| }; |
| final map2 = { |
| 'key-a': 'value-a', |
| 'key-b': 'value-b-new', |
| }; |
| new MapChangeRecord('key-b', 'value-b-old', 'value-b-new').apply(map1); |
| expect(map1, map2); |
| }); |
| }); |
| } |