This tests that titleUIElement works correctly even when things change dynamically.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS axElement('control1').titleUIElement().isEqual(axElement('label1')) is true
PASS axElement('control2').titleUIElement().isEqual(axElement('label2')) is true
PASS hasTitleUIElement(axElement('control3')) is false
PASS document.getElementById('label3').setAttribute('for', 'control3'); axElement('control3').titleUIElement().isEqual(axElement('label3')) is true
PASS var label4Element = createLabelWithIdAndForAttribute('label4', 'control4'); hasTitleUIElement(axElement('control4')) is false
PASS document.getElementById('container').appendChild(label4Element); hasTitleUIElement(axElement('control4')) is true
PASS axElement('control4').titleUIElement().isEqual(axElement('label4')) is true
PASS label4Element.parentElement.removeChild(label4Element); hasTitleUIElement(axElement('control4')) is false
PASS hasTitleUIElement(axElement('control5')) is false
PASS reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').titleUIElement() != null is true
PASS axElement('control5').titleUIElement().isEqual(axElement('label5')) is true
PASS axElement('control6').titleUIElement().isEqual(axElement('label6b')) is true
PASS newLabel6Element = createLabelWithIdAndForAttribute('label6a', 'control6'); document.body.insertBefore(newLabel6Element, document.body.firstChild); axElement('control6').titleUIElement().isEqual(axElement('label6a')) is true
PASS document.body.removeChild(newLabel6Element); axElement('control6').titleUIElement().isEqual(axElement('label6b')) is true
PASS successfullyParsed is true

TEST COMPLETE

