|
1 | 1 | #if compiler(>=6.1) && _runtime(_multithreaded)
|
2 | 2 | import XCTest
|
3 |
| -import JavaScriptKit |
4 | 3 | import _CJavaScriptKit // For swjs_get_worker_thread_id
|
| 4 | +@testable import JavaScriptKit |
5 | 5 | @testable import JavaScriptEventLoop
|
6 | 6 |
|
7 | 7 | @_extern(wasm, module: "JavaScriptEventLoopTestSupportTests", name: "isMainThread")
|
@@ -151,6 +151,55 @@ final class WebWorkerTaskExecutorTests: XCTestCase {
|
151 | 151 | executor.terminate()
|
152 | 152 | }
|
153 | 153 |
|
| 154 | + func testThreadLocalPerThreadValues() async throws { |
| 155 | + struct Check { |
| 156 | + @ThreadLocal(boxing: ()) |
| 157 | + static var value: Int? |
| 158 | + } |
| 159 | + let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1) |
| 160 | + XCTAssertNil(Check.value) |
| 161 | + Check.value = 42 |
| 162 | + XCTAssertEqual(Check.value, 42) |
| 163 | + |
| 164 | + let task = Task(executorPreference: executor) { |
| 165 | + XCTAssertEqual(Check.value, nil) |
| 166 | + Check.value = 100 |
| 167 | + XCTAssertEqual(Check.value, 100) |
| 168 | + return Check.value |
| 169 | + } |
| 170 | + let result = await task.value |
| 171 | + XCTAssertEqual(result, 100) |
| 172 | + XCTAssertEqual(Check.value, 42) |
| 173 | + } |
| 174 | + |
| 175 | + func testLazyThreadLocalPerThreadInitialization() async throws { |
| 176 | + struct Check { |
| 177 | + static var valueToInitialize = 42 |
| 178 | + static var countOfInitialization = 0 |
| 179 | + @LazyThreadLocal(initialize: { |
| 180 | + countOfInitialization += 1 |
| 181 | + return valueToInitialize |
| 182 | + }) |
| 183 | + static var value: Int |
| 184 | + } |
| 185 | + let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1) |
| 186 | + XCTAssertEqual(Check.countOfInitialization, 0) |
| 187 | + XCTAssertEqual(Check.value, 42) |
| 188 | + XCTAssertEqual(Check.countOfInitialization, 1) |
| 189 | + |
| 190 | + Check.valueToInitialize = 100 |
| 191 | + |
| 192 | + let task = Task(executorPreference: executor) { |
| 193 | + XCTAssertEqual(Check.countOfInitialization, 1) |
| 194 | + XCTAssertEqual(Check.value, 100) |
| 195 | + XCTAssertEqual(Check.countOfInitialization, 2) |
| 196 | + return Check.value |
| 197 | + } |
| 198 | + let result = await task.value |
| 199 | + XCTAssertEqual(result, 100) |
| 200 | + XCTAssertEqual(Check.countOfInitialization, 2) |
| 201 | + } |
| 202 | + |
154 | 203 | /*
|
155 | 204 | func testDeinitJSObjectOnDifferentThread() async throws {
|
156 | 205 | let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1)
|
|
0 commit comments