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