Chromium Code Reviews| 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 |