39 lines
1.9 KiB
JavaScript
39 lines
1.9 KiB
JavaScript
const assert = require('node:assert/strict')
|
|
const snake = require('../src/common/snake.js')
|
|
assert.ok(snake.ARENA, 'shared circular arena exists')
|
|
const a = snake.ARENA
|
|
assert.equal(a.cell,32); assert.equal(a.radius,184); assert.equal(a.offset,57)
|
|
assert.equal(a.cells.length,89)
|
|
const widths=[]
|
|
for(let y=0;y<a.size;y++) {
|
|
const row=a.cells.filter(c=>c.y===y); widths.push(row.length)
|
|
for(const c of row) {
|
|
const dx=Math.abs(a.offset+(c.x+.5)*a.cell-233)+a.cell/2
|
|
const dy=Math.abs(a.offset+(c.y+.5)*a.cell-233)+a.cell/2
|
|
assert.ok(dx*dx+dy*dy<=a.radius*a.radius,'whole tile inside circle')
|
|
}
|
|
}
|
|
assert.deepEqual(widths,[3,7,9,9,11,11,11,9,9,7,3])
|
|
assert.ok(snake.initialSnake().every(c=>a.cells.some(p=>p.x===c.x&&p.y===c.y)))
|
|
// Exhaust every varying row/column boundary, including shortest rows.
|
|
for(const horizontal of [true,false]) for(let line=0;line<a.size;line++) {
|
|
const span=horizontal?a.rows[line]:a.columns[line]
|
|
for(const sign of [-1,1]) {
|
|
const edge=sign===1?span[span.length-1]:span[0], opposite=sign===1?span[0]:span[span.length-1]
|
|
const c=v=>horizontal?{x:v,y:line}:{x:line,y:v}
|
|
const dir=horizontal?{x:sign,y:0}:{x:0,y:sign}
|
|
const cells=[c(edge),c(edge-sign),c(edge-sign*2)]
|
|
assert.equal(snake.step(cells,dir,null,a,'classic').alive,false)
|
|
const r=snake.step(cells,dir,null,a,'wrap')
|
|
assert.equal(r.alive,true); assert.deepEqual(r.snake[0],c(opposite))
|
|
assert.deepEqual(snake.renderPieces(r.snake,dir,a),[horizontal?(sign===1?'head_e':'head_w'):(sign===1?'head_s':'head_n'),horizontal?'body_h':'body_v',horizontal?(sign===1?'tail_w':'tail_e'):(sign===1?'tail_n':'tail_s')])
|
|
}
|
|
}
|
|
const original=Math.random
|
|
try {
|
|
Math.random=()=>0
|
|
for(const empty of a.cells) assert.deepEqual(snake.spawnFood(a.cells.filter(c=>c!==empty),a),empty)
|
|
assert.equal(snake.spawnFood(a.cells,a),null)
|
|
} finally {Math.random=original}
|
|
console.log('ROUND ARENA GEOMETRY / MOVEMENT / FOOD / SEAMS PASS')
|