feat(sim): F4.6f1 what a run leaves goes back into the document
The oracle SaveAfterRunRun saves Java's project after a run. The room writes what a run leaves that Java keeps - files, running servers, virtual hosts, mail servers' domains and accounts, mail programs' accounts and folders, firewalls, DHCP clients' addresses - into the document as origin 'sim', at most once a second, after each action and at the stop; writeRunState writes only what differs. The command line now goes on in a folder made before a restart, as Java's does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +1,8 @@
|
||||
// The room's command line window against Java's (tools/java-oracle
|
||||
// TerminalWindowRun): the same keys typed into a computer's window, the same
|
||||
// text, prompt and history after each, over a stop and a start. One
|
||||
// difference is named: what a run made in the files is not yet written back
|
||||
// into the document (F4.6f), so after the restart the folder made before is
|
||||
// gone and the window goes on at the root, where Java's goes on in it.
|
||||
// text, prompt and history after each, over a stop and a start — the
|
||||
// folder made before the stop is in the project afterwards (written back,
|
||||
// F4.6f), and the window goes on in it, as Java's does.
|
||||
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { dirname, join } from 'node:path';
|
||||
@@ -59,9 +58,6 @@ function setUp(programs: readonly string[] = ['commandPrompt']) {
|
||||
return { doc, room, send, run, read, got, connect: (listener: (message: HostMessage) => void) => room.connect(listener) };
|
||||
}
|
||||
|
||||
/** Until the files of a run are written back (F4.6f): the folder made before the restart is gone, the window goes on at the root. */
|
||||
const FILES_NOT_KEPT_YET = (text: string) => text.replaceAll('/dir', '/');
|
||||
|
||||
describe("a command line's window", () => {
|
||||
it("shows what Java's window shows, key by key, over a stop and a start", () => {
|
||||
const { send, run, read } = setUp();
|
||||
@@ -70,7 +66,6 @@ describe("a command line's window", () => {
|
||||
run(TICK_MILLISECONDS);
|
||||
let pointer = -1;
|
||||
let input = '';
|
||||
let restartedAt: number | undefined;
|
||||
for (const step of java.steps) {
|
||||
if (step.step.startsWith('enter:')) {
|
||||
send({ kind: 'input', node: 'pc', app: 'terminal', action: 'enter', args: { line: step.step.slice('enter:'.length) }, reqId: step.step });
|
||||
@@ -85,13 +80,9 @@ describe("a command line's window", () => {
|
||||
send({ kind: 'stop' });
|
||||
send({ kind: 'start' });
|
||||
run(400);
|
||||
restartedAt = terminalScreen(read()).text.length;
|
||||
}
|
||||
const screen = terminalScreen(read());
|
||||
const expected =
|
||||
restartedAt === undefined
|
||||
? step
|
||||
: { ...step, text: step.text.slice(0, restartedAt) + FILES_NOT_KEPT_YET(step.text.slice(restartedAt)), prompt: FILES_NOT_KEPT_YET(step.prompt) };
|
||||
const expected = step;
|
||||
expect({ text: screen.text, prompt: screen.prompt, promptShown: screen.promptShown, input }, step.step).toEqual({
|
||||
text: expected.text,
|
||||
prompt: expected.prompt,
|
||||
@@ -120,9 +111,9 @@ describe("a command line's window", () => {
|
||||
send({ kind: 'start' });
|
||||
run(400);
|
||||
expect(terminalScreen(read()).prompt).toBe('/docs> ');
|
||||
// The folder gone from the project: the next start goes on at the root.
|
||||
files.delete('/docs');
|
||||
// The folder gone from the project (in the design): the next start goes on at the root.
|
||||
send({ kind: 'stop' });
|
||||
files.delete('/docs');
|
||||
send({ kind: 'start' });
|
||||
run(400);
|
||||
expect(terminalScreen(read()).prompt).toBe('/> ');
|
||||
|
||||
Reference in New Issue
Block a user