/accessible/tests/mochitest/text.js

https://github.com/diogogmt/mozilla-central · JavaScript · 393 lines · 237 code · 31 blank · 125 comment · 30 complexity · 5c40999e839c15e64e3a65a9b113b51d MD5 · raw file

  1. ////////////////////////////////////////////////////////////////////////////////
  2. // Public
  3. const BOUNDARY_CHAR = nsIAccessibleText.BOUNDARY_CHAR;
  4. const BOUNDARY_WORD_START = nsIAccessibleText.BOUNDARY_WORD_START;
  5. const BOUNDARY_WORD_END = nsIAccessibleText.BOUNDARY_WORD_END;
  6. const BOUNDARY_LINE_START = nsIAccessibleText.BOUNDARY_LINE_START;
  7. const BOUNDARY_LINE_END = nsIAccessibleText.BOUNDARY_LINE_END;
  8. const BOUNDARY_ATTRIBUTE_RANGE = nsIAccessibleText.BOUNDARY_ATTRIBUTE_RANGE;
  9. const kTodo = 1;
  10. const kOk = 2;
  11. /**
  12. * Test characterCount for the given array of accessibles.
  13. *
  14. * @param aCount [in] the expected character count
  15. * @param aIDs [in] array of accessible identifiers to test
  16. */
  17. function testCharacterCount(aIDs, aCount)
  18. {
  19. for (var i = 0; i < aIDs.length; i++) {
  20. var textacc = getAccessible(aIDs[i], [nsIAccessibleText]);
  21. is(textacc.characterCount, aCount,
  22. "Wrong character count for " + prettyName(aIDs[i]));
  23. }
  24. }
  25. /**
  26. * Test text between two given offsets
  27. *
  28. * @param aIDs [in] an array of accessible IDs to test
  29. * @param aStartOffset [in] the start offset within the text to test
  30. * @param aEndOffset [in] the end offset up to which the text is tested
  31. * @param aText [in] the expected result from the test
  32. */
  33. function testText(aIDs, aStartOffset, aEndOffset, aText)
  34. {
  35. for (var i = 0; i < aIDs.length; i++)
  36. {
  37. var acc = getAccessible(aIDs[i], nsIAccessibleText);
  38. try {
  39. is(acc.getText(aStartOffset, aEndOffset), aText,
  40. "getText: wrong text between start and end offsets '" + aStartOffset +
  41. "', '" + aEndOffset + " for '" + prettyName(aIDs[i]) + "'");
  42. } catch (e) {
  43. ok(false,
  44. "getText fails between start and end offsets '" + aStartOffset +
  45. "', '" + aEndOffset + " for '" + prettyName(aIDs[i]) + "'");
  46. }
  47. }
  48. }
  49. /**
  50. * Test password text between two given offsets
  51. *
  52. * @param aIDs [in] an array of accessible IDs to test
  53. * @param aStartOffset [in] the start offset within the text to test
  54. * @param aEndOffset [in] the end offset up to which the text is tested
  55. * @param aText [in] the expected result from the test
  56. *
  57. * @note All this function does is test that getText doe snot expose the
  58. * password text itself, but something else.
  59. */
  60. function testPasswordText(aIDs, aStartOffset, aEndOffset, aText)
  61. {
  62. for (var i = 0; i < aIDs.length; i++)
  63. {
  64. var acc = getAccessible(aIDs[i], nsIAccessibleText);
  65. try {
  66. isnot(acc.getText(aStartOffset, aEndOffset), aText,
  67. "getText: plain text between start and end offsets '" + aStartOffset +
  68. "', '" + aEndOffset + " for '" + prettyName(aIDs[i]) + "'");
  69. } catch (e) {
  70. ok(false,
  71. "getText fails between start and end offsets '" + aStartOffset +
  72. "', '" + aEndOffset + " for '" + prettyName(aIDs[i]) + "'");
  73. }
  74. }
  75. }
  76. /**
  77. * Test getTextAtOffset for BOUNDARY_CHAR over different elements.
  78. *
  79. * @param aIDs [in] the accessible identifier or array of accessible
  80. * identifiers
  81. * @param aOffset [in] the offset to get a character at it
  82. * @param aChar [in] the expected character
  83. * @param aStartOffset [in] expected start offset of the character
  84. * @param aEndOffset [in] expected end offset of the character
  85. */
  86. function testCharAtOffset(aIDs, aOffset, aChar, aStartOffset, aEndOffset)
  87. {
  88. var IDs = (aIDs instanceof Array) ? aIDs : [ aIDs ];
  89. for (var i = 0; i < IDs.length; i++) {
  90. var acc = getAccessible(IDs[i], nsIAccessibleText);
  91. testTextHelper(IDs[i], aOffset, BOUNDARY_CHAR,
  92. aChar, aStartOffset, aEndOffset,
  93. kOk, kOk, kOk,
  94. acc.getTextAtOffset, "getTextAtOffset ");
  95. }
  96. }
  97. /**
  98. * Test getTextAtOffset function over different elements
  99. *
  100. * @param aOffset [in] the offset to get the text at
  101. * @param aBoundaryType [in] Boundary type for text to be retrieved
  102. * @param aText [in] expected return text for getTextAtOffset
  103. * @param aStartOffset [in] expected return start offset for getTextAtOffset
  104. * @param aEndOffset [in] expected return end offset for getTextAtOffset
  105. * @param ... [in] list of tuples made of:
  106. * element identifier
  107. * kTodo or kOk for returned text
  108. * kTodo or kOk for returned start offset
  109. * kTodo or kOk for returned offset result
  110. *
  111. */
  112. function testTextAtOffset(aOffset, aBoundaryType, aText,
  113. aStartOffset, aEndOffset)
  114. {
  115. for (var i = 5; i < arguments.length; i = i + 4) {
  116. var ID = arguments[i];
  117. var acc = getAccessible(ID, nsIAccessibleText);
  118. var toDoFlag1 = arguments[i + 1];
  119. var toDoFlag2 = arguments[i + 2];
  120. var toDoFlag3 = arguments[i + 3];
  121. testTextHelper(ID, aOffset, aBoundaryType,
  122. aText, aStartOffset, aEndOffset,
  123. toDoFlag1, toDoFlag2, toDoFlag3,
  124. acc.getTextAtOffset, "getTextAtOffset ");
  125. }
  126. }
  127. /**
  128. * Test getTextAfterOffset for BOUNDARY_CHAR over different elements.
  129. *
  130. * @param aIDs [in] the accessible identifier or array of accessible
  131. * identifiers
  132. * @param aOffset [in] the offset to get a character after it
  133. * @param aChar [in] the expected character
  134. * @param aStartOffset [in] expected start offset of the character
  135. * @param aEndOffset [in] expected end offset of the character
  136. */
  137. function testCharAfterOffset(aIDs, aOffset, aChar, aStartOffset, aEndOffset)
  138. {
  139. var IDs = (aIDs instanceof Array) ? aIDs : [ aIDs ];
  140. for (var i = 0; i < IDs.length; i++) {
  141. var acc = getAccessible(IDs[i], nsIAccessibleText);
  142. testTextHelper(IDs[i], aOffset, BOUNDARY_CHAR,
  143. aChar, aStartOffset, aEndOffset,
  144. kOk, kOk, kOk,
  145. acc.getTextAfterOffset, "getTextAfterOffset ");
  146. }
  147. }
  148. /**
  149. * Test getTextAfterOffset function over different elements
  150. *
  151. * @param aOffset [in] the offset to get the text after
  152. * @param aBoundaryType [in] Boundary type for text to be retrieved
  153. * @param aText [in] expected return text for getTextAfterOffset
  154. * @param aStartOffset [in] expected return start offset for getTextAfterOffset
  155. * @param aEndOffset [in] expected return end offset for getTextAfterOffset
  156. * @param ... [in] list of tuples made of:
  157. * element identifier
  158. * kTodo or kOk for returned text
  159. * kTodo or kOk for returned start offset
  160. * kTodo or kOk for returned offset result
  161. */
  162. function testTextAfterOffset(aOffset, aBoundaryType,
  163. aText, aStartOffset, aEndOffset)
  164. {
  165. for (var i = 5; i < arguments.length; i = i + 4) {
  166. var ID = arguments[i];
  167. var acc = getAccessible(ID, nsIAccessibleText);
  168. var toDoFlag1 = arguments[i + 1];
  169. var toDoFlag2 = arguments[i + 2];
  170. var toDoFlag3 = arguments[i + 3];
  171. testTextHelper(ID, aOffset, aBoundaryType,
  172. aText, aStartOffset, aEndOffset,
  173. toDoFlag1, toDoFlag2, toDoFlag3,
  174. acc.getTextAfterOffset, "getTextAfterOffset ");
  175. }
  176. }
  177. /**
  178. * Test getTextBeforeOffset for BOUNDARY_CHAR over different elements.
  179. *
  180. * @param aIDs [in] the accessible identifier or array of accessible
  181. * identifiers
  182. * @param aOffset [in] the offset to get a character before it
  183. * @param aChar [in] the expected character
  184. * @param aStartOffset [in] expected start offset of the character
  185. * @param aEndOffset [in] expected end offset of the character
  186. */
  187. function testCharBeforeOffset(aIDs, aOffset, aChar, aStartOffset, aEndOffset)
  188. {
  189. var IDs = (aIDs instanceof Array) ? aIDs : [ aIDs ];
  190. for (var i = 0; i < IDs.length; i++) {
  191. var acc = getAccessible(IDs[i], nsIAccessibleText);
  192. testTextHelper(IDs[i], aOffset, BOUNDARY_CHAR,
  193. aChar, aStartOffset, aEndOffset,
  194. kOk, kOk, kOk,
  195. acc.getTextBeforeOffset, "getTextBeforeOffset ");
  196. }
  197. }
  198. /**
  199. * Test getTextBeforeOffset function over different elements
  200. *
  201. * @param aOffset [in] the offset to get the text before
  202. * @param aBoundaryType [in] Boundary type for text to be retrieved
  203. * @param aText [in] expected return text for getTextBeforeOffset
  204. * @param aStartOffset [in] expected return start offset for getTextBeforeOffset
  205. * @param aEndOffset [in] expected return end offset for getTextBeforeOffset
  206. * @param ... [in] list of tuples made of:
  207. * element identifier
  208. * kTodo or kOk for returned text
  209. * kTodo or kOk for returned start offset
  210. * kTodo or kOk for returned offset result
  211. *
  212. */
  213. function testTextBeforeOffset(aOffset, aBoundaryType,
  214. aText, aStartOffset, aEndOffset)
  215. {
  216. for (var i = 5; i < arguments.length; i = i + 4) {
  217. var ID = arguments[i];
  218. var acc = getAccessible(ID, nsIAccessibleText);
  219. var toDoFlag1 = arguments[i + 1];
  220. var toDoFlag2 = arguments[i + 2];
  221. var toDoFlag3 = arguments[i + 3];
  222. testTextHelper(ID, aOffset, aBoundaryType,
  223. aText, aStartOffset, aEndOffset,
  224. toDoFlag1, toDoFlag2, toDoFlag3,
  225. acc.getTextBeforeOffset, "getTextBeforeOffset ");
  226. }
  227. }
  228. /**
  229. * Test word count for an element.
  230. *
  231. * @param aElement [in] element identifier
  232. * @param aCount [in] Expected word count
  233. * @param aToDoFlag [in] kTodo or kOk for returned text
  234. */
  235. function testWordCount(aElement, aCount, aToDoFlag)
  236. {
  237. var isFunc = (aToDoFlag == kTodo) ? todo_is : is;
  238. var acc = getAccessible(aElement, nsIAccessibleText);
  239. var startOffsetObj = {}, endOffsetObj = {};
  240. var length = acc.characterCount;
  241. var offset = 0;
  242. var wordCount = 0;
  243. while (true) {
  244. var text = acc.getTextAtOffset(offset, BOUNDARY_WORD_START,
  245. startOffsetObj, endOffsetObj);
  246. if (offset >= length)
  247. break;
  248. wordCount++;
  249. offset = endOffsetObj.value;
  250. }
  251. isFunc(wordCount, aCount, "wrong words count for '" + acc.getText(0, -1) + "': " +
  252. wordCount);
  253. }
  254. /**
  255. * Test word at a position for an element.
  256. *
  257. * @param aElement [in] element identifier
  258. * @param aWordIndex [in] index of the word to test
  259. * @param aText [in] expected text for that word
  260. * @param aToDoFlag [in] kTodo or kOk for returned text
  261. */
  262. function testWordAt(aElement, aWordIndex, aText, aToDoFlag)
  263. {
  264. var isFunc = (aToDoFlag == kTodo) ? todo_is : is;
  265. var acc = getAccessible(aElement, nsIAccessibleText);
  266. var startOffsetObj = {}, endOffsetObj = {};
  267. var length = acc.characterCount;
  268. var offset = 0;
  269. var wordIndex = -1;
  270. var wordFountAtOffset = -1;
  271. while (true) {
  272. var text = acc.getTextAtOffset(offset, BOUNDARY_WORD_START,
  273. startOffsetObj, endOffsetObj);
  274. if (offset >= length)
  275. break;
  276. wordIndex++;
  277. offset = endOffsetObj.value;
  278. if (wordIndex == aWordIndex) {
  279. wordFountAtOffset = startOffsetObj.value;
  280. break;
  281. }
  282. }
  283. if (wordFountAtOffset >= 0) {
  284. var text = acc.getTextAtOffset(wordFountAtOffset, BOUNDARY_WORD_END,
  285. startOffsetObj, endOffsetObj);
  286. if (endOffsetObj.value < wordFountAtOffset) {
  287. todo(false, "wrong start and end offset for word '" + aWordIndex + "': " +
  288. " of text '" + acc.getText(0, -1) + "'");
  289. return;
  290. }
  291. text = acc.getText(wordFountAtOffset, endOffsetObj.value);
  292. isFunc(text, aText, "wrong text for word at pos '" + aWordIndex + "': " +
  293. " of text '" + acc.getText(0, -1) + "'");
  294. }
  295. else {
  296. isFunc(false, "failed to find word " + aText + " at word pos " + aWordIndex +
  297. " of text '" + acc.getText(0, -1) + "'");
  298. }
  299. }
  300. /**
  301. * Test words in a element.
  302. *
  303. * @param aElement [in] element identifier
  304. * @param aWords [in] array of expected words
  305. * @param aToDoFlag [in, optional] kTodo or kOk for returned text
  306. */
  307. function testWords(aElement, aWords, aToDoFlag)
  308. {
  309. if (aToDoFlag == null)
  310. aToDoFlag = kOk;
  311. testWordCount(aElement, aWords.length, aToDoFlag);
  312. for (var i = 0; i < aWords.length; i++) {
  313. testWordAt(aElement, i, aWords[i], aToDoFlag);
  314. }
  315. }
  316. ////////////////////////////////////////////////////////////////////////////////
  317. // Private
  318. function testTextHelper(aID, aOffset, aBoundaryType,
  319. aText, aStartOffset, aEndOffset,
  320. aToDoFlag1, aToDoFlag2, aToDoFlag3,
  321. aTextFunc, aTextFuncName)
  322. {
  323. var exceptionFlag = aToDoFlag1 == undefined ||
  324. aToDoFlag2 == undefined ||
  325. aToDoFlag3 == undefined;
  326. try {
  327. var startOffsetObj = {}, endOffsetObj = {};
  328. var text = aTextFunc(aOffset, aBoundaryType,
  329. startOffsetObj, endOffsetObj);
  330. var isFunc1 = (aToDoFlag1 == kTodo) ? todo_is : is;
  331. var isFunc2 = (aToDoFlag2 == kTodo) ? todo_is : is;
  332. var isFunc3 = (aToDoFlag3 == kTodo) ? todo_is : is;
  333. var startMsg = aTextFuncName + "(" + boundaryToString(aBoundaryType) + "): ";
  334. var endMsg = ", id: '" + prettyName(aID) + "';";
  335. isFunc1(text, aText,
  336. startMsg + "wrong text, offset: " + aOffset + endMsg);
  337. isFunc2(startOffsetObj.value, aStartOffset,
  338. startMsg + "wrong start offset, offset: " + aOffset + endMsg);
  339. isFunc3(endOffsetObj.value, aEndOffset,
  340. startMsg + "wrong end offset, offset: " + aOffset + endMsg);
  341. } catch (e) {
  342. var okFunc = exceptionFlag ? todo : ok;
  343. okFunc(false, startMsg + "failed at offset " + aOffset + endMsg);
  344. }
  345. }
  346. function boundaryToString(aBoundaryType)
  347. {
  348. switch (aBoundaryType) {
  349. case BOUNDARY_CHAR:
  350. return "char";
  351. case BOUNDARY_WORD_START:
  352. return "word start";
  353. case BOUNDARY_WORD_END:
  354. return "word end";
  355. case BOUNDARY_LINE_START:
  356. return "line start";
  357. case BOUNDARY_LINE_END:
  358. return "line end";
  359. case BOUNDARY_ATTRIBUTE_RANGE:
  360. return "attr range";
  361. }
  362. }