Use a full-width primary banner with centered text, auto-hide after 2.2 seconds, and tests for timer reset behavior. Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
2.0 KiB
Swift
61 lines
2.0 KiB
Swift
//
|
||
// ToastCenterTests.swift
|
||
// suixinkanTests
|
||
//
|
||
// Created by Codex on 2026/6/23.
|
||
//
|
||
|
||
import XCTest
|
||
@testable import suixinkan
|
||
|
||
@MainActor
|
||
/// 全局 Toast 状态中心测试,覆盖自动隐藏和连续展示行为。
|
||
final class ToastCenterTests: XCTestCase {
|
||
/// 测试 show 会立即写入当前 Toast 文案。
|
||
func testShowStoresMessage() {
|
||
let center = ToastCenter(autoDismissNanoseconds: 100_000_000)
|
||
|
||
center.show("保存成功")
|
||
|
||
XCTAssertEqual(center.snapshotForTests, ToastSnapshot(message: "保存成功"))
|
||
}
|
||
|
||
/// 测试 Toast 到达自动隐藏时间后会清空文案。
|
||
func testToastAutoDismissesAfterDelay() async throws {
|
||
let center = ToastCenter(autoDismissNanoseconds: 60_000_000)
|
||
|
||
center.show("保存成功")
|
||
try await Task.sleep(nanoseconds: 90_000_000)
|
||
|
||
XCTAssertEqual(center.snapshotForTests, ToastSnapshot(message: nil))
|
||
}
|
||
|
||
/// 测试连续 show 会覆盖旧文案,并重新计算自动隐藏时间。
|
||
func testRepeatedShowResetsAutoDismissTimer() async throws {
|
||
let center = ToastCenter(autoDismissNanoseconds: 100_000_000)
|
||
|
||
center.show("第一条")
|
||
try await Task.sleep(nanoseconds: 70_000_000)
|
||
center.show("第二条")
|
||
try await Task.sleep(nanoseconds: 60_000_000)
|
||
|
||
XCTAssertEqual(center.snapshotForTests, ToastSnapshot(message: "第二条"))
|
||
|
||
try await Task.sleep(nanoseconds: 70_000_000)
|
||
XCTAssertEqual(center.snapshotForTests, ToastSnapshot(message: nil))
|
||
}
|
||
|
||
/// 测试手动 dismiss 会立即清空文案,并取消当前自动隐藏任务。
|
||
func testDismissClearsMessageImmediately() async throws {
|
||
let center = ToastCenter(autoDismissNanoseconds: 100_000_000)
|
||
|
||
center.show("保存成功")
|
||
center.dismiss()
|
||
|
||
XCTAssertEqual(center.snapshotForTests, ToastSnapshot(message: nil))
|
||
|
||
try await Task.sleep(nanoseconds: 130_000_000)
|
||
XCTAssertEqual(center.snapshotForTests, ToastSnapshot(message: nil))
|
||
}
|
||
}
|