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), isEmpty);
    });

    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), isEmpty);
    });

    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);
    });
  });
}
