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