import 'package:belatuk_merge_map/belatuk_merge_map.dart';
import 'package:test/test.dart';

void main() {
  test('can merge two simple maps', () {
    var merged = mergeMap([
      {'hello': 'world'},
      {'hello': 'dolly'}
    ]);
    expect(merged['hello'], equals('dolly'));
  });

  test("the last map's values supersede those of prior", () {
    var merged = mergeMap([
      {'letter': 'a'},
      {'letter': 'b'},
      {'letter': 'c'}
    ]);
    expect(merged['letter'], equals('c'));
  });

  test('can merge two once-nested maps', () {
    // ignore: omit_local_variable_types
    Map map1 = {
      'hello': 'world',
      'foo': {'nested': false}
    };
    // ignore: omit_local_variable_types
    Map map2 = {
      'goodbye': 'sad life',
      'foo': {'nested': true, 'it': 'works'}
    };
    var merged = mergeMap([map1, map2]);

    expect(merged['hello'], equals('world'));
    expect(merged['goodbye'], equals('sad life'));
    expect(merged['foo']['nested'], equals(true));
    expect(merged['foo']['it'], equals('works'));
  });

  test('once-nested map supersession', () {
    // ignore: omit_local_variable_types
    Map map1 = {
      'hello': 'world',
      'foo': {'nested': false}
    };
    // ignore: omit_local_variable_types
    Map map2 = {
      'goodbye': 'sad life',
      'foo': {'nested': true, 'it': 'works'}
    };
    // ignore: omit_local_variable_types
    Map map3 = {
      'foo': {'nested': 'supersession'}
    };

    var merged = mergeMap([map1, map2, map3]);
    expect(merged['foo']['nested'], equals('supersession'));
  });

  test('can merge two twice-nested maps', () {
    // ignore: omit_local_variable_types
    Map map1 = {
      'a': {
        'b': {'c': 'd'}
      }
    };
    // ignore: omit_local_variable_types
    Map map2 = {
      'a': {
        'b': {'c': 'D', 'e': 'f'}
      }
    };
    var merged = mergeMap([map1, map2]);

    expect(merged['a']['b']['c'], equals('D'));
    expect(merged['a']['b']['e'], equals('f'));
  });

  test('twice-nested map supersession', () {
    // ignore: omit_local_variable_types
    Map map1 = {
      'a': {
        'b': {'c': 'd'}
      }
    };
    // ignore: omit_local_variable_types
    Map map2 = {
      'a': {
        'b': {'c': 'D', 'e': 'f'}
      }
    };
    // ignore: omit_local_variable_types
    Map map3 = {
      'a': {
        'b': {'e': 'supersession'}
      }
    };
    var merged = mergeMap([map1, map2, map3]);

    expect(merged['a']['b']['c'], equals('D'));
    expect(merged['a']['b']['e'], equals('supersession'));
  });
}