This test checks that the cursor covers the next character to be overwritten in overtype mode instead of being painted as a caret (1px width bar)

ABC
שדן
שדןABC
Verifying block cursor position and width for each position in 'ABC' in a rtl block
getSelection().collapse(textNode, 0)
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 1)
PASS blockCursorStartPosition[0] < blockCursorStartPosition[1] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 2)
PASS blockCursorStartPosition[1] < blockCursorStartPosition[2] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 3)
PASS blockCursor.width is 0
PASS internals.absoluteCaretBounds().width is 1


Verifying block cursor position and width for each position in 'שדן' in a rtl block
getSelection().collapse(textNode, 0)
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 1)
PASS blockCursorStartPosition[0] > blockCursorStartPosition[1] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 2)
PASS blockCursorStartPosition[1] > blockCursorStartPosition[2] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 3)
PASS blockCursor.width is 0
PASS internals.absoluteCaretBounds().width is 1


Verifying block cursor position and width for each position in 'שדןABC' in a rtl block
getSelection().collapse(textNode, 0)
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 1)
PASS blockCursorStartPosition[0] > blockCursorStartPosition[1] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 2)
PASS blockCursorStartPosition[1] > blockCursorStartPosition[2] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 3)
PASS blockCursorStartPosition[2] > blockCursorStartPosition[3] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 4)
PASS blockCursorStartPosition[3] < blockCursorStartPosition[4] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 5)
PASS blockCursorStartPosition[4] < blockCursorStartPosition[5] is true
PASS getSelection().isCollapsed is true
PASS blockCursor.width > 1 is true
PASS internals.absoluteCaretBounds().width is 1
getSelection().collapse(textNode, 6)
PASS blockCursor.width is 0
PASS internals.absoluteCaretBounds().width is 1


PASS successfullyParsed is true

TEST COMPLETE

