import { test as base, expect } from 'vitest' import { Agent, Cell } from '.' import { CellGrid } from '../structures' class TestAgent extends Agent { constructor(opts) { super(opts) } public act() { return } } interface TestFixture { agent: Agent grid: CellGrid } const test = base.extend({ agent: new TestAgent({ initialPosition: [0, 0], randomSeed: 0, }), grid: CellGrid.default(10) }) test('It should be initialized with default values', ({ agent }) => { expect(agent.energy).toBeCloseTo(1) expect(agent.rotation.asRadians()).toBeCloseTo(0) expect(agent.sightRange).toBe(10) expect(agent.fov.asDegrees()).toBe(90) expect(agent.traitMutationRate).toBe(0.01) expect(agent.traitCrossoverRate).toBe(0.5) expect(agent.color.toHex()).toBe('#00ff') }) test('It should move to a neighboring cell', ({ agent, grid }) => { expect(agent.previousPosition.components).toEqual([0, 0]) agent.moveTo(grid, [0, 1]) expect(agent.previousPosition.components).toEqual([0, 0]) expect(agent.position.components).toEqual([0, 1]) expect(agent.energy).toBeCloseTo(1) expect(agent.rotation.asDegrees()).toBeCloseTo(90) }) test('It should move a specified distance', ({ agent, grid }) => { agent.move(grid, 1) expect(agent.previousPosition.components).toEqual([0, 1]) expect(agent.position.components[0]).toBeCloseTo(0) expect(agent.position.components[1]).toBeCloseTo(2) expect(agent.energy).toBeCloseTo(1) expect(agent.rotation.asDegrees()).toBeCloseTo(90) }) test('It should rotate to face a given cell', ({ agent, grid }) => { expect(agent.rotation.asDegrees()).toBeCloseTo(90) const cell = grid.getCell([1,1])! agent.faceCell(cell) expect(agent.rotation.asDegrees()).toBeCloseTo(-45) }) test('It should get neighboring cells', ({ agent, grid}) => { agent.moveTo(grid, [5, 5]) const neighbors = agent.getNeighborCells(grid) const expectedNeighbors = [ [4,5], [6,5], [5,4], [5,6], ] expect(neighbors.map(cell => cell.location)).toEqual(expectedNeighbors) }) // test('It should eat to regain energy', ({ agent }) => { // expect(agent.energy).toBeCloseTo(1) // agent.eat() // expect(agent.energy).toBeCloseTo(2) // })