|
1 | 1 | import { describe, expect, test, xtest } from '@jest/globals'; |
2 | 2 | import { findAnagrams } from './anagram'; |
3 | 3 |
|
| 4 | +const areSetsEqual = (setA, setB) => |
| 5 | + setA.size === setB.size && [...setA].every((val) => setB.has(val)); |
| 6 | + |
4 | 7 | describe('Anagram', () => { |
5 | 8 | test('no matches', () => { |
6 | | - expect( |
7 | | - findAnagrams('diaper', ['hello', 'world', 'zombies', 'pants']), |
8 | | - ).toEqual([]); |
| 9 | + const expected = []; |
| 10 | + const actual = findAnagrams('diaper', [ |
| 11 | + 'hello', |
| 12 | + 'world', |
| 13 | + 'zombies', |
| 14 | + 'pants', |
| 15 | + ]); |
| 16 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
9 | 17 | }); |
10 | 18 |
|
11 | 19 | xtest('detects two anagrams', () => { |
12 | | - expect(findAnagrams('solemn', ['lemons', 'cherry', 'melons'])).toEqual([ |
13 | | - 'lemons', |
14 | | - 'melons', |
15 | | - ]); |
| 20 | + const expected = ['lemons', 'melons']; |
| 21 | + const actual = findAnagrams('solemn', ['lemons', 'cherry', 'melons']); |
| 22 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
16 | 23 | }); |
17 | 24 |
|
18 | 25 | xtest('does not detect anagram subsets', () => { |
19 | | - expect(findAnagrams('good', ['dog', 'goody'])).toEqual([]); |
| 26 | + const expected = []; |
| 27 | + const actual = findAnagrams('good', ['dog', 'goody']); |
| 28 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
20 | 29 | }); |
21 | 30 |
|
22 | 31 | xtest('detects anagram', () => { |
23 | | - expect( |
24 | | - findAnagrams('listen', ['enlists', 'google', 'inlets', 'banana']), |
25 | | - ).toEqual(['inlets']); |
| 32 | + const expected = ['inlets']; |
| 33 | + const actual = findAnagrams('listen', [ |
| 34 | + 'enlists', |
| 35 | + 'google', |
| 36 | + 'inlets', |
| 37 | + 'banana', |
| 38 | + ]); |
| 39 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
26 | 40 | }); |
27 | 41 |
|
28 | 42 | xtest('detects three anagrams', () => { |
29 | | - expect( |
30 | | - findAnagrams('allergy', [ |
31 | | - 'gallery', |
32 | | - 'ballerina', |
33 | | - 'regally', |
34 | | - 'clergy', |
35 | | - 'largely', |
36 | | - 'leading', |
37 | | - ]), |
38 | | - ).toEqual(['gallery', 'regally', 'largely']); |
| 43 | + const expected = ['gallery', 'regally', 'largely']; |
| 44 | + const actual = findAnagrams('allergy', [ |
| 45 | + 'gallery', |
| 46 | + 'ballerina', |
| 47 | + 'regally', |
| 48 | + 'clergy', |
| 49 | + 'largely', |
| 50 | + 'leading', |
| 51 | + ]); |
| 52 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
39 | 53 | }); |
40 | 54 |
|
41 | 55 | xtest('detects multiple anagrams with different case', () => { |
42 | | - expect(findAnagrams('nose', ['Eons', 'ONES'])).toEqual(['Eons', 'ONES']); |
| 56 | + const expected = ['Eons', 'ONES']; |
| 57 | + const actual = findAnagrams('nose', ['Eons', 'ONES']); |
| 58 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
43 | 59 | }); |
44 | 60 |
|
45 | 61 | xtest('does not detect non-anagrams with identical checksum', () => { |
46 | | - expect(findAnagrams('mass', ['last'])).toEqual([]); |
| 62 | + const expected = []; |
| 63 | + const actual = findAnagrams('mass', ['last']); |
| 64 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
47 | 65 | }); |
48 | 66 |
|
49 | 67 | xtest('detects anagrams case-insensitively', () => { |
50 | | - expect( |
51 | | - findAnagrams('Orchestra', ['cashregister', 'Carthorse', 'radishes']), |
52 | | - ).toEqual(['Carthorse']); |
| 68 | + const expected = ['Carthorse']; |
| 69 | + const actual = findAnagrams('Orchestra', [ |
| 70 | + 'cashregister', |
| 71 | + 'Carthorse', |
| 72 | + 'radishes', |
| 73 | + ]); |
| 74 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
53 | 75 | }); |
54 | 76 |
|
55 | 77 | xtest('detects anagrams using case-insensitive subject', () => { |
56 | | - expect( |
57 | | - findAnagrams('Orchestra', ['cashregister', 'carthorse', 'radishes']), |
58 | | - ).toEqual(['carthorse']); |
| 78 | + const expected = ['carthorse']; |
| 79 | + const actual = findAnagrams('Orchestra', [ |
| 80 | + 'cashregister', |
| 81 | + 'carthorse', |
| 82 | + 'radishes', |
| 83 | + ]); |
| 84 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
59 | 85 | }); |
60 | 86 |
|
61 | 87 | xtest('detects anagrams using case-insensitive possible matches', () => { |
62 | | - expect( |
63 | | - findAnagrams('orchestra', ['cashregister', 'Carthorse', 'radishes']), |
64 | | - ).toEqual(['Carthorse']); |
| 88 | + const expected = ['Carthorse']; |
| 89 | + const actual = findAnagrams('orchestra', [ |
| 90 | + 'cashregister', |
| 91 | + 'Carthorse', |
| 92 | + 'radishes', |
| 93 | + ]); |
| 94 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
65 | 95 | }); |
66 | 96 |
|
67 | 97 | xtest('does not detect an anagram if the original word is repeated', () => { |
68 | | - expect(findAnagrams('go', ['go Go GO'])).toEqual([]); |
| 98 | + const expected = []; |
| 99 | + const actual = findAnagrams('go', ['go Go GO']); |
| 100 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
69 | 101 | }); |
70 | 102 |
|
71 | 103 | xtest('anagrams must use all letters exactly once', () => { |
72 | | - expect(findAnagrams('tapper', ['patter'])).toEqual([]); |
| 104 | + const expected = []; |
| 105 | + const actual = findAnagrams('tapper', ['patter']); |
| 106 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
73 | 107 | }); |
74 | 108 |
|
75 | 109 | xtest('words are not anagrams of themselves (case-insensitive)', () => { |
76 | | - expect(findAnagrams('BANANA', ['BANANA', 'Banana', 'banana'])).toEqual([]); |
| 110 | + const expected = []; |
| 111 | + const actual = findAnagrams('BANANA', ['BANANA', 'Banana', 'banana']); |
| 112 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
77 | 113 | }); |
78 | 114 |
|
79 | 115 | xtest('words other than themselves can be anagrams', () => { |
80 | | - expect(findAnagrams('LISTEN', ['Listen', 'Silent', 'LISTEN'])).toEqual([ |
81 | | - 'Silent', |
82 | | - ]); |
| 116 | + const expected = ['Silent']; |
| 117 | + const actual = findAnagrams('LISTEN', ['Listen', 'Silent', 'LISTEN']); |
| 118 | + expect(areSetsEqual(new Set(expected), new Set(actual))).toEqual(true); |
83 | 119 | }); |
84 | 120 | }); |
0 commit comments