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 'test_support.js', |
19 'tree_walker.js', | 20 'tree_walker.js', |
20 ], | 21 ], |
21 | 22 |
22 /** @override */ | 23 /** @override */ |
23 browsePreload: DUMMY_URL, | 24 browsePreload: DUMMY_URL, |
24 | 25 |
25 getSampleTree: function() { | 26 getSampleTree: function() { |
26 let loc = {left: 0, top: 0, width: 0, height: 0}; | 27 let loc = {left: 0, top: 0, width: 0, height: 0}; |
27 // root | 28 // root |
28 // middle1 | 29 // upper1 |
29 // leaf1 | 30 // middle1 |
30 // leaf2 | 31 // lower1 |
31 // leaf3 | 32 // leaf1 |
32 // middle2 | 33 // leaf2 |
33 // leaf4 | 34 // leaf3 |
34 // leaf5 | 35 // lower2 |
| 36 // leaf4 |
| 37 // leaf5 |
| 38 // middle2 |
| 39 // lower3 |
| 40 // leaf6 |
| 41 // leaf7 |
| 42 // upper2 |
| 43 // leaf8 |
35 let root = {location: loc, state: {}}; | 44 let root = {location: loc, state: {}}; |
| 45 let upper1 = {location: loc, state: {}}; |
| 46 let upper2 = {location: loc, state: {}}; |
36 let middle1 = {location: loc, state: {}}; | 47 let middle1 = {location: loc, state: {}}; |
37 let middle2 = {location: loc, state: {}}; | 48 let middle2 = {location: loc, state: {}}; |
| 49 let lower1 = {location: loc, state: {}}; |
| 50 let lower2 = {location: loc, state: {}}; |
| 51 let lower3 = {location: loc, state: {}}; |
38 let leaf1 = {location: loc, state: {}}; | 52 let leaf1 = {location: loc, state: {}}; |
39 let leaf2 = {location: loc, state: {}}; | 53 let leaf2 = {location: loc, state: {}}; |
40 let leaf3 = {location: loc, state: {}}; | 54 let leaf3 = {location: loc, state: {}}; |
41 let leaf4 = {location: loc, state: {}}; | 55 let leaf4 = {location: loc, state: {}}; |
42 let leaf5 = {location: loc, state: {}}; | 56 let leaf5 = {location: loc, state: {}}; |
| 57 let leaf6 = {location: loc, state: {}}; |
| 58 let leaf7 = {location: loc, state: {}}; |
| 59 let leaf8 = {location: loc, state: {}}; |
43 | 60 |
44 root.firstChild = middle1; | 61 let ts = new TestSupport(); |
45 root.lastChild = middle2; | 62 ts.setChildren(root, [upper1, upper2]); |
46 | 63 ts.setChildren(upper1, [middle1, middle2]); |
47 middle1.parent = root; | 64 ts.setChildren(upper2, [leaf8]); |
48 middle2.parent = root; | 65 ts.setChildren(middle1, [lower1, lower2]); |
49 middle1.nextSibling = middle2; | 66 ts.setChildren(middle2, [lower3]); |
50 middle2.previousSibling = middle1; | 67 ts.setChildren(lower1, [leaf1, leaf2, leaf3]); |
51 middle1.firstChild = leaf1; | 68 ts.setChildren(lower2, [leaf4, leaf5]); |
52 middle1.lastChild = leaf3; | 69 ts.setChildren(lower3, [leaf6, leaf7]); |
53 middle2.firstChild = leaf4; | |
54 middle2.lastChild = leaf5; | |
55 | |
56 leaf1.parent = middle1; | |
57 leaf2.parent = middle1; | |
58 leaf3.parent = middle1; | |
59 leaf1.nextSibling = leaf2; | |
60 leaf2.previousSibling = leaf1; | |
61 leaf2.nextSibling = leaf3; | |
62 leaf3.previousSibling = leaf2; | |
63 | |
64 leaf4.parent = middle2; | |
65 leaf5.parent = middle2; | |
66 leaf4.nextSibling = leaf5; | |
67 leaf5.previousSibling = leaf4; | |
68 | 70 |
69 return { | 71 return { |
70 root: root, | 72 root: root, |
| 73 upper1: upper1, |
| 74 upper2: upper2, |
71 middle1: middle1, | 75 middle1: middle1, |
72 middle2: middle2, | 76 middle2: middle2, |
| 77 lower1: lower1, |
| 78 lower2: lower2, |
| 79 lower3: lower3, |
73 leaf1: leaf1, | 80 leaf1: leaf1, |
74 leaf2: leaf2, | 81 leaf2: leaf2, |
75 leaf3: leaf3, | 82 leaf3: leaf3, |
76 leaf4: leaf4, | 83 leaf4: leaf4, |
77 leaf5: leaf5 | 84 leaf5: leaf5, |
| 85 leaf6: leaf6, |
| 86 leaf7: leaf7, |
| 87 leaf8: leaf8 |
78 }; | 88 }; |
79 }, | 89 }, |
80 | 90 |
81 getDefaultRestrictions: function() { | 91 getDefaultRestrictions: function() { |
82 return { | 92 return { |
83 leaf: function(node) { | 93 leaf: function(node) { |
84 return false; | 94 return false; |
85 }, | 95 }, |
86 visit: function(node) { | 96 visit: function(node) { |
87 return node.state.focusable === true; | 97 return node.state.focusable === true; |
88 }, | 98 }, |
89 } | 99 } |
| 100 }, |
| 101 |
| 102 getSubtreeRestrictions: function() { |
| 103 return { |
| 104 leaf: function(node) { |
| 105 return node.state.leaf === true; |
| 106 }, |
| 107 visit: function(node) { |
| 108 return node.state.focusable === true; |
| 109 }, |
| 110 } |
90 } | 111 } |
91 }; | 112 }; |
92 | 113 |
93 TEST_F('AutomationTreeWalkerUnitTest', 'MoveToNode', function() { | 114 TEST_F('AutomationTreeWalkerUnitTest', 'MoveToNodeWholeTree', function() { |
94 chrome.automation = { | 115 let t = this.getSampleTree(); |
95 RoleType: {DESKTOP: 'desktop', TAB: 'tab', TAB_LIST: 'tabList'}, | 116 let treeWalker = new AutomationTreeWalker( |
96 StateType: {FOCUSABLE: 'focusable', OFFSCREEN: 'offscreen'} | 117 t.root, t.root, this.getDefaultRestrictions()); |
97 }; | |
98 | 118 |
99 let t = this.getSampleTree(); | 119 t.root.state['focusable'] = true; |
100 let treeWalker = | 120 t.middle1.state['focusable'] = true; |
101 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 121 t.leaf1.state['focusable'] = true; |
102 | 122 t.leaf2.state['focusable'] = true; |
103 let interesting = {focusable: true}; | 123 t.leaf5.state['focusable'] = true; |
104 t.leaf1.state = interesting; | 124 t.lower3.state['focusable'] = true; |
105 t.leaf2.state = interesting; | 125 t.leaf6.state['focusable'] = true; |
106 t.middle2.state = interesting; | 126 t.upper2.state['focusable'] = true; |
107 t.leaf5.state = interesting; | 127 t.leaf8.state['focusable'] = true; |
108 | 128 |
109 // Move to next node. | 129 // Move to next node. |
| 130 assertEquals(t.middle1, treeWalker.moveToNode(true)); |
110 assertEquals(t.leaf1, treeWalker.moveToNode(true)); | 131 assertEquals(t.leaf1, treeWalker.moveToNode(true)); |
111 assertEquals(t.leaf2, treeWalker.moveToNode(true)); | 132 assertEquals(t.leaf2, treeWalker.moveToNode(true)); |
112 assertEquals(t.middle2, treeWalker.moveToNode(true)); | |
113 assertEquals(t.leaf5, treeWalker.moveToNode(true)); | 133 assertEquals(t.leaf5, treeWalker.moveToNode(true)); |
114 assertEquals(t.leaf1, treeWalker.moveToNode(true)); | 134 assertEquals(t.lower3, treeWalker.moveToNode(true)); |
| 135 assertEquals(t.leaf6, treeWalker.moveToNode(true)); |
| 136 assertEquals(t.upper2, treeWalker.moveToNode(true)); |
| 137 assertEquals(t.leaf8, treeWalker.moveToNode(true)); |
| 138 assertEquals(t.root, treeWalker.moveToNode(true)); |
| 139 assertEquals(t.middle1, treeWalker.moveToNode(true)); |
115 | 140 |
116 // Move to previous node. | 141 // Move to previous node. |
| 142 assertEquals(t.root, treeWalker.moveToNode(false)); |
| 143 assertEquals(t.leaf8, treeWalker.moveToNode(false)); |
| 144 assertEquals(t.upper2, treeWalker.moveToNode(false)); |
| 145 assertEquals(t.leaf6, treeWalker.moveToNode(false)); |
| 146 assertEquals(t.lower3, treeWalker.moveToNode(false)); |
117 assertEquals(t.leaf5, treeWalker.moveToNode(false)); | 147 assertEquals(t.leaf5, treeWalker.moveToNode(false)); |
118 assertEquals(t.middle2, treeWalker.moveToNode(false)); | |
119 assertEquals(t.leaf2, treeWalker.moveToNode(false)); | 148 assertEquals(t.leaf2, treeWalker.moveToNode(false)); |
120 assertEquals(t.leaf1, treeWalker.moveToNode(false)); | 149 assertEquals(t.leaf1, treeWalker.moveToNode(false)); |
121 assertEquals(t.leaf5, treeWalker.moveToNode(false)); | 150 assertEquals(t.middle1, treeWalker.moveToNode(false)); |
| 151 }); |
| 152 |
| 153 TEST_F('AutomationTreeWalkerUnitTest', 'MoveToNodeInSubtree', function() { |
| 154 let t = this.getSampleTree(); |
| 155 let treeWalker = new AutomationTreeWalker( |
| 156 t.upper1, t.upper1, this.getSubtreeRestrictions()); |
| 157 |
| 158 t.lower2.state['leaf'] = true; |
| 159 t.lower3.state['leaf'] = true; |
| 160 |
| 161 t.root.state['focusable'] = true; |
| 162 t.middle1.state['focusable'] = true; |
| 163 t.leaf1.state['focusable'] = true; |
| 164 t.leaf2.state['focusable'] = true; |
| 165 t.leaf5.state['focusable'] = true; |
| 166 t.lower3.state['focusable'] = true; |
| 167 t.leaf6.state['focusable'] = true; |
| 168 t.upper2.state['focusable'] = true; |
| 169 t.leaf8.state['focusable'] = true; |
| 170 |
| 171 // Move to next node. |
| 172 assertEquals(t.middle1, treeWalker.moveToNode(true)); |
| 173 assertEquals(t.leaf1, treeWalker.moveToNode(true)); |
| 174 assertEquals(t.leaf2, treeWalker.moveToNode(true)); |
| 175 assertEquals(t.lower3, treeWalker.moveToNode(true)); |
| 176 assertEquals(t.middle1, treeWalker.moveToNode(true)); |
| 177 |
| 178 // Move to previous node. |
| 179 assertEquals(t.lower3, treeWalker.moveToNode(false)); |
| 180 assertEquals(t.leaf2, treeWalker.moveToNode(false)); |
| 181 assertEquals(t.leaf1, treeWalker.moveToNode(false)); |
| 182 assertEquals(t.middle1, treeWalker.moveToNode(false)); |
| 183 assertEquals(t.lower3, treeWalker.moveToNode(false)); |
122 }); | 184 }); |
123 | 185 |
124 TEST_F('AutomationTreeWalkerUnitTest', 'GetNextNode', function() { | 186 TEST_F('AutomationTreeWalkerUnitTest', 'GetNextNode', function() { |
125 let t = this.getSampleTree(); | 187 let t = this.getSampleTree(); |
126 let treeWalker = | 188 let treeWalker = new AutomationTreeWalker( |
127 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 189 t.middle1, t.middle1, this.getDefaultRestrictions()); |
128 | 190 |
129 let order = | 191 let order = |
130 [t.root, t.middle1, t.leaf1, t.leaf2, t.leaf3, | 192 [t.middle1, t.lower1, t.leaf1, t.leaf2, t.leaf3, |
131 t.middle2, t.leaf4, t.leaf5]; | 193 t.lower2, t.leaf4, t.leaf5]; |
132 let node = t.root; | 194 let node = t.middle1; |
133 for (let i = 0; i < order.length; i++) { | 195 for (let i = 0; i < order.length; i++) { |
134 assertEquals(order[i], node); | 196 assertEquals(order[i], node); |
135 node = treeWalker.getNextNode_(node); | 197 node = treeWalker.getNextNode_(node); |
136 } | 198 } |
137 assertEquals(undefined, node); | 199 assertEquals(undefined, node); |
138 }); | 200 }); |
139 | 201 |
140 TEST_F('AutomationTreeWalkerUnitTest', 'GetPreviousNode', function() { | 202 TEST_F('AutomationTreeWalkerUnitTest', 'GetPreviousNode', function() { |
141 let t = this.getSampleTree(); | 203 let t = this.getSampleTree(); |
142 let treeWalker = | 204 let treeWalker = new AutomationTreeWalker( |
143 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 205 t.leaf5, t.middle1, this.getDefaultRestrictions()); |
144 | 206 |
145 let order = | 207 let order = |
146 [t.leaf5, t.leaf4, t.middle2, t.leaf3, t.leaf2, | 208 [t.leaf5, t.leaf4, t.lower2, t.leaf3, t.leaf2, |
147 t.leaf1, t.middle1, t.root]; | 209 t.leaf1, t.lower1, t.middle1]; |
148 let node = t.leaf5; | 210 let node = t.leaf5; |
149 for (let i = 0; i < order.length; i++) { | 211 for (let i = 0; i < order.length; i++) { |
150 assertEquals(order[i], node); | 212 assertEquals(order[i], node); |
151 node = treeWalker.getPreviousNode_(node); | 213 node = treeWalker.getPreviousNode_(node); |
152 } | 214 } |
153 assertEquals(undefined, node); | 215 assertEquals(undefined, node); |
154 }); | 216 }); |
155 | 217 |
156 TEST_F('AutomationTreeWalkerUnitTest', 'GetYoungestDescendant', function() { | 218 TEST_F('AutomationTreeWalkerUnitTest', 'GetYoungestDescendant', function() { |
157 let t = this.getSampleTree(); | 219 let t = this.getSampleTree(); |
158 let treeWalker = | 220 let treeWalker = new AutomationTreeWalker( |
159 new AutomationTreeWalker(t.root, t.root, this.getDefaultRestrictions()); | 221 t.root, t.root, this.getDefaultRestrictions()); |
160 | 222 |
161 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.root)); | 223 assertEquals(t.leaf8, treeWalker.getYoungestDescendant_(t.root)); |
162 assertEquals(t.leaf3, treeWalker.getYoungestDescendant_(t.middle1)); | 224 assertEquals(t.leaf7, treeWalker.getYoungestDescendant_(t.upper1)); |
163 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.middle2)); | 225 assertEquals(t.leaf8, treeWalker.getYoungestDescendant_(t.upper2)); |
| 226 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.middle1)); |
| 227 assertEquals(t.leaf7, treeWalker.getYoungestDescendant_(t.middle2)); |
| 228 assertEquals(t.leaf3, treeWalker.getYoungestDescendant_(t.lower1)); |
| 229 assertEquals(t.leaf5, treeWalker.getYoungestDescendant_(t.lower2)); |
| 230 assertEquals(t.leaf7, treeWalker.getYoungestDescendant_(t.lower3)); |
164 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf1)); | 231 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf1)); |
165 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf2)); | 232 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf2)); |
166 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf3)); | 233 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf3)); |
167 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf4)); | 234 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf4)); |
168 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf5)); | 235 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf5)); |
| 236 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf6)); |
| 237 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf7)); |
| 238 assertEquals(undefined, treeWalker.getYoungestDescendant_(t.leaf8)); |
169 }); | 239 }); |
OLD | NEW |