Skip to content

Commit a6a53a9

Browse files
committed
chore: add unit test for reporting JSTracing prop access
1 parent 565608b commit a6a53a9

File tree

1 file changed

+54
-3
lines changed

1 file changed

+54
-3
lines changed

Tests/JavaScriptKitTests/JSTracingTests.swift

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,66 @@ final class JSTracingTests: XCTestCase {
1616
let prop5 = try XCTUnwrap(globalObject1.prop_5.object)
1717
_ = prop5.func6!(true, 1, 2)
1818

19-
XCTAssertEqual(startInfo.count, 1)
20-
guard case let .method(receiver, methodName, arguments) = startInfo.first else {
19+
let methodEvents = startInfo.filter {
20+
if case .method = $0 { return true }
21+
return false
22+
}
23+
XCTAssertEqual(methodEvents.count, 1)
24+
guard case let .method(receiver, methodName, arguments) = methodEvents.first else {
2125
XCTFail("Expected method info")
2226
return
2327
}
2428
XCTAssertEqual(receiver.id, prop5.id)
2529
XCTAssertEqual(methodName, "func6")
2630
XCTAssertEqual(arguments, [.boolean(true), .number(1), .number(2)])
27-
XCTAssertEqual(ended, 1)
31+
XCTAssertEqual(ended, startInfo.count)
32+
}
33+
34+
func testJSCallHookReportsPropertyAccess() throws {
35+
var startInfo: [JSTracing.JSCallInfo] = []
36+
var ended = 0
37+
let remove = JSTracing.default.addJSCallHook { info in
38+
startInfo.append(info)
39+
return { ended += 1 }
40+
}
41+
defer { remove() }
42+
43+
let obj = JSObject.global.globalObject1
44+
45+
// Read a property (triggers propertyGet)
46+
let _ = obj.prop_1
47+
48+
// Write a property (triggers propertySet)
49+
obj.prop_1 = .number(999)
50+
51+
// Filter to only propertyGet/propertySet events (subscript reads for the
52+
// method-call test fixture also fire propertyGet, so be precise).
53+
let propEvents = startInfo.filter {
54+
switch $0 {
55+
case .propertyGet(_, let name) where name == "prop_1": return true
56+
case .propertySet(_, let name, _) where name == "prop_1": return true
57+
default: return false
58+
}
59+
}
60+
61+
XCTAssertEqual(propEvents.count, 2)
62+
63+
guard case .propertyGet(let getReceiver, let getName) = propEvents[0] else {
64+
XCTFail("Expected propertyGet info")
65+
return
66+
}
67+
XCTAssertEqual(getReceiver.id, obj.object!.id)
68+
XCTAssertEqual(getName, "prop_1")
69+
70+
guard case .propertySet(let setReceiver, let setName, let setValue) = propEvents[1] else {
71+
XCTFail("Expected propertySet info")
72+
return
73+
}
74+
XCTAssertEqual(setReceiver.id, obj.object!.id)
75+
XCTAssertEqual(setName, "prop_1")
76+
XCTAssertEqual(setValue, .number(999))
77+
78+
XCTAssertEqual(ended, startInfo.count)
2879
}
2980

3081
func testJSClosureCallHookReportsMetadata() throws {

0 commit comments

Comments
 (0)