fix actor working

This commit is contained in:
2026-02-17 08:53:16 -06:00
parent fbdfbc1200
commit 2a38292ff7
8 changed files with 177 additions and 181 deletions

104
test.ce
View File

@@ -318,7 +318,7 @@ function collect_actor_tests(package_name, specific_test) {
// Spawn an actor test and track it
function spawn_actor_test(test_info) {
var test_name = text(test_info.file, 6, -3) // remove "tests/" and ".ce"
var test_name = text(test_info.file, 6, -3)
log.console(` [ACTOR] ${test_info.file}`)
var entry = {
@@ -331,16 +331,41 @@ function spawn_actor_test(test_info) {
}
var _spawn = function() {
var actor_path = text(test_info.path, 0, -3) // remove .ce
entry.actor = $start(actor_path)
var actor_path = text(test_info.path, 0, -3)
$start(function(event) {
var end_time = time.number()
var duration_ns = round((end_time - entry.start_time) * 1000000000)
if (event.type == 'greet') {
entry.actor = event.actor
return
}
var idx = find(pending_actor_tests, e => e == entry)
if (idx != null) {
pending_actor_tests = array(
array(pending_actor_tests, 0, idx),
array(pending_actor_tests, idx + 1)
)
}
entry.duration_ns = duration_ns
if (event.type == 'stop') {
entry.status = "passed"
log.console(` PASS ${test_name}`)
} else {
entry.status = "failed"
entry.error = { message: event.reason || "Actor disrupted" }
log.console(` FAIL ${test_name}: ${entry.error.message}`)
}
push(actor_test_results, entry)
if (gc_after_each_test) dbg.gc()
check_completion()
}, actor_path)
push(pending_actor_tests, entry)
} disruption {
entry.status = "failed"
entry.error = { message: `Failed to spawn actor` }
entry.error = { message: "Failed to spawn actor" }
entry.duration_ns = 0
push(actor_test_results, entry)
log.console(` FAIL ${test_name}: `)
log.error()
log.console(` FAIL ${test_name}: Failed to spawn`)
}
_spawn()
}
@@ -582,69 +607,6 @@ if (length(all_actor_tests) > 0) {
}
}
// Handle messages from actor tests
function handle_actor_message(msg) {
var sender = msg.$sender
var found_idx = -1
var i = 0
var res = null
var entry = null
for (i = 0; i < length(pending_actor_tests); i++) {
if (pending_actor_tests[i].actor == sender) {
found_idx = i
break
}
}
if (found_idx == -1) return
var base_entry = pending_actor_tests[found_idx]
pending_actor_tests = array(array(pending_actor_tests, 0, found_idx), array(pending_actor_tests, found_idx + 1))
var end_time = time.number()
var duration_ns = round((end_time - base_entry.start_time) * 1000000000)
var results = []
if (is_array(msg)) {
results = msg
} else if (msg && is_array(msg.results)) {
results = msg.results
} else {
results = [msg]
}
for (i = 0; i < length(results); i++) {
res = results[i] || {}
entry = {
package: base_entry.package,
file: base_entry.file,
test: res.test || base_entry.test + (length(results) > 1 ? `#${i+1}` : ""),
status: "failed",
duration_ns: duration_ns
}
if (res.type && res.type != "test_result") {
entry.error = { message: `Unexpected message type: ${res.type}` }
log.console(` FAIL ${entry.test}: unexpected message`)
} else if (res.passed) {
entry.status = "passed"
log.console(` PASS ${entry.test}`)
} else {
entry.error = { message: res.error || "Test failed" }
if (res.stack) entry.error.stack = res.stack
log.console(` FAIL ${entry.test}: ${entry.error.message}`)
}
push(actor_test_results, entry)
}
if (gc_after_each_test) {
dbg.gc()
}
check_completion()
}
// Check for timed out actor tests
function check_timeouts() {
var now = time.number()
@@ -870,8 +832,4 @@ Total: ${totals.total}, Passed: ${totals.passed}, Failed: ${totals.failed}
if (length(all_actor_tests) == 0) {
generate_reports(totals)
$stop()
} else {
$portal(function(msg) {
handle_actor_message(msg)
})
}