Skip to content

Commit 92c7413

Browse files
Tests: Enable assert_return/wat test cases
1 parent 4976dd3 commit 92c7413

File tree

1 file changed

+36
-51
lines changed

1 file changed

+36
-51
lines changed

Tests/WasmKitTests/Spectest/TestCase.swift

Lines changed: 36 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,19 @@ extension WastRunContext {
168168
}
169169
return instance
170170
}
171-
func deriveModuleInstance(from execute: WastExecute) throws -> Instance? {
171+
func deriveInstance(by name: String?) throws -> Instance {
172+
let instance: Instance?
173+
if let name {
174+
instance = lookupInstance(name)
175+
} else {
176+
instance = currentInstance
177+
}
178+
guard let instance else {
179+
throw SpectestError("no module to execute")
180+
}
181+
return instance
182+
}
183+
func deriveInstance(from execute: WastExecute) throws -> Instance? {
172184
switch execute {
173185
case .invoke(let invoke):
174186
if let module = invoke.module {
@@ -263,54 +275,17 @@ extension WastRunContext {
263275
return .passed
264276

265277
case .assertReturn(let execute, let results):
266-
let instance: Instance?
267-
do {
268-
instance = try deriveModuleInstance(from: execute)
269-
} catch {
270-
return .failed("failed to derive module instance: \(error)")
271-
}
272-
guard let instance else {
273-
return .failed("no module to execute")
274-
}
275-
276278
let expected = parseValues(args: results)
277-
278-
switch execute {
279-
case .invoke(let invoke):
280-
let result: [WasmKit.Value]
281-
do {
282-
result = try wastInvoke(call: invoke)
283-
} catch {
284-
return .failed("\(error)")
285-
}
286-
guard result.isTestEquivalent(to: expected) else {
287-
return .failed("invoke result mismatch: expected: \(expected), actual: \(result)")
288-
}
289-
return .passed
290-
291-
case .get(_, let globalName):
292-
let result: WasmKit.Value
293-
do {
294-
guard case let .global(global) = instance.export(globalName) else {
295-
throw Trap._raw("no global export with name \(globalName) in a module instance \(instance)")
296-
}
297-
result = global.value
298-
} catch {
299-
return .failed("\(error)")
300-
}
301-
guard result.isTestEquivalent(to: expected[0]) else {
302-
return .failed("get result mismatch: expected: \(expected), actual: \(result)")
303-
}
304-
return .passed
305-
case .wat: return .skipped("TBD")
279+
let actual = try wastExecute(execute: execute)
280+
guard actual.isTestEquivalent(to: expected) else {
281+
return .failed("invoke result mismatch: expected: \(expected), actual: \(actual)")
306282
}
307-
283+
return .passed
308284
case .assertTrap(let execute, let message):
309285
switch execute {
310286
case .invoke(let invoke):
311287
do {
312288
_ = try wastInvoke(call: invoke)
313-
// XXX: This is wrong but just keep it as is
314289
return .failed("trap expected: \(message)")
315290
} catch let trap as Trap {
316291
guard trap.assertionText.contains(message) else {
@@ -367,16 +342,26 @@ extension WastRunContext {
367342
}
368343
}
369344

370-
private func wastInvoke(call: WastInvoke) throws -> [Value] {
371-
let instance: Instance?
372-
do {
373-
instance = try deriveModuleInstance(from: .invoke(call))
374-
} catch {
375-
throw SpectestError("failed to derive module instance: \(error)")
376-
}
377-
guard let instance else {
378-
throw SpectestError("no module to execute")
345+
private func wastExecute(execute: WastExecute) throws -> [Value] {
346+
switch execute {
347+
case .invoke(let invoke):
348+
return try wastInvoke(call: invoke)
349+
case .get(let module, let globalName):
350+
let instance = try deriveInstance(by: module)
351+
let result: WasmKit.Value
352+
guard case let .global(global) = instance.export(globalName) else {
353+
throw SpectestError("no global export with name \(globalName) in a module instance \(instance)")
354+
}
355+
return [global.value]
356+
case .wat(var wat):
357+
let module = try parseModule(rootPath: rootPath, moduleSource: .binary(wat.encode()))
358+
_ = try instantiate(module: module)
359+
return []
379360
}
361+
}
362+
363+
private func wastInvoke(call: WastInvoke) throws -> [Value] {
364+
let instance = try deriveInstance(by: call.module)
380365
guard let function = instance.exportedFunction(name: call.name) else {
381366
throw SpectestError("function \(call.name) not exported")
382367
}

0 commit comments

Comments
 (0)