blob: 2875015fda50bfc3635e9bdd072453b5acb709b5 [file] [log] [blame]
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
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), MapChangeRecord.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), MapChangeRecord.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 replay 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);
});
});
}