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