@@ -3,31 +3,40 @@ import { matcherHint } from 'jest-matcher-utils';
33import type { ReactTestInstance } from 'react-test-renderer' ;
44
55import { checkReactElement , printElement } from './utils' ;
6+ import { getParentElement } from './component-tree' ;
67
7- function isStyleVisible ( element : ReactTestInstance ) {
8+ function isVisibleForStyles ( element : ReactTestInstance ) {
89 const style = element . props . style || { } ;
910 const { display, opacity } = StyleSheet . flatten ( style ) ;
1011 return display !== 'none' && opacity !== 0 ;
1112}
1213
13- function isAttributeVisible ( element : ReactTestInstance ) {
14- return element . type !== Modal || element . props . visible !== false ;
14+ function isVisibleForAccessibility ( element : ReactTestInstance ) {
15+ return (
16+ ! element . props . accessibilityElementsHidden &&
17+ element . props . importantForAccessibility !== 'no-hide-descendants'
18+ ) ;
1519}
1620
17- function isVisibleForAccessibility ( element : ReactTestInstance ) {
18- const visibleForiOSVoiceOver = ! element . props . accessibilityElementsHidden ;
19- const visibleForAndroidTalkBack =
20- element . props . importantForAccessibility !== 'no-hide-descendants' ;
21- return visibleForiOSVoiceOver && visibleForAndroidTalkBack ;
21+ function isModalVisible ( element : ReactTestInstance ) {
22+ return element . type !== Modal || element . props . visible !== false ;
2223}
2324
2425function isElementVisible ( element : ReactTestInstance ) : boolean {
25- return (
26- isStyleVisible ( element ) &&
27- isAttributeVisible ( element ) &&
28- isVisibleForAccessibility ( element ) &&
29- ( ! element . parent || isElementVisible ( element . parent ) )
30- ) ;
26+ let current : ReactTestInstance | null = element ;
27+ while ( current ) {
28+ if (
29+ ! isVisibleForStyles ( current ) ||
30+ ! isVisibleForAccessibility ( current ) ||
31+ ! isModalVisible ( current )
32+ ) {
33+ return false ;
34+ }
35+
36+ current = getParentElement ( current , [ Modal ] ) ;
37+ }
38+
39+ return true ;
3140}
3241
3342export function toBeVisible ( this : jest . MatcherContext , element : ReactTestInstance ) {
0 commit comments