54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { BREAK_AT, RACK_GLASSES, freshRack, stepRack, turnSharpness } from '../../src/scenes/floor/glassie';
|
|
|
|
describe('the glassie run (pure physics)', () => {
|
|
it('a smooth walk settles the rack and breaks nothing', () => {
|
|
let r = { glasses: RACK_GLASSES, wobble: 0.6 };
|
|
let broke = 0;
|
|
for (let i = 0; i < 120; i++) {
|
|
const out = stepRack(r, 16, false, 0);
|
|
r = out.rack;
|
|
broke += out.broke;
|
|
}
|
|
expect(broke).toBe(0);
|
|
expect(r.wobble).toBe(0);
|
|
expect(r.glasses).toBe(RACK_GLASSES);
|
|
});
|
|
|
|
it('two quick crowd bumps break a glass; the wobble sheds with it', () => {
|
|
let r = freshRack();
|
|
r = stepRack(r, 16, true, 0).rack;
|
|
expect(r.glasses).toBe(RACK_GLASSES); // one bump is a scare, not a smash
|
|
const out = stepRack(r, 16, true, 0);
|
|
expect(out.broke).toBe(1);
|
|
expect(out.rack.glasses).toBe(RACK_GLASSES - 1);
|
|
expect(out.rack.wobble).toBeLessThan(BREAK_AT);
|
|
});
|
|
|
|
it('sawing the stick hard eventually costs glass even with no crowd', () => {
|
|
let r = freshRack();
|
|
let broke = 0;
|
|
for (let i = 0; i < 300; i++) {
|
|
const out = stepRack(r, 16, false, 1);
|
|
r = out.rack;
|
|
broke += out.broke;
|
|
}
|
|
expect(broke).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('a rack cannot go below zero glasses', () => {
|
|
const r = { glasses: 1, wobble: 0.99 };
|
|
const out = stepRack(r, 16, true, 1);
|
|
expect(out.rack.glasses).toBe(0);
|
|
const again = stepRack(out.rack, 16, true, 1);
|
|
expect(again.rack.glasses).toBe(0);
|
|
expect(again.broke).toBe(0);
|
|
});
|
|
|
|
it('turnSharpness is 0 for steady cruise, 1 for a full reversal', () => {
|
|
expect(turnSharpness(100, 0, 100, 0, 116)).toBe(0);
|
|
expect(turnSharpness(116, 0, -116, 0, 116)).toBe(1);
|
|
expect(turnSharpness(0, 0, 60, 0, 0)).toBe(0); // junk maxSpeed is inert
|
|
});
|
|
});
|