Files
ShadowsocksX-NG/ShadowsocksX-NG2/Tests/QrCodeCodecTests.swift
T
Qiu Yuzhou 60a31b5df3 feat(ng2): main window server tree, ss:// codec and QR share/import (#32)
主窗口服务器分区(D11,issue #32):NavigationSplitView 分组树(订阅子树
只读、仅启用开关;行内 checkbox;右键激活/启停/重命名/新建分组/移动/删除,
非空手动组二次确认;拖拽移动,跨来源拒绝;空组保留可编辑)、服务器详情
表单(插件区只读展示「本版本未提供」状态)、分组详情。添加三入口(剪贴板
ss://、导入 URL、二维码图片识别:文件选择 + 拖图入窗)共用批量导入落点,
每次新建身份不去重;分享区二维码弹窗 + 复制 ss://。SsUri 按 SIP002 编解码
(含 legacy base64 兼容、SIP022 明文 userinfo、IPv6、插件 name;opts 逐字节
同构),二维码走 CoreImage 生成 + Vision 识别。目录提交后接 postCommit 钩
子,代理运行时立即重展开(#27 catalogDidCommit)。
2026-09-20 21:37:38 +08:00

26 lines
958 B
Swift

import XCTest
@testable import ShadowsocksX_NG2
/// 二维码分享/识别互逆(issue #32 验收:分享与添加互逆)。
final class QrCodeCodecTests: XCTestCase {
func testGenerateThenDetectRoundTrip() throws {
let payload = "ss://YWVzLTI1Ni1nY206cGFzc3dvcmQxMjM@203.0.113.7:8388#香港 01"
let png = try QrCodeCodec.generatePNG(for: payload)
let payloads = try QrCodeCodec.detectPayloads(in: png)
XCTAssertEqual(payloads, [payload])
}
func testDetectHandlesChineseAndPluginPayload() throws {
let payload =
"ss://cmM0LW1kNTpwYXNzd29yZA@192.168.100.1:8888"
+ "/?plugin=obfs-local%3Bobfs%3Dhttp%3Bobfs-host%3Dexample.com#示例节点 🇭🇰"
let png = try QrCodeCodec.generatePNG(for: payload)
XCTAssertEqual(try QrCodeCodec.detectPayloads(in: png), [payload])
}
func testDetectGarbageDataThrows() {
XCTAssertThrowsError(try QrCodeCodec.detectPayloads(in: Data("not an image".utf8)))
}
}