190ff9d99SŁukasz Kosmaty'use strict'; 290ff9d99SŁukasz Kosmaty 390ff9d99SŁukasz Kosmatyimport Constants from 'expo-constants'; 419cbf4dcSBartłomiej Bukowskiimport { Platform } from 'expo-modules-core'; 590ff9d99SŁukasz Kosmaty 690ff9d99SŁukasz Kosmatyimport ExponentTest from './ExponentTest'; 790ff9d99SŁukasz Kosmatyimport { isDeviceFarm } from './utils/Environment'; 890ff9d99SŁukasz Kosmaty 990ff9d99SŁukasz Kosmatyfunction browserSupportsWebGL() { 1090ff9d99SŁukasz Kosmaty try { 1190ff9d99SŁukasz Kosmaty const canvas = document.createElement('canvas'); 1290ff9d99SŁukasz Kosmaty return ( 1390ff9d99SŁukasz Kosmaty !!window.WebGLRenderingContext && 1490ff9d99SŁukasz Kosmaty (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')) 1590ff9d99SŁukasz Kosmaty ); 1690ff9d99SŁukasz Kosmaty } catch (e) { 1790ff9d99SŁukasz Kosmaty return false; 1890ff9d99SŁukasz Kosmaty } 1990ff9d99SŁukasz Kosmaty} 2090ff9d99SŁukasz Kosmaty 2190ff9d99SŁukasz Kosmatyfunction optionalRequire(requirer) { 2290ff9d99SŁukasz Kosmaty try { 2390ff9d99SŁukasz Kosmaty return requirer(); 2490ff9d99SŁukasz Kosmaty } catch (e) { 2590ff9d99SŁukasz Kosmaty // eslint-disable-next-line 2690ff9d99SŁukasz Kosmaty return; 2790ff9d99SŁukasz Kosmaty } 2890ff9d99SŁukasz Kosmaty} 2990ff9d99SŁukasz Kosmaty 3090ff9d99SŁukasz Kosmaty// Both Location and TaskManager test suites define tasks in TaskManager. 3190ff9d99SŁukasz Kosmaty// Since tasks can only be defined during initialization phase (not as a result 3290ff9d99SŁukasz Kosmaty// of calling some function when the application is running, but rather in global scope), 3390ff9d99SŁukasz Kosmaty// we need to trigger code execution of these modules here (not in `getTestModules` 3490ff9d99SŁukasz Kosmaty// which is called in one of the components). 3590ff9d99SŁukasz Kosmatyconst LocationTestScreen = optionalRequire(() => require('./tests/Location')); 3690ff9d99SŁukasz Kosmatyconst TaskManagerTestScreen = optionalRequire(() => require('./tests/TaskManager')); 3790ff9d99SŁukasz Kosmaty// I have a hunch that optionalRequire doesn't work when *not* in global scope 3890ff9d99SŁukasz Kosmaty// since I had to move Camera screen import here too to get rid of an error 3990ff9d99SŁukasz Kosmaty// caused by missing native module. 4090ff9d99SŁukasz Kosmatyconst CameraTestScreen = optionalRequire(() => require('./tests/Camera')); 4190ff9d99SŁukasz Kosmaty 4290ff9d99SŁukasz Kosmaty// List of all modules for tests. Each file path must be statically present for 4390ff9d99SŁukasz Kosmaty// the packager to pick them all up. 4490ff9d99SŁukasz Kosmatyexport function getTestModules() { 4590ff9d99SŁukasz Kosmaty const modules = [ 4690ff9d99SŁukasz Kosmaty // Sanity 4790ff9d99SŁukasz Kosmaty require('./tests/Basic'), 4890ff9d99SŁukasz Kosmaty ]; 4990ff9d99SŁukasz Kosmaty 5090ff9d99SŁukasz Kosmaty // Expo core modules should run everywhere 5190ff9d99SŁukasz Kosmaty modules.push( 5290ff9d99SŁukasz Kosmaty require('./tests/Asset'), 5390ff9d99SŁukasz Kosmaty require('./tests/Constants'), 5490ff9d99SŁukasz Kosmaty require('./tests/FileSystem'), 5590ff9d99SŁukasz Kosmaty require('./tests/Font'), 5690ff9d99SŁukasz Kosmaty require('./tests/Permissions'), 57e16679f7SStanisław Chmiela require('./tests/ImagePicker'), 58e16679f7SStanisław Chmiela optionalRequire(() => require('./tests/Image')) 5990ff9d99SŁukasz Kosmaty ); 6090ff9d99SŁukasz Kosmaty 6190ff9d99SŁukasz Kosmaty // Universally tested APIs 6290ff9d99SŁukasz Kosmaty modules.push( 6390ff9d99SŁukasz Kosmaty require('./tests/Random'), 6490ff9d99SŁukasz Kosmaty require('./tests/Crypto'), 6590ff9d99SŁukasz Kosmaty require('./tests/KeepAwake'), 6690ff9d99SŁukasz Kosmaty require('./tests/Blur'), 6790ff9d99SŁukasz Kosmaty require('./tests/LinearGradient'), 6890ff9d99SŁukasz Kosmaty require('./tests/Facebook'), 6990ff9d99SŁukasz Kosmaty require('./tests/HTML'), 7090ff9d99SŁukasz Kosmaty require('./tests/FirebaseCore'), 719158859eSHein Rutjes require('./tests/FirebaseAnalytics'), 72e11b7986SStanisław Chmiela require('./tests/FirebaseRecaptcha'), 7385ce611fSCedric van Putten require('./tests/FirebaseJSSDKCompat'), 74626595cbSHein Rutjes require('./tests/FirebaseJSSDK'), 7561c2143aSmnightingale require('./tests/ImageManipulator'), 76e11b7986SStanisław Chmiela optionalRequire(() => require('./tests/SQLite')) 7790ff9d99SŁukasz Kosmaty ); 7890ff9d99SŁukasz Kosmaty 7990ff9d99SŁukasz Kosmaty if (Platform.OS === 'android') { 8090ff9d99SŁukasz Kosmaty modules.push(require('./tests/JSC')); 8105f47bb5SKudo Chien modules.push(require('./tests/Hermes')); 8290ff9d99SŁukasz Kosmaty } 8390ff9d99SŁukasz Kosmaty 8490ff9d99SŁukasz Kosmaty if (global.DETOX) { 8590ff9d99SŁukasz Kosmaty modules.push( 8690ff9d99SŁukasz Kosmaty require('./tests/Contacts'), 8790ff9d99SŁukasz Kosmaty require('./tests/Haptics'), 8890ff9d99SŁukasz Kosmaty require('./tests/Localization'), 8990ff9d99SŁukasz Kosmaty require('./tests/SecureStore'), 9090ff9d99SŁukasz Kosmaty require('./tests/SMS'), 9190ff9d99SŁukasz Kosmaty require('./tests/StoreReview'), 9247b314f0SCharlie Cruzan require('./tests/Notifications') 9390ff9d99SŁukasz Kosmaty ); 9490ff9d99SŁukasz Kosmaty return modules; 9590ff9d99SŁukasz Kosmaty } 9690ff9d99SŁukasz Kosmaty 9790ff9d99SŁukasz Kosmaty if (Platform.OS === 'web') { 9890ff9d99SŁukasz Kosmaty modules.push( 9990ff9d99SŁukasz Kosmaty require('./tests/Contacts'), 10090ff9d99SŁukasz Kosmaty // require('./tests/SVG'), 10190ff9d99SŁukasz Kosmaty require('./tests/Localization'), 102dc7b526eSWarren Bickley require('./tests/Recording'), 10347b314f0SCharlie Cruzan optionalRequire(() => require('./tests/Notifications')), 104731f34a7STomasz Sapeta LocationTestScreen 10590ff9d99SŁukasz Kosmaty ); 10690ff9d99SŁukasz Kosmaty 10790ff9d99SŁukasz Kosmaty if (browserSupportsWebGL()) { 10890ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/GLView'))); 10990ff9d99SŁukasz Kosmaty } 11090ff9d99SŁukasz Kosmaty 11190ff9d99SŁukasz Kosmaty if (ExponentTest && !ExponentTest.isInCI) { 11290ff9d99SŁukasz Kosmaty // modules.push(optionalRequire(() => require('./tests/Speech'))); 11390ff9d99SŁukasz Kosmaty } 11490ff9d99SŁukasz Kosmaty return modules.filter(Boolean); 11590ff9d99SŁukasz Kosmaty } 11690ff9d99SŁukasz Kosmaty 11790ff9d99SŁukasz Kosmaty modules.push( 11890ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Application')), 11956b27c56SEvan Bacon optionalRequire(() => require('./tests/AuthSession')), 12090ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Device')), 12190ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/GLView')), 12290ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Haptics')), 12390ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Localization')), 12490ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Network')), 12590ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/SecureStore')), 12690ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Segment')), 12790ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Speech')), 12890ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/Recording')), 12990ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/ScreenOrientation')), 13090ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobInterstitial')), 13190ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobRewarded')), 13290ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/FBBannerAd')), 1334281e48eSEvan Bacon optionalRequire(() => require('./tests/Notifications')), 13413c5c8bdSEvan Bacon optionalRequire(() => require('./tests/NavigationBar')), 13513c5c8bdSEvan Bacon optionalRequire(() => require('./tests/SystemUI')) 13690ff9d99SŁukasz Kosmaty ); 13790ff9d99SŁukasz Kosmaty 13890ff9d99SŁukasz Kosmaty if (!isDeviceFarm()) { 13990ff9d99SŁukasz Kosmaty // Times out sometimes 14090ff9d99SŁukasz Kosmaty modules.push( 14190ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobPublisherBanner')), 14290ff9d99SŁukasz Kosmaty optionalRequire(() => require('./tests/AdMobBanner')) 14390ff9d99SŁukasz Kosmaty ); 14490ff9d99SŁukasz Kosmaty // Invalid placementId in CI (all tests fail) 14590ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/FBNativeAd'))); 14690ff9d99SŁukasz Kosmaty // Requires interaction (sign in popup) 14790ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/GoogleSignIn'))); 14890ff9d99SŁukasz Kosmaty // Popup to request device's location which uses Google's location service 14990ff9d99SŁukasz Kosmaty modules.push(LocationTestScreen); 15090ff9d99SŁukasz Kosmaty // Fails to redirect because of malformed URL in published version with release channel parameter 15190ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Linking'))); 15290ff9d99SŁukasz Kosmaty // Has uncontrolled view controllers 15390ff9d99SŁukasz Kosmaty modules.push(require('./tests/SMS')); 15490ff9d99SŁukasz Kosmaty // Requires permission 1559b1f804bSŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Contacts'))); 15690ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Calendar'))); 157aa2d439aSTomasz Sapeta modules.push(optionalRequire(() => require('./tests/CalendarReminders'))); 15890ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/MediaLibrary'))); 15990ff9d99SŁukasz Kosmaty 16090ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Battery'))); 16190ff9d99SŁukasz Kosmaty if (Constants.isDevice) { 16290ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Brightness'))); 16390ff9d99SŁukasz Kosmaty } 16490ff9d99SŁukasz Kosmaty // Crashes app when mounting component 16590ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Video'))); 16690ff9d99SŁukasz Kosmaty // "sdkUnversionedTestSuite failed: java.lang.NullPointerException: Attempt to invoke interface method 16790ff9d99SŁukasz Kosmaty // 'java.util.Map org.unimodules.interfaces.taskManager.TaskInterface.getOptions()' on a null object reference" 16890ff9d99SŁukasz Kosmaty modules.push(TaskManagerTestScreen); 16990ff9d99SŁukasz Kosmaty // Audio tests are flaky in CI due to asynchronous fetching of resources 17090ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Audio'))); 171bd6ca857Sandy 17290ff9d99SŁukasz Kosmaty // The Camera tests are flaky on iOS, i.e. they fail randomly 173bd6ca857Sandy if (Constants.isDevice) { 17490ff9d99SŁukasz Kosmaty modules.push(CameraTestScreen); 17590ff9d99SŁukasz Kosmaty } 17690ff9d99SŁukasz Kosmaty } 17790ff9d99SŁukasz Kosmaty if (Constants.isDevice) { 17890ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/Cellular'))); 17990ff9d99SŁukasz Kosmaty modules.push(optionalRequire(() => require('./tests/BarCodeScanner'))); 18090ff9d99SŁukasz Kosmaty } 181*22d1e005SBartosz Kaszubowski return modules 182*22d1e005SBartosz Kaszubowski .filter(Boolean) 183*22d1e005SBartosz Kaszubowski .sort((a, b) => (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1)); 18490ff9d99SŁukasz Kosmaty} 185