import { HashMap } from '../../../../src/util/map/HashMap'; type KeyType = { field1: string; field2: number }; type ValueType = { field3: string; field4: number }; function hashFn(key: KeyType): string { return `${key.field1}${key.field2}`; } describe('A HashMap', (): void => { const key1: KeyType = { field1: 'key', field2: 123 }; const key1Eq: KeyType = { field1: 'key', field2: 123 }; const key2: KeyType = { field1: 'key', field2: 321 }; const unknownKey: KeyType = { field1: 'key', field2: 999 }; const value1: ValueType = { field3: 'value', field4: 123 }; const value2: ValueType = { field3: 'value', field4: 321 }; let map: HashMap; beforeEach(async(): Promise => { map = new HashMap(hashFn); map.set(key1, value1); map.set(key2, value2); }); it('can check if the map has a key.', async(): Promise => { expect(map.has(key1)).toBe(true); expect(map.has(key1Eq)).toBe(true); expect(map.has(key2)).toBe(true); expect(map.has(unknownKey)).toBe(false); }); it('can get the values from the map.', async(): Promise => { expect(map.get(key1)).toBe(value1); expect(map.get(key1Eq)).toBe(value1); expect(map.get(key2)).toBe(value2); expect(map.get(unknownKey)).toBeUndefined(); }); it('can set values.', async(): Promise => { map.set(key1Eq, value2); expect(map.get(key1)).toBe(value2); }); it('can set values in the constructor.', async(): Promise => { map = new HashMap(hashFn, [[ key1, value1 ]]); expect(map.get(key1)).toBe(value1); expect(map.has(key2)).toBe(false); }); it('can remove values.', async(): Promise => { map.delete(key1Eq); expect(map.has(key1)).toBe(false); expect(map.has(key2)).toBe(true); }); it('can clear the map.', async(): Promise => { map.clear(); expect(map.has(key1)).toBe(false); expect(map.has(key2)).toBe(false); }); it('can iterate over the map.', async(): Promise => { expect([ ...map ]).toEqual([[ key1, value1 ], [ key2, value2 ]]); expect([ ...map.entries() ]).toEqual([[ key1, value1 ], [ key2, value2 ]]); expect([ ...map.keys() ]).toEqual([ key1, key2 ]); expect([ ...map.values() ]).toEqual([ value1, value2 ]); }); it('supports a forEach call.', async(): Promise => { const result: string[] = []; map.forEach((value): void => { result.push(value.field3); }); expect(result).toEqual([ 'value', 'value' ]); }); it('can return the size.', async(): Promise => { expect(map.size).toBe(2); map.delete(key1); expect(map.size).toBe(1); map.clear(); expect(map.size).toBe(0); }); it('returns a string tag.', async(): Promise => { expect(map[Symbol.toStringTag]).toBe('HashMap'); }); });