Revamp the UI test snapshot naming convention to make them easier to organize and find.
This commit is contained in:
committed by
Stefan Ceriu
parent
d05d506f80
commit
65bf02b70d
@@ -35,85 +35,85 @@ class AppLockSetupUITests: XCTestCase {
|
||||
try await Task.sleep(for: .seconds(0.5))
|
||||
|
||||
// Create PIN screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.createPIN, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.createPIN)
|
||||
|
||||
enterPIN()
|
||||
|
||||
// Confirm PIN screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.confirmPIN)
|
||||
try await app.assertScreenshot(step: Step.confirmPIN)
|
||||
|
||||
enterPIN()
|
||||
|
||||
// Setup biometrics screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.setupBiometrics)
|
||||
try await app.assertScreenshot(step: Step.setupBiometrics)
|
||||
|
||||
app.buttons[A11yIdentifiers.appLockSetupBiometricsScreen.allow].tap()
|
||||
|
||||
// Settings screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.settings)
|
||||
try await app.assertScreenshot(step: Step.settings)
|
||||
|
||||
app.buttons[A11yIdentifiers.appLockSetupSettingsScreen.changePIN].tap()
|
||||
|
||||
// Change PIN (create).
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.changePIN)
|
||||
try await app.assertScreenshot(step: Step.changePIN)
|
||||
|
||||
enterDifferentPIN()
|
||||
|
||||
// Change PIN (confirm).
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.confirmChangePIN)
|
||||
try await app.assertScreenshot(step: Step.confirmChangePIN)
|
||||
|
||||
enterDifferentPIN()
|
||||
|
||||
// Settings screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.settings)
|
||||
try await app.assertScreenshot(step: Step.settings)
|
||||
|
||||
app.buttons[A11yIdentifiers.appLockSetupSettingsScreen.removePIN].tap()
|
||||
app.alerts.element.buttons[A11yIdentifiers.alertInfo.primaryButton].tap()
|
||||
|
||||
// Pop the stack returning to whatever was last presented.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.clearedStack)
|
||||
try await app.assertScreenshot(step: Step.clearedStack)
|
||||
}
|
||||
|
||||
func testMandatoryCreateFlow() async throws {
|
||||
app = Application.launch(.appLockSetupFlowMandatory)
|
||||
|
||||
// Create PIN screen (non-modal and no cancellation button).
|
||||
try await app.assertScreenshot(.appLockSetupFlowMandatory, step: Step.createPIN)
|
||||
try await app.assertScreenshot(step: Step.createPIN)
|
||||
|
||||
enterPIN()
|
||||
|
||||
// Confirm PIN screen (non-modal and no cancellation button).
|
||||
try await app.assertScreenshot(.appLockSetupFlowMandatory, step: Step.confirmPIN)
|
||||
try await app.assertScreenshot(step: Step.confirmPIN)
|
||||
|
||||
enterPIN()
|
||||
|
||||
// Setup biometrics screen (non-modal).
|
||||
try await app.assertScreenshot(.appLockSetupFlowMandatory, step: Step.setupBiometrics)
|
||||
try await app.assertScreenshot(step: Step.setupBiometrics)
|
||||
|
||||
let allowButton = app.buttons[A11yIdentifiers.appLockSetupBiometricsScreen.allow]
|
||||
XCTAssertTrue(allowButton.exists, "The biometrics screen should be shown.")
|
||||
allowButton.tap()
|
||||
|
||||
// The stack should remain on biometrics for the presenting flow to take over navigation.
|
||||
try await app.assertScreenshot(.appLockSetupFlowMandatory, step: Step.setupBiometrics)
|
||||
try await app.assertScreenshot(step: Step.setupBiometrics)
|
||||
}
|
||||
|
||||
func testUnlockFlow() async throws {
|
||||
app = Application.launch(.appLockSetupFlowUnlock)
|
||||
|
||||
// Create PIN screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlowUnlock)
|
||||
try await app.assertScreenshot()
|
||||
|
||||
enterPIN()
|
||||
|
||||
// Settings screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.settings, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.settings)
|
||||
|
||||
app.buttons[A11yIdentifiers.appLockSetupSettingsScreen.removePIN].tap()
|
||||
app.alerts.element.buttons[A11yIdentifiers.alertInfo.primaryButton].tap()
|
||||
|
||||
// Pop the stack returning to whatever was last presented.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.clearedStack)
|
||||
try await app.assertScreenshot(step: Step.clearedStack)
|
||||
}
|
||||
|
||||
func testCancel() async throws {
|
||||
@@ -122,12 +122,12 @@ class AppLockSetupUITests: XCTestCase {
|
||||
app.showKeyboardIfNeeded() // The secure text field is focussed automatically
|
||||
|
||||
// Create PIN screen.
|
||||
try await app.assertScreenshot(.appLockSetupFlowUnlock)
|
||||
try await app.assertScreenshot()
|
||||
|
||||
app.buttons[A11yIdentifiers.appLockSetupPINScreen.cancel].tap()
|
||||
|
||||
// Return to whatever was last presented.
|
||||
try await app.assertScreenshot(.appLockSetupFlow, step: Step.clearedStack)
|
||||
try await app.assertScreenshot(step: Step.clearedStack)
|
||||
}
|
||||
|
||||
// MARK: - Helpers
|
||||
@@ -27,13 +27,13 @@ class AppLockUITests: XCTestCase {
|
||||
await client.waitForApp()
|
||||
|
||||
// Blank form representing an unlocked app.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked)
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
|
||||
// When backgrounding the app.
|
||||
try client.send(.notification(name: UIApplication.didEnterBackgroundNotification))
|
||||
|
||||
// Then the placeholder screen should obscure the content.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.placeholder)
|
||||
try await app.assertScreenshot(step: Step.placeholder)
|
||||
|
||||
// When foregrounding the app.
|
||||
try client.send(.notification(name: UIApplication.willEnterForegroundNotification))
|
||||
@@ -41,13 +41,13 @@ class AppLockUITests: XCTestCase {
|
||||
try client.send(.notification(name: UIApplication.didBecomeActiveNotification))
|
||||
|
||||
// Then the Lock Screen should be shown to enter a PIN.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.lockScreen)
|
||||
try await app.assertScreenshot(step: Step.lockScreen)
|
||||
|
||||
// When entering a PIN
|
||||
enterPIN()
|
||||
|
||||
// Then the app should be unlocked again.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked)
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
}
|
||||
|
||||
func testFlowDisabled() async throws {
|
||||
@@ -57,13 +57,13 @@ class AppLockUITests: XCTestCase {
|
||||
await client.waitForApp()
|
||||
|
||||
// Blank form representing an unlocked app.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
|
||||
// When backgrounding the app.
|
||||
try client.send(.notification(name: UIApplication.didEnterBackgroundNotification))
|
||||
|
||||
// Then the app should remain unlocked.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
|
||||
// When foregrounding the app.
|
||||
try client.send(.notification(name: UIApplication.willEnterForegroundNotification))
|
||||
@@ -71,7 +71,7 @@ class AppLockUITests: XCTestCase {
|
||||
try client.send(.notification(name: UIApplication.didBecomeActiveNotification))
|
||||
|
||||
// Then the app should still remain unlocked.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
}
|
||||
|
||||
func testWrongPIN() async throws {
|
||||
@@ -80,7 +80,7 @@ class AppLockUITests: XCTestCase {
|
||||
app = Application.launch(.appLockFlow)
|
||||
await client.waitForApp()
|
||||
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
try client.send(.notification(name: UIApplication.didEnterBackgroundNotification))
|
||||
try await Task.sleep(for: .milliseconds(500)) // Don't overwrite the previous signal immediately.
|
||||
|
||||
@@ -88,22 +88,22 @@ class AppLockUITests: XCTestCase {
|
||||
try? await Task.sleep(for: .milliseconds(100))
|
||||
try client.send(.notification(name: UIApplication.didBecomeActiveNotification))
|
||||
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.lockScreen, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.lockScreen)
|
||||
|
||||
// When entering an incorrect PIN
|
||||
enterWrongPIN()
|
||||
|
||||
// Then the app should remain locked with a warning.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.failedUnlock, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.failedUnlock)
|
||||
|
||||
// When entering it incorrectly twice more.
|
||||
enterWrongPIN()
|
||||
enterWrongPIN()
|
||||
|
||||
// Then then the app should sign the user out.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.logoutAlert, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.logoutAlert)
|
||||
app.alerts.element.buttons[A11yIdentifiers.alertInfo.primaryButton].tap()
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.forcedLogout, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.forcedLogout)
|
||||
}
|
||||
|
||||
func testResignActive() async throws {
|
||||
@@ -113,13 +113,13 @@ class AppLockUITests: XCTestCase {
|
||||
await client.waitForApp()
|
||||
|
||||
// Blank form representing an unlocked app.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked)
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
|
||||
// When the app resigns active but doesn't enter the background.
|
||||
try client.send(.notification(name: UIApplication.willResignActiveNotification))
|
||||
|
||||
// Then the placeholder screen should obscure the content.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.placeholder)
|
||||
try await app.assertScreenshot(step: Step.placeholder)
|
||||
|
||||
// When the app becomes active again.
|
||||
try client.send(.notification(name: UIApplication.willEnterForegroundNotification))
|
||||
@@ -127,7 +127,7 @@ class AppLockUITests: XCTestCase {
|
||||
try client.send(.notification(name: UIApplication.didBecomeActiveNotification))
|
||||
|
||||
// Then the app should not have become unlock.
|
||||
try await app.assertScreenshot(.appLockFlow, step: Step.unlocked)
|
||||
try await app.assertScreenshot(step: Step.unlocked)
|
||||
}
|
||||
|
||||
// MARK: - Helpers
|
||||
@@ -57,35 +57,32 @@ extension XCUIApplication {
|
||||
static var recordMode: SnapshotTestingConfiguration.Record = .missing
|
||||
|
||||
/// Assert screenshot for a screen with the given identifier. Does not fail if a screenshot is newly created.
|
||||
/// - Parameter identifier: Identifier of the UI test screen
|
||||
/// - Parameter step: An optional integer that can be used to take multiple snapshots per test identifier.
|
||||
/// - Parameter insets: Optional insets with which to crop the image by.
|
||||
/// - Parameter testName: The current test name, first part of the resulting snapshot filename.
|
||||
/// - Parameter step: An optional integer that can be used to take multiple snapshots per test identifier
|
||||
/// - Parameter delay: How much to wait before taking the snapshot
|
||||
@MainActor
|
||||
func assertScreenshot(_ identifier: UITestsScreenIdentifier, step: Int? = nil, insets: UIEdgeInsets? = nil, delay: Duration = .seconds(1), precision: Float = 0.99) async throws {
|
||||
var snapshotName = identifier.rawValue
|
||||
if let step {
|
||||
snapshotName += "-\(step)"
|
||||
}
|
||||
|
||||
snapshotName += "-\(deviceName)-\(localeCode)"
|
||||
|
||||
func assertScreenshot(fileName: String = #file, testName: String = #function, step: Int? = nil, delay: Duration = .seconds(0.5)) async throws {
|
||||
// Sometimes the CI might be too slow to load the content so let's wait the delay time
|
||||
try await Task.sleep(for: delay)
|
||||
|
||||
var snapshot = screenshot().image
|
||||
let snapshot = screenshot().image
|
||||
|
||||
if let insets {
|
||||
snapshot = snapshot.inset(by: insets)
|
||||
var sanitizedSuiteName = String(fileName.prefix(fileName.count - "Tests.swift".count))
|
||||
sanitizedSuiteName = (sanitizedSuiteName as NSString).lastPathComponent
|
||||
sanitizedSuiteName = sanitizedSuiteName.prefix(1).lowercased() + sanitizedSuiteName.dropFirst()
|
||||
|
||||
var testName = "\(testName.dropLast(2))-\(deviceName)-\(localeCode)"
|
||||
if let step {
|
||||
testName += "-\(step)"
|
||||
}
|
||||
|
||||
|
||||
let failure = withSnapshotTesting(record: Self.recordMode) {
|
||||
verifySnapshot(of: snapshot,
|
||||
as: .image(precision: precision,
|
||||
as: .image(precision: 0.99,
|
||||
perceptualPrecision: 0.98,
|
||||
scale: nil),
|
||||
// use any kind of suffix here to snapshot the same file multiple times and avoid countering on the library side
|
||||
named: "UI",
|
||||
testName: snapshotName)
|
||||
named: testName,
|
||||
testName: sanitizedSuiteName)
|
||||
}
|
||||
|
||||
if let failure {
|
||||
|
||||
@@ -27,7 +27,7 @@ class AuthenticationFlowCoordinatorUITests: XCTestCase {
|
||||
app.textFields[A11yIdentifiers.loginScreen.emailUsername].clearAndTypeText("alice\n", app: app)
|
||||
app.secureTextFields[A11yIdentifiers.loginScreen.password].clearAndTypeText("12345678", app: app)
|
||||
|
||||
try await app.assertScreenshot(.authenticationFlow)
|
||||
try await app.assertScreenshot()
|
||||
|
||||
// Login Screen: Tap next
|
||||
app.buttons[A11yIdentifiers.loginScreen.continue].tap()
|
||||
@@ -77,7 +77,7 @@ class AuthenticationFlowCoordinatorUITests: XCTestCase {
|
||||
app.textFields[A11yIdentifiers.loginScreen.emailUsername].clearAndTypeText("@test:server.net\n", app: app)
|
||||
|
||||
// Then the screen should not allow login to continue.
|
||||
try await app.assertScreenshot(.authenticationFlow, step: 1)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSelectingOIDCServer() {
|
||||
@@ -13,7 +13,7 @@ class BugReportUITests: XCTestCase {
|
||||
let app = Application.launch(.bugReport)
|
||||
|
||||
// Initial state without a screenshot attached.
|
||||
try await app.assertScreenshot(.bugReport, step: 0)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testReportText() async throws {
|
||||
@@ -23,13 +23,13 @@ class BugReportUITests: XCTestCase {
|
||||
app.textFields[A11yIdentifiers.bugReportScreen.report].clearAndTypeText("Text", app: app)
|
||||
XCTAssert(app.switches[A11yIdentifiers.bugReportScreen.sendLogs].isOn)
|
||||
XCTAssert(!app.switches[A11yIdentifiers.bugReportScreen.canContact].isOn)
|
||||
try await app.assertScreenshot(.bugReport, step: 2)
|
||||
try await app.assertScreenshot()
|
||||
|
||||
// Type more than 4 characters and send the button should become enabled.
|
||||
app.textFields[A11yIdentifiers.bugReportScreen.report].clearAndTypeText("Longer text", app: app)
|
||||
XCTAssert(app.switches[A11yIdentifiers.bugReportScreen.sendLogs].isOn)
|
||||
XCTAssert(!app.switches[A11yIdentifiers.bugReportScreen.canContact].isOn)
|
||||
try await app.assertScreenshot(.bugReport, step: 3)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,12 +11,12 @@ import XCTest
|
||||
class CreateRoomScreenUITests: XCTestCase {
|
||||
func testLanding() async throws {
|
||||
let app = Application.launch(.createRoom)
|
||||
try await app.assertScreenshot(.createRoom)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testLandingWithoutUsers() async throws {
|
||||
let app = Application.launch(.createRoomNoUsers)
|
||||
try await app.assertScreenshot(.createRoomNoUsers)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testLongInputNameText() async throws {
|
||||
@@ -27,6 +27,6 @@ class CreateRoomScreenUITests: XCTestCase {
|
||||
app.textFields[A11yIdentifiers.createRoomScreen.roomName].tap()
|
||||
app.textFields[A11yIdentifiers.createRoomScreen.roomName].typeText(.init(repeating: "x", count: 200))
|
||||
app.textFields[A11yIdentifiers.createRoomScreen.roomName].typeText("\n")
|
||||
try await app.assertScreenshot(.createRoom, step: 1)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ class EncryptionResetUITests: XCTestCase {
|
||||
app = Application.launch(.encryptionReset)
|
||||
|
||||
// Starting with the root screen.
|
||||
try await app.assertScreenshot(.encryptionReset, step: Step.resetScreen)
|
||||
try await app.assertScreenshot(step: Step.resetScreen)
|
||||
|
||||
// Confirm the intent to reset.
|
||||
app.buttons[A11yIdentifiers.encryptionResetScreen.continueReset].tap()
|
||||
@@ -29,12 +29,12 @@ class EncryptionResetUITests: XCTestCase {
|
||||
|
||||
try await Task.sleep(for: .seconds(2.0))
|
||||
|
||||
try await app.assertScreenshot(.encryptionReset, step: Step.passwordScreen)
|
||||
try await app.assertScreenshot(step: Step.passwordScreen)
|
||||
|
||||
// Enter the password and submit.
|
||||
let passwordField = app.secureTextFields[A11yIdentifiers.encryptionResetPasswordScreen.passwordField]
|
||||
passwordField.clearAndTypeText("supersecurepassword", app: app)
|
||||
app.buttons[A11yIdentifiers.encryptionResetPasswordScreen.submit].tap()
|
||||
try await app.assertScreenshot(.encryptionReset, step: Step.resetingEncryption, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: Step.resetingEncryption)
|
||||
}
|
||||
}
|
||||
@@ -26,55 +26,55 @@ class EncryptionSettingsUITests: XCTestCase {
|
||||
app = Application.launch(.encryptionSettings)
|
||||
|
||||
// Starting with key storage and recovery enabled.
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.secureBackupScreenSetUp)
|
||||
try await app.assertScreenshot(step: Step.secureBackupScreenSetUp)
|
||||
|
||||
// Toggle key storage off.
|
||||
app.switches[A11yIdentifiers.secureBackupScreen.keyStorage].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.keyBackupScreen)
|
||||
try await app.assertScreenshot(step: Step.keyBackupScreen)
|
||||
|
||||
// Confirm deletion of keys.
|
||||
app.buttons[A11yIdentifiers.secureBackupKeyBackupScreen.deleteKeyStorage].tap()
|
||||
app.buttons[A11yIdentifiers.alertInfo.primaryButton].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.secureBackupScreenDisabled)
|
||||
try await app.assertScreenshot(step: Step.secureBackupScreenDisabled)
|
||||
|
||||
// Toggle key storage back on and set up recovery.
|
||||
app.switches[A11yIdentifiers.secureBackupScreen.keyStorage].tap()
|
||||
app.buttons[A11yIdentifiers.secureBackupScreen.recoveryKey].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.setUpRecovery)
|
||||
try await app.assertScreenshot(step: Step.setUpRecovery)
|
||||
|
||||
// Generate and copy a new recovery key.
|
||||
app.buttons[A11yIdentifiers.secureBackupRecoveryKeyScreen.generateRecoveryKey].tap()
|
||||
app.buttons[A11yIdentifiers.secureBackupRecoveryKeyScreen.copyRecoveryKey].tap()
|
||||
app.buttons[A11yIdentifiers.secureBackupRecoveryKeyScreen.done].tap()
|
||||
app.buttons[A11yIdentifiers.alertInfo.primaryButton].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.secureBackupScreenSetUp)
|
||||
try await app.assertScreenshot(step: Step.secureBackupScreenSetUp)
|
||||
|
||||
// Change the recovery key.
|
||||
app.buttons[A11yIdentifiers.secureBackupScreen.recoveryKey].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.changeRecovery)
|
||||
try await app.assertScreenshot(step: Step.changeRecovery)
|
||||
|
||||
// Generate and copy the updated recovery key.
|
||||
app.buttons[A11yIdentifiers.secureBackupRecoveryKeyScreen.generateRecoveryKey].tap()
|
||||
app.buttons[A11yIdentifiers.secureBackupRecoveryKeyScreen.copyRecoveryKey].tap()
|
||||
app.buttons[A11yIdentifiers.secureBackupRecoveryKeyScreen.done].tap()
|
||||
app.buttons[A11yIdentifiers.alertInfo.primaryButton].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.secureBackupScreenSetUp)
|
||||
try await app.assertScreenshot(step: Step.secureBackupScreenSetUp)
|
||||
}
|
||||
|
||||
func testOutOfSyncFlow() async throws {
|
||||
app = Application.launch(.encryptionSettingsOutOfSync)
|
||||
|
||||
// Starting with key storage and recovery enabled.
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.secureBackupScreenOutOfSync)
|
||||
try await app.assertScreenshot(step: Step.secureBackupScreenOutOfSync)
|
||||
|
||||
// Confirm the recovery key.
|
||||
app.buttons[A11yIdentifiers.secureBackupScreen.recoveryKey].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.confirmRecovery)
|
||||
try await app.assertScreenshot(step: Step.confirmRecovery)
|
||||
|
||||
// Enter the recovery key and submit.
|
||||
let recoveryKeyField = app.secureTextFields[A11yIdentifiers.secureBackupRecoveryKeyScreen.recoveryKeyField]
|
||||
recoveryKeyField.clearAndTypeText("sUpe RSec rEtR Ecov ERYk Ey12", app: app)
|
||||
app.buttons[A11yIdentifiers.secureBackupRecoveryKeyScreen.confirm].tap()
|
||||
try await app.assertScreenshot(.encryptionSettings, step: Step.secureBackupScreenSetUp)
|
||||
try await app.assertScreenshot(step: Step.secureBackupScreenSetUp)
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ import XCTest
|
||||
class PollFormScreenUITests: XCTestCase {
|
||||
func testEmptyScreen() async throws {
|
||||
let app = Application.launch(.createPoll)
|
||||
try await app.assertScreenshot(.createPoll)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testFilledPoll() async throws {
|
||||
@@ -34,7 +34,7 @@ class PollFormScreenUITests: XCTestCase {
|
||||
let createButton = app.buttons[A11yIdentifiers.pollFormScreen.submit]
|
||||
XCTAssertTrue(createButton.isEnabled)
|
||||
|
||||
try await app.assertScreenshot(.createPoll, step: 1, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testMaxOptions() async throws {
|
||||
@@ -57,6 +57,6 @@ class PollFormScreenUITests: XCTestCase {
|
||||
XCTAssertFalse(addOption.exists)
|
||||
XCTAssertFalse(createButton.isEnabled)
|
||||
|
||||
try await app.assertScreenshot(.createPoll, step: 2, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ class RoomMembersListScreenUITests: XCTestCase {
|
||||
func testJoinedAndInvitedMembers() async throws {
|
||||
let app = Application.launch(.roomMembersListScreenPendingInvites)
|
||||
|
||||
try await app.assertScreenshot(.roomMembersListScreenPendingInvites)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSearchInvitedMember() async throws {
|
||||
@@ -21,7 +21,7 @@ class RoomMembersListScreenUITests: XCTestCase {
|
||||
let searchBar = app.searchFields.firstMatch
|
||||
searchBar.clearAndTypeText("alice\n", app: app)
|
||||
|
||||
try await app.assertScreenshot(.roomMembersListScreenPendingInvites, step: 1, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSearchJoinedMember() async throws {
|
||||
@@ -30,6 +30,6 @@ class RoomMembersListScreenUITests: XCTestCase {
|
||||
let searchBar = app.searchFields.firstMatch
|
||||
searchBar.clearAndTypeText("bob\n", app: app)
|
||||
|
||||
try await app.assertScreenshot(.roomMembersListScreenPendingInvites, step: 2, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
}
|
||||
@@ -23,25 +23,25 @@ class RoomRolesAndPermissionsUITests: XCTestCase {
|
||||
func testFlow() async throws {
|
||||
app = Application.launch(.roomRolesAndPermissionsFlow)
|
||||
|
||||
try await app.assertScreenshot(.roomRolesAndPermissionsFlow, step: Step.rolesAndPermissions)
|
||||
try await app.assertScreenshot(step: Step.rolesAndPermissions)
|
||||
|
||||
app.buttons[A11yIdentifiers.roomRolesAndPermissionsScreen.administrators].tap()
|
||||
try await app.assertScreenshot(.roomRolesAndPermissionsFlow, step: Step.administratorsRole)
|
||||
try await app.assertScreenshot(step: Step.administratorsRole)
|
||||
app.navigationBars.buttons.element(boundBy: 0).tap()
|
||||
|
||||
app.buttons[A11yIdentifiers.roomRolesAndPermissionsScreen.moderators].tap()
|
||||
try await app.assertScreenshot(.roomRolesAndPermissionsFlow, step: Step.moderatorsRole)
|
||||
try await app.assertScreenshot(step: Step.moderatorsRole)
|
||||
app.navigationBars.buttons.element(boundBy: 0).tap()
|
||||
|
||||
app.buttons[A11yIdentifiers.roomRolesAndPermissionsScreen.roomDetails].tap()
|
||||
try await app.assertScreenshot(.roomRolesAndPermissionsFlow, step: Step.roomDetailsPermissions)
|
||||
try await app.assertScreenshot(step: Step.roomDetailsPermissions)
|
||||
app.navigationBars.buttons.element(boundBy: 0).tap()
|
||||
|
||||
app.buttons[A11yIdentifiers.roomRolesAndPermissionsScreen.messagesAndContent].tap()
|
||||
try await app.assertScreenshot(.roomRolesAndPermissionsFlow, step: Step.messagesAndContentPermissions)
|
||||
try await app.assertScreenshot(step: Step.messagesAndContentPermissions)
|
||||
app.navigationBars.buttons.element(boundBy: 0).tap()
|
||||
|
||||
app.buttons[A11yIdentifiers.roomRolesAndPermissionsScreen.memberModeration].tap()
|
||||
try await app.assertScreenshot(.roomRolesAndPermissionsFlow, step: Step.memberModerationPermissions)
|
||||
try await app.assertScreenshot(step: Step.memberModerationPermissions)
|
||||
}
|
||||
}
|
||||
@@ -15,14 +15,14 @@ class RoomScreenUITests: XCTestCase {
|
||||
XCTAssert(app.staticTexts[A11yIdentifiers.roomScreen.name].exists)
|
||||
XCTAssert(app.staticTexts[A11yIdentifiers.roomScreen.avatar].exists)
|
||||
|
||||
try await app.assertScreenshot(.roomPlainNoAvatar, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSmallTimelineLayout() async throws {
|
||||
let app = Application.launch(.roomSmallTimeline)
|
||||
|
||||
// The messages should be bottom aligned.
|
||||
try await app.assertScreenshot(.roomSmallTimeline, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSmallTimelineWithIncomingAndPagination() async throws {
|
||||
@@ -38,7 +38,7 @@ class RoomScreenUITests: XCTestCase {
|
||||
try await performOperation(.paginate, using: client)
|
||||
|
||||
// Then the 4 visible messages should stay aligned to the bottom.
|
||||
try await app.assertScreenshot(.roomSmallTimelineIncomingAndSmallPagination, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSmallTimelineWithLargePagination() async throws {
|
||||
@@ -53,7 +53,7 @@ class RoomScreenUITests: XCTestCase {
|
||||
try await performOperation(.paginate, using: client)
|
||||
|
||||
// The bottom of the timeline should remain visible with more items added above.
|
||||
try await app.assertScreenshot(.roomSmallTimelineLargePagination, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testTimelineLayoutAtTop() async throws {
|
||||
@@ -68,13 +68,13 @@ class RoomScreenUITests: XCTestCase {
|
||||
for _ in 0...5 {
|
||||
app.swipeDown()
|
||||
}
|
||||
try await app.assertScreenshot(.roomLayoutTop, delay: .seconds(0.5)) // Assert initial state for comparison.
|
||||
try await app.assertScreenshot() // Assert initial state for comparison.
|
||||
|
||||
// When a back pagination occurs.
|
||||
try await performOperation(.paginate, using: client)
|
||||
|
||||
// Then the bottom of the timeline should remain unchanged (with new items having been added above).
|
||||
try await app.assertScreenshot(.roomLayoutTop, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testTimelineLayoutAtBottom() async throws {
|
||||
@@ -93,12 +93,12 @@ class RoomScreenUITests: XCTestCase {
|
||||
try await Task.sleep(for: .seconds(1))
|
||||
|
||||
// Then the timeline should scroll down to reveal the message.
|
||||
try await app.assertScreenshot(.roomLayoutBottom, step: 0, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: 0)
|
||||
|
||||
// When the keyboard appears for the message composer.
|
||||
try await tapMessageComposer(in: app)
|
||||
|
||||
try await app.assertScreenshot(.roomLayoutBottom, step: 1, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot(step: 1)
|
||||
}
|
||||
|
||||
func testTimelineLayoutHighlightExisting() async throws {
|
||||
@@ -113,7 +113,7 @@ class RoomScreenUITests: XCTestCase {
|
||||
try await performOperation(.focusOnEvent("$5"), using: client)
|
||||
|
||||
// Then the item should become highlighted.
|
||||
try await app.assertScreenshot(.roomLayoutHighlight, step: 0, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
|
||||
guard UIDevice.current.userInterfaceIdiom == .phone else { return }
|
||||
|
||||
@@ -123,32 +123,32 @@ class RoomScreenUITests: XCTestCase {
|
||||
try await performOperation(.focusOnEvent("$5"), using: client)
|
||||
|
||||
// Then the item should also be highlighted and scrolled to in the same state as before.
|
||||
try await app.assertScreenshot(.roomLayoutHighlight, step: 0)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testTimelineReadReceipts() async throws {
|
||||
let app = Application.launch(.roomSmallTimelineWithReadReceipts)
|
||||
|
||||
// The messages should be bottom aligned.
|
||||
try await app.assertScreenshot(.roomSmallTimelineWithReadReceipts, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testTimelineDisclosedPolls() async throws {
|
||||
let app = Application.launch(.roomWithDisclosedPolls)
|
||||
|
||||
try await app.assertScreenshot(.roomWithDisclosedPolls)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testTimelineUndisclosedPolls() async throws {
|
||||
let app = Application.launch(.roomWithUndisclosedPolls)
|
||||
|
||||
try await app.assertScreenshot(.roomWithUndisclosedPolls)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testTimelineOutgoingPolls() async throws {
|
||||
let app = Application.launch(.roomWithOutgoingPolls)
|
||||
|
||||
try await app.assertScreenshot(.roomWithOutgoingPolls)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
// MARK: - Helper Methods
|
||||
@@ -14,7 +14,7 @@ class ServerSelectionUITests: XCTestCase {
|
||||
let app = Application.launch(.serverSelection)
|
||||
|
||||
// Then it should be configured for matrix.org
|
||||
try await app.assertScreenshot(.serverSelection, step: 0)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testEmptyAddress() async throws {
|
||||
@@ -26,7 +26,7 @@ class ServerSelectionUITests: XCTestCase {
|
||||
app.textFields[A11yIdentifiers.changeServerScreen.server].buttons.element.tap()
|
||||
|
||||
// Then the screen should not allow the user to continue.
|
||||
try await app.assertScreenshot(.serverSelection, step: 1, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testInvalidAddress() async throws {
|
||||
@@ -37,7 +37,7 @@ class ServerSelectionUITests: XCTestCase {
|
||||
app.textFields[A11yIdentifiers.changeServerScreen.server].clearAndTypeText("thisisbad\n", app: app) // The tests only accept an address from LoginHomeserver.mockXYZ
|
||||
|
||||
// Then an error should be shown and the confirmation button disabled.
|
||||
try await app.assertScreenshot(.serverSelection, step: 2, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
XCTAssertFalse(app.buttons[A11yIdentifiers.changeServerScreen.continue].isEnabled, "The continue button should be disabled when there is an error.")
|
||||
}
|
||||
}
|
||||
@@ -23,61 +23,61 @@ class SessionVerificationUITests: XCTestCase {
|
||||
|
||||
func testChallengeMatches() async throws {
|
||||
let app = Application.launch(.sessionVerification)
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.initialState)
|
||||
try await app.assertScreenshot(step: Step.initialState)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.requestVerification].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.waitingForOtherDevice)
|
||||
try await app.assertScreenshot(step: Step.waitingForOtherDevice)
|
||||
|
||||
XCTAssert(app.buttons[A11yIdentifiers.sessionVerificationScreen.startSasVerification].waitForExistence(timeout: 10.0))
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.useEmojiComparisonPrompt)
|
||||
try await app.assertScreenshot(step: Step.useEmojiComparisonPrompt)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.startSasVerification].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.waitingForEmojis)
|
||||
try await app.assertScreenshot(step: Step.waitingForEmojis)
|
||||
|
||||
XCTAssert(app.buttons[A11yIdentifiers.sessionVerificationScreen.acceptChallenge].waitForExistence(timeout: 10.0))
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.compareEmojis)
|
||||
try await app.assertScreenshot(step: Step.compareEmojis)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.acceptChallenge].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.acceptingEmojis)
|
||||
try await app.assertScreenshot(step: Step.acceptingEmojis)
|
||||
|
||||
XCTAssert(app.staticTexts[A11yIdentifiers.sessionVerificationScreen.verificationComplete].waitForExistence(timeout: 10.0))
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.verificationComplete)
|
||||
try await app.assertScreenshot(step: Step.verificationComplete)
|
||||
}
|
||||
|
||||
func testChallengeDoesNotMatch() async throws {
|
||||
let app = Application.launch(.sessionVerification)
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.initialState)
|
||||
try await app.assertScreenshot(step: Step.initialState)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.requestVerification].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.waitingForOtherDevice)
|
||||
try await app.assertScreenshot(step: Step.waitingForOtherDevice)
|
||||
|
||||
XCTAssert(app.buttons[A11yIdentifiers.sessionVerificationScreen.startSasVerification].waitForExistence(timeout: 10.0))
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.useEmojiComparisonPrompt)
|
||||
try await app.assertScreenshot(step: Step.useEmojiComparisonPrompt)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.startSasVerification].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.waitingForEmojis)
|
||||
try await app.assertScreenshot(step: Step.waitingForEmojis)
|
||||
|
||||
XCTAssert(app.buttons[A11yIdentifiers.sessionVerificationScreen.acceptChallenge].waitForExistence(timeout: 10.0))
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.compareEmojis)
|
||||
try await app.assertScreenshot(step: Step.compareEmojis)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.declineChallenge].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.verificationCancelled)
|
||||
try await app.assertScreenshot(step: Step.verificationCancelled)
|
||||
}
|
||||
|
||||
func testSessionVerificationCancelation() async throws {
|
||||
let app = Application.launch(.sessionVerification)
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.initialState)
|
||||
try await app.assertScreenshot(step: Step.initialState)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.requestVerification].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.waitingForOtherDevice)
|
||||
try await app.assertScreenshot(step: Step.waitingForOtherDevice)
|
||||
|
||||
XCTAssert(app.buttons[A11yIdentifiers.sessionVerificationScreen.startSasVerification].waitForExistence(timeout: 10.0))
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.useEmojiComparisonPrompt)
|
||||
try await app.assertScreenshot(step: Step.useEmojiComparisonPrompt)
|
||||
|
||||
app.buttons[A11yIdentifiers.sessionVerificationScreen.startSasVerification].tap()
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.waitingForEmojis)
|
||||
try await app.assertScreenshot(step: Step.waitingForEmojis)
|
||||
|
||||
XCTAssert(app.buttons[A11yIdentifiers.sessionVerificationScreen.acceptChallenge].waitForExistence(timeout: 10.0))
|
||||
try await app.assertScreenshot(.sessionVerification, step: Step.compareEmojis)
|
||||
try await app.assertScreenshot(step: Step.compareEmojis)
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ import XCTest
|
||||
class StartChatScreenUITests: XCTestCase {
|
||||
func testLanding() async throws {
|
||||
let app = Application.launch(.startChat)
|
||||
try await app.assertScreenshot(.startChat)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSearchWithNoResults() async throws {
|
||||
@@ -19,7 +19,7 @@ class StartChatScreenUITests: XCTestCase {
|
||||
let searchField = app.searchFields.firstMatch
|
||||
searchField.clearAndTypeText("None\n", app: app)
|
||||
XCTAssert(app.staticTexts[A11yIdentifiers.startChatScreen.searchNoResults].waitForExistence(timeout: 1.0))
|
||||
try await app.assertScreenshot(.startChat, step: 1, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testSearchWithResults() async throws {
|
||||
@@ -28,6 +28,6 @@ class StartChatScreenUITests: XCTestCase {
|
||||
searchField.clearAndTypeText("Bob\n", app: app)
|
||||
XCTAssertFalse(app.staticTexts[A11yIdentifiers.startChatScreen.searchNoResults].waitForExistence(timeout: 1.0))
|
||||
XCTAssertEqual(app.collectionViews.firstMatch.cells.count, 2)
|
||||
try await app.assertScreenshot(.startChat, step: 2, delay: .seconds(0.5))
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
}
|
||||
@@ -16,15 +16,15 @@ class UserSessionScreenTests: XCTestCase {
|
||||
|
||||
app.swipeDown() // Make sure the header shows a large title
|
||||
|
||||
try await app.assertScreenshot(.userSessionScreen, step: 1)
|
||||
try await app.assertScreenshot(step: 1)
|
||||
|
||||
app.buttons[A11yIdentifiers.homeScreen.roomName(firstRoomName)].tap()
|
||||
XCTAssert(app.staticTexts[firstRoomName].waitForExistence(timeout: 5.0))
|
||||
try await Task.sleep(for: .seconds(1))
|
||||
try await app.assertScreenshot(.userSessionScreen, step: 2)
|
||||
try await app.assertScreenshot(step: 2)
|
||||
|
||||
app.buttons[A11yIdentifiers.roomScreen.composerToolbar.openComposeOptions].tapCenter()
|
||||
try await app.assertScreenshot(.userSessionScreen, step: 3)
|
||||
try await app.assertScreenshot(step: 3)
|
||||
}
|
||||
|
||||
func testUserSessionReply() async throws {
|
||||
@@ -36,7 +36,7 @@ class UserSessionScreenTests: XCTestCase {
|
||||
let cell = app.cells.element(boundBy: 1) // Skip the typing indicator cell
|
||||
cell.swipeRight(velocity: .fast)
|
||||
|
||||
try await app.assertScreenshot(.userSessionScreenReply)
|
||||
try await app.assertScreenshot()
|
||||
}
|
||||
|
||||
func testElementCall() async throws {
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:180743191fcf9af0de19525e3fa649e89cb24c9e5be1cd77b6da96272c71aa14
|
||||
size 66254
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f17a493508ec7c8d7a3608e1dc17a134bc20d3e891b7d386e3a989175850bf04
|
||||
size 107079
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ba85903b9410ef1799d981b18354474f265b23ada14c616402d7c777e7054bbe
|
||||
size 119199
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ff7b6a42a6a36f2f9f717bc967bfd78d758fb3ce8b4a3d16220a2211fd24f61b
|
||||
size 57129
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:67c559de04b481b370c3f02e4ad737403f393691cef4cb5ef9362a2946bc8adb
|
||||
size 1298585
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2129e9965746b2c46997831bfccfaf2ccc95d0a5a0087c14520cd33d910972c5
|
||||
size 948014
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ff7b6a42a6a36f2f9f717bc967bfd78d758fb3ce8b4a3d16220a2211fd24f61b
|
||||
size 57129
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f17a493508ec7c8d7a3608e1dc17a134bc20d3e891b7d386e3a989175850bf04
|
||||
size 107079
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:93e676ab4e92ce0e3e74053bc92a1d40f21bf838f61b65d85870f358169e1a02
|
||||
size 108229
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cb5fe2b3a34ccae29a0edca430d4309375c6afcc783c07eec045ed999476e9dd
|
||||
size 245978
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6ac4dcb7cd838276d22502d7b3bdf2c656e8ec18cfa49f58b8e360147200b8c8
|
||||
size 119260
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
|
||||
size 64833
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ba85903b9410ef1799d981b18354474f265b23ada14c616402d7c777e7054bbe
|
||||
size 119199
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9c12efc3f647aad33d2acf44902f418d2defbc03f67bf07a15ffdc2438e60dcf
|
||||
size 120307
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:10f6f648ae629a8b2b6b5f957a71a34debbfbe89327637dbddbdd76c9a79b69f
|
||||
size 387060
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f2372478a7214c51d2d8cd632a50069946fb596760edb579c8c806f07faec041
|
||||
size 134539
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ff7b6a42a6a36f2f9f717bc967bfd78d758fb3ce8b4a3d16220a2211fd24f61b
|
||||
size 57129
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6b16d8bffe575dbb20cd9ec78ef4750edcbbe75f7e9726771584b272935a1eff
|
||||
size 107103
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b32ae450f9873664aa7010f14bc5c32f764e7d8f2c8fb29c61b08342668ec820
|
||||
size 119196
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7ece1e4397aca92f8394aafdf7495ffeaaec3621bb31cc49cd5645e0b134f11f
|
||||
size 108257
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6eb0c25cd2a799a253b92f1b04b2a7b9cf7a734dc0f8b8610ad427d7b25ef48d
|
||||
size 120307
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:907d3be4bef23d70e41249c6b73006309822a8fb4a67e3b06382d2ee803392f3
|
||||
size 245970
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:991a0c6281fd3a7a280fb842b0adbcab4879a9bdbbdfba77d31dd6d751dafc49
|
||||
size 387057
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:318cf076f437c24e2a878fcc4b5db1effb6f77c6ebe8a6a21e73657ef9315a0f
|
||||
size 119247
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d38fd4080538033e0e56889cf375584b77e6045bb665f4db55362161b46f3af4
|
||||
size 134555
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
|
||||
size 64833
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:befa476bc2cf2c6b8e3e7670fa9c0a8eb672f8b91301e1bdb1e84634af41e1cb
|
||||
size 139690
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f3aa49a3e21a62edf61d697972b7d40ccf987198ea5047ecb7635d8c3932b69
|
||||
size 82727
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3ebecc8c5bf382df5bcb4750a96f93fd1de093b4dab507ee65c3e440e5b6c2ed
|
||||
size 152097
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6f8b736dc8897b992a197f3ce235ac4cc1f63f36b45bfa63561118b8714f2637
|
||||
size 151743
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ef84d325ff4f091c6e136f16416d90c3542ad358a70f08e4436ffd9946f5a999
|
||||
size 82486
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0e31ec858ed724977857addd0a65170740ae58b547afa81b56b13748b4937d3c
|
||||
size 172259
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:83f6b63c31a8b2ca26a058872291774392a01890616dcc2fd2f675077c06c89a
|
||||
size 171851
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
|
||||
size 64833
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3ba80ae09fb465a5abc014de375094527aaf931b1a69aa3f7764815e09ca064b
|
||||
size 95827
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:48fa8f1042d17890ff132fdbe07841e58fe70909ed83360a0a1ab5dbc9dbc104
|
||||
size 95522
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d7378f5adfd525aaee8a4ab42f2ed0cc98c54ca0a1c87faa9c61c5d1f824f960
|
||||
size 83655
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3648ac4fc1c98576a3516afdf280a37c00e44d0c4ee1519b849291c34660aef9
|
||||
size 56204
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:006f005339c2a986769038d2f015a2e9dc2285fb80cff0ac38eddda842a2f4c5
|
||||
size 89868
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:37a1b6e23665ab8f0363f2c572c72aed075891cc9e636197b4952579897820e8
|
||||
size 89485
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ad1a00cf2c8eb6508cf9c170a5c014d51ea69b14de9b90d9dfee0fbd47ad7e0e
|
||||
size 90752
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8cc2812541983bf300e6e62315a5401ce66ad29fc2bd05e605d4ff4c8163d6ca
|
||||
size 90433
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
|
||||
size 64833
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:befa476bc2cf2c6b8e3e7670fa9c0a8eb672f8b91301e1bdb1e84634af41e1cb
|
||||
size 139690
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3648ac4fc1c98576a3516afdf280a37c00e44d0c4ee1519b849291c34660aef9
|
||||
size 56204
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f3aa49a3e21a62edf61d697972b7d40ccf987198ea5047ecb7635d8c3932b69
|
||||
size 82727
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3a9088fb4b320bdae5714e27ce37246287314086513751e4e295258110b7ef3a
|
||||
size 152117
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7b84b3822271da60548b5377a15b691f29fe0342bdb1832ec2ca625e063f70fe
|
||||
size 95862
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3feacce0433a2c01983cece54991e07f900d4fcd1204293b7fbf086493744749
|
||||
size 151761
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:69be9ad1028840f0647dd3bdf145792af5c71016083662954800660d9f705618
|
||||
size 95557
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:45c4fe3dea366978d7f5f2b2fdec5f4adc2b77eec2d9a06909aa93e0f9bdac98
|
||||
size 172282
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ca28b102ed02b26d6136f28165d5859879a8def084c3e9312dfa6c80b63b20e8
|
||||
size 171874
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:29451cacdf506cf7fcb458bdb9dcc922bded3b655ad35a7334579d0477d92a48
|
||||
size 89891
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d385efc1e1bc3e2353a172a370e5c8d7c24016af24b657f1528b091593abc000
|
||||
size 90772
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cc04a1b65075e130ea2334746496f1547188b3e84c14608877aa6217f2a2d2d5
|
||||
size 89507
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5e28519408070f07c0812f419476c56fe440c8effd9b9e5c491092259a29292b
|
||||
size 90458
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a54d207472a94758bc5fb6c98dc99593176f6593c6ba8ae33890d8ba4b50507e
|
||||
size 139710
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:79c998e7c0d5ce6fe9eb5c4040a0a59b0a0806a2ab710173db4c4785946076d6
|
||||
size 82753
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:eca0528523edae6dfae1cb8087c1aeb12224102c26b0fa7db99a17729fb22740
|
||||
size 167101
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:58bcbecf677ba5b1ce9fc86a541e1df0389464677b882d34903be09512c65f46
|
||||
size 94767
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d4c1065c8cbd078860b9a8ab1c8579e48488794c23c6c1895c5b275c9c0ba0b6
|
||||
size 266840
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ef5e6b24ab13e84fd763387cdeeb60255d4acd37daf1b34d01c7a706139dff6f
|
||||
size 84644
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7cb6285b10fe064ea7ab09df509044ace622f9c5be87bc6fe59205a0b1f08aef
|
||||
size 87787
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:835678f4881b61cc57a2695b9e55c401bf2f95adcfdc94c1448438ec4f2fd01e
|
||||
size 84623
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:44652302192e3e5877eb731b05f710ce32663854f9eb6ba6a36ad2e0a0860b02
|
||||
size 87758
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ca45475a92f7cf7e058e9e6aec7c1b8d71d2e5ec01304fa17c64a10fc9ece387
|
||||
size 167076
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6b4b5b0b562fd610b3de3c7949ec39e28b1078ce59e54b515f256547386dcf48
|
||||
size 266822
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c9a40262e1c2588be6f35f09c6e1974fc925f9edf899be056e45ffcdf5e2ac71
|
||||
size 137444
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1bf80e63f574f22ddfe4f045c0a0a57b67ef4ababefafe4be8820ae59f35ce8e
|
||||
size 172930
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7b14d8fc973cf920445b2dbcda93908ced0bf2cd4ac4135e133a6bb6fbee7f00
|
||||
size 204746
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:27f6ae4c920ade62e2c6078d16d3f6cf6c2988f76869a413d2b92a2a6ec0d497
|
||||
size 198666
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:56860531fa683fe7be9e90a2a4c41ffc3e207b7bb1ad7d993ae5c1a3e7442fd5
|
||||
size 208800
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user