blob: 1577ef323cadbccfdf2bca66f00dfc029bf993f7 [file] [log] [blame]
// Copyright 2014 The Flutter 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:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
@immutable
class _MockKey {
const _MockKey({required this.hashCode, required this.payload});
@override
final int hashCode;
final String payload;
@override
bool operator ==(Object other) {
return other is _MockKey && other.payload == payload;
}
}
void main() {
test('PersistentHashMap - Simple Test', () {
final List<PersistentHashMap<String, int>> maps =
<PersistentHashMap<String, int>>[];
maps.add(const PersistentHashMap<String, int>.empty());
for (int i = 0; i < 50; i++) {
maps.add(maps.last.put('key:$i', i));
}
for (int i = 1; i < maps.length; i++) {
final PersistentHashMap<String, int> m = maps[i];
for (int j = 0; j < i; j++) {
expect(m['key:$j'], equals(j));
}
}
});
test('PersistentHashMap - hash collisions', () {
const _MockKey key1 = _MockKey(hashCode: 1, payload: 'key:1');
const _MockKey key2 = _MockKey(hashCode: 0 | (1 << 5), payload: 'key:2');
const _MockKey key3 = _MockKey(hashCode: 1, payload: 'key:3');
const _MockKey key4 = _MockKey(hashCode: 1 | (1 << 5), payload: 'key:4');
final PersistentHashMap<_MockKey, String> map =
const PersistentHashMap<_MockKey, String>.empty()
.put(key1, 'a')
.put(key2, 'b')
.put(key3, 'c');
expect(map[key1], equals('a'));
expect(map[key2], equals('b'));
expect(map[key3], equals('c'));
final PersistentHashMap<_MockKey, String> map2 = map.put(key4, 'd');
expect(map2[key4], equals('d'));
final PersistentHashMap<_MockKey, String> map3 = map2
.put(key1, 'updated(a)')
.put(key2, 'updated(b)')
.put(key3, 'updated(c)')
.put(key4, 'updated(d)');
expect(map3[key1], equals('updated(a)'));
expect(map3[key2], equals('updated(b)'));
expect(map3[key3], equals('updated(c)'));
expect(map3[key4], equals('updated(d)'));
});
test('PersistentHashMap - inflation of nodes', () {
final List<PersistentHashMap<_MockKey, int>> maps =
<PersistentHashMap<_MockKey, int>>[];
maps.add(const PersistentHashMap<_MockKey, int>.empty());
for (int i = 0; i < 32 * 32; i++) {
maps.add(maps.last.put(_MockKey(hashCode: i, payload: '$i'), i));
}
for (int i = 1; i < maps.length; i++) {
final PersistentHashMap<_MockKey, int> m = maps[i];
for (int j = 0; j < i; j++) {
expect(m[_MockKey(hashCode: j, payload: '$j')], equals(j));
}
}
});
}