michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Public michael@0: michael@0: const BOUNDARY_CHAR = nsIAccessibleText.BOUNDARY_CHAR; michael@0: const BOUNDARY_WORD_START = nsIAccessibleText.BOUNDARY_WORD_START; michael@0: const BOUNDARY_WORD_END = nsIAccessibleText.BOUNDARY_WORD_END; michael@0: const BOUNDARY_LINE_START = nsIAccessibleText.BOUNDARY_LINE_START; michael@0: const BOUNDARY_LINE_END = nsIAccessibleText.BOUNDARY_LINE_END; michael@0: michael@0: const kTextEndOffset = nsIAccessibleText.TEXT_OFFSET_END_OF_TEXT; michael@0: const kCaretOffset = nsIAccessibleText.TEXT_OFFSET_CARET; michael@0: michael@0: const kTodo = 1; // a test is expected to fail michael@0: const kOk = 2; // a test doesn't fail michael@0: michael@0: /** michael@0: * Test characterCount for the given array of accessibles. michael@0: * michael@0: * @param aCount [in] the expected character count michael@0: * @param aIDs [in] array of accessible identifiers to test michael@0: * @param aTodoFlag [in, optional] either kOk or kTodo michael@0: */ michael@0: function testCharacterCount(aIDs, aCount, aTodoFlag) michael@0: { michael@0: var ids = (aIDs instanceof Array) ? aIDs : [ aIDs ]; michael@0: var isFunc = (aTodoFlag == kTodo) ? todo_is : is; michael@0: for (var i = 0; i < ids.length; i++) { michael@0: var textacc = getAccessible(ids[i], [nsIAccessibleText]); michael@0: isFunc(textacc.characterCount, aCount, michael@0: "Wrong character count for " + prettyName(ids[i])); michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Test text between two given offsets. michael@0: * michael@0: * @param aIDs [in] an array of accessible IDs to test michael@0: * @param aStartOffset [in] the start offset within the text to test michael@0: * @param aEndOffset [in] the end offset up to which the text is tested michael@0: * @param aText [in] the expected result from the test michael@0: * @param aTodoFlag [in, optional] either kOk or kTodo michael@0: */ michael@0: function testText(aIDs, aStartOffset, aEndOffset, aText, aTodoFlag) michael@0: { michael@0: var ids = (aIDs instanceof Array) ? aIDs : [ aIDs ]; michael@0: var isFunc = (aTodoFlag == kTodo) ? todo_is : is; michael@0: for (var i = 0; i < ids.length; i++) { michael@0: var acc = getAccessible(ids[i], nsIAccessibleText); michael@0: try { michael@0: isFunc(acc.getText(aStartOffset, aEndOffset), aText, michael@0: "getText: wrong text between start and end offsets '" + michael@0: aStartOffset + "', '" + aEndOffset + " for '" + michael@0: prettyName(ids[i]) + "'"); michael@0: } catch (e) { michael@0: ok(false, michael@0: "getText fails between start and end offsets '" + aStartOffset + michael@0: "', '" + aEndOffset + " for '" + prettyName(ids[i]) + "'"); michael@0: } michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Test password text between two given offsets michael@0: * michael@0: * @param aIDs [in] an array of accessible IDs to test michael@0: * @param aStartOffset [in] the start offset within the text to test michael@0: * @param aEndOffset [in] the end offset up to which the text is tested michael@0: * @param aText [in] the expected result from the test michael@0: * michael@0: * @note All this function does is test that getText doe snot expose the michael@0: * password text itself, but something else. michael@0: */ michael@0: function testPasswordText(aIDs, aStartOffset, aEndOffset, aText) michael@0: { michael@0: for (var i = 0; i < aIDs.length; i++) michael@0: { michael@0: var acc = getAccessible(aIDs[i], nsIAccessibleText); michael@0: try { michael@0: isnot(acc.getText(aStartOffset, aEndOffset), aText, michael@0: "getText: plain text between start and end offsets '" + aStartOffset + michael@0: "', '" + aEndOffset + " for '" + prettyName(aIDs[i]) + "'"); michael@0: } catch (e) { michael@0: ok(false, michael@0: "getText fails between start and end offsets '" + aStartOffset + michael@0: "', '" + aEndOffset + " for '" + prettyName(aIDs[i]) + "'"); michael@0: } michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Test getTextAtOffset for BOUNDARY_CHAR over different elements. michael@0: * michael@0: * @param aIDs [in] the accessible identifier or array of accessible michael@0: * identifiers michael@0: * @param aOffset [in] the offset to get a character at it michael@0: * @param aChar [in] the expected character michael@0: * @param aStartOffset [in] expected start offset of the character michael@0: * @param aEndOffset [in] expected end offset of the character michael@0: */ michael@0: function testCharAtOffset(aIDs, aOffset, aChar, aStartOffset, aEndOffset) michael@0: { michael@0: var IDs = (aIDs instanceof Array) ? aIDs : [ aIDs ]; michael@0: for (var i = 0; i < IDs.length; i++) { michael@0: var acc = getAccessible(IDs[i], nsIAccessibleText); michael@0: testTextHelper(IDs[i], aOffset, BOUNDARY_CHAR, michael@0: aChar, aStartOffset, aEndOffset, michael@0: kOk, kOk, kOk, michael@0: acc.getTextAtOffset, "getTextAtOffset "); michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Test getTextAtOffset function over different elements. michael@0: * michael@0: * @param aIDs [in] ID or array of IDs michael@0: * @param aBoundaryType [in] boundary type for text to be retrieved michael@0: * @param aTestList [in] array of sets: michael@0: * offset1 and offset2 defining the offset range michael@0: * the text in the range michael@0: * start offset of the text in the range michael@0: * end offset of the text in the range michael@0: * michael@0: * or michael@0: * michael@0: * @param aOffset [in] the offset to get the text at michael@0: * @param aBoundaryType [in] Boundary type for text to be retrieved michael@0: * @param aText [in] expected return text for getTextAtOffset michael@0: * @param aStartOffset [in] expected return start offset for getTextAtOffset michael@0: * @param aEndOffset [in] expected return end offset for getTextAtOffset michael@0: * @param ... [in] list of ids or list of tuples made of: michael@0: * element identifier michael@0: * kTodo or kOk for returned text michael@0: * kTodo or kOk for returned start offset michael@0: * kTodo or kOk for returned offset result michael@0: */ michael@0: function testTextAtOffset() michael@0: { michael@0: testTextSuperHelper("getTextAtOffset", arguments); michael@0: } michael@0: michael@0: /** michael@0: * Test getTextAfterOffset for BOUNDARY_CHAR over different elements. michael@0: * michael@0: * @param aIDs [in] the accessible identifier or array of accessible michael@0: * identifiers michael@0: * @param aOffset [in] the offset to get a character after it michael@0: * @param aChar [in] the expected character michael@0: * @param aStartOffset [in] expected start offset of the character michael@0: * @param aEndOffset [in] expected end offset of the character michael@0: */ michael@0: function testCharAfterOffset(aIDs, aOffset, aChar, aStartOffset, aEndOffset) michael@0: { michael@0: var IDs = (aIDs instanceof Array) ? aIDs : [ aIDs ]; michael@0: for (var i = 0; i < IDs.length; i++) { michael@0: var acc = getAccessible(IDs[i], nsIAccessibleText); michael@0: testTextHelper(IDs[i], aOffset, BOUNDARY_CHAR, michael@0: aChar, aStartOffset, aEndOffset, michael@0: kOk, kOk, kOk, michael@0: acc.getTextAfterOffset, "getTextAfterOffset "); michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Test getTextAfterOffset function over different elements michael@0: * michael@0: * @param aIDs [in] ID or array of IDs michael@0: * @param aBoundaryType [in] boundary type for text to be retrieved michael@0: * @param aTestList [in] array of sets: michael@0: * offset1 and offset2 defining the offset range michael@0: * the text in the range michael@0: * start offset of the text in the range michael@0: * end offset of the text in the range michael@0: * michael@0: * or michael@0: * michael@0: * @param aOffset [in] the offset to get the text after michael@0: * @param aBoundaryType [in] Boundary type for text to be retrieved michael@0: * @param aText [in] expected return text for getTextAfterOffset michael@0: * @param aStartOffset [in] expected return start offset for getTextAfterOffset michael@0: * @param aEndOffset [in] expected return end offset for getTextAfterOffset michael@0: * @param ... [in] list of ids or list of tuples made of: michael@0: * element identifier michael@0: * kTodo or kOk for returned text michael@0: * kTodo or kOk for returned start offset michael@0: * kTodo or kOk for returned offset result michael@0: */ michael@0: function testTextAfterOffset(aOffset, aBoundaryType, michael@0: aText, aStartOffset, aEndOffset) michael@0: { michael@0: testTextSuperHelper("getTextAfterOffset", arguments); michael@0: } michael@0: michael@0: /** michael@0: * Test getTextBeforeOffset for BOUNDARY_CHAR over different elements. michael@0: * michael@0: * @param aIDs [in] the accessible identifier or array of accessible michael@0: * identifiers michael@0: * @param aOffset [in] the offset to get a character before it michael@0: * @param aChar [in] the expected character michael@0: * @param aStartOffset [in] expected start offset of the character michael@0: * @param aEndOffset [in] expected end offset of the character michael@0: */ michael@0: function testCharBeforeOffset(aIDs, aOffset, aChar, aStartOffset, aEndOffset) michael@0: { michael@0: var IDs = (aIDs instanceof Array) ? aIDs : [ aIDs ]; michael@0: for (var i = 0; i < IDs.length; i++) { michael@0: var acc = getAccessible(IDs[i], nsIAccessibleText); michael@0: testTextHelper(IDs[i], aOffset, BOUNDARY_CHAR, michael@0: aChar, aStartOffset, aEndOffset, michael@0: kOk, kOk, kOk, michael@0: acc.getTextBeforeOffset, "getTextBeforeOffset "); michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Test getTextBeforeOffset function over different elements michael@0: * michael@0: * @param aIDs [in] ID or array of IDs michael@0: * @param aBoundaryType [in] boundary type for text to be retrieved michael@0: * @param aTestList [in] array of sets: michael@0: * offset1 and offset2 defining the offset range michael@0: * the text in the range michael@0: * start offset of the text in the range michael@0: * end offset of the text in the range michael@0: * michael@0: * or michael@0: * michael@0: * @param aOffset [in] the offset to get the text before michael@0: * @param aBoundaryType [in] Boundary type for text to be retrieved michael@0: * @param aText [in] expected return text for getTextBeforeOffset michael@0: * @param aStartOffset [in] expected return start offset for getTextBeforeOffset michael@0: * @param aEndOffset [in] expected return end offset for getTextBeforeOffset michael@0: * @param ... [in] list of ids or list of tuples made of: michael@0: * element identifier michael@0: * kTodo or kOk for returned text michael@0: * kTodo or kOk for returned start offset michael@0: * kTodo or kOk for returned offset result michael@0: */ michael@0: function testTextBeforeOffset(aOffset, aBoundaryType, michael@0: aText, aStartOffset, aEndOffset) michael@0: { michael@0: testTextSuperHelper("getTextBeforeOffset", arguments); michael@0: } michael@0: michael@0: /** michael@0: * Test word count for an element. michael@0: * michael@0: * @param aElement [in] element identifier michael@0: * @param aCount [in] Expected word count michael@0: * @param aToDoFlag [in] kTodo or kOk for returned text michael@0: */ michael@0: function testWordCount(aElement, aCount, aToDoFlag) michael@0: { michael@0: var isFunc = (aToDoFlag == kTodo) ? todo_is : is; michael@0: var acc = getAccessible(aElement, nsIAccessibleText); michael@0: var startOffsetObj = {}, endOffsetObj = {}; michael@0: var length = acc.characterCount; michael@0: var offset = 0; michael@0: var wordCount = 0; michael@0: while (true) { michael@0: var text = acc.getTextAtOffset(offset, BOUNDARY_WORD_START, michael@0: startOffsetObj, endOffsetObj); michael@0: if (offset >= length) michael@0: break; michael@0: michael@0: wordCount++; michael@0: offset = endOffsetObj.value; michael@0: } michael@0: isFunc(wordCount, aCount, michael@0: "wrong words count for '" + acc.getText(0, -1) + "': " + wordCount + michael@0: " in " + prettyName(aElement)); michael@0: } michael@0: michael@0: /** michael@0: * Test word at a position for an element. michael@0: * michael@0: * @param aElement [in] element identifier michael@0: * @param aWordIndex [in] index of the word to test michael@0: * @param aText [in] expected text for that word michael@0: * @param aToDoFlag [in] kTodo or kOk for returned text michael@0: */ michael@0: function testWordAt(aElement, aWordIndex, aText, aToDoFlag) michael@0: { michael@0: var isFunc = (aToDoFlag == kTodo) ? todo_is : is; michael@0: var acc = getAccessible(aElement, nsIAccessibleText); michael@0: michael@0: var textLength = acc.characterCount; michael@0: var wordIdx = aWordIndex; michael@0: var startOffsetObj = { value: 0 }, endOffsetObj = { value: 0 }; michael@0: for (offset = 0; offset < textLength; offset = endOffsetObj.value) { michael@0: acc.getTextAtOffset(offset, BOUNDARY_WORD_START, michael@0: startOffsetObj, endOffsetObj); michael@0: michael@0: wordIdx--; michael@0: if (wordIdx < 0) michael@0: break; michael@0: } michael@0: michael@0: if (wordIdx >= 0) { michael@0: ok(false, michael@0: "the given word index '" + aWordIndex + "' exceeds words amount in " + michael@0: prettyName(aElement)); michael@0: michael@0: return; michael@0: } michael@0: michael@0: var startWordOffset = startOffsetObj.value; michael@0: var endWordOffset = endOffsetObj.value; michael@0: michael@0: // Calculate the end word offset. michael@0: acc.getTextAtOffset(endOffsetObj.value, BOUNDARY_WORD_END, michael@0: startOffsetObj, endOffsetObj); michael@0: if (startOffsetObj.value != textLength) michael@0: endWordOffset = startOffsetObj.value michael@0: michael@0: if (endWordOffset <= startWordOffset) { michael@0: todo(false, michael@0: "wrong start and end offset for word at index '" + aWordIndex + "': " + michael@0: " of text '" + acc.getText(0, -1) + "' in " + prettyName(aElement)); michael@0: michael@0: return; michael@0: } michael@0: michael@0: text = acc.getText(startWordOffset, endWordOffset); michael@0: isFunc(text, aText, "wrong text for word at index '" + aWordIndex + "': " + michael@0: " of text '" + acc.getText(0, -1) + "' in " + prettyName(aElement)); michael@0: } michael@0: michael@0: /** michael@0: * Test words in a element. michael@0: * michael@0: * @param aElement [in] element identifier michael@0: * @param aWords [in] array of expected words michael@0: * @param aToDoFlag [in, optional] kTodo or kOk for returned text michael@0: */ michael@0: function testWords(aElement, aWords, aToDoFlag) michael@0: { michael@0: if (aToDoFlag == null) michael@0: aToDoFlag = kOk; michael@0: michael@0: testWordCount(aElement, aWords.length, aToDoFlag); michael@0: michael@0: for (var i = 0; i < aWords.length; i++) { michael@0: testWordAt(aElement, i, aWords[i], aToDoFlag); michael@0: } michael@0: } michael@0: michael@0: /** michael@0: * Remove all selections. michael@0: * michael@0: * @param aID [in] Id, DOM node, or acc obj michael@0: */ michael@0: function cleanTextSelections(aID) michael@0: { michael@0: var acc = getAccessible(aID, [nsIAccessibleText]); michael@0: michael@0: while (acc.selectionCount > 0) michael@0: acc.removeSelection(0); michael@0: } michael@0: michael@0: /** michael@0: * Test addSelection method. michael@0: * michael@0: * @param aID [in] Id, DOM node, or acc obj michael@0: * @param aStartOffset [in] start offset for the new selection michael@0: * @param aEndOffset [in] end offset for the new selection michael@0: * @param aSelectionsCount [in] expected number of selections after addSelection michael@0: */ michael@0: function testTextAddSelection(aID, aStartOffset, aEndOffset, aSelectionsCount) michael@0: { michael@0: var acc = getAccessible(aID, [nsIAccessibleText]); michael@0: var text = acc.getText(0, -1); michael@0: michael@0: acc.addSelection(aStartOffset, aEndOffset); michael@0: michael@0: ok(acc.selectionCount, aSelectionsCount, michael@0: text + ": failed to add selection from offset '" + aStartOffset + michael@0: "' to offset '" + aEndOffset + "': selectionCount after"); michael@0: } michael@0: michael@0: /** michael@0: * Test removeSelection method. michael@0: * michael@0: * @param aID [in] Id, DOM node, or acc obj michael@0: * @param aSelectionIndex [in] index of the selection to be removed michael@0: * @param aSelectionsCount [in] expected number of selections after michael@0: * removeSelection michael@0: */ michael@0: function testTextRemoveSelection(aID, aSelectionIndex, aSelectionsCount) michael@0: { michael@0: var acc = getAccessible(aID, [nsIAccessibleText]); michael@0: var text = acc.getText(0, -1); michael@0: michael@0: acc.removeSelection(aSelectionIndex); michael@0: michael@0: ok(acc.selectionCount, aSelectionsCount, michael@0: text + ": failed to remove selection at index '" + michael@0: aSelectionIndex + "': selectionCount after"); michael@0: } michael@0: michael@0: /** michael@0: * Test setSelectionBounds method. michael@0: * michael@0: * @param aID [in] Id, DOM node, or acc obj michael@0: * @param aStartOffset [in] new start offset for the selection michael@0: * @param aEndOffset [in] new end offset for the selection michael@0: * @param aSelectionIndex [in] index of the selection to set michael@0: * @param aSelectionsCount [in] expected number of selections after michael@0: * setSelectionBounds michael@0: */ michael@0: function testTextSetSelection(aID, aStartOffset, aEndOffset, michael@0: aSelectionIndex, aSelectionsCount) michael@0: { michael@0: var acc = getAccessible(aID, [nsIAccessibleText]); michael@0: var text = acc.getText(0, -1); michael@0: michael@0: acc.setSelectionBounds(aSelectionIndex, aStartOffset, aEndOffset); michael@0: michael@0: is(acc.selectionCount, aSelectionsCount, michael@0: text + ": failed to set selection at index '" + michael@0: aSelectionIndex + "': selectionCount after"); michael@0: } michael@0: michael@0: /** michael@0: * Test selectionCount method. michael@0: * michael@0: * @param aID [in] Id, DOM node, or acc obj michael@0: * @param aCount [in] expected selection count michael@0: */ michael@0: function testTextSelectionCount(aID, aCount) michael@0: { michael@0: var acc = getAccessible(aID, [nsIAccessibleText]); michael@0: var text = acc.getText(0, -1); michael@0: michael@0: is(acc.selectionCount, aCount, text + ": wrong selectionCount: "); michael@0: } michael@0: michael@0: /** michael@0: * Test getSelectionBounds method. michael@0: * michael@0: * @param aID [in] Id, DOM node, or acc obj michael@0: * @param aStartOffset [in] expected start offset for the selection michael@0: * @param aEndOffset [in] expected end offset for the selection michael@0: * @param aSelectionIndex [in] index of the selection to get michael@0: */ michael@0: function testTextGetSelection(aID, aStartOffset, aEndOffset, aSelectionIndex) michael@0: { michael@0: var acc = getAccessible(aID, [nsIAccessibleText]); michael@0: var text = acc.getText(0, -1); michael@0: michael@0: var startObj = {}, endObj = {}; michael@0: acc.getSelectionBounds(aSelectionIndex, startObj, endObj); michael@0: michael@0: is(startObj.value, aStartOffset, text + ": wrong start offset for index '" + michael@0: aSelectionIndex + "'"); michael@0: is(endObj.value, aEndOffset, text + ": wrong end offset for index '" + michael@0: aSelectionIndex + "'"); michael@0: } michael@0: michael@0: function testTextRange(aRange, aStartContainer, aStartOffset, michael@0: aEndContainer, aEndOffset) michael@0: { michael@0: is(aRange.startContainer, getAccessible(aStartContainer), michael@0: "Wrong start container"); michael@0: is(aRange.startOffset, aStartOffset, michael@0: "Wrong start offset"); michael@0: is(aRange.endContainer, getAccessible(aEndContainer), michael@0: "Wrong end container"); michael@0: is(aRange.endOffset, aEndOffset, michael@0: "Wrong end offset"); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Private michael@0: michael@0: function testTextSuperHelper(aFuncName, aArgs) michael@0: { michael@0: // List of tests. michael@0: if (aArgs[2] instanceof Array) { michael@0: var ids = (aArgs[0] instanceof Array) ? aArgs[0] : [ aArgs[0] ]; michael@0: var boundaryType = aArgs[1]; michael@0: var list = aArgs[2]; michael@0: for (var i = 0; i < list.length; i++) { michael@0: var offset1 = list[i][0], offset2 = list[i][1]; michael@0: var text = list[i][2], startOffset = list[i][3], endOffset = list[i][4]; michael@0: var failureList = list[i][5]; michael@0: for (var offset = offset1; offset <= offset2; offset++) { michael@0: for (var idIdx = 0; idIdx < ids.length; idIdx++) { michael@0: var id = ids[idIdx]; michael@0: michael@0: var flagOk1 = kOk, flagOk2 = kOk, flagOk3 = kOk; michael@0: if (failureList) { michael@0: for (var fIdx = 0; fIdx < failureList.length; fIdx++) { michael@0: if (offset == failureList[fIdx][0] && id == failureList[fIdx][1]) { michael@0: flagOk1 = failureList[fIdx][2]; michael@0: flagOk2 = failureList[fIdx][3]; michael@0: flagOk3 = failureList[fIdx][4]; michael@0: break; michael@0: } michael@0: } michael@0: } michael@0: michael@0: var acc = getAccessible(id, nsIAccessibleText); michael@0: testTextHelper(id, offset, boundaryType, michael@0: text, startOffset, endOffset, michael@0: flagOk1, flagOk2, flagOk3, michael@0: acc[aFuncName], aFuncName + " "); michael@0: } michael@0: } michael@0: } michael@0: return; michael@0: } michael@0: michael@0: // Test at single offset. List of IDs. michael@0: var offset = aArgs[0]; michael@0: var boundaryType = aArgs[1]; michael@0: var text = aArgs[2]; michael@0: var startOffset = aArgs[3]; michael@0: var endOffset = aArgs[4]; michael@0: if (aArgs[5] instanceof Array) { michael@0: var ids = aArgs[5]; michael@0: for (var i = 0; i < ids.length; i++) { michael@0: var acc = getAccessible(ids[i], nsIAccessibleText); michael@0: testTextHelper(ids[i], offset, boundaryType, michael@0: text, startOffset, endOffset, michael@0: kOk, kOk, kOk, michael@0: acc[aFuncName], aFuncName + " "); michael@0: } michael@0: michael@0: return; michael@0: } michael@0: michael@0: // Each ID is tested separately. michael@0: for (var i = 5; i < aArgs.length; i = i + 4) { michael@0: var ID = aArgs[i]; michael@0: var acc = getAccessible(ID, nsIAccessibleText); michael@0: var toDoFlag1 = aArgs[i + 1]; michael@0: var toDoFlag2 = aArgs[i + 2]; michael@0: var toDoFlag3 = aArgs[i + 3]; michael@0: michael@0: testTextHelper(ID, offset, boundaryType, michael@0: text, startOffset, endOffset, michael@0: toDoFlag1, toDoFlag2, toDoFlag3, michael@0: acc[aFuncName], aFuncName + " "); michael@0: } michael@0: } michael@0: michael@0: function testTextHelper(aID, aOffset, aBoundaryType, michael@0: aText, aStartOffset, aEndOffset, michael@0: aToDoFlag1, aToDoFlag2, aToDoFlag3, michael@0: aTextFunc, aTextFuncName) michael@0: { michael@0: var exceptionFlag = aToDoFlag1 == undefined || michael@0: aToDoFlag2 == undefined || michael@0: aToDoFlag3 == undefined; michael@0: michael@0: var startMsg = aTextFuncName + "(" + boundaryToString(aBoundaryType) + "): "; michael@0: var endMsg = ", id: " + prettyName(aID) + ";"; michael@0: michael@0: try { michael@0: var startOffsetObj = {}, endOffsetObj = {}; michael@0: var text = aTextFunc(aOffset, aBoundaryType, michael@0: startOffsetObj, endOffsetObj); michael@0: michael@0: if (exceptionFlag) { michael@0: ok(false, startMsg + "no expected failure at offset " + aOffset + endMsg); michael@0: return; michael@0: } michael@0: michael@0: var isFunc1 = (aToDoFlag1 == kTodo) ? todo : ok; michael@0: var isFunc2 = (aToDoFlag2 == kTodo) ? todo : ok; michael@0: var isFunc3 = (aToDoFlag3 == kTodo) ? todo : ok; michael@0: michael@0: isFunc1(text == aText, michael@0: startMsg + "wrong text " + michael@0: "(got '" + text + "', expected: '" + aText + "')" + michael@0: ", offset: " + aOffset + endMsg); michael@0: isFunc2(startOffsetObj.value == aStartOffset, michael@0: startMsg + "wrong start offset" + michael@0: "(got '" + startOffsetObj.value + "', expected: '" + aStartOffset + "')" + michael@0: ", offset: " + aOffset + endMsg); michael@0: isFunc3(endOffsetObj.value == aEndOffset, michael@0: startMsg + "wrong end offset" + michael@0: "(got '" + endOffsetObj.value + "', expected: '" + aEndOffset + "')" + michael@0: ", offset: " + aOffset + endMsg); michael@0: michael@0: } catch (e) { michael@0: var okFunc = exceptionFlag ? todo : ok; michael@0: okFunc(false, startMsg + "failed at offset " + aOffset + endMsg + michael@0: ", exception: " + e); michael@0: } michael@0: } michael@0: michael@0: function boundaryToString(aBoundaryType) michael@0: { michael@0: switch (aBoundaryType) { michael@0: case BOUNDARY_CHAR: michael@0: return "char"; michael@0: case BOUNDARY_WORD_START: michael@0: return "word start"; michael@0: case BOUNDARY_WORD_END: michael@0: return "word end"; michael@0: case BOUNDARY_LINE_START: michael@0: return "line start"; michael@0: case BOUNDARY_LINE_END: michael@0: return "line end"; michael@0: } michael@0: }