ARIA 1.1 Testable Statements JSON
Structure of JSON
The JSON structure is an array of tests. Each test has the parts identified below and each part is explained in their sections.
- testing
- element
- comment
- expected
- files
testing
- Testing is a group level comment pulled from the level 2 header.
- example "ARIA role Testable Statements"
element
The element type tested
- This is found by identifying the element with id='test'
example div
comment
The comment that identifies the test
- The comment comes from the line starting with ; //
- example div application div child aria-activedescendant
expected
The expected results.
- From the test's wiki table
- rowspans make an object with multiple attributes
- a row with lots of columns will be nested object/tags
- example
{ "MSAA":"ROLE_SYSTEM_TABLE", "IAccessible2": {"object": { "xml-roles":"table" },"IAccessibleTable2": "SHOWN"}, "UIA": {"Control Type":"Table","grid pattern TODO": "SHOWN","table pattern TODO": "SHOWN"}, "ATK": {"ROLE_TABLE": "SHOWN","object": { "xml-roles":"table" },"Table interface TODO": "SHOWN"}, "AXAPI": {"AXRole":"AXTable","AXSubrole":"<nil>","AXRoleDescription":"grid"} }
files
files is an array of test files.
- ARIA tests using HTML elements will have one test
- test type: html
- Tests testing SVG will have two tests
- Test with inline SVG in a HTML file
- test type: html
- Test with native SVG file
- test type: svg
- Test with inline SVG in a HTML file
type
Type of the test file. Currently the known types are:
- html
- svg
- example html
test
The test file.
- A fully specified file.
- The comment is put in the head title element.
- example
[ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div application, div child, aria-activedescendant </title> </head> <body> <div id='test' role='application' aria-activedescendant='bob'> <div id='bob' tabindex='0' class='bobber'>Hello world</div> </div> </body> </html>" } ]
script
File:Aria11wiki.zip Perl script for producing JSON from the wiki testable statements
File:Aria11test.zip JSON file extracted from the roles section of the wiki on Sept 1, 2016.
Steps to running the script
- Go to the wiki page with testable statements
- Go into edit mode (Edit)
- Copy the entire contents and save it as a file
- Find # main program in the perl script
- Change my $wiki_markup_filename assignment to your file
- Change $test_dir and $json_filename to produce the output file's name
- To run HTML make sure my $issvg = 0;
- To run SVG make sure my $issvg = 1;
- Run the perl script (use a modern version of perl 5.2x). The version I use is 5.22.0 on windows.
- Script will print information on the console, if the last thing printed is program exited normally things went well. Other things the script may print out are the number of tests and the breakdown by grouping for the tests.
Stuff the script uses and skips in the wiki
- The script reads the wiki markup sequentially.
- When the script reads a wiki table it populates a test.
- A test consists of:
- The last level 2 header
- The last comment (starts with a semicolon whitespace then //)
- The last testable statement (everything inside a pre tag)
- The wiki table
Sections without a wiki table don't produce a test.
JSON Example
JSON from ARIA 1.1 roles.
[ { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div application div child aria-activedescendant", "expected": { "MSAA":"ROLE_SYSTEM_APPLICATION", "UIA": {"Control Type":"Pane","Localized Control Type":"application"}, , "ATK":"ROLE_EMBEDDED", "AXAPI": {"AXRole":"AXGroup","AXSubrole":"AXWebApplication","AXRoleDescription":"web application","array": { "AXSelectedRows": { "pointer":"id='bob'"} }} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div application, div child, aria-activedescendant </title> </head> <body> <div id='test' role='application' aria-activedescendant='bob'> <div id='bob' tabindex='0' class='bobber'>Hello world</div> </div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div article aria-posinset aria-setsize", "expected": { "MSAA": {"role":"ROLE_SYSTEM_DOCUMENT","STATE_SYSTEM_READONLY":"<shown>"}, "IAccessible2": {"object": {"xml-roles":"article","posinset":"4","setsize":"8"}"groupPosition()": {"similarItemsInGroup":"8","positionInGroup":"4"}}, "UIA": {"control type":"Group","localize control type":"article", "AriaProperties": {"posinset":"4","setsize":"8"}}, "ATK": {"role":"ROLE_ARTICLE", "object": {"xml-roles":"article","posinset":"4","setsize":"8"}}, "AXAPI": {"AXRole":"AXGroup","AXSubrole":"AXDocumentArticle","AXDescription":"article","AXARIAPosInSet":"4","AXARIASetSize":"8"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div article, aria-posinset, aria-setsize </title> </head> <body> <div id=\"test\" role=\"article\" aria-posinset=\"4\" aria-setsize=\"8\">test cell</div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"span", "comment":"aria-colindex aria-colcount missing from core AAM", "expected": { , "MSAA": { "role":"ROLE_SYSTEM_CELL" }, "UIA": {"Control Type":"TableItem","Selection pattern TODO": "SHOWN","NOT":"invoke pattern TODO"}, "ATK": {"role":"ROLE_TABLE_CELL","TableCell Interface": "SHOWN"}, "AXAPI": {"AXRole":"AXCell","AXSubrole":"<nil>","AXRoleDescription":"'cell'"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> aria-colindex, aria-colcount missing from core AAM </title> </head> <body> <div role=\"table\"> <div role=\"row\"> <span id=\"test\" role=\"cell\" aria-colindex=\"4\" aria-colcount=\"8\">test cell</span> </div> </div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div checkbox aria-checked false", "expected": { "MSAA": {"ROLE_SYSTEM_CHECKBUTTON": "SHOWN","NOT":"STATE_SYSTEM_CHECKED"}, , "IAccessibile2": { "object": { "checkable":"true"} }, "UIA": {"Control Type":"Checkbox","Toggle": { "ToggleState":"Off" }}, "ATK": {"ROLE_CHECK_BOX": "SHOWN","STATE_CHECKABLE": "SHOWN","NOT":"STATE_CHECKED"}, "AXAPI": {"AXRole":"AXCheckbox","AXSubrole":"<nil>","AXDescription":"check box","AXValue":"0"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div checkbox, aria-checked false </title> </head> <body> <div id='test' role='checkbox' aria-checked='false' class='chkbox'>I like cars</div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div checkbox aria-checked true", "expected": { "MSAA": {"ROLE_SYSTEM_CHECKBUTTON": "SHOWN","STATE_SYSTEM_CHECKED": "SHOWN"}, , "IAccessibile2": { "object": { "checkable":"true"} }, "UIA": {"Control Type":"Checkbox","Toggle": { "ToggleState":"On" }}, "ATK": {"ROLE_CHECK_BOX": "SHOWN","STATE_CHECKABLE": "SHOWN","STATE_CHECKED": "SHOWN"}, "AXAPI": {"AXRole":"AXCheckbox","AXSubrole":"<nil>","AXDescription":"check box","AXValue":"1"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div checkbox, aria-checked true </title> </head> <body> <div id='test' role='checkbox' aria-checked='true' class='chkbox'>I like cars</div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"missing aria-colcount and aria-rowcount from core AAM", "expected": { , "MSAA":"ROLE_SYSTEM_TABLE", "IAccessible2":"IAccessibleTable2", "UIA": {"DataGrid": "SHOWN","Selection pattern TODO": "SHOWN"}, "ATK": {"ROLE_TABLE": "SHOWN","object": { "xml-roles":"grid" },"Table interface TODO": "SHOWN","Selection": "SHOWN"}, "AXAPI": {"AXRole":"AXTable","AXSubrole":"<nil>","AXDescription":"grid"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> missing aria-colcount and aria-rowcount from core AAM </title> </head> <body> <div role='grid' id='test' aria-rowcount='3' aria-colcount='2'> <div role='row'> <span role='gridcell'> <button>hello</button> </span> </div> </div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"log implicit aria-live polite", "expected": { "IAccessible2": {"object": {"xml-roles":"log","container-live":"polite","live":"polite","container-live-role":"log"}}, "UIA": {"Control Type":"Group","Localized Control Type":"log","LiveSettingProperty":"Polite"}, "ATK": {"ROLE_LOG": "SHOWN", "object": {"xml-roles":"log","container-live":"polite","live":"polite","container-live-role":"log"}}, "AXAPI": {"AXRole":"AXGroup","AXSubrole":"AXApplicationLog","AXRoleDescription":"log"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> log, implicit aria-live polite </title> </head> <body> <div id='test' role='log' > </div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"main", "expected": { "Iaccessible2": {"IA2_ROLE_LANDMARK": "SHOWN","object": { "xml-roles":"main" }}, "UIA": {"Control Type":"Group","Localized Control Type":"main","Landmark Type":"Main","Localized Landmark Type":"main"}, "ATK": {"ROLE_LANDMARK": "SHOWN","object": { "xml-roles":"main" }}, "AXAPI": {"AXRole":"AXGroup","AXSubrole":"AXLandmarkMain","AXRoleDescription":"main"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> main </title> </head> <body> <div id='test' role='main'>Hellp world</div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"li", "comment":"menuitem aria-posinset aria-setsize", "expected": { , "MSAA":"ROLE_SYSTEM_MENUITEM", "IAccessible2": {"object": {"posinset":"4","setsize":"8"}"groupPosition()": {"similarItemsInGroup":"8","positionInGroup":"4"}}, "UIA": {"Control Type":"MenuItem", "AriaProperties": {"posinset":"4","setsize":"8"}}, "ATK": {"ROLE_MENU_ITEM": "SHOWN", "object": {"posinset":"4","setsize":"8"}}, "AXAPI": {"AXRole":"AXMenuItem","AXSubrole":"<nil>","AXRoleDescription":"menu item","AXARIAPosInSet":"4","AXARIASetSize":"8"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> menuitem, aria-posinset, aria-setsize </title> </head> <body> <ul role='menu'>Menu <li role='menuitem'> option 1</li> <li role='menuitem' id='test' aria-posinset='4' aria-setsize='8'> option 2</li> <li role='menuitem'> option 3</li> </ul> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"li", "comment":"menuitemcheckbox aria-posinset aria-setsize", "expected": { , "MSAA": { "OR": { "ROLE_SYSTEM_MENUITEM":"ROLE_SYSTEM_CHECKBUTTON"} }, "IAccessible2": {"IA2_ROLE_CHECK_MENU_ITEM": "SHOWN", "object": {"checkable":"true","posinset":"4","setsize":"8"}, "groupPosition()": {"similarItemsInGroup":"8","positionInGroup":"4"}}, "UIA": {"Control Type":"MenuItem","Toggle": { "ToggleState":"On" }, "AriaProperties": {"posinset":"4","setsize":"8"}}, "ATK": {"ROLE_MENU_ITEM": "SHOWN","STATE_CHECKABLE": "SHOWN","STATE_CHECKED": "SHOWN", "object": {"posinset":"4","setsize":"8"}}, "AXAPI": {"AXRole":"AXMenuItem","AXSubrole":"<nil>","AXRoleDescription":"menu item","AXValue":"1","AXARIAPosInSet":"4","AXARIASetSize":"8"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> menuitemcheckbox, aria-posinset, aria-setsize </title> </head> <body> <ul role='menu'>Menu <li role='menuitem'> option 1</li> <li role='menuitemcheckbox' id='test' aria-posinset='4' aria-setsize='8' class='ckbox' aria-checked='true'>panda doodles</li> <li role='menuitem'> option 3</li> </ul> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"li", "comment":"menuitemradio", "expected": { , "MSAA": { "OR": { "ROLE_SYSTEM_RADIOBUTTON":"ROLE_SYSTEM_MENUITEM"} }, "IAccessibile2": {"IA2_ROLE_RADIO_MENU_ITEM": "SHOWN","object": { "checkable":"true" }}, "UIA": {"Control Type":"MenuItem","Toggle": { "ToggleState":"Off" },"SelectItem Pattern": "SHOWN"}, "ATK": {"ROLE_RADIO_MENU_ITEM": "SHOWN","STATE_CHECKABLE": "SHOWN","NOT":"STATE_CHECKED"}, "AXAPI": {"AXRole":"AXMenuItem","AXSubrole":"<nil>","AXDescription":"menu item","AXMenuItemMarkChar":"<nil>"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> menuitemradio </title> </head> <body> <ul role='menu'>Menu <li role='menuitemradio'> option 1</li> <li role='menuitemradio'> option 2</li> <li role='menuitemradio' id='test' > option 3</li> </ul> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div radio role aria-checked false", "expected": { "MSAA": {"ROLE_SYSTEM_RADIOBUTTON": "SHOWN","NOT":"STATE_SYSTEM_CHECKED"}, "IAccessibile2": {"object": {"checkable":"true","posinset":"4","setsize":"8"}"groupPosition()": {"similarItemsInGroup":"8","positionInGroup":"4"}}, "UIA": {"Control Type":"RadioButton","Toggle": { "ToggleState":"Off" }, "AriaProperties": {"posinset":"4","setsize":"8"}}, "ATK": {"ROLE_RADIO_BUTTON": "SHOWN","STATE_CHECKABLE": "SHOWN","NOT":"STATE_CHECKED", "object": {"posinset":"4","setsize":"8"}}, "AXAPI": {"AXRole":"AXRadioButton","AXSubrole":"<nil>","AXDescription":"radio button","AXValue":"0","AXARIAPosInSet":"4","AXARIASetSize":"8"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div, radio role, aria-checked false </title> </head> <body> <div id='test' role='radio' aria-checked='false' class='radio' aria-posinset='4' aria-setsize='8'>Car</div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div search", "expected": { "IAccessible2": {"IA2_ROLE_LANDMARK": "SHOWN","object": { "xml-roles":"search" }}, "UIA": {"Control Type":"Group","Localized Control Type":"search","Landmark Type":"Search","Localized Landmark Type":"search"}, "ATK": {"ROLE_LANDMARK": "SHOWN","object": { "xml-roles":"search" }}, "AXAPI": {"AXRole":"AXGroup","AXSubrole":"AXLandmarkSearch","AXRoleDescription":"search"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div search </title> </head> <body> <div id='test' role='search' contenteditable='true'></div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div searchbox default single line", "expected": { , "MSAA":"ROLE_SYSTEM_TEXT", "IAccessible2": { "object": { "xml-roles":"search"} }, "UIA": {"Control Type":"Edit","Localized Control Type":"search box"}, "ATK": {"ROLE_ENTRY": "SHOWN","STATE_SINGLE_LINE": "SHOWN","EditibleText": "SHOWN"}, "AXAPI": {"AXRole":"AXTextField","AXSubrole":"AXSearchField","AXRoleDescription":"search text field"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div searchbox, default single line </title> </head> <body> <div id='test' role='searchbox' contenteditable='true'></div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div searchbox role search multiline", "expected": { , "MSAA":"ROLE_SYSTEM_TEXT", "IAccessible2": {"IA2_MULTI_LINE": "SHOWN","NOT":"IA2_SINGLE_LINE","object": { "xml-roles":"search" }}, "UIA": {"Control Type":"Edit","Localized Control Type":"search box","AriaProperties": { "multiline":"true" }}, "ATK": {"ROLE_ENTRY": "SHOWN","NOT":"STATE_SINGLE_LINE","STATE_MULTI_LINE": "SHOWN","EditibleText": "SHOWN"}, "AXAPI": {"AXRole":"AXTextField","AXSubrole":"AXSearchField","AXRoleDescription":"search text field"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div searchbox, role search, multiline </title> </head> <body> <div id='test' role='searchbox' contenteditable='true' aria-multiline='true'></div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div status aria-expanded false", "expected": { "MSAA": {"ROLE_SYSTEM_STATUSBAR": "SHOWN","STATE_SYSTEM_EXPANDED": "SHOWN"}, "IAccessible2": {"object": {"container-live":"polite","live":"polite","container-live-role":"status"}}, "UIA": {"Control Type":"Group","Localized Control Type":"status","LiveSettingProperty":"1","ExpandCollapse": { "ExpandCollapseState":"expanded" }}, "ATK": {"ROLE_STATUSBAR": "SHOWN", "object": {"container-live":"polite","live":"polite","container-live-role":"status"}, "AXAPI": {"AXRole":"AXGroup","AXSubrole":"AXApplicationStatus","AXRoleDescription":"status","AXExpanded":"YES"}}, , "STATE_EXPANDABLE": "SHOWN", "STATE_EXPANDED": "SHOWN", } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div status, aria-expanded false </title> </head> <body> <div role='status' id='test' aria-expanded='false'> </div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div switch aria-checked false", "expected": { "IAccessibile2": {"IA2_ROLE_TOGGLE_BUTTON": "SHOWN","object": { "xml-roles":"switch" }}, "UIA": {"Control Type":"Button","Localized Control Type":"toggleswitch","Toggle": { "ToggleState":"Off" }}, "ATK": {"ROLE_CHECK_BOX": "SHOWN","STATE_CHECKABLE": "SHOWN","NOT":"STATE_CHECKED"}, "AXAPI": {"AXRole":"AXCheckbox","AXSubrole":"AXSwitch","AXDescription":"switch","AXValue":"0"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div switch, aria-checked false </title> </head> <body> <div id='test' role='switch' aria-checked='false' class='switch'>power</div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"div tab aria-posinset and aria-setsize", "expected": { "MSAA": {"ROLE_SYSTEM_PAGETAB": "SHOWN","STATE_SYSTEM_SELECTED": "SHOWN","STATE_SYSTEM_SELECTABLE": "SHOWN"}, "IAccessible2": {"object": {"posinset":"3","setsize":"7"}"groupPosition()": {"similarItemsInGroup":"7","positionInGroup":"3"}}, "UIA": {"Control Type":"TabItem", "AriaProperties": {"posinset":"3","setsize":"7"}, "ATK": {"ROLE_PAGE_TAB": "SHOWN","STATE_SELECTED": "SHOWN","STATE_SELECTABLE": "SHOWN", "object": {"posinset":"3","setsize":"7"}}}, , "SelectionItem":"IsSelected", "AXAPI": {"AXRole":"AXRadioButton","AXSubrole":"<nil>","AXRoleDescription":"tab","AXARIAPosInSet":"3","AXARIASetSize":"7","AXSelected":"YES"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> div tab, aria-posinset and aria-setsize </title> </head> <body> <div role='tabpanel'> <div role='tab' aria-selected='false'>Hello Mary</div> <div role='tab' id='test' aria-selected='true' aria-posinset='3' aria-setsize='7'>Hello Bob</div> </div> </body> </html>" } ]}, { "testing":"ARIA role Testable Statements", "element":"div", "comment":"aria-rowcount and aria-colcount not in core AAM", "expected": { , "MSAA":"ROLE_SYSTEM_TABLE", "IAccessible2": {"object": { "xml-roles":"table" },"IAccessibleTable2": "SHOWN"}, "UIA": {"Control Type":"Table","grid pattern TODO": "SHOWN","table pattern TODO": "SHOWN"}, "ATK": {"ROLE_TABLE": "SHOWN","object": { "xml-roles":"table" },"Table interface TODO": "SHOWN"}, "AXAPI": {"AXRole":"AXTable","AXSubrole":"<nil>","AXRoleDescription":"grid"} } , "files": [ { "type":"html", "test": "<!DOCTYPE html> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <title> aria-rowcount and aria-colcount not in core AAM </title> </head> <body> <div role='table' id='test' aria-rowcount='3' aria-colcount='2'> <div role='row'> <span role='cell'>cheese</span> </div> </div> </body> </html>" } ]} ]