Initial Commit
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import { describe, it } from "@suaveplan/testing/runner";
|
||||
import * as fc from "fast-check";
|
||||
import { createCommand, executeCommand } from "../../src/command/command.js";
|
||||
import { CommandMerger } from "../../src/merge/command-merger.js";
|
||||
|
||||
interface Counter {
|
||||
value: number;
|
||||
}
|
||||
|
||||
describe("property: CommandMerger merge associativity", () => {
|
||||
it("merged command executes to same state as executing individually", {
|
||||
timeout: 30000,
|
||||
}, () => {
|
||||
fc.assert(
|
||||
fc.property(
|
||||
fc.array(fc.integer({ min: 1, max: 10 }), {
|
||||
minLength: 1,
|
||||
maxLength: 15,
|
||||
}),
|
||||
(deltas) => {
|
||||
const commands = deltas.map((d) =>
|
||||
createCommand<Counter>(
|
||||
"Inc",
|
||||
(s) => ({ value: s.value + d }),
|
||||
(s) => ({ value: s.value - d })
|
||||
)
|
||||
);
|
||||
|
||||
// Execute individually
|
||||
let individual: Counter = { value: 0 };
|
||||
for (const cmd of commands) {
|
||||
individual = executeCommand(individual, cmd);
|
||||
}
|
||||
|
||||
// Merge all then execute
|
||||
const m = new CommandMerger<Counter>({
|
||||
maxCount: commands.length + 1,
|
||||
});
|
||||
for (const cmd of commands) m.add(cmd);
|
||||
const merged = m.flush();
|
||||
const mergedResult = merged
|
||||
? executeCommand({ value: 0 }, merged)
|
||||
: { value: 0 };
|
||||
|
||||
return mergedResult.value === individual.value;
|
||||
}
|
||||
),
|
||||
{ numRuns: 200 }
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user