Files
rubik/tests/algorithm-runner.test.js
T
tiennm99 eb592e5c98 feat: add kociemba solver and vitest unit tests
- Solver: cubejs-backed two-phase solver, lazy-loaded chunk so the ~80 KB
  table-init cost stays out of the main bundle. New cube-to-facelets
  converter (3D model -> 54-char URFDLB string) verified bit-for-bit
  against cubejs's own move() output.
- Solve button in ControlsPanel with disabled "Solving..." state, wired
  through the CubeView controller; animates each move sequentially.
- Rewrite solved-check to the WCA face-uniformity definition. The old
  strict "identity quaternion per cubie" check rejected center spins
  (invisible) and whole-cube rotations, both of which are still solved
  per WCA / Kociemba.
- Vitest specs under tests/ cover cubie-model, move-definitions,
  move-parser, apply-move (4x turns, inverses, sune order=6, R2 == R R),
  scrambler, solved-check, algorithm-runner, cube-to-facelets, solver.
  39 tests, ~3 s. Adds npm test / npm run test:watch scripts.
2026-04-27 10:25:28 +07:00

25 lines
963 B
JavaScript

import { describe, it, expect } from 'vitest';
import { createSolvedCube } from '../src/lib/core/cubie-model.js';
import { runInstant, runAnimated } from '../src/lib/core/algorithm-runner.js';
import { isSolved } from '../src/lib/core/solved-check.js';
describe('algorithm-runner', () => {
it('runInstant applies all moves and returns the spec list', async () => {
const c = createSolvedCube();
const moves = await runInstant(c, "R U R' U'");
expect(moves.map((m) => m.name)).toEqual(['R', 'U', "R'", "U'"]);
expect(isSolved(c)).toBe(false);
});
it('runAnimated awaits each animation in order', async () => {
const order = [];
const fakeAnimate = (m) => {
order.push(m.name);
return Promise.resolve();
};
const moves = await runAnimated('R U2 F', fakeAnimate);
expect(order).toEqual(['R', 'U2', 'F']);
expect(moves).toHaveLength(3);
});
});