ssap_app/node_modules/expo-dev-menu/ios/UITests/DevMenuUIMatchers.swift

107 lines
2.7 KiB
Swift

import XCTest
import UIKit
class DevMenuViews {
static let mainScreen = "DevMenuMainScreen"
static let footer = "DevMenuFooter"
static let settingsScreen = "DevMenuSettingsScreen"
static let profileScreen = "DevMenuProfileScreen"
}
class DevMenuUIMatchers {
static func currentRootView() -> UIView? {
return UIApplication.shared.keyWindow?.rootViewController?.view
}
static func findView(rootView: UIView, _ matcher: (UIView) -> Bool) -> UIView? {
if matcher(rootView) {
return rootView
}
for subView in rootView.subviews {
let found = findView(rootView: subView, matcher)
if found != nil {
return found
}
}
return nil
}
static func findView(_ matcher: (UIView) -> Bool) -> UIView? {
guard let view = DevMenuUIMatchers.currentRootView() else {
return nil
}
return findView(rootView: view, matcher)
}
static func findView(rootView: UIView, tag: String) -> UIView? {
return DevMenuUIMatchers.findView(rootView: rootView) {
return $0.accessibilityIdentifier == tag && $0.isVisible()
}
}
static func findView(tag: String) -> UIView? {
guard let view = DevMenuUIMatchers.currentRootView() else {
return nil
}
return findView(rootView: view, tag: tag)
}
static func waitForView(_ matcher: (UIView) -> Bool) -> UIView {
let timer = Date(timeIntervalSinceNow: DevMenuTestOptions.defaultTimeout)
while timer.timeIntervalSinceNow > 0 {
DevMenuLooper.runMainLoop(for: DevMenuTestOptions.loopTime)
guard let view = DevMenuUIMatchers.currentRootView() else {
continue
}
let found = findView(rootView: view, matcher)
if found != nil {
return found!
}
}
XCTFail("Can not find view.")
return UIView() // just for compiler
}
static func waitForView(tag: String) -> UIView {
return waitForView {
return $0.accessibilityIdentifier == tag && $0.isVisible()
}
}
static func waitForView(text: String) -> UIView {
return waitForView {
if type(of: $0) == NSClassFromString("RCTTextView")! {
return $0.isVisible() && ($0.value(forKey: "_textStorage") as! NSTextStorage).string == text
}
return false
}
}
static func findView(rootView: UIView, text: String) -> UIView? {
findView(rootView: rootView) {
if type(of: $0) == NSClassFromString("RCTTextView")! {
return $0.isVisible() && ($0.value(forKey: "_textStorage") as! NSTextStorage).string == text
}
return false
}
}
static func findView(text: String) -> UIView? {
guard let view = DevMenuUIMatchers.currentRootView() else {
return nil
}
return findView(rootView: view, text: text)
}
}