Files
claude-code-haha/native/cu-helper/Tests/CuHelperTests/RendererAttributeReuseTests.swift
T
程序员阿江(Relakkes) 8336cd8cc9 feat(computer-use): finalize native input and global app consent
Route coordinate clicks through the exact AX hit, reuse render-local
attributes and keep keyboard macros within validated native boundaries.
Preserve lossless capture evidence while returning bounded model images,
and propagate cancellation through daemon and lock acquisition.

Remove legacy per-app restrictions after feature-wide consent on both
platforms while retaining global disablement and target validation.
Include native helpers, regression tests and a stable receiver fixture.

Validation: 224 focused TypeScript tests, 516 XCTest cases and 15 Swift
Testing cases passed. Local sidecar and Electron builds, development
package creation and package smoke checks passed.
2026-09-10 20:58:39 +08:00

51 lines
2.4 KiB
Swift

import XCTest
@testable import cc_haha_computer_use
@MainActor
final class RendererAttributeReuseTests: XCTestCase {
func testKnownFingerprintScalarsAndSuccessfulSettableAvoidBackendRepeats() {
var reads = 0
func read(_ value: String) -> String { reads += 1; return value }
let observation = RendererAttributeReuse(
title: read("Title"), description: read("Description"), role: read("AXButton")
)
XCTAssertEqual(observation.title { read("Title") }, "Title")
XCTAssertEqual(observation.description { read("Description") }, "Description")
XCTAssertEqual(observation.role { read("AXButton") }, "AXButton")
for _ in 0..<2 {
XCTAssertEqual(observation.settable { reads += 1; return false }, false)
}
XCTAssertEqual(reads, 4, "three fingerprint reads plus one settable query, instead of eight")
}
func testMissingScalarsRetryAndCacheOnlyLaterSuccess() {
let observation = RendererAttributeReuse(title: nil, description: nil, role: nil)
var reads = 0
for get in [observation.title, observation.description, observation.role] {
XCTAssertNil(get { reads += 1; return nil })
XCTAssertEqual(get { reads += 1; return "recovered" }, "recovered")
XCTAssertEqual(get { reads += 1; return "changed" }, "recovered")
}
XCTAssertEqual(reads, 6)
}
func testSettableFailureRetriesButSuccessfulFalseDoesNot() {
let observation = RendererAttributeReuse(title: nil, description: nil, role: nil)
var reads = 0
XCTAssertNil(observation.settable { reads += 1; return nil })
XCTAssertEqual(observation.settable { reads += 1; return false }, false)
XCTAssertEqual(observation.settable { reads += 1; return true }, false)
XCTAssertEqual(reads, 2)
}
func testSeparateNodesAndRenderPassesNeverShareObservations() {
let first = RendererAttributeReuse(title: "Same", description: nil, role: "AXButton")
let duplicate = RendererAttributeReuse(title: "Same", description: nil, role: "AXButton")
XCTAssertEqual(first.settable { true }, true)
XCTAssertEqual(duplicate.settable { false }, false)
let nextPass = RendererAttributeReuse(title: "Changed", description: nil, role: "AXButton")
XCTAssertEqual(nextPass.title { "wrong" }, "Changed")
XCTAssertEqual(nextPass.settable { false }, false)
}
}