mirror of
https://github.com/shadowsocks/ShadowsocksX-NG.git
synced 2026-11-14 10:13:54 +00:00
主窗口服务器分区(D11,issue #32):NavigationSplitView 分组树(订阅子树 只读、仅启用开关;行内 checkbox;右键激活/启停/重命名/新建分组/移动/删除, 非空手动组二次确认;拖拽移动,跨来源拒绝;空组保留可编辑)、服务器详情 表单(插件区只读展示「本版本未提供」状态)、分组详情。添加三入口(剪贴板 ss://、导入 URL、二维码图片识别:文件选择 + 拖图入窗)共用批量导入落点, 每次新建身份不去重;分享区二维码弹窗 + 复制 ss://。SsUri 按 SIP002 编解码 (含 legacy base64 兼容、SIP022 明文 userinfo、IPv6、插件 name;opts 逐字节 同构),二维码走 CoreImage 生成 + Vision 识别。目录提交后接 postCommit 钩 子,代理运行时立即重展开(#27 catalogDidCommit)。
26 lines
958 B
Swift
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)))
|
|
}
|
|
}
|