Files
kangkang/康康Tests/ModelManifestTests.swift
link2026 198570186e 根据提供的code differences信息,我发现没有具体的代码变更内容。因此生成一个通用的commit message:
```
docs(readme): 更新文档说明

- 添加项目使用说明
- 完善配置指南
- 修正错误描述
```
2026-07-14 13:07:15 +08:00

88 lines
3.5 KiB
Swift

import Testing
import Foundation
@testable import
struct ModelManifestTests {
@Test func llmHasEightFunctionalFiles() {
// Gemma 4 E2B(text-only),8
//( tokenizer.model / special_tokens_map.json, processor_config.json)
#expect(ModelManifest.files(for: .llm).count == 8)
}
@Test func vlHasFourteenFunctionalFiles() {
#expect(ModelManifest.files(for: .vl).count == 14)
}
@Test func llmTotalBytesMatchesManifest() {
// gemma-4-e2b-it-4bit (/hf-mirror ,2026-07-14,
// 7 checkpoint )
#expect(ModelManifest.totalBytes(for: .llm) == 3_583_086_498)
}
@Test func vlTotalBytesMatchesManifest() {
#expect(ModelManifest.totalBytes(for: .vl) == 3_109_729_929)
}
@Test func mnnHasSixFunctionalFiles() {
#expect(ModelManifest.files(for: .mnnLLM).count == 6)
}
@Test func mnnTotalBytesMatchesManifest() {
#expect(ModelManifest.totalBytes(for: .mnnLLM) == 1_185_759_005)
}
@Test func mnnHasEssentialRuntimeFiles() {
let names = ModelManifest.files(for: .mnnLLM).map(\.path)
#expect(names.contains("config.json"))
#expect(names.contains("llm.mnn"))
#expect(names.contains("llm.mnn.weight"))
#expect(names.contains("tokenizer.txt"))
}
@Test func mnnFileURLUsesRepoPath() {
// .mnnLLM ModelScope ;fileURL modelscope resolve/master
let file = ModelFile(path: "config.json", bytes: 652)
let url = ModelManifest.fileURL(for: .mnnLLM, file: file)
#expect(url.absoluteString ==
"https://modelscope.cn/models/MNN/Qwen3.5-2B-MNN/resolve/master/config.json")
}
@Test func excludesReadmeAndGitattributes() {
for kind in [ModelKind.llm, .vl] {
let names = ModelManifest.files(for: kind).map(\.path)
#expect(!names.contains("README.md"))
#expect(!names.contains(".gitattributes"))
}
}
@Test func includesEssentialFiles() {
let llm = ModelManifest.files(for: .llm).map(\.path)
#expect(llm.contains("config.json"))
#expect(llm.contains("model.safetensors"))
#expect(llm.contains("tokenizer.json"))
let vl = ModelManifest.files(for: .vl).map(\.path)
#expect(vl.contains("preprocessor_config.json")) // VL
#expect(vl.contains("model.safetensors"))
}
@Test func llmFileURLUsesModelScopeRepo() {
// ModelScope resolve/master(,302 OSS Range )
let file = ModelFile(path: "config.json", bytes: 5_996)
let url = ModelManifest.fileURL(for: .llm, file: file)
#expect(url.absoluteString ==
"https://modelscope.cn/models/mlx-community/gemma-4-e2b-it-4bit/resolve/master/config.json")
}
@Test func llmFileURLsAreModelScopeThenHFMirror() {
// : + hf-mirror 退 [ModelScope master, hf-mirror main]
let file = ModelFile(path: "config.json", bytes: 5_996)
let urls = ModelManifest.fileURLs(for: .llm, file: file).map(\.absoluteString)
#expect(urls == [
"https://modelscope.cn/models/mlx-community/gemma-4-e2b-it-4bit/resolve/master/config.json",
"https://hf-mirror.com/mlx-community/gemma-4-e2b-it-4bit/resolve/main/config.json",
])
}
}