OLD | NEW |
---|---|
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * Test fixture for tree_walker.js. | 6 * Test fixture for tree_walker.js. |
7 * @constructor | 7 * @constructor |
8 * @extends {testing.Test} | 8 * @extends {testing.Test} |
9 */ | 9 */ |
10 function AutomationTreeWalkerUnitTest () { | 10 function AutomationTreeWalkerUnitTest () { |
11 testing.Test.call(this); | 11 testing.Test.call(this); |
12 }; | 12 }; |
13 | 13 |
14 AutomationTreeWalkerUnitTest.prototype = { | 14 AutomationTreeWalkerUnitTest.prototype = { |
15 __proto__: testing.Test.prototype, | 15 __proto__: testing.Test.prototype, |
16 | 16 |
17 /** @override */ | 17 /** @override */ |
18 extraLibraries: [ | 18 extraLibraries: [ |
19 'tree_walker.js', | 19 'tree_walker.js', |
20 ], | 20 ], |
21 | 21 |
22 /** @override */ | 22 /** @override */ |
23 browsePreload: DUMMY_URL, | 23 browsePreload: DUMMY_URL, |
24 | 24 |
25 getSampleTree: function() { | 25 getSampleTree: function() { |
26 let loc = {left: 0, top: 0, width: 0, height: 0}; | 26 let loc = {left: 0, top: 0, width: 0, height: 0}; |
27 // root | 27 // root |
28 // middle1 | 28 // upper1 |
David Tseng
2017/05/09 16:49:21
Suggestion: write a general method to create the f
elichtenberg
2017/05/09 23:35:30
I tried this, but it wasn't very readable, and it
| |
29 // leaf1 | 29 // middle1 |
30 // leaf2 | 30 // lower1 |
31 // leaf3 | 31 // leaf1 |
32 // middle2 | 32 // leaf2 |
33 // leaf4 | 33 // leaf3 |
34 // leaf5 | 34 // lower2 |
35 // leaf4 | |
36 // leaf5 | |
37 // middle2 | |
38 // lower3 | |
39 // leaf6 | |
40 // leaf7 | |
41 // upper2 | |
42 // leaf8 | |
35 let root = {location: loc, state: {}}; | 43 let root = {location: loc, state: {}}; |
44 let upper1 = {location: loc, state: {}}; | |
45 let upper2 = {location: loc, state: {}}; | |
36 let middle1 = {location: loc, state: {}}; | 46 let middle1 = {location: loc, state: {}}; |
37 let middle2 = {location: loc, state: {}}; | 47 let middle2 = {location: loc, state: {}}; |
48 let lower1 = {location: loc, state: {}}; | |
49 let lower2 = {location: loc, state: {}}; | |
50 let lower3 = {location: loc, state: {}}; | |
38 let leaf1 = {location: loc, state: {}}; | 51 let leaf1 = {location: loc, state: {}}; |
39 let leaf2 = {location: loc, state: {}}; | 52 let leaf2 = {location: loc, state: {}}; |
40 let leaf3 = {location: loc, state: {}}; | 53 let leaf3 = {location: loc, state: {}}; |
41 let leaf4 = {location: loc, state: {}}; | 54 let leaf4 = {location: loc, state: {}}; |
42 let leaf5 = {location: loc, state: {}}; | 55 let leaf5 = {location: loc, state: {}}; |
56 let leaf6 = {location: loc, state: {}}; | |
57 let leaf7 = {location: loc, state: {}}; | |
58 let leaf8 = {location: loc, state: {}}; | |
43 | 59 |
44 root.firstChild = middle1; | 60 root.firstChild = upper1; |
45 root.lastChild = middle2; | 61 root.lastChild = upper2; |
46 | 62 |
47 middle1.parent = root; | 63 upper1.parent = root; |
48 middle2.parent = root; | 64 upper2.parent = root; |
65 upper1.nextSibling = upper2; | |
66 upper2.previousSibling = upper1; | |
67 upper1.firstChild = middle1; | |
68 upper1.lastChild = middle2; | |
69 upper2.firstChild = leaf8; | |
70 upper2.lastChild = leaf8; | |
71 | |
72 middle1.parent = upper1; | |
73 middle2.parent = upper1; | |
49 middle1.nextSibling = middle2; | 74 middle1.nextSibling = middle2; |
50 middle2.previousSibling = middle1; | 75 middle2.previousSibling = middle1; |
51 middle1.firstChild = leaf1; | 76 middle1.firstChild = lower1; |
52 middle1.lastChild = leaf3; | 77 middle1.lastChild = lower2; |
53 middle2.firstChild = leaf4; | 78 middle2.firstChild = lower3; |
54 middle2.lastChild = leaf5; | 79 middle2.lastChild = lower3; |
55 | 80 |
56 leaf1.parent = middle1; | 81 lower1.parent = middle1; |
57 leaf2.parent = middle1; | 82 lower2.parent = middle1; |
58 leaf3.parent = middle1; | 83 lower1.nextSibling = lower2; |
84 lower2.previousSibling = lower1; | |
85 lower1.firstChild = leaf1; | |
86 lower1.lastChild = leaf3; | |
87 lower2.firstChild = leaf4; | |
88 lower2.lastChild = leaf5; | |
89 | |
90 lower3.parent = middle2; | |
91 lower3.firstChild = leaf6; | |
92 lower3.lastChild = leaf7; | |
93 | |
94 leaf1.parent = lower1; | |
95 leaf2.parent = lower1; | |
96 leaf3.parent = lower1; | |
59 leaf1.nextSibling = leaf2; | 97 leaf1.nextSibling = leaf2; |
60 leaf2.previousSibling = leaf1; | 98 leaf2.previousSibling = leaf1; |
61 leaf2.nextSibling = leaf3; | 99 leaf2.nextSibling = leaf3; |
62 leaf3.previousSibling = leaf2; | 100 leaf3.previousSibling = leaf2; |
63 | 101 |
64 leaf4.parent = middle2; | 102 leaf4.parent = lower2; |
65 leaf5.parent = middle2; | 103 leaf5.parent = lower2; |
66 leaf4.nextSibling = leaf5; | 104 leaf4.nextSibling = leaf5; |
67 leaf5.previousSibling = leaf4; | 105 leaf5.previousSibling = leaf4; |
68 | 106 |
107 leaf6.parent = lower3; | |
108 leaf7.parent = lower3; | |
109 leaf6.nextSibling = leaf7; | |
110 leaf7.previousSibling = leaf6; | |
111 | |
112 leaf8.parent = upper2; | |
113 | |
69 return { | 114 return { |
70 root: root, | 115 root: root, |
116 upper1: upper1, | |
117 upper2: upper2, | |
71 middle1: middle1, | 118 middle1: middle1, |
72 middle2: middle2, | 119 middle2: middle2, |
120 lower1: lower1, | |
121 lower2: lower2, | |
122 lower3: lower3, | |
73 leaf1: leaf1, | 123 leaf1: leaf1, |
74 leaf2: leaf2, | 124 leaf2: leaf2, |
75 leaf3: leaf3, | 125 leaf3: leaf3, |
76 leaf4: leaf4, | 126 leaf4: leaf4, |
77 leaf5: leaf5 | 127 leaf5: leaf5, |
128 leaf6: leaf6, | |
129 leaf7: leaf7, | |
130 leaf8: leaf8 | |
78 }; | 131 }; |
79 }, | 132 }, |
80 | 133 |
81 getDefaultRestrictions: function() { | 134 getDefaultRestrictions: function() { |
82 return { | 135 return { |
83 leaf: function(node) { | 136 leaf: function(node) { |
84 return false; | 137 return false; |
85 }, | 138 }, |
86 visit: function(node) { | 139 visit: function(node) { |
87 return node.state.focusable === true; | 140 return node.state.focusable === true; |
88 }, | 141 }, |
89 } | 142 } |
143 }, | |
144 | |
145 getSubtreeRestrictions: function() { | |
146 return { | |
147 leaf: function(node) { | |
148 return node.state.leaf === true; | |
149 }, | |
150 visit: function(node) { | |
151 return node.state.focusable === true; | |
152 }, | |
153 } | |
90 } | 154 } |
91 }; | 155 }; |
92 | 156 |
93 TEST_F('AutomationTreeWalkerUnitTest', 'MoveToNode', function() { | 157 TEST_F('AutomationTreeWalkerUnitTest', 'MoveToNodeWholeTree', function() { |
94 chrome.automation = { | 158 let t = this.getSampleTree(); |
95 RoleType: {DESKTOP: 'desktop', TAB: 'tab', TAB_LIST: 'tabList'}, | 159 let treeWalker = new AutomationTreeWalker( |
96 StateType: {FOCUSABLE: 'focusable', OFFSCREEN: 'offscreen'} | 160 t.root, t.root, this.getDefaultRestrictions()); |
97 }; | |
98 | 161 |
99 let t = this.getSampleTree(); | 162 t.root.state['focusable'] = true; |
100 let treeWalker = | 163 t.middle1.state['focusable'] = true; |
101 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 164 t.leaf1.state['focusable'] = true; |
102 | 165 t.leaf2.state['focusable'] = true; |
103 let interesting = {focusable: true}; | 166 t.leaf5.state['focusable'] = true; |
104 t.leaf1.state = interesting; | 167 t.lower3.state['focusable'] = true; |
105 t.leaf2.state = interesting; | 168 t.leaf6.state['focusable'] = true; |
106 t.middle2.state = interesting; | 169 t.upper2.state['focusable'] = true; |
107 t.leaf5.state = interesting; | 170 t.leaf8.state['focusable'] = true; |
108 | 171 |
109 // Move to next node. | 172 // Move to next node. |
173 assertEquals(t.middle1, treeWalker.moveToNode(true)); | |
110 assertEquals(t.leaf1, treeWalker.moveToNode(true)); | 174 assertEquals(t.leaf1, treeWalker.moveToNode(true)); |
111 assertEquals(t.leaf2, treeWalker.moveToNode(true)); | 175 assertEquals(t.leaf2, treeWalker.moveToNode(true)); |
112 assertEquals(t.middle2, treeWalker.moveToNode(true)); | |
113 assertEquals(t.leaf5, treeWalker.moveToNode(true)); | 176 assertEquals(t.leaf5, treeWalker.moveToNode(true)); |
114 assertEquals(t.leaf1, treeWalker.moveToNode(true)); | 177 assertEquals(t.lower3, treeWalker.moveToNode(true)); |
178 assertEquals(t.leaf6, treeWalker.moveToNode(true)); | |
179 assertEquals(t.upper2, treeWalker.moveToNode(true)); | |
180 assertEquals(t.leaf8, treeWalker.moveToNode(true)); | |
181 assertEquals(t.root, treeWalker.moveToNode(true)); | |
182 assertEquals(t.middle1, treeWalker.moveToNode(true)); | |
115 | 183 |
116 // Move to previous node. | 184 // Move to previous node. |
185 assertEquals(t.root, treeWalker.moveToNode(false)); | |
186 assertEquals(t.leaf8, treeWalker.moveToNode(false)); | |
187 assertEquals(t.upper2, treeWalker.moveToNode(false)); | |
188 assertEquals(t.leaf6, treeWalker.moveToNode(false)); | |
189 assertEquals(t.lower3, treeWalker.moveToNode(false)); | |
117 assertEquals(t.leaf5, treeWalker.moveToNode(false)); | 190 assertEquals(t.leaf5, treeWalker.moveToNode(false)); |
118 assertEquals(t.middle2, treeWalker.moveToNode(false)); | |
119 assertEquals(t.leaf2, treeWalker.moveToNode(false)); | 191 assertEquals(t.leaf2, treeWalker.moveToNode(false)); |
120 assertEquals(t.leaf1, treeWalker.moveToNode(false)); | 192 assertEquals(t.leaf1, treeWalker.moveToNode(false)); |
121 assertEquals(t.leaf5, treeWalker.moveToNode(false)); | 193 assertEquals(t.middle1, treeWalker.moveToNode(false)); |
194 }); | |
195 | |
196 TEST_F('AutomationTreeWalkerUnitTest', 'MoveToNodeInSubtree', function() { | |
197 let t = this.getSampleTree(); | |
198 let treeWalker = new AutomationTreeWalker( | |
199 t.upper1, t.upper1, this.getSubtreeRestrictions()); | |
200 | |
201 t.lower2.state['leaf'] = true; | |
202 t.lower3.state['leaf'] = true; | |
203 | |
204 t.root.state['focusable'] = true; | |
205 t.middle1.state['focusable'] = true; | |
206 t.leaf1.state['focusable'] = true; | |
207 t.leaf2.state['focusable'] = true; | |
208 t.leaf5.state['focusable'] = true; | |
209 t.lower3.state['focusable'] = true; | |
210 t.leaf6.state['focusable'] = true; | |
211 t.upper2.state['focusable'] = true; | |
212 t.leaf8.state['focusable'] = true; | |
213 | |
214 // Move to next node. | |
215 assertEquals(t.middle1, treeWalker.moveToNode(true)); | |
216 assertEquals(t.leaf1, treeWalker.moveToNode(true)); | |
217 assertEquals(t.leaf2, treeWalker.moveToNode(true)); | |
218 assertEquals(t.lower3, treeWalker.moveToNode(true)); | |
219 assertEquals(t.middle1, treeWalker.moveToNode(true)); | |
220 | |
221 // Move to previous node. | |
222 assertEquals(t.lower3, treeWalker.moveToNode(false)); | |
223 assertEquals(t.leaf2, treeWalker.moveToNode(false)); | |
224 assertEquals(t.leaf1, treeWalker.moveToNode(false)); | |
225 assertEquals(t.middle1, treeWalker.moveToNode(false)); | |
226 assertEquals(t.lower3, treeWalker.moveToNode(false)); | |
122 }); | 227 }); |
123 | 228 |
124 TEST_F('AutomationTreeWalkerUnitTest', 'GetNextNode', function() { | 229 TEST_F('AutomationTreeWalkerUnitTest', 'GetNextNode', function() { |
125 let t = this.getSampleTree(); | 230 let t = this.getSampleTree(); |
126 let treeWalker = | 231 let treeWalker = |
127 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 232 new AutomationTreeWalker(t.middle1, t.middle1, this.getDefaultRestrictions ()); |
128 | 233 |
129 let order = | 234 let order = |
130 [t.root, t.middle1, t.leaf1, t.leaf2, t.leaf3, | 235 [t.middle1, t.lower1, t.leaf1, t.leaf2, t.leaf3, |
131 t.middle2, t.leaf4, t.leaf5]; | 236 t.lower2, t.leaf4, t.leaf5]; |
132 let node = t.root; | 237 let node = t.middle1; |
133 for (let i = 0; i < order.length; i++) { | 238 for (let i = 0; i < order.length; i++) { |
134 assertEquals(order[i], node); | 239 assertEquals(order[i], node); |
135 node = treeWalker.getNextNode_(node); | 240 node = treeWalker.getNextNode_(node); |
136 } | 241 } |
137 assertEquals(undefined, node); | 242 assertEquals(undefined, node); |
138 }); | 243 }); |
139 | 244 |
140 TEST_F('AutomationTreeWalkerUnitTest', 'GetPreviousNode', function() { | 245 TEST_F('AutomationTreeWalkerUnitTest', 'GetPreviousNode', function() { |
141 let t = this.getSampleTree(); | 246 let t = this.getSampleTree(); |
142 let treeWalker = | 247 let treeWalker = |
143 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 248 new AutomationTreeWalker(t.leaf5, t.middle1, this.getDefaultRestrictions() ); |
144 | 249 |
145 let order = | 250 let order = |
146 [t.leaf5, t.leaf4, t.middle2, t.leaf3, t.leaf2, | 251 [t.leaf5, t.leaf4, t.lower2, t.leaf3, t.leaf2, |
147 t.leaf1, t.middle1, t.root]; | 252 t.leaf1, t.lower1, t.middle1]; |
148 let node = t.leaf5; | 253 let node = t.leaf5; |
149 for (let i = 0; i < order.length; i++) { | 254 for (let i = 0; i < order.length; i++) { |
150 assertEquals(order[i], node); | 255 assertEquals(order[i], node); |
151 node = treeWalker.getPreviousNode_(node); | 256 node = treeWalker.getPreviousNode_(node); |
152 } | 257 } |
153 assertEquals(undefined, node); | 258 assertEquals(undefined, node); |
154 }); | 259 }); |
155 | 260 |
156 TEST_F('AutomationTreeWalkerUnitTest', 'GetYoungestDescendant', function() { | 261 TEST_F('AutomationTreeWalkerUnitTest', 'GetYoungestDescendant', function() { |
157 let t = this.getSampleTree(); | 262 let t = this.getSampleTree(); |
158 let treeWalker = | 263 let treeWalker = |
159 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 264 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); |
160 | 265 |
161 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.root)); | 266 assertEquals(t.leaf8, treeWalker.getYoungestDescendant_(t.root)); |
162 assertEquals(t.leaf3, treeWalker.getYoungestDescendant_(t.middle1)); | 267 assertEquals(t.leaf7, treeWalker.getYoungestDescendant_(t.upper1)); |
163 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.middle2)); | 268 assertEquals(t.leaf8, treeWalker.getYoungestDescendant_(t.upper2)); |
269 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.middle1)); | |
270 assertEquals(t.leaf7, treeWalker.getYoungestDescendant_(t.middle2)); | |
271 assertEquals(t.leaf3, treeWalker.getYoungestDescendant_(t.lower1)); | |
272 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.lower2)); | |
273 assertEquals(t.leaf7, treeWalker.getYoungestDescendant_(t.lower3)); | |
164 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf1)); | 274 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf1)); |
165 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf2)); | 275 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf2)); |
166 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf3)); | 276 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf3)); |
167 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf4)); | 277 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf4)); |
168 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf5)); | 278 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf5)); |
279 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf6)); | |
280 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf7)); | |
281 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf8)); | |
169 }); | 282 }); |
OLD | NEW |