✓
Passing This code compiles and runs correctly.
Code
// Test: Impure events require overrides
// MUST_FAIL: has impure events without overrides
//
// When a test calls an impure event (Zig proc without ~[pure]),
// the compiler should error and list ALL impure events at once.
//
// This is the "fix/recompile loop killer" - great UX!
~import std/testing
// Impure event - Zig proc without ~[pure]
~event fetch-user { id: u32 }
| found []const u8
~proc fetch-user|zig {
// This is impure - does I/O (simulated)
return .{ .found = "Alice" };
}
// Another impure event
~event save-log { message: []const u8 }
~proc save-log|zig {
// This is impure - writes to disk
}
// Test: Should FAIL - calls impure events without overrides
~test(Impure events should error) {
~fetch-user(id: 1)
| found u |> save-log(message: u.name)
| saved |> assert.ok()
}
Error Verification
Expected Error Pattern
MUST_FAILActual Compiler Output
[TEST] Building mock lookup map
[TEST] Transformed program has 15 items:
[TEST] [0] flow
[TEST] invocation: fetch-user
[TEST] [1] other
[TEST] [2] other
[TEST] [3] other
[TEST] [4] other
[TEST] [5] other
[TEST] [6] other
[TEST] [7] other
[TEST] [8] other
[TEST] [9] event_decl
[TEST] [10] proc_decl
[TEST] [11] other
[TEST] [12] event_decl
[TEST] [13] proc_decl
[TEST] [14] other
[TEST] Found 1 transformed flows
[TEST] Purity walk complete, 2 impure events
thread 97458611 panic: Test 'Impure events should error' has impure events without mocks:
- fetch-user
- save-log
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend_output_emitted.zig:2935:39: 0x102fde517 in handler (backend_output)
@panic(err_msg.items);
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend_output_emitted.zig:5439:39: 0x102e565e7 in call_handler_testing_test (backend_output)
const result = handler.handler(input);
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:870:44: 0x102fe79d3 in applyTransform (backend_output)
const result = try transform.handler_fn(handler_node, handler_program, allocator);
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:718:42: 0x102e55043 in walkNode (backend_output)
return try applyTransform(node, position, program, transform, allocator);
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:684:36: 0x102e54b27 in walkNode (backend_output)
const result = try walkNode(child, program, transforms, allocator, childPosition(node, child, position));
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:684:36: 0x102e54b27 in walkNode (backend_output)
const result = try walkNode(child, program, transforms, allocator, childPosition(node, child, position));
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:684:36: 0x102e54b27 in walkNode (backend_output)
const result = try walkNode(child, program, transforms, allocator, childPosition(node, child, position));
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:684:36: 0x102e54b27 in walkNode (backend_output)
const result = try walkNode(child, program, transforms, allocator, childPosition(node, child, position));
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:684:36: 0x102e54b27 in walkNode (backend_output)
const result = try walkNode(child, program, transforms, allocator, childPosition(node, child, position));
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:606:24: 0x102e546c3 in walkOnce (backend_output)
return try walkNode(root, program, transforms, allocator, .none);
^
/Users/larsde/src/koru/src/transform_pass_runner.zig:580:36: 0x102e55e83 in walkAndTransform (backend_output)
const result = try walkOnce(current_program, transforms, allocator);
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend_output_emitted.zig:5543:62: 0x102e5601b in run_pass (backend_output)
const result = try transform_pass_runner.walkAndTransform(program, transforms, allocator);
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend_output_emitted.zig:1438:75: 0x102e2fefb in handler (backend_output)
const post_transform_ast = backend_output.run_pass("transform", ctx.ast, ctx.allocator) catch |err| {
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend_output_emitted.zig:859:111: 0x102e2d063 in handler (backend_output)
const nested_result_1 = koru_std.koru_compiler.evaluate_comptime_event.handler(.{ .ctx = c2 });
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend_output_emitted.zig:675:94: 0x102e2c9af in handler (backend_output)
const nested_result_0 = koru_std.koru_compiler.frontend_event.handler(.{ .ctx = c0 });
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend_output_emitted.zig:5572:67: 0x102e2c7d3 in koru_coordinate (backend_output)
const result = koru_std.koru_compiler.coordinate_event.handler(.{
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend.zig:90:39: 0x10323f2cb in emit (backend)
const result = koru_coordinate(source_ast, &allocator);
^
/Users/larsde/src/koru/tests/regression/300_ADVANCED_FEATURES/395_TESTING/395_005_impure_event_error/backend.zig:190:51: 0x10323fbeb in main (backend)
const generated_code = try RuntimeEmitter.emit(compile_allocator, final_ast);
^
/opt/homebrew/Cellar/zig/0.15.2_1/lib/zig/std/start.zig:627:37: 0x1032458a7 in main (backend)
const result = root.main() catch |err| {
^
???:?:?: 0x18da2fdff in ??? (???)
???:?:?: 0x0 in ??? (???)
/Users/larsde/src/koru/scripts/regression_lib.sh: line 256: 97467 Abort trap: 6 ./backend outputTest Configuration
MUST_FAIL
Expected Error:
impure events without mocks