-
Notifications
You must be signed in to change notification settings - Fork 0
/
4-find-word.spec.js
140 lines (137 loc) · 3.33 KB
/
4-find-word.spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/// <reference types="cypress" />
import findWord from '../../findWord.js';
const tests = [
{
desc: '3x3 grid',
grid: [
['x', 'c', 'a'],
['d', 'y', 't'],
['o', 'g', 'z'],
],
cases: [
['Returns false if first letter not in grid', 'q', false],
['Matches word in corner', 'cat', true],
['Matches vertical word', 'cyg', true],
['Matches horizontal word', 'dyt', true],
['Matches single letter', 'y', true],
['Diagonal moves not allowed', 'ayo', false],
['Non-adjacent moves not allowed', 'taco', false],
['Returns false if search terminates by running out of squares', 'xdogycatzzz', false],
],
},
{
desc: '5x5 grid',
grid: [
['x', 'c', 'a', 't'],
['d', 'y', 'i', 'n'],
['c', 'e', 'p', 'f'],
['a', 'c', 'b', 'w'],
['r', 'a', 'c', 'h'],
],
cases: [
['Works on word with multiple turns', 'catnip', true],
['Reusing letters not permitted', 'racecar', false],
],
},
{
desc: '5x4 grid',
grid: [
['f', 'x', 't', 'k', 't'],
['g', 'n', 'r', 'c', 'r'],
['n', 'i', 'a', 'a', 'a'],
['i', 'k', 'c', 'b', 'c'],
],
cases: [
['Works with grid where x > y', 'king', true],
['Handles partial paths with dead ends', 'backtracking', true],
],
},
{
desc: '3x5 grid',
grid: [
['t', 'f', 'g'],
['a', 'd', 'h'],
['l', 's', 'j'],
['l', 'a', 'k'],
['g', 'd', 'l'],
['r', 'i', 'm'],
],
cases: [
['Works with grid where y > x', 'tallgrid', true],
],
},
{
desc: 'Empty grid',
grid: [],
cases: [
['Returns false on empty grid', 'cat', false],
],
},
{
desc: '1x1 grid',
grid: [['q']],
cases: [
['Returns true on 1x1 grid', 'q', true],
],
},
{
desc: '1x5 grid',
grid: [['h', 'e', 'l', 'l', 'o']],
cases: [
['Matches word in 5x1 grid', 'hello', true],
],
},
{
desc: '5x1 grid',
grid: [
['h'],
['e'],
['l'],
['l'],
['o'],
],
cases: [
['Matches word in 5x1 grid', 'hello', true],
],
},
// Want to ensure that algorithm isn't unreasonably slow
{
desc: 'Grid with single letter',
grid: [
['a', 'a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a', 'a'],
],
cases: [
['Matches single-letter string in single-letter grid', 'aaaaaaaaaaaaaaa', true],
['Returns false on nonexistent letter in single-letter grid', 'aaaaaaaaaaaazaa', false],
],
},
{
desc: 'Grid with mostly single letters',
grid: [
['a', 'a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a', 'a'],
['a', 'a', 'a', 'z', 'a'],
['a', 'a', 'a', 'a', 'z'],
],
cases: [
['Returns false on nonexistent letter in single-letter grid', 'aaaaaaaaaaaaazz', false],
],
},
];
describe('Tests for findWord()', () => {
tests.forEach((test) => {
describe(test.desc, () => {
test.cases.forEach(([desc, word, expected]) => {
it(`${desc}: findWord('${word}') == ${expected}`, () => {
test.grid.map((row) => cy.log(JSON.stringify(row)));
cy.wrap(findWord(test.grid, word)).should('equal', expected);
});
});
});
});
});