@afixt/test-utils 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +6 -2
- package/.github/workflows/test.yml +26 -0
- package/BROWSER_TESTING.md +109 -0
- package/CLAUDE.md +22 -0
- package/package.json +6 -8
- package/playwright.config.js +27 -0
- package/src/domUtils.js +1 -1
- package/src/getAccessibleName.js +8 -4
- package/src/getCSSGeneratedContent.js +9 -5
- package/src/getFocusableElements.js +13 -4
- package/src/getImageText.js +4 -1
- package/src/testContrast.js +5 -1
- package/test/__screenshots__/getImageText.test.js/getImageText-should-be-an-async-function-1.png +0 -0
- package/test/__screenshots__/getImageText.test.js/getImageText-should-be-defined-and-exported-from-the-module-1.png +0 -0
- package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-empty-string-input-gracefully-1.png +0 -0
- package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-invalid-image-paths-gracefully-1.png +0 -0
- package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-null-or-undefined-input-gracefully-1.png +0 -0
- package/test/__screenshots__/getImageText.test.js/getImageText-should-log-errors-in-non-test-environments-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-call-original-addEventListener-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-added-event-listeners-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-listeners-for-different-event-types-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-multiple-listeners-for-the-same-event-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-options-parameter-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getEventListeners-should-return-all-event-listeners-for-an-element-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getEventListeners-should-return-empty-object-for-elements-without-listeners-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-generate-XPath-for-elements-without-id-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-handle-multiple-siblings-correctly-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-return-XPath-for-element-with-id-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-event-listeners-on-child-elements-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-event-listeners-on-root-element-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-listeners-from-multiple-elements-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-multiple-event-types-on-same-element-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-return-empty-array-when-no-event-listeners-exist-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-use-document-as-default-root-element-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-work-with-custom-root-element-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-call-original-removeEventListener-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-handle-removing-non-existent-listeners-gracefully-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-only-remove-the-specified-listener-1.png +0 -0
- package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-remove-tracked-event-listeners-1.png +0 -0
- package/test/arrayUtils.test.js +22 -0
- package/test/domUtils.test.js +241 -0
- package/test/getAccessibleName.test.js +182 -0
- package/test/getAccessibleText.test.js +350 -79
- package/test/getCSSGeneratedContent.test.js +175 -1
- package/test/getFocusableElements.test.js +106 -35
- package/test/getImageText.test.js +95 -12
- package/test/getStyleObject.test.js +19 -1
- package/test/hasCSSGeneratedContent.test.js +7 -2
- package/test/hasParent.test.js +116 -0
- package/test/hasValidAriaRole.test.js +64 -2
- package/test/index.test.js +165 -0
- package/test/interactiveRoles.test.js +60 -0
- package/test/isAriaAttributesValid.test.js +36 -0
- package/test/isDataTable.test.js +492 -0
- package/test/isFocusable.test.js +94 -1
- package/test/isValidUrl.test.js +31 -19
- package/test/isVisible.test.js +121 -3
- package/test/playwright/css-pseudo-elements.spec.js +155 -0
- package/test/playwright/fixtures/css-pseudo-elements.html +77 -0
- package/test/setup.js +9 -1
- package/test/stringUtils.test.js +277 -1
- package/test/testContrast.test.js +614 -9
- package/test/testLang.test.js +152 -11
- package/test/testOrder.integration.test.js +369 -0
- package/test/testOrder.test.js +756 -21
- package/todo.md +11 -1
- package/vitest.config.js +8 -1
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/coverage-final.json +0 -51
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -161
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/test-utils/docs/scripts/core.js.html +0 -2263
- package/coverage/test-utils/docs/scripts/core.min.js.html +0 -151
- package/coverage/test-utils/docs/scripts/index.html +0 -176
- package/coverage/test-utils/docs/scripts/resize.js.html +0 -355
- package/coverage/test-utils/docs/scripts/search.js.html +0 -880
- package/coverage/test-utils/docs/scripts/search.min.js.html +0 -100
- package/coverage/test-utils/docs/scripts/third-party/fuse.js.html +0 -109
- package/coverage/test-utils/docs/scripts/third-party/hljs-line-num-original.js.html +0 -1192
- package/coverage/test-utils/docs/scripts/third-party/hljs-line-num.js.html +0 -85
- package/coverage/test-utils/docs/scripts/third-party/hljs-original.js.html +0 -15598
- package/coverage/test-utils/docs/scripts/third-party/hljs.js.html +0 -85
- package/coverage/test-utils/docs/scripts/third-party/index.html +0 -236
- package/coverage/test-utils/docs/scripts/third-party/popper.js.html +0 -100
- package/coverage/test-utils/docs/scripts/third-party/tippy.js.html +0 -88
- package/coverage/test-utils/docs/scripts/third-party/tocbot.js.html +0 -2098
- package/coverage/test-utils/docs/scripts/third-party/tocbot.min.js.html +0 -85
- package/coverage/test-utils/index.html +0 -131
- package/coverage/test-utils/src/arrayUtils.js.html +0 -283
- package/coverage/test-utils/src/domUtils.js.html +0 -622
- package/coverage/test-utils/src/getAccessibleName.js.html +0 -1444
- package/coverage/test-utils/src/getAccessibleText.js.html +0 -271
- package/coverage/test-utils/src/getAriaAttributesByElement.js.html +0 -142
- package/coverage/test-utils/src/getCSSGeneratedContent.js.html +0 -265
- package/coverage/test-utils/src/getComputedRole.js.html +0 -592
- package/coverage/test-utils/src/getFocusableElements.js.html +0 -163
- package/coverage/test-utils/src/getGeneratedContent.js.html +0 -130
- package/coverage/test-utils/src/getImageText.js.html +0 -160
- package/coverage/test-utils/src/getStyleObject.js.html +0 -220
- package/coverage/test-utils/src/hasAccessibleName.js.html +0 -166
- package/coverage/test-utils/src/hasAttribute.js.html +0 -130
- package/coverage/test-utils/src/hasCSSGeneratedContent.js.html +0 -145
- package/coverage/test-utils/src/hasHiddenParent.js.html +0 -172
- package/coverage/test-utils/src/hasParent.js.html +0 -247
- package/coverage/test-utils/src/hasValidAriaAttributes.js.html +0 -175
- package/coverage/test-utils/src/hasValidAriaRole.js.html +0 -172
- package/coverage/test-utils/src/index.html +0 -611
- package/coverage/test-utils/src/index.js.html +0 -274
- package/coverage/test-utils/src/interactiveRoles.js.html +0 -145
- package/coverage/test-utils/src/isAriaAttributesValid.js.html +0 -304
- package/coverage/test-utils/src/isComplexTable.js.html +0 -412
- package/coverage/test-utils/src/isDataTable.js.html +0 -799
- package/coverage/test-utils/src/isFocusable.js.html +0 -187
- package/coverage/test-utils/src/isHidden.js.html +0 -136
- package/coverage/test-utils/src/isOffScreen.js.html +0 -133
- package/coverage/test-utils/src/isValidUrl.js.html +0 -124
- package/coverage/test-utils/src/isVisible.js.html +0 -271
- package/coverage/test-utils/src/listEventListeners.js.html +0 -370
- package/coverage/test-utils/src/queryCache.js.html +0 -1156
- package/coverage/test-utils/src/stringUtils.js.html +0 -535
- package/coverage/test-utils/src/testContrast.js.html +0 -784
- package/coverage/test-utils/src/testLang.js.html +0 -1810
- package/coverage/test-utils/src/testOrder.js.html +0 -355
- package/coverage/test-utils/vitest.config.browser.js.html +0 -133
- package/coverage/test-utils/vitest.config.js.html +0 -157
- package/test/browser-setup.js +0 -68
- package/vitest.config.browser.js +0 -17
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Tests for the main index.js module
|
|
3
|
+
* @description Verifies that all exports are properly exported from the main entry point
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import * as utils from '../src/index.js';
|
|
8
|
+
|
|
9
|
+
describe('index.js exports', () => {
|
|
10
|
+
it('should export array utilities', () => {
|
|
11
|
+
expect(utils.arrayUnique).toBeDefined();
|
|
12
|
+
expect(utils.arrayRemoveByValue).toBeDefined();
|
|
13
|
+
expect(utils.arrayCount).toBeDefined();
|
|
14
|
+
expect(utils.cleanBlank).toBeDefined();
|
|
15
|
+
expect(utils.arrayUtils).toBeDefined();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should export DOM utilities', () => {
|
|
19
|
+
expect(utils.hasAttr).toBeDefined();
|
|
20
|
+
expect(utils.attrBegins).toBeDefined();
|
|
21
|
+
expect(utils.containsNoCase).toBeDefined();
|
|
22
|
+
expect(utils.getAttributes).toBeDefined();
|
|
23
|
+
expect(utils.getAttributesAsString).toBeDefined();
|
|
24
|
+
expect(utils.getConstructor).toBeDefined();
|
|
25
|
+
expect(utils.getDocumentSize).toBeDefined();
|
|
26
|
+
expect(utils.getElementsWithDuplicateIds).toBeDefined();
|
|
27
|
+
expect(utils.getOuterHTML).toBeDefined();
|
|
28
|
+
expect(utils.getXPath).toBeDefined();
|
|
29
|
+
expect(utils.hasFocus).toBeDefined();
|
|
30
|
+
expect(utils.isFullyVisible).toBeDefined();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should export accessibility name utilities', () => {
|
|
34
|
+
expect(utils.getAccessibleText).toBeDefined();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should export ARIA utilities', () => {
|
|
38
|
+
expect(utils.hasValidAriaAttributes).toBeDefined();
|
|
39
|
+
expect(utils.hasValidAriaRole).toBeDefined();
|
|
40
|
+
expect(utils.isAriaAttributeValid).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should export CSS utilities', () => {
|
|
44
|
+
expect(utils.getCSSGeneratedContent).toBeDefined();
|
|
45
|
+
expect(utils.getGeneratedContent).toBeDefined();
|
|
46
|
+
expect(utils.getStyleObject).toBeDefined();
|
|
47
|
+
expect(utils.hasCSSGeneratedContent).toBeDefined();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should export table utilities', () => {
|
|
51
|
+
expect(utils.checkMultiRowsInHeader).toBeDefined();
|
|
52
|
+
expect(utils.checkMultiRowsWithColspan).toBeDefined();
|
|
53
|
+
expect(utils.checkInconsistent).toBeDefined();
|
|
54
|
+
expect(utils.isComplexTable).toBeDefined();
|
|
55
|
+
expect(utils.isDataTable).toBeDefined();
|
|
56
|
+
expect(utils.rowCount).toBeDefined();
|
|
57
|
+
expect(utils.cellCount).toBeDefined();
|
|
58
|
+
expect(utils.countBordersPct).toBeDefined();
|
|
59
|
+
expect(utils.colCount).toBeDefined();
|
|
60
|
+
expect(utils.cellColorDiffs).toBeDefined();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should export visibility utilities', () => {
|
|
64
|
+
expect(utils.isOffScreen).toBeDefined();
|
|
65
|
+
expect(utils.isVisible).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should export element relationship utilities', () => {
|
|
69
|
+
expect(utils.hasParent).toBeDefined();
|
|
70
|
+
expect(utils.hasAttribute).toBeDefined();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should export focus management utilities', () => {
|
|
74
|
+
expect(utils.getFocusableElements).toBeDefined();
|
|
75
|
+
expect(utils.isFocusable).toBeDefined();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should export role computation utilities', () => {
|
|
79
|
+
expect(utils.roleMapping).toBeDefined();
|
|
80
|
+
expect(utils.getComputedRole).toBeDefined();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should export image utilities', () => {
|
|
84
|
+
expect(utils.getImageText).toBeDefined();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should export testing utilities', () => {
|
|
88
|
+
expect(utils.testContrast).toBeDefined();
|
|
89
|
+
expect(utils.langCodes).toBeDefined();
|
|
90
|
+
expect(utils.validLangCodes).toBeDefined();
|
|
91
|
+
expect(utils.rtls).toBeDefined();
|
|
92
|
+
expect(utils.getTwoLetterCode).toBeDefined();
|
|
93
|
+
expect(utils.testLang).toBeDefined();
|
|
94
|
+
expect(utils.getLang).toBeDefined();
|
|
95
|
+
expect(utils.isDirValid).toBeDefined();
|
|
96
|
+
expect(utils.sortByVisualOrder).toBeDefined();
|
|
97
|
+
expect(utils.testOrder).toBeDefined();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should export URL utilities', () => {
|
|
101
|
+
expect(utils.isValidUrl).toBeDefined();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should export string utilities', () => {
|
|
105
|
+
expect(utils.isEmpty).toBeDefined();
|
|
106
|
+
expect(utils.isString).toBeDefined();
|
|
107
|
+
expect(utils.strlen).toBeDefined();
|
|
108
|
+
expect(utils.isNormalInteger).toBeDefined();
|
|
109
|
+
expect(utils.isUpperCase).toBeDefined();
|
|
110
|
+
expect(utils.isAlphaNumeric).toBeDefined();
|
|
111
|
+
expect(utils.getPathFromUrl).toBeDefined();
|
|
112
|
+
expect(utils.getAllText).toBeDefined();
|
|
113
|
+
expect(utils.hasText).toBeDefined();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should export event listener utilities', () => {
|
|
117
|
+
expect(utils.listEventListeners).toBeDefined();
|
|
118
|
+
expect(utils.getEventListeners).toBeDefined();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('should export interactive roles array', () => {
|
|
122
|
+
const interactiveRolesKeys = Object.keys(utils).filter(key => /^\d+$/.test(key));
|
|
123
|
+
expect(interactiveRolesKeys.length).toBeGreaterThan(0);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should have object exports for data structures', () => {
|
|
127
|
+
expect(typeof utils.arrayUtils).toBe('object');
|
|
128
|
+
expect(typeof utils.roleMapping).toBe('object');
|
|
129
|
+
expect(typeof utils.langCodes).toBe('object');
|
|
130
|
+
expect(typeof utils.validLangCodes).toBe('object');
|
|
131
|
+
expect(typeof utils.rtls).toBe('object');
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('should have function exports for utilities', () => {
|
|
135
|
+
const functionExports = [
|
|
136
|
+
'arrayUnique', 'arrayRemoveByValue', 'arrayCount', 'cleanBlank',
|
|
137
|
+
'hasAttr', 'attrBegins', 'getAccessibleText', 'hasValidAriaAttributes',
|
|
138
|
+
'getCSSGeneratedContent', 'isComplexTable', 'isVisible', 'hasParent',
|
|
139
|
+
'getFocusableElements', 'getComputedRole', 'getImageText', 'testContrast',
|
|
140
|
+
'testLang', 'isValidUrl', 'isEmpty', 'listEventListeners'
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
functionExports.forEach(funcName => {
|
|
144
|
+
expect(typeof utils[funcName]).toBe('function');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('should export all expected utility functions', () => {
|
|
149
|
+
const expectedFunctions = [
|
|
150
|
+
'arrayUnique', 'arrayRemoveByValue', 'arrayCount', 'cleanBlank',
|
|
151
|
+
'hasAttr', 'attrBegins', 'containsNoCase', 'getAttributes',
|
|
152
|
+
'getAccessibleText', 'hasValidAriaAttributes', 'hasValidAriaRole',
|
|
153
|
+
'getCSSGeneratedContent', 'getGeneratedContent', 'getStyleObject',
|
|
154
|
+
'isComplexTable', 'isDataTable', 'isOffScreen', 'isVisible',
|
|
155
|
+
'hasParent', 'hasAttribute', 'getFocusableElements', 'isFocusable',
|
|
156
|
+
'getComputedRole', 'getImageText', 'testContrast', 'testLang',
|
|
157
|
+
'testOrder', 'isValidUrl', 'isEmpty', 'isString', 'listEventListeners'
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
expectedFunctions.forEach(funcName => {
|
|
161
|
+
expect(utils[funcName]).toBeDefined();
|
|
162
|
+
expect(typeof utils[funcName]).toBe('function');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Tests for interactiveRoles utility
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import interactiveRoles from '../src/interactiveRoles.js';
|
|
7
|
+
|
|
8
|
+
describe('interactiveRoles', () => {
|
|
9
|
+
it('should be an array', () => {
|
|
10
|
+
expect(Array.isArray(interactiveRoles)).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should contain expected interactive roles', () => {
|
|
14
|
+
const expectedRoles = [
|
|
15
|
+
'button',
|
|
16
|
+
'checkbox',
|
|
17
|
+
'combobox',
|
|
18
|
+
'link',
|
|
19
|
+
'menu',
|
|
20
|
+
'menuitemcheckbox',
|
|
21
|
+
'menuitemradio',
|
|
22
|
+
'radio',
|
|
23
|
+
'scrollbar',
|
|
24
|
+
'slider',
|
|
25
|
+
'spinbutton',
|
|
26
|
+
'tablist',
|
|
27
|
+
'textbox',
|
|
28
|
+
'toolbar',
|
|
29
|
+
'switch',
|
|
30
|
+
'tree'
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
expectedRoles.forEach(role => {
|
|
34
|
+
expect(interactiveRoles).toContain(role);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should have the correct length', () => {
|
|
39
|
+
expect(interactiveRoles).toHaveLength(16);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should contain only string values', () => {
|
|
43
|
+
interactiveRoles.forEach(role => {
|
|
44
|
+
expect(typeof role).toBe('string');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should not contain duplicates', () => {
|
|
49
|
+
const uniqueRoles = [...new Set(interactiveRoles)];
|
|
50
|
+
expect(uniqueRoles).toHaveLength(interactiveRoles.length);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should contain standard ARIA interactive roles', () => {
|
|
54
|
+
expect(interactiveRoles).toContain('button');
|
|
55
|
+
expect(interactiveRoles).toContain('link');
|
|
56
|
+
expect(interactiveRoles).toContain('textbox');
|
|
57
|
+
expect(interactiveRoles).toContain('checkbox');
|
|
58
|
+
expect(interactiveRoles).toContain('radio');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -80,4 +80,40 @@ describe('isAriaAttributeValid', () => {
|
|
|
80
80
|
expect(isAriaAttributeValid(attr)).toBe(true);
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
|
+
|
|
84
|
+
it('should validate newer and less common ARIA attributes', () => {
|
|
85
|
+
const newerAttributes = [
|
|
86
|
+
'aria-braillelabel',
|
|
87
|
+
'aria-brailleroledescription',
|
|
88
|
+
'aria-colcount',
|
|
89
|
+
'aria-colindex',
|
|
90
|
+
'aria-colindextext',
|
|
91
|
+
'aria-colspan',
|
|
92
|
+
'aria-current',
|
|
93
|
+
'aria-description',
|
|
94
|
+
'aria-details',
|
|
95
|
+
'aria-dropeffect',
|
|
96
|
+
'aria-errormessage',
|
|
97
|
+
'aria-flowto',
|
|
98
|
+
'aria-grabbed',
|
|
99
|
+
'aria-keyshortcuts',
|
|
100
|
+
'aria-modal',
|
|
101
|
+
'aria-roledescription',
|
|
102
|
+
'aria-rowcount',
|
|
103
|
+
'aria-rowindex',
|
|
104
|
+
'aria-rowindextext',
|
|
105
|
+
'aria-rowspan'
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
newerAttributes.forEach(attr => {
|
|
109
|
+
expect(isAriaAttributeValid(attr)).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should handle edge cases with empty string and whitespace', () => {
|
|
114
|
+
expect(isAriaAttributeValid('')).toBe(false);
|
|
115
|
+
expect(isAriaAttributeValid(' ')).toBe(false);
|
|
116
|
+
expect(isAriaAttributeValid('\t')).toBe(false);
|
|
117
|
+
expect(isAriaAttributeValid('\n')).toBe(false);
|
|
118
|
+
});
|
|
83
119
|
});
|