blob: 05cded62c75cbed0bff2cca7ec60c98ed866c01e [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. 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:test/test.dart';
import '../dummies/dummy_value_observer.dart';
// TODO: make tests generic.
// typedef MapCreator = Map<K, V> Function<K, V>();
// issue: template arguments of generic function have dynamic runtime type, so
// Converter factory constructor throws exception.
typedef MapCreator = Map<int, int> Function();
/// Generic class, to test if [TestingMap] correctly implements Map API.
class MapApiTester<TestingMap extends Map> {
MapCreator _mapCreator;
MapApiTester(this._mapCreator);
/// Tests Map API implementation.
void testApi() {
test('hashCode', () {
// ignore: unused_local_variable
final map = _mapCreator().hashCode;
});
test('isEmpty', () {
final map = _mapCreator();
expect(map.isEmpty, isTrue);
map[0] = 1;
expect(map.isEmpty, isFalse);
});
test('isNotEmpty', () {
final map = _mapCreator();
expect(map.isNotEmpty, isFalse);
map[0] = 1;
expect(map.isNotEmpty, isTrue);
});
test('keys', () {
final map = _mapCreator();
expect(map.keys.toList(), equals([]));
map[0] = 1;
map[2] = 1;
map[4] = 1;
map[4] = 2;
expect(map.keys.toList()..sort(), equals([0, 2, 4]));
});
test('length', () {
final map = _mapCreator();
expect(map.length, equals(0));
map[0] = 1;
map[2] = 1;
map[4] = 1;
map[4] = 2;
expect(map.length, equals(3));
});
test('values', () {
final map = _mapCreator();
expect(map.values.toList(), equals([]));
map[0] = 1;
map[2] = 1;
map[4] = 1;
map[4] = 2;
expect(map.values.toList()..sort(), equals([1, 1, 2]));
});
test('operator ==', () {
final map = _mapCreator();
expect(map == map, isTrue);
final otherStorage = _mapCreator();
expect(map == otherStorage, isFalse);
});
test('operator []', () {
final map = _mapCreator();
expect(map[0], isNull);
map[0] = 1;
map[2] = 1;
map[4] = 1;
map[4] = 2;
expect(map[0], equals(1));
expect(map[2], equals(1));
expect(map[4], equals(2));
expect(map[3], isNull);
});
test('addAll()', () {
final map = _mapCreator();
map[0] = 1;
map[2] = 1;
map[4] = 2;
final other = _mapCreator();
other[0] = 2;
other[1] = 1;
other[3] = 4;
map.addAll(other);
expect(map.keys.toList()..sort(), equals([0, 1, 2, 3, 4]));
expect(map[0], equals(2));
expect(map[1], equals(1));
expect(map[2], equals(1));
expect(map[3], equals(4));
expect(map[4], equals(2));
});
test('clear()', () {
final map = _mapCreator();
map[0] = 1;
map[2] = 1;
map[4] = 2;
map.clear();
expect(map.keys.toList().isEmpty, isTrue);
});
test('containsKey()', () {
final map = _mapCreator();
expect(map.containsKey(0), isFalse);
expect(map.containsKey(1), isFalse);
map[0] = 1;
expect(map.containsKey(0), isTrue);
expect(map.containsKey(1), isFalse);
});
test('containsValue()', () {
final map = _mapCreator();
expect(map.containsValue(1), isFalse);
map[0] = 1;
expect(map.containsValue(1), isTrue);
map[0] = 2;
expect(map.containsValue(1), isFalse);
expect(map.containsValue(2), isTrue);
});
test('forEach()', () {
final list = <int>[];
final map = _mapCreator();
map[0] = 1;
map[2] = 1;
map[4] = 2;
map.forEach((key, value) => list.add(key));
expect(list..sort(), equals([0, 2, 4]));
});
test('putIfAbsent()', () {
final map = _mapCreator();
expect(map.putIfAbsent(0, () => 1), equals(1));
expect(map.putIfAbsent(0, () => 2), equals(1));
expect(map.putIfAbsent(1, () => 2), equals(2));
});
test('toString()', () {
final map = _mapCreator();
map[0] = 1;
expect(map.toString(), equals('{0: 1}'));
});
}
void testObserver() {
test('Observer calls.', () {
final dynamic map = _mapCreator();
final observer = DummyValueObserver();
map.observer = observer;
expect(map.containsKey(0), equals(false));
observer.expectNotChanged();
// Check that each modification method calls observer.valueWasChanged():
map[0] = 1;
observer
..expectChanged()
..reset();
expect(map[0], equals(1));
observer.expectNotChanged();
map.putIfAbsent(2, () => 1);
observer
..expectChanged()
..reset();
map.remove(0);
observer
..expectChanged()
..reset();
map.addAll({0: 1, 2: 4, -1: 0});
observer
..expectChanged()
..reset();
map.clear();
observer
..expectChanged()
..reset();
});
}
}