aria_test.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. // Copyright 2008 The Closure Library Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS-IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.goog.provide('goog.a11y.ariaTest');
  14. goog.provide('goog.a11y.ariaTest');
  15. goog.setTestOnly('goog.a11y.ariaTest');
  16. goog.require('goog.a11y.aria');
  17. goog.require('goog.a11y.aria.Role');
  18. goog.require('goog.a11y.aria.State');
  19. goog.require('goog.dom');
  20. goog.require('goog.dom.TagName');
  21. goog.require('goog.testing.jsunit');
  22. var aria = goog.a11y.aria;
  23. var Role = goog.a11y.aria.Role;
  24. var State = goog.a11y.aria.State;
  25. var sandbox;
  26. var someDiv;
  27. var someSpan;
  28. var htmlButton;
  29. function setUp() {
  30. sandbox = goog.dom.getElement('sandbox');
  31. someDiv = goog.dom.createDom(goog.dom.TagName.DIV, {id: 'someDiv'}, 'DIV');
  32. someSpan =
  33. goog.dom.createDom(goog.dom.TagName.SPAN, {id: 'someSpan'}, 'SPAN');
  34. htmlButton =
  35. goog.dom.createDom(goog.dom.TagName.BUTTON, {id: 'someButton'}, 'BUTTON');
  36. goog.dom.appendChild(sandbox, someDiv);
  37. goog.dom.appendChild(someDiv, someSpan);
  38. }
  39. function tearDown() {
  40. goog.dom.removeChildren(sandbox);
  41. someDiv = null;
  42. someSpan = null;
  43. htmlButton = null;
  44. }
  45. function testGetSetRole() {
  46. assertNull('someDiv\'s role should be null', aria.getRole(someDiv));
  47. assertNull('someSpan\'s role should be null', aria.getRole(someSpan));
  48. aria.setRole(someDiv, Role.MENU);
  49. aria.setRole(someSpan, Role.MENU_ITEM);
  50. assertEquals(
  51. 'someDiv\'s role should be MENU', Role.MENU, aria.getRole(someDiv));
  52. assertEquals(
  53. 'someSpan\'s role should be MENU_ITEM', Role.MENU_ITEM,
  54. aria.getRole(someSpan));
  55. var div = goog.dom.createElement(goog.dom.TagName.DIV);
  56. goog.dom.appendChild(sandbox, div);
  57. goog.dom.appendChild(
  58. div,
  59. goog.dom.createDom(
  60. goog.dom.TagName.SPAN, {id: 'anotherSpan', role: Role.CHECKBOX}));
  61. assertEquals(
  62. 'anotherSpan\'s role should be CHECKBOX', Role.CHECKBOX,
  63. aria.getRole(goog.dom.getElement('anotherSpan')));
  64. }
  65. function testGetSetToggleState() {
  66. assertThrows('Should throw because no state is specified.', function() {
  67. aria.getState(someDiv);
  68. });
  69. assertThrows('Should throw because no state is specified.', function() {
  70. aria.getState(someDiv);
  71. });
  72. aria.setState(someDiv, State.LABELLEDBY, 'someSpan');
  73. assertEquals(
  74. 'someDiv\'s labelledby state should be "someSpan"', 'someSpan',
  75. aria.getState(someDiv, State.LABELLEDBY));
  76. // Test setting for aria-activedescendant with empty value.
  77. assertFalse(
  78. someDiv.hasAttribute ? someDiv.hasAttribute('aria-activedescendant') :
  79. !!someDiv.getAttribute('aria-activedescendant'));
  80. aria.setState(someDiv, State.ACTIVEDESCENDANT, 'someSpan');
  81. assertEquals('someSpan', aria.getState(someDiv, State.ACTIVEDESCENDANT));
  82. aria.setState(someDiv, State.ACTIVEDESCENDANT, '');
  83. assertFalse(
  84. someDiv.hasAttribute ? someDiv.hasAttribute('aria-activedescendant') :
  85. !!someDiv.getAttribute('aria-activedescendant'));
  86. // Test setting state that has a default value to empty value.
  87. assertFalse(
  88. someDiv.hasAttribute ? someDiv.hasAttribute('aria-relevant') :
  89. !!someDiv.getAttribute('aria-relevant'));
  90. aria.setState(someDiv, State.RELEVANT, aria.RelevantValues.TEXT);
  91. assertEquals(
  92. aria.RelevantValues.TEXT, aria.getState(someDiv, State.RELEVANT));
  93. aria.setState(someDiv, State.RELEVANT, '');
  94. assertEquals(
  95. aria.RelevantValues.ADDITIONS + ' ' + aria.RelevantValues.TEXT,
  96. aria.getState(someDiv, State.RELEVANT));
  97. // Test toggling an attribute that has a true/false value.
  98. aria.setState(someDiv, State.EXPANDED, false);
  99. assertEquals('false', aria.getState(someDiv, State.EXPANDED));
  100. aria.toggleState(someDiv, State.EXPANDED);
  101. assertEquals('true', aria.getState(someDiv, State.EXPANDED));
  102. aria.setState(someDiv, State.EXPANDED, true);
  103. assertEquals('true', aria.getState(someDiv, State.EXPANDED));
  104. aria.toggleState(someDiv, State.EXPANDED);
  105. assertEquals('false', aria.getState(someDiv, State.EXPANDED));
  106. // Test toggling an attribute that does not have a true/false value.
  107. aria.setState(someDiv, State.RELEVANT, aria.RelevantValues.TEXT);
  108. assertEquals(
  109. aria.RelevantValues.TEXT, aria.getState(someDiv, State.RELEVANT));
  110. aria.toggleState(someDiv, State.RELEVANT);
  111. assertEquals('', aria.getState(someDiv, State.RELEVANT));
  112. aria.removeState(someDiv, State.RELEVANT);
  113. assertEquals('', aria.getState(someDiv, State.RELEVANT));
  114. // This is not a valid value, but this is what happens if toggle is misused.
  115. aria.toggleState(someDiv, State.RELEVANT);
  116. assertEquals('true', aria.getState(someDiv, State.RELEVANT));
  117. }
  118. function testGetStateString() {
  119. aria.setState(someDiv, State.LABEL, 'test_label');
  120. aria.setState(
  121. someSpan, State.LABEL, aria.getStateString(someDiv, State.LABEL));
  122. assertEquals(
  123. aria.getState(someDiv, State.LABEL),
  124. aria.getState(someSpan, State.LABEL));
  125. assertEquals(
  126. 'The someDiv\'s enum value should be "test_label".', 'test_label',
  127. aria.getState(someDiv, State.LABEL));
  128. assertEquals(
  129. 'The someSpan\'s enum value should be "copy move".', 'test_label',
  130. aria.getStateString(someSpan, State.LABEL));
  131. someDiv.setAttribute('aria-label', '');
  132. assertEquals(null, aria.getStateString(someDiv, State.LABEL));
  133. aria.setState(someDiv, State.MULTILINE, true);
  134. var thrown = false;
  135. try {
  136. aria.getStateString(someDiv, State.MULTILINE);
  137. } catch (e) {
  138. thrown = true;
  139. }
  140. assertTrue('invalid use of getStateString on boolean.', thrown);
  141. aria.setState(someDiv, State.LIVE, aria.LivePriority.ASSERTIVE);
  142. thrown = false;
  143. aria.setState(someDiv, State.LEVEL, 1);
  144. try {
  145. aria.getStateString(someDiv, State.LEVEL);
  146. } catch (e) {
  147. thrown = true;
  148. }
  149. assertTrue('invalid use of getStateString on numbers.', thrown);
  150. }
  151. function testGetStateStringArray() {
  152. aria.setState(someDiv, State.LABELLEDBY, ['1', '2']);
  153. aria.setState(
  154. someSpan, State.LABELLEDBY,
  155. aria.getStringArrayStateInternalUtil(someDiv, State.LABELLEDBY));
  156. assertEquals(
  157. aria.getState(someDiv, State.LABELLEDBY),
  158. aria.getState(someSpan, State.LABELLEDBY));
  159. assertEquals(
  160. 'The someDiv\'s enum value should be "1 2".', '1 2',
  161. aria.getState(someDiv, State.LABELLEDBY));
  162. assertEquals(
  163. 'The someSpan\'s enum value should be "1 2".', '1 2',
  164. aria.getState(someSpan, State.LABELLEDBY));
  165. assertSameElements(
  166. 'The someDiv\'s enum value should be "1 2".', ['1', '2'],
  167. aria.getStringArrayStateInternalUtil(someDiv, State.LABELLEDBY));
  168. assertSameElements(
  169. 'The someSpan\'s enum value should be "1 2".', ['1', '2'],
  170. aria.getStringArrayStateInternalUtil(someSpan, State.LABELLEDBY));
  171. }
  172. function testGetStateNumber() {
  173. aria.setState(someDiv, State.LEVEL, 1);
  174. aria.setState(
  175. someSpan, State.LEVEL, aria.getStateNumber(someDiv, State.LEVEL));
  176. assertEquals(
  177. aria.getState(someDiv, State.LEVEL),
  178. aria.getState(someSpan, State.LEVEL));
  179. assertEquals(
  180. 'The someDiv\'s enum value should be "1".', '1',
  181. aria.getState(someDiv, State.LEVEL));
  182. assertEquals(
  183. 'The someSpan\'s enum value should be "1".', '1',
  184. aria.getState(someSpan, State.LEVEL));
  185. assertEquals(
  186. 'The someDiv\'s enum value should be "1".', 1,
  187. aria.getStateNumber(someDiv, State.LEVEL));
  188. assertEquals(
  189. 'The someSpan\'s enum value should be "1".', 1,
  190. aria.getStateNumber(someSpan, State.LEVEL));
  191. aria.setState(someDiv, State.MULTILINE, true);
  192. var thrown = false;
  193. try {
  194. aria.getStateNumber(someDiv, State.MULTILINE);
  195. } catch (e) {
  196. thrown = true;
  197. }
  198. assertTrue('invalid use of getStateNumber on boolean.', thrown);
  199. aria.setState(someDiv, State.LIVE, aria.LivePriority.ASSERTIVE);
  200. thrown = false;
  201. try {
  202. aria.getStateBoolean(someDiv, State.LIVE);
  203. } catch (e) {
  204. thrown = true;
  205. }
  206. assertTrue('invalid use of getStateNumber on strings.', thrown);
  207. }
  208. function testGetStateBoolean() {
  209. assertNull(aria.getStateBoolean(someDiv, State.MULTILINE));
  210. aria.setState(someDiv, State.MULTILINE, false);
  211. assertFalse(aria.getStateBoolean(someDiv, State.MULTILINE));
  212. aria.setState(someDiv, State.MULTILINE, true);
  213. aria.setState(
  214. someSpan, State.MULTILINE,
  215. aria.getStateBoolean(someDiv, State.MULTILINE));
  216. assertEquals(
  217. aria.getState(someDiv, State.MULTILINE),
  218. aria.getState(someSpan, State.MULTILINE));
  219. assertEquals(
  220. 'The someDiv\'s enum value should be "true".', 'true',
  221. aria.getState(someDiv, State.MULTILINE));
  222. assertEquals(
  223. 'The someSpan\'s enum value should be "true".', 'true',
  224. aria.getState(someSpan, State.MULTILINE));
  225. assertEquals(
  226. 'The someDiv\'s enum value should be "true".', true,
  227. aria.getStateBoolean(someDiv, State.MULTILINE));
  228. assertEquals(
  229. 'The someSpan\'s enum value should be "true".', true,
  230. aria.getStateBoolean(someSpan, State.MULTILINE));
  231. aria.setState(someDiv, State.LEVEL, 1);
  232. var thrown = false;
  233. try {
  234. aria.getStateBoolean(someDiv, State.LEVEL);
  235. } catch (e) {
  236. thrown = true;
  237. }
  238. assertTrue('invalid use of getStateBoolean on numbers.', thrown);
  239. aria.setState(someDiv, State.LIVE, aria.LivePriority.ASSERTIVE);
  240. thrown = false;
  241. try {
  242. aria.getStateBoolean(someDiv, State.LIVE);
  243. } catch (e) {
  244. thrown = true;
  245. }
  246. assertTrue('invalid use of getStateBoolean on strings.', thrown);
  247. }
  248. function testGetSetActiveDescendant() {
  249. aria.setActiveDescendant(someDiv, null);
  250. assertNull(
  251. 'someDiv\'s activedescendant should be null',
  252. aria.getActiveDescendant(someDiv));
  253. aria.setActiveDescendant(someDiv, someSpan);
  254. assertEquals(
  255. 'someDiv\'s active descendant should be "someSpan"', someSpan,
  256. aria.getActiveDescendant(someDiv));
  257. }
  258. function testGetSetLabel() {
  259. assertEquals('someDiv\'s label should be ""', '', aria.getLabel(someDiv));
  260. aria.setLabel(someDiv, 'somelabel');
  261. assertEquals(
  262. 'someDiv\'s label should be "somelabel"', 'somelabel',
  263. aria.getLabel(someDiv));
  264. }
  265. function testHasState() {
  266. aria.setState(someDiv, State.EXPANDED, false);
  267. assertTrue(aria.hasState(someDiv, State.EXPANDED));
  268. aria.removeState(someDiv, State.EXPANDED);
  269. assertFalse(aria.hasState(someDiv, State.EXPANDED));
  270. }