1*90ff9d99SŁukasz Kosmaty'use strict'; 2*90ff9d99SŁukasz Kosmaty 3*90ff9d99SŁukasz Kosmatyimport { Platform } from '@unimodules/core'; 4*90ff9d99SŁukasz Kosmatyimport Constants from 'expo-constants'; 5*90ff9d99SŁukasz Kosmaty 6*90ff9d99SŁukasz Kosmatyimport ExponentTest from './ExponentTest'; 7*90ff9d99SŁukasz Kosmatyimport { isDeviceFarm } from './utils/Environment'; 8*90ff9d99SŁukasz Kosmaty 9*90ff9d99SŁukasz Kosmatyfunction browserSupportsWebGL() { 10*90ff9d99SŁukasz Kosmaty try { 11*90ff9d99SŁukasz Kosmaty const canvas = document.createElement('canvas'); 12*90ff9d99SŁukasz Kosmaty return ( 13*90ff9d99SŁukasz Kosmaty !!window.WebGLRenderingContext && 14*90ff9d99SŁukasz Kosmaty (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')) 15*90ff9d99SŁukasz Kosmaty ); 16*90ff9d99SŁukasz Kosmaty } catch (e) { 17*90ff9d99SŁukasz Kosmaty return false; 18*90ff9d99SŁukasz Kosmaty } 19*90ff9d99SŁukasz Kosmaty} 20*90ff9d99SŁukasz Kosmaty 21*90ff9d99SŁukasz Kosmatyfunction optionalRequire(requirer) { 22*90ff9d99SŁukasz Kosmaty try { 23*90ff9d99SŁukasz Kosmaty return requirer(); 24*90ff9d99SŁukasz Kosmaty } catch (e) { 25*90ff9d99SŁukasz Kosmaty // eslint-disable-next-line 26*90ff9d99SŁukasz Kosmaty return; 27*90ff9d99SŁukasz Kosmaty } 28*90ff9d99SŁukasz Kosmaty} 29*90ff9d99SŁukasz Kosmaty 30*90ff9d99SŁukasz Kosmaty// Both Location and TaskManager test suites define tasks in TaskManager. 31*90ff9d99SŁukasz Kosmaty// Since tasks can only be defined during initialization phase (not as a result 32*90ff9d99SŁukasz Kosmaty// of calling some function when the application is running, but rather in global scope), 33*90ff9d99SŁukasz Kosmaty// we need to trigger code execution of these modules here (not in `getTestModules` 34*90ff9d99SŁukasz Kosmaty// which is called in one of the components). 35*90ff9d99SŁukasz Kosmatyconst LocationTestScreen = optionalRequire(() => require('./tests/Location')); 36*90ff9d99SŁukasz Kosmatyconst TaskManagerTestScreen = optionalRequire(() => require('./tests/TaskManager')); 37*90ff9d99SŁukasz Kosmaty// I have a hunch that optionalRequire doesn't work when *not* in global scope 38*90ff9d99SŁukasz Kosmaty// since I had to move Camera screen import here too to get rid of an error 39*90ff9d99SŁukasz Kosmaty// caused by missing native module. 40*90ff9d99SŁukasz Kosmatyconst CameraTestScreen = optionalRequire(() => require('./tests/Camera')); 41*90ff9d99SŁukasz Kosmaty 42*90ff9d99SŁukasz Kosmaty// List of all modules for tests. Each file path must be statically present for 43*90ff9d99SŁukasz Kosmaty// the packager to pick them all up. 44*90ff9d99SŁukasz Kosmatyexport function getTestModules() { 45*90ff9d99SŁukasz Kosmaty const modules = [ 46*90ff9d99SŁukasz Kosmaty // Sanity 47*90ff9d99SŁukasz Kosmaty require('./tests/Basic'), 48*90ff9d99SŁukasz Kosmaty ]; 49*90ff9d99SŁukasz Kosmaty 50*90ff9d99SŁukasz Kosmaty // Expo core modules should run everywhere 51*90ff9d99SŁukasz Kosmaty modules.push( 52*90ff9d99SŁukasz Kosmaty require('./tests/Asset'), 53*90ff9d99SŁukasz Kosmaty require('./tests/Constants'), 54*90ff9d99SŁukasz Kosmaty require('./tests/FileSystem'), 55*90ff9d99SŁukasz Kosmaty require('./tests/Font'), 56*90ff9d99SŁukasz Kosmaty require('./tests/Permissions'), 57*90ff9d99SŁukasz Kosmaty require('./tests/ImagePicker') 58*90ff9d99SŁukasz Kosmaty ); 59*90ff9d99SŁukasz Kosmaty 60*90ff9d99SŁukasz Kosmaty // Universally tested APIs 61*90ff9d99SŁukasz Kosmaty modules.push( 62*90ff9d99SŁukasz Kosmaty require('./tests/Random'), 63*90ff9d99SŁukasz Kosmaty require('./tests/Crypto'), 64*90ff9d99SŁukasz Kosmaty require('./tests/KeepAwake'), 65*90ff9d99SŁukasz Kosmaty require('./tests/Blur'), 66*90ff9d99SŁukasz Kosmaty require('./tests/LinearGradient'), 67*90ff9d99SŁukasz Kosmaty require('./tests/Facebook'), 68*90ff9d99SŁukasz Kosmaty require('./tests/HTML'), 69*90ff9d99SŁukasz Kosmaty require('./tests/FirebaseCore'), 70*90ff9d99SŁukasz Kosmaty require('./tests/FirebaseAnalytics') 71*90ff9d99SŁukasz Kosmaty ); 72*90ff9d99SŁukasz Kosmaty 73*90ff9d99SŁukasz Kosmaty if (Platform.OS === 'android') { 74*90ff9d99SŁukasz Kosmaty modules.push(require('./tests/JSC')); 75*90ff9d99SŁukasz Kosmaty } 76*90ff9d99SŁukasz Kosmaty 77*90ff9d99SŁukasz Kosmaty if (global.DETOX) { 78*90ff9d99SŁukasz Kosmaty modules.push( 79*90ff9d99SŁukasz Kosmaty require('./tests/Contacts'), 80*90ff9d99SŁukasz Kosmaty require('./tests/Haptics'), 81*90ff9d99SŁukasz Kosmaty require('./tests/Localization'), 82*90ff9d99SŁukasz Kosmaty require('./tests/SecureStore'), 83*90ff9d99SŁukasz Kosmaty require('./tests/SMS'), 84*90ff9d99SŁukasz Kosmaty require('./tests/StoreReview'), 85*90ff9d99SŁukasz Kosmaty require('./tests/NewNotifications') 86*90ff9d99SŁukasz Kosmaty ); 87*90ff9d99SŁukasz Kosmaty return modules; 88*90ff9d99SŁukasz Kosmaty } 89*90ff9d99SŁukasz Kosmaty 90*90ff9d99SŁukasz Kosmaty if (Platform.OS === 'web') { 91*90ff9d99SŁukasz Kosmaty modules.push( 92*90ff9d99SŁukasz Kosmaty require('./tests/Contacts'), 93*90ff9d99SŁukasz Kosmaty // require('./tests/SVG'), 94*90ff9d99SŁukasz Kosmaty require('./tests/Localization'), 95*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/NewNotifications')) 96*90ff9d99SŁukasz Kosmaty ); 97*90ff9d99SŁukasz Kosmaty 98*90ff9d99SŁukasz Kosmaty if (browserSupportsWebGL()) { 99*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/GLView'))); 100*90ff9d99SŁukasz Kosmaty } 101*90ff9d99SŁukasz Kosmaty 102*90ff9d99SŁukasz Kosmaty if (ExponentTest && !ExponentTest.isInCI) { 103*90ff9d99SŁukasz Kosmaty // modules.push(optionalRequire(() => require('./tests/Speech'))); 104*90ff9d99SŁukasz Kosmaty } 105*90ff9d99SŁukasz Kosmaty return modules.filter(Boolean); 106*90ff9d99SŁukasz Kosmaty } 107*90ff9d99SŁukasz Kosmaty 108*90ff9d99SŁukasz Kosmaty modules.push( 109*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Application')), 110*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Device')), 111*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/GLView')), 112*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Haptics')), 113*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Localization')), 114*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Network')), 115*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/SecureStore')), 116*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Segment')), 117*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/SQLite')), 118*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Speech')), 119*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Recording')), 120*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/ScreenOrientation')), 121*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Payments')), 122*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobInterstitial')), 123*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobRewarded')), 124*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/FBBannerAd')), 125*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/NewNotifications')) 126*90ff9d99SŁukasz Kosmaty ); 127*90ff9d99SŁukasz Kosmaty 128*90ff9d99SŁukasz Kosmaty if (!isDeviceFarm()) { 129*90ff9d99SŁukasz Kosmaty // Times out sometimes 130*90ff9d99SŁukasz Kosmaty modules.push( 131*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobPublisherBanner')), 132*90ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobBanner')) 133*90ff9d99SŁukasz Kosmaty ); 134*90ff9d99SŁukasz Kosmaty // Invalid placementId in CI (all tests fail) 135*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/FBNativeAd'))); 136*90ff9d99SŁukasz Kosmaty // Requires interaction (sign in popup) 137*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/GoogleSignIn'))); 138*90ff9d99SŁukasz Kosmaty // Popup to request device's location which uses Google's location service 139*90ff9d99SŁukasz Kosmaty modules.push(LocationTestScreen); 140*90ff9d99SŁukasz Kosmaty // Fails to redirect because of malformed URL in published version with release channel parameter 141*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Linking'))); 142*90ff9d99SŁukasz Kosmaty // Has uncontrolled view controllers 143*90ff9d99SŁukasz Kosmaty modules.push(require('./tests/SMS')); 144*90ff9d99SŁukasz Kosmaty // Requires permission 145*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Calendar'))); 146*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/MediaLibrary'))); 147*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Notifications'))); 148*90ff9d99SŁukasz Kosmaty 149*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Battery'))); 150*90ff9d99SŁukasz Kosmaty if (Constants.isDevice) { 151*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Brightness'))); 152*90ff9d99SŁukasz Kosmaty } 153*90ff9d99SŁukasz Kosmaty // Crashes app when mounting component 154*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Video'))); 155*90ff9d99SŁukasz Kosmaty // "sdkUnversionedTestSuite failed: java.lang.NullPointerException: Attempt to invoke interface method 156*90ff9d99SŁukasz Kosmaty // 'java.util.Map org.unimodules.interfaces.taskManager.TaskInterface.getOptions()' on a null object reference" 157*90ff9d99SŁukasz Kosmaty modules.push(TaskManagerTestScreen); 158*90ff9d99SŁukasz Kosmaty // Audio tests are flaky in CI due to asynchronous fetching of resources 159*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Audio'))); 160*90ff9d99SŁukasz Kosmaty // The Camera tests are flaky on iOS, i.e. they fail randomly 161*90ff9d99SŁukasz Kosmaty if (Constants.isDevice && Platform.OS === 'android') { 162*90ff9d99SŁukasz Kosmaty modules.push(CameraTestScreen); 163*90ff9d99SŁukasz Kosmaty } 164*90ff9d99SŁukasz Kosmaty } 165*90ff9d99SŁukasz Kosmaty if (Constants.isDevice) { 166*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Cellular'))); 167*90ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/BarCodeScanner'))); 168*90ff9d99SŁukasz Kosmaty } 169*90ff9d99SŁukasz Kosmaty return modules.filter(Boolean); 170*90ff9d99SŁukasz Kosmaty} 171