Skip to content

Commit ed4718d

Browse files
committed
refactor tests
1 parent ae90b30 commit ed4718d

4 files changed

Lines changed: 97 additions & 50 deletions

File tree

packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,15 @@ class TouchableHighlightImpl extends React.Component<
230230
const {onBlur, onFocus, ...eventHandlersWithoutBlurAndFocus} =
231231
this.state.pressability.getEventHandlers();
232232

233+
// The `disabled` prop takes precedence over `aria-disabled`, which in turn
234+
// takes precedence over `accessibilityState.disabled`. The remaining
235+
// `aria-*` state props are forwarded to `View`, which merges them.
236+
const disabled = this.props.disabled ?? this.props['aria-disabled'];
233237
const accessibilityState: ?AccessibilityState =
234-
this.props.disabled != null
238+
disabled != null
235239
? {
236240
...this.props.accessibilityState,
237-
disabled: this.props.disabled,
241+
disabled,
238242
}
239243
: this.props.accessibilityState;
240244

@@ -260,6 +264,10 @@ class TouchableHighlightImpl extends React.Component<
260264
accessibilityLanguage={this.props.accessibilityLanguage}
261265
accessibilityRole={this.props.accessibilityRole}
262266
accessibilityState={accessibilityState}
267+
aria-busy={this.props['aria-busy']}
268+
aria-checked={this.props['aria-checked']}
269+
aria-expanded={this.props['aria-expanded']}
270+
aria-selected={this.props['aria-selected']}
263271
accessibilityValue={accessibilityValue}
264272
accessibilityActions={this.props.accessibilityActions}
265273
onAccessibilityAction={this.props.onAccessibilityAction}

packages/react-native/Libraries/Image/Image.ios.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ let BaseImage: AbstractImageIOS = ({
205205
// In order for `aria-hidden` to work on iOS we must set `accessible` to
206206
// false (`accessibilityElementsHidden` is not enough).
207207
resolvedProps.accessible = false;
208-
} else if (alt !== undefined) {
208+
} else if (alt != null) {
209209
resolvedProps.accessible = true;
210210
} else if (accessible != null) {
211211
resolvedProps.accessible = accessible;

packages/react-native/Libraries/Image/__tests__/Image-itest.js

Lines changed: 5 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -648,53 +648,11 @@ describe('<Image>', () => {
648648
});
649649
});
650650

651-
describe('aria-* accessibility state', () => {
652-
(
653-
[
654-
[<Image aria-busy={true} accessible={true} />, 'busy:true'],
655-
[<Image aria-disabled={true} accessible={true} />, 'disabled:true'],
656-
[<Image aria-expanded={true} accessible={true} />, 'expanded:true'],
657-
[<Image aria-selected={true} accessible={true} />, 'selected:true'],
658-
[<Image aria-checked={true} accessible={true} />, 'checked:Checked'],
659-
] as const
660-
).forEach(([element, expected]) => {
661-
it(`maps ${expected.split(':')[0]} into accessibilityState`, () => {
662-
const root = Fantom.createRoot();
663-
664-
Fantom.runTask(() => {
665-
root.render(element);
666-
});
667-
668-
expect(
669-
root
670-
.getRenderedOutput({props: ['accessibilityState']})
671-
.toJSONObject().props.accessibilityState,
672-
).toContain(expected);
673-
});
674-
});
675-
676-
it('takes precedence over the matching accessibilityState field', () => {
677-
const root = Fantom.createRoot();
678-
679-
Fantom.runTask(() => {
680-
root.render(
681-
<Image
682-
accessibilityState={{busy: false, disabled: true}}
683-
aria-busy={true}
684-
accessible={true}
685-
/>,
686-
);
687-
});
688-
689-
const accessibilityState = root
690-
.getRenderedOutput({props: ['accessibilityState']})
691-
.toJSONObject().props.accessibilityState;
692-
693-
expect(accessibilityState).toContain('busy:true');
694-
// Fields not covered by an `aria-*` prop are preserved.
695-
expect(accessibilityState).toContain('disabled:true');
696-
});
697-
651+
describe('accessibilityState', () => {
652+
// The `aria-*` to `accessibilityState` mapping is covered by
653+
// `accessibilityPropsSuite`. This case cannot live there, because
654+
// `Pressable` and `TouchableWithoutFeedback` always emit
655+
// `accessibilityState`.
698656
it('is not set when no state props are provided', () => {
699657
const root = Fantom.createRoot();
700658

packages/react-native/src/private/__tests__/utilities/accessibilityPropsSuite.js

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,87 @@ export default function accessibilityPropsSuite(
310310
).toEqual(true);
311311
});
312312
});
313+
314+
describe('aria-* aliases', () => {
315+
it('\'aria-busy\' maps to "busy"', () => {
316+
expect(
317+
getAccessibilityProp(
318+
<Component aria-busy={true} />,
319+
'accessibilityState',
320+
).includes('busy:true'),
321+
).toEqual(true);
322+
});
323+
324+
it('\'aria-disabled\' maps to "disabled"', () => {
325+
expect(
326+
getAccessibilityProp(
327+
<Component aria-disabled={true} />,
328+
'accessibilityState',
329+
).includes('disabled:true'),
330+
).toEqual(true);
331+
});
332+
333+
it('\'aria-expanded\' maps to "expanded"', () => {
334+
expect(
335+
getAccessibilityProp(
336+
<Component aria-expanded={true} />,
337+
'accessibilityState',
338+
).includes('expanded:true'),
339+
).toEqual(true);
340+
});
341+
342+
it('\'aria-selected\' maps to "selected"', () => {
343+
expect(
344+
getAccessibilityProp(
345+
<Component aria-selected={true} />,
346+
'accessibilityState',
347+
).includes('selected:true'),
348+
).toEqual(true);
349+
});
350+
351+
describe('\'aria-checked\' maps to "checked"', () => {
352+
it('when set to true', () => {
353+
expect(
354+
getAccessibilityProp(
355+
<Component aria-checked={true} />,
356+
'accessibilityState',
357+
).includes('checked:Checked'),
358+
).toEqual(true);
359+
});
360+
361+
it('when set to false', () => {
362+
expect(
363+
getAccessibilityProp(
364+
<Component aria-checked={false} />,
365+
'accessibilityState',
366+
).includes('checked:Unchecked'),
367+
).toEqual(true);
368+
});
369+
370+
it("when set to 'mixed'", () => {
371+
expect(
372+
getAccessibilityProp(
373+
<Component aria-checked="mixed" />,
374+
'accessibilityState',
375+
).includes('checked:Mixed'),
376+
).toEqual(true);
377+
});
378+
});
379+
380+
it('take precedence over the matching `accessibilityState` field', () => {
381+
const accessibilityState = getAccessibilityProp(
382+
<Component
383+
accessibilityState={{busy: false, disabled: true}}
384+
aria-busy={true}
385+
/>,
386+
'accessibilityState',
387+
);
388+
389+
expect(accessibilityState.includes('busy:true')).toEqual(true);
390+
// Fields not covered by an `aria-*` prop are preserved.
391+
expect(accessibilityState.includes('disabled:true')).toEqual(true);
392+
});
393+
});
313394
});
314395

315396
describe('accessibilityActions', () => {

0 commit comments

Comments
 (0)