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