4864e92e30
Project CI / AI game creator shell Rust shard 1/4 (push) Failing after 18s
Project CI / AI game creator shell Rust shard 4/4 (push) Failing after 18s
Project CI / AI game creator shell Rust shard 3/4 (push) Failing after 18s
Project CI / AI game creator shell Rust shard 2/4 (push) Failing after 18s
Project CI / AI game creator shell Rust smoke (push) Failing after 19s
Project CI / Native shell tests (push) Failing after 19s
Project CI / Backend tests (push) Failing after 19s
Project CI / AI game creator shell Rust crates (push) Failing after 19s
Project CI / Frontend tests (push) Failing after 6s
Project CI / AI game creator shell web tests (push) Failing after 12s
Project CI / Repository checks (push) Failing after 12s
恢复顾问态不自主推进、不安排下一步和不提交阶段审批的约束 恢复过程文档轻量记录原则并明确审批与问询的职责边界 补回顶层设计的排除方向及星露谷示例定位 统一星露谷分析示例的五处旧路径引用 同步策划专题文档与团队共享约定 Reviewed-on: #433 Co-authored-by: Linghong <ink29535@proton.me> Co-committed-by: Linghong <ink29535@proton.me>
71 lines
2.2 KiB
JavaScript
71 lines
2.2 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('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/);
|
|
});
|