3193182665
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (push) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (push) Has been cancelled
Project CI / AI game creator shell Rust smoke (push) Has been cancelled
Project CI / AI game creator shell Rust crates (push) Has been cancelled
Project CI / Backend tests (push) Has been cancelled
Project CI / Native shell tests (push) Has been cancelled
Project CI / Frontend tests (push) Has been cancelled
Project CI / Repository checks (push) Has been cancelled
Project CI / AI game creator shell web tests (push) Has been cancelled
删除 Claude 流式结果测试中已失效的回合参数 分片运行器使用 Cargo 渲染诊断并保留 JSON 产物发现 新增编译失败诊断回归测试并更新排障文档
83 lines
2.7 KiB
JavaScript
83 lines
2.7 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { spawnSync } from 'node:child_process';
|
|
import fs from 'node:fs';
|
|
import os from 'node:os';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const runner = fileURLToPath(
|
|
new URL('./run-rust-shell-test-shards.mjs', import.meta.url),
|
|
);
|
|
|
|
function runFixture(t, source) {
|
|
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agc-shard-output-'));
|
|
t.after(() => fs.rmSync(root, { recursive: true, force: true }));
|
|
fs.mkdirSync(path.join(root, 'src'));
|
|
fs.writeFileSync(
|
|
path.join(root, 'Cargo.toml'),
|
|
'[package]\nname = "shard-output-fixture"\nversion = "0.1.0"\nedition = "2021"\n',
|
|
);
|
|
fs.writeFileSync(path.join(root, 'src/lib.rs'), source);
|
|
const result = spawnSync(
|
|
process.execPath,
|
|
[
|
|
runner,
|
|
`--manifest=${path.join(root, 'Cargo.toml')}`,
|
|
'--target-kind=lib',
|
|
'--no-locked',
|
|
'--shards=1',
|
|
`--shard-tmp-root=${path.join(root, 'tmp')}`,
|
|
],
|
|
{
|
|
encoding: 'utf8',
|
|
timeout: 60_000,
|
|
windowsHide: true,
|
|
env: { ...process.env, CARGO_TARGET_DIR: path.join(root, 'target') },
|
|
},
|
|
);
|
|
assert.ifError(result.error);
|
|
return { status: result.status, output: result.stdout + result.stderr };
|
|
}
|
|
|
|
test('failed shard retains panic details and separates selected count from failures', (t) => {
|
|
const result = runFixture(
|
|
t,
|
|
`
|
|
#[test]
|
|
fn passing_case() {}
|
|
#[test]
|
|
fn failing_case() {
|
|
assert_eq!(1, 2, "shard panic evidence");
|
|
}
|
|
`,
|
|
);
|
|
assert.equal(result.status, 1, result.output);
|
|
assert.match(result.output, /FAILED \(selected 2 test\(s\)\)/);
|
|
assert.match(result.output, /failing_case/);
|
|
assert.match(result.output, /panicked at src[\\/]lib\.rs:/);
|
|
assert.match(result.output, /shard panic evidence/);
|
|
assert.match(result.output, /left: 1/);
|
|
assert.match(result.output, /right: 2/);
|
|
assert.match(result.output, /1 passed; 1 failed/);
|
|
});
|
|
|
|
test('compile failure retains the diagnostic code, source location and cause', (t) => {
|
|
const result = runFixture(
|
|
t,
|
|
'#[test]\nfn compile_failure() { let _: u32 = "not a number"; }\n',
|
|
);
|
|
assert.equal(result.status, 1, result.output);
|
|
assert.match(result.output, /error\[E0308\]/);
|
|
assert.match(result.output, /src[\\/]lib\.rs:2:/);
|
|
assert.match(result.output, /mismatched types/);
|
|
assert.match(result.output, /expected `u32`, found `&str`/);
|
|
});
|
|
|
|
test('successful shard keeps its compact summary', (t) => {
|
|
const result = runFixture(t, '#[test]\nfn passing_case() {}\n');
|
|
assert.equal(result.status, 0, result.output);
|
|
assert.match(result.output, /shard 1\/1 ok: 1 test\(s\)/);
|
|
assert.doesNotMatch(result.output, /test passing_case \.\.\. ok/);
|
|
});
|