Files
cell/tests/overling.ce

165 lines
3.8 KiB
Plaintext

// Overling test suite - tests actor hierarchy management
var time = use('time');
// Track test results
var testResults = {
type: 'test_results',
test_name: 'overling',
passed: 0,
failed: 0,
total: 0,
failures: [],
duration: 0
};
var startTime;
// Helper to run a single test
function runTest(testName, testFn) {
var passed = true;
var messages = [];
try {
testFn(function(result) {
passed = result.passed;
messages = result.messages || [];
// Update results
testResults.total++;
if (passed) {
testResults.passed++;
} else {
testResults.failed++;
testResults.failures.push({
name: testName,
error: messages.join('\n')
});
}
// Log individual result
log.console(testName + ' - ' + (passed ? 'Passed' : 'Failed'));
if (!passed && messages.length > 0) {
log.console(' ' + messages.join('\n '));
}
});
} catch (e) {
testResults.total++;
testResults.failed++;
testResults.failures.push({
name: testName,
error: 'Exception thrown: ' + (e.stack || e.toString())
});
log.console(testName + ' - Failed');
log.console(' Exception thrown: ' + (e.stack || e.toString()));
}
}
// Test suite
var tests = [
{
name: "Actor should be able to spawn underlings",
run: function(done) {
var underlingCount = 0;
var targetCount = 3;
// Spawn several underlings
for (var i = 0; i < targetCount; i++) {
$_.start(function(greet) {
underlingCount++;
if (underlingCount == targetCount) {
done({
passed: true,
messages: []
});
}
}, "underling", ["test" + i]);
}
// Timeout protection
$_.delay(function() {
if (underlingCount < targetCount) {
done({
passed: false,
messages: ["Only spawned " + underlingCount + " of " + targetCount + " underlings"]
});
}
}, 1);
}
},
{
name: "Actor should be able to stop underlings",
run: function(done) {
var stopped = false;
$_.start(function(greet) {
// Stop the underling immediately
$_.stop(greet.actor);
stopped = true;
// Give it a moment to ensure stop worked
$_.delay(function() {
done({
passed: stopped,
messages: stopped ? [] : ["Failed to stop underling"]
});
}, 0.1);
}, "underling", ["stop_test"]);
}
},
{
name: "Actor unneeded function should terminate after timeout",
run: function(done) {
var finished = false;
$_.unneeded(function() {
finished = true;
done({
passed: true,
messages: []
});
}, 0.5); // 500ms timeout
// Check that it hasn't finished too early
$_.delay(function() {
if (finished) {
done({
passed: false,
messages: ["unneeded finished too early"]
});
}
}, 0.2);
}
}
];
// Message receiver
$_.receiver(function(msg) {
if (msg.type == 'run_tests') {
startTime = time.number();
var testsCompleted = 0;
// Run all tests
for (var i = 0; i < tests.length; i++) {
var test = tests[i];
runTest(test.name, test.run);
}
// Wait for all async tests to complete
var checkComplete = function() {
if (testResults.total >= tests.length) {
// Calculate duration
testResults.duration = time.number() - startTime;
// Send results back
send(msg, testResults);
} else {
$_.delay(checkComplete, 0.1);
}
};
$_.delay(checkComplete, 0.1);
}
});