Der gespiegelte Ausschnitt hinter der Seitenleiste war nicht das Problem — JellyTV macht es genauso. Auffällig wurde er erst durch die Bewegung: beim seitlichen Durchblättern wanderten das echte und das gespiegelte Stück gegeneinander, und die Naht dazwischen war das auffälligste Ding auf dem Bildschirm. Jetzt rutscht das neue Bild 32 Punkte herein und blendet dabei über das alte. Nichts wandert weit genug, als dass ein Versatz auffiele. Wischen blättert weiter, nach vorn wie zurück; das nächste Bild wird geholt, solange das aktuelle noch steht, sonst blendet der Aufmacher auf eine graue Fläche über. Dazu ein Testziel, das die App mit der Attrappe in einen Zustand fährt und fotografiert. Der Grund ist ein wiederkehrender Fehler: Aussagen über das Aussehen waren Vermutungen, weil niemand hinsehen konnte — der Simulator kennt keinen Befehl fürs Antippen, und dieses Xcode bringt kein Simulator-Fenster mehr mit. Damit ist „sieht es so aus?" eine Frage, die sich beantworten lässt. Die Startargument-Anmeldung an der Attrappe steht unter #if DEBUG und führt am Schlüsselbund vorbei: kein echter Server, kein echtes Konto, kein echter Token. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
2.4 KiB
Swift
58 lines
2.4 KiB
Swift
import XCTest
|
|
|
|
/// Fährt die App in die Zustände, über die geredet wird, und legt Bilder davon ab.
|
|
///
|
|
/// Der Grund für diese Datei ist ein wiederkehrender Fehler: Aussagen über das
|
|
/// Aussehen waren Vermutungen, weil niemand hinsehen konnte. Der Simulator
|
|
/// kennt keinen Befehl fürs Antippen, und dieses Xcode bringt kein
|
|
/// Simulator-Fenster mehr mit, das sich fernsteuern ließe. Ein UI-Test kann
|
|
/// beides — tippen und fotografieren.
|
|
///
|
|
/// Die Bilder landen im Dokumentenordner des Testläufers, der vom Rechner aus
|
|
/// über `simctl get_app_container` erreichbar ist. Anhänge im Ergebnisbündel
|
|
/// wären der vorgesehene Weg, müssten aber erst wieder herausgeschält werden.
|
|
///
|
|
/// Die Inhalte kommen aus `Tools/JellyfinStub` — kein echter Server, kein
|
|
/// echtes Konto, kein echter Token.
|
|
final class LayoutSnapshots: XCTestCase {
|
|
override func setUp() {
|
|
continueAfterFailure = false
|
|
}
|
|
|
|
/// `XCUIScreen` fotografiert in der Lage des **Geräts**, nicht in der der
|
|
/// Oberfläche — im Querformat kommt das Bild dann hochkant und um
|
|
/// neunzig Grad gedreht heraus, und jedes Maß daran ist falsch herum.
|
|
/// Die App selbst fotografiert richtig herum.
|
|
private func shoot(_ app: XCUIApplication, _ name: String) {
|
|
let data = app.screenshot().pngRepresentation
|
|
let folder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
|
|
try? data.write(to: folder.appendingPathComponent("\(name).png"))
|
|
}
|
|
|
|
func testHomeAndDetail() throws {
|
|
let app = XCUIApplication()
|
|
app.launchArguments = ["-FlixyStubServer", "http://127.0.0.1:8096"]
|
|
app.launch()
|
|
|
|
XCUIDevice.shared.orientation = .landscapeLeft
|
|
|
|
// Die Startseite muss stehen, bevor fotografiert wird — sonst ist auf
|
|
// dem Bild nur der Ladekreis.
|
|
XCTAssertTrue(app.staticTexts["Weiterschauen"].waitForExistence(timeout: 20))
|
|
Thread.sleep(forTimeInterval: 3)
|
|
shoot(app, "01-start-oben")
|
|
|
|
// Der Aufmacher wechselt nach sieben Sekunden. Kurz davor anfangen
|
|
// und in Serie fotografieren: nur so ist der Übergang selbst zu sehen
|
|
// und nicht bloß sein Ergebnis.
|
|
Thread.sleep(forTimeInterval: 4.2)
|
|
for step in 0..<6 {
|
|
shoot(app, String(format: "02-wechsel-%d", step))
|
|
Thread.sleep(forTimeInterval: 0.12)
|
|
}
|
|
|
|
Thread.sleep(forTimeInterval: 2)
|
|
shoot(app, "03-danach")
|
|
}
|
|
}
|