@@ -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