Revamp the UI test snapshot naming convention to make them easier to organize and find.

This commit is contained in:
Stefan Ceriu
2025-03-04 17:17:52 +02:00
committed by Stefan Ceriu
parent d05d506f80
commit 65bf02b70d
313 changed files with 636 additions and 520 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -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() {

View File

@@ -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()
}
}

View File

@@ -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()
}
}

View File

@@ -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)
}
}

View File

@@ -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)
}
}

View File

@@ -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()
}
}

View File

@@ -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()
}
}

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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.")
}
}

View File

@@ -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)
}
}

View File

@@ -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()
}
}

View File

@@ -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 {

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:180743191fcf9af0de19525e3fa649e89cb24c9e5be1cd77b6da96272c71aa14
size 66254

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f17a493508ec7c8d7a3608e1dc17a134bc20d3e891b7d386e3a989175850bf04
size 107079

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ba85903b9410ef1799d981b18354474f265b23ada14c616402d7c777e7054bbe
size 119199

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ff7b6a42a6a36f2f9f717bc967bfd78d758fb3ce8b4a3d16220a2211fd24f61b
size 57129

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:67c559de04b481b370c3f02e4ad737403f393691cef4cb5ef9362a2946bc8adb
size 1298585

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2129e9965746b2c46997831bfccfaf2ccc95d0a5a0087c14520cd33d910972c5
size 948014

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ff7b6a42a6a36f2f9f717bc967bfd78d758fb3ce8b4a3d16220a2211fd24f61b
size 57129

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f17a493508ec7c8d7a3608e1dc17a134bc20d3e891b7d386e3a989175850bf04
size 107079

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:93e676ab4e92ce0e3e74053bc92a1d40f21bf838f61b65d85870f358169e1a02
size 108229

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cb5fe2b3a34ccae29a0edca430d4309375c6afcc783c07eec045ed999476e9dd
size 245978

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6ac4dcb7cd838276d22502d7b3bdf2c656e8ec18cfa49f58b8e360147200b8c8
size 119260

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
size 64833

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ba85903b9410ef1799d981b18354474f265b23ada14c616402d7c777e7054bbe
size 119199

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9c12efc3f647aad33d2acf44902f418d2defbc03f67bf07a15ffdc2438e60dcf
size 120307

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:10f6f648ae629a8b2b6b5f957a71a34debbfbe89327637dbddbdd76c9a79b69f
size 387060

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f2372478a7214c51d2d8cd632a50069946fb596760edb579c8c806f07faec041
size 134539

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ff7b6a42a6a36f2f9f717bc967bfd78d758fb3ce8b4a3d16220a2211fd24f61b
size 57129

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6b16d8bffe575dbb20cd9ec78ef4750edcbbe75f7e9726771584b272935a1eff
size 107103

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b32ae450f9873664aa7010f14bc5c32f764e7d8f2c8fb29c61b08342668ec820
size 119196

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7ece1e4397aca92f8394aafdf7495ffeaaec3621bb31cc49cd5645e0b134f11f
size 108257

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6eb0c25cd2a799a253b92f1b04b2a7b9cf7a734dc0f8b8610ad427d7b25ef48d
size 120307

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:907d3be4bef23d70e41249c6b73006309822a8fb4a67e3b06382d2ee803392f3
size 245970

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:991a0c6281fd3a7a280fb842b0adbcab4879a9bdbbdfba77d31dd6d751dafc49
size 387057

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:318cf076f437c24e2a878fcc4b5db1effb6f77c6ebe8a6a21e73657ef9315a0f
size 119247

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d38fd4080538033e0e56889cf375584b77e6045bb665f4db55362161b46f3af4
size 134555

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
size 64833

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:befa476bc2cf2c6b8e3e7670fa9c0a8eb672f8b91301e1bdb1e84634af41e1cb
size 139690

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f3aa49a3e21a62edf61d697972b7d40ccf987198ea5047ecb7635d8c3932b69
size 82727

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3ebecc8c5bf382df5bcb4750a96f93fd1de093b4dab507ee65c3e440e5b6c2ed
size 152097

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6f8b736dc8897b992a197f3ce235ac4cc1f63f36b45bfa63561118b8714f2637
size 151743

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ef84d325ff4f091c6e136f16416d90c3542ad358a70f08e4436ffd9946f5a999
size 82486

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0e31ec858ed724977857addd0a65170740ae58b547afa81b56b13748b4937d3c
size 172259

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:83f6b63c31a8b2ca26a058872291774392a01890616dcc2fd2f675077c06c89a
size 171851

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
size 64833

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3ba80ae09fb465a5abc014de375094527aaf931b1a69aa3f7764815e09ca064b
size 95827

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:48fa8f1042d17890ff132fdbe07841e58fe70909ed83360a0a1ab5dbc9dbc104
size 95522

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d7378f5adfd525aaee8a4ab42f2ed0cc98c54ca0a1c87faa9c61c5d1f824f960
size 83655

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3648ac4fc1c98576a3516afdf280a37c00e44d0c4ee1519b849291c34660aef9
size 56204

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:006f005339c2a986769038d2f015a2e9dc2285fb80cff0ac38eddda842a2f4c5
size 89868

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:37a1b6e23665ab8f0363f2c572c72aed075891cc9e636197b4952579897820e8
size 89485

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ad1a00cf2c8eb6508cf9c170a5c014d51ea69b14de9b90d9dfee0fbd47ad7e0e
size 90752

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8cc2812541983bf300e6e62315a5401ce66ad29fc2bd05e605d4ff4c8163d6ca
size 90433

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1246f8b0f5a56918a8a0dc11436fc44f981eece24b8876ebce1ef9922fd93d67
size 64833

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:befa476bc2cf2c6b8e3e7670fa9c0a8eb672f8b91301e1bdb1e84634af41e1cb
size 139690

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3648ac4fc1c98576a3516afdf280a37c00e44d0c4ee1519b849291c34660aef9
size 56204

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4f3aa49a3e21a62edf61d697972b7d40ccf987198ea5047ecb7635d8c3932b69
size 82727

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3a9088fb4b320bdae5714e27ce37246287314086513751e4e295258110b7ef3a
size 152117

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7b84b3822271da60548b5377a15b691f29fe0342bdb1832ec2ca625e063f70fe
size 95862

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3feacce0433a2c01983cece54991e07f900d4fcd1204293b7fbf086493744749
size 151761

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:69be9ad1028840f0647dd3bdf145792af5c71016083662954800660d9f705618
size 95557

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:45c4fe3dea366978d7f5f2b2fdec5f4adc2b77eec2d9a06909aa93e0f9bdac98
size 172282

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ca28b102ed02b26d6136f28165d5859879a8def084c3e9312dfa6c80b63b20e8
size 171874

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:29451cacdf506cf7fcb458bdb9dcc922bded3b655ad35a7334579d0477d92a48
size 89891

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d385efc1e1bc3e2353a172a370e5c8d7c24016af24b657f1528b091593abc000
size 90772

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cc04a1b65075e130ea2334746496f1547188b3e84c14608877aa6217f2a2d2d5
size 89507

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5e28519408070f07c0812f419476c56fe440c8effd9b9e5c491092259a29292b
size 90458

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a54d207472a94758bc5fb6c98dc99593176f6593c6ba8ae33890d8ba4b50507e
size 139710

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:79c998e7c0d5ce6fe9eb5c4040a0a59b0a0806a2ab710173db4c4785946076d6
size 82753

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eca0528523edae6dfae1cb8087c1aeb12224102c26b0fa7db99a17729fb22740
size 167101

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:58bcbecf677ba5b1ce9fc86a541e1df0389464677b882d34903be09512c65f46
size 94767

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d4c1065c8cbd078860b9a8ab1c8579e48488794c23c6c1895c5b275c9c0ba0b6
size 266840

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ef5e6b24ab13e84fd763387cdeeb60255d4acd37daf1b34d01c7a706139dff6f
size 84644

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7cb6285b10fe064ea7ab09df509044ace622f9c5be87bc6fe59205a0b1f08aef
size 87787

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:835678f4881b61cc57a2695b9e55c401bf2f95adcfdc94c1448438ec4f2fd01e
size 84623

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:44652302192e3e5877eb731b05f710ce32663854f9eb6ba6a36ad2e0a0860b02
size 87758

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ca45475a92f7cf7e058e9e6aec7c1b8d71d2e5ec01304fa17c64a10fc9ece387
size 167076

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6b4b5b0b562fd610b3de3c7949ec39e28b1078ce59e54b515f256547386dcf48
size 266822

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c9a40262e1c2588be6f35f09c6e1974fc925f9edf899be056e45ffcdf5e2ac71
size 137444

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1bf80e63f574f22ddfe4f045c0a0a57b67ef4ababefafe4be8820ae59f35ce8e
size 172930

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7b14d8fc973cf920445b2dbcda93908ced0bf2cd4ac4135e133a6bb6fbee7f00
size 204746

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:27f6ae4c920ade62e2c6078d16d3f6cf6c2988f76869a413d2b92a2a6ec0d497
size 198666

View File

@@ -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