@@ -33,6 +33,52 @@ function getTitleStyle(component: RenderResult): TextStyle {
3333}
3434
3535describe ( 'Accordion' , ( ) => {
36+ it ( 'ACC-001 ignores defaultExpanded while controlled and requests the inverse of each supplied value' , async ( ) => {
37+ const onExpandedChange = jest . fn ( ) ;
38+ const component = await renderAccordion ( { expanded : true , defaultExpanded : false , onExpandedChange } ) ;
39+
40+ await fireEvent . press ( getHeader ( component ) ) ;
41+ await fireEvent . press ( getHeader ( component ) ) ;
42+ expect ( onExpandedChange . mock . calls ) . toEqual ( [ [ false ] , [ false ] ] ) ;
43+ expect ( getHeader ( component ) . props . accessibilityState . expanded ) . toBe ( true ) ;
44+
45+ await component . rerender ( < Accordion expanded = { false } defaultExpanded onExpandedChange = { onExpandedChange } /> ) ;
46+ await fireEvent . press ( getHeader ( component ) ) ;
47+ expect ( onExpandedChange . mock . calls ) . toEqual ( [ [ false ] , [ false ] , [ true ] ] ) ;
48+ expect ( getHeader ( component ) . props . accessibilityState . expanded ) . toBe ( false ) ;
49+ } ) ;
50+
51+ it ( 'ACC-004 retains the body identity and hides descendants only while collapsed' , async ( ) => {
52+ const component = await renderAccordion ( { bodyContent : { children : < Text > Persistent details</ Text > } } ) ;
53+ const bodyId = getBody ( component ) . props . id ;
54+
55+ expect ( getHeader ( component ) . props . accessibilityControls ) . toBe ( bodyId ) ;
56+ expect ( getHeader ( component ) . props [ 'aria-controls' ] ) . toBe ( bodyId ) ;
57+ expect ( getBody ( component ) . props . accessibilityElementsHidden ) . toBe ( true ) ;
58+ expect ( getBody ( component ) . props . importantForAccessibility ) . toBe ( 'no-hide-descendants' ) ;
59+ expect ( component . getByText ( 'Persistent details' , { includeHiddenElements : true } ) ) . toBeOnTheScreen ( ) ;
60+
61+ await fireEvent . press ( getHeader ( component ) ) ;
62+ expect ( getBody ( component ) . props . id ) . toBe ( bodyId ) ;
63+ expect ( getBody ( component ) . props . accessibilityElementsHidden ) . toBe ( false ) ;
64+ expect ( getBody ( component ) . props . importantForAccessibility ) . toBeUndefined ( ) ;
65+ expect ( component . getByText ( 'Persistent details' ) ) . toBeOnTheScreen ( ) ;
66+
67+ await fireEvent . press ( getHeader ( component ) ) ;
68+ expect ( getBody ( component ) . props . id ) . toBe ( bodyId ) ;
69+ expect ( getBody ( component ) . props . accessibilityElementsHidden ) . toBe ( true ) ;
70+ expect ( getBody ( component ) . props . importantForAccessibility ) . toBe ( 'no-hide-descendants' ) ;
71+ } ) ;
72+
73+ it . each ( [ 'chevronStart' , 'chevronEnd' ] as const ) ( 'ACC-002 omits null optional header slots in %s layout' , async ( layout ) => {
74+ const component = await renderAccordion ( { layout, title : null , leadingIcon : null , accessibilityLabel : 'Details' } ) ;
75+ expect ( component . queryByTestId ( 'accordion-title' ) ) . toBeNull ( ) ;
76+ expect ( component . queryByTestId ( 'accordion-leading-icon' ) ) . toBeNull ( ) ;
77+ expect ( getHeader ( component ) . children ) . toHaveLength ( 1 ) ;
78+ expect ( getHeader ( component ) . props . accessibilityLabel ) . toBe ( 'Details' ) ;
79+ expect ( component . getByTestId ( 'accordion-chevron-icon' ) . props . accessible ) . toBe ( false ) ;
80+ } ) ;
81+
3682 it ( 'renders a default header, default icon, and hidden body wiring' , async ( ) => {
3783 const component = await renderAccordion ( { } ) ;
3884 const header = getHeader ( component ) ;
0 commit comments