ios-projects/AIStudyApp/AIStudyAppTests/FileCacheTests.swift
WangDL 7066200b7b feat: MVVM 架构、全套 UI 页面、浅深色主题、本地持久化、等待名单、AI 动效
- 架构层:ViewModel/ObservableObject、Service/Repository、网络层 APIClient/APIEndpoint/APIError
- 设计系统:Color(light:dark:) 自适应 28 色 Token、ColorSchemeManager 深浅色切换
- 全页面:AI 对话/反馈/回忆/薄弱点、知识库 CRUD、学习工作台、复习计划、学习分析、个人中心/设置
- 登录与引导:Sign in with Apple、AppSession 状态管理、引导流程、演示模式
- 本地持久化:FileCache + PersistenceController(学习任务/复习任务/学习记录)
- 本地化:zh-Hans Localizable.strings ~120 条、ZXStrings 程序化引用、LanguageManager
- 组件库:ZXTabBar/ZXBackHeader/ZXSTaskRow/ZXChartView/ZXTypingIndicator 等 22 个共享组件
- 等待名单:WaitlistView 邮箱收集表单
- 动效:ZXTypingIndicator AI 打字动画、ZXShimmerModifier 骨架屏
- 测试:StudyHomeViewModel/AIChatViewModel/ReviewPlanViewModel/FileCache 共 28 条
- Dynamic Type 支持 + 范围限制

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 22:22:50 +08:00

45 lines
1.3 KiB
Swift

import XCTest
@testable import AIStudyApp
final class FileCacheTests: XCTestCase {
var cache: FileCache!
override func setUp() {
super.setUp()
cache = FileCache(suite: "test_cache_\(UUID().uuidString)")
}
override func tearDown() {
try? cache.clear()
cache = nil
super.tearDown()
}
func testSaveAndLoad_roundTrip() throws {
let items = ["a", "b", "c"]
try cache.save(items, forKey: "test")
let loaded: [String]? = try cache.load([String].self, forKey: "test")
XCTAssertEqual(loaded, items)
}
func testLoad_missingKeyReturnsNil() throws {
let result: [String]? = try cache.load([String].self, forKey: "never_saved")
XCTAssertNil(result)
}
func testRemove_clearsKey() throws {
try cache.save([1, 2, 3], forKey: "numbers")
try cache.remove(forKey: "numbers")
let result: [Int]? = try cache.load([Int].self, forKey: "numbers")
XCTAssertNil(result)
}
func testSave_overwritesExistingKey() throws {
try cache.save([1], forKey: "key")
try cache.save([1, 2, 3], forKey: "key")
let loaded: [Int]? = try cache.load([Int].self, forKey: "key")
XCTAssertEqual(loaded, [1, 2, 3])
}
}