feat(game): NAVIGATION AI unlocks two-hop jumps in one action (#35)
CI / build + unit + e2e (pull_request) Failing after 3m11s
CI / build + unit + e2e (pull_request) Failing after 3m11s
This commit is contained in:
+35
-1
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { bodyRng, explorationRng, generatePlanets, generateRing, generateStartRegion, makeName, mulberry32, rollExploration } from './world'
|
||||
import { bodyRng, explorationRng, generatePlanets, generateRing, generateStartRegion, makeName, mulberry32, reachableWithin, rollExploration } from './world'
|
||||
|
||||
describe('generateStartRegion', () => {
|
||||
const region = generateStartRegion(mulberry32(42))
|
||||
@@ -145,3 +145,37 @@ describe('rollExploration', () => {
|
||||
expect(shapes).toEqual(new Set(['rp', 'r-', '-p', '--']))
|
||||
})
|
||||
})
|
||||
|
||||
describe('reachableWithin (#35 jump range)', () => {
|
||||
// Chain 1—2—3—4 with a branch off 2: 2—5. Distances from 1: 2→1, 3/5→2, 4→3.
|
||||
const edges: [number, number][] = [[1, 2], [2, 3], [3, 4], [2, 5]]
|
||||
|
||||
it('maxHops=1 returns only direct neighbours at distance 1 (the pre-NAV-AI range)', () => {
|
||||
expect(reachableWithin(edges, 1, 1)).toEqual(new Map([[2, 1]]))
|
||||
})
|
||||
|
||||
it('maxHops=2 adds the two-hop systems and stops before three', () => {
|
||||
expect(reachableWithin(edges, 1, 2)).toEqual(new Map([ [2, 1], [3, 2], [5, 2] ]))
|
||||
})
|
||||
|
||||
it('larger maxHops keeps walking until the graph is exhausted', () => {
|
||||
expect(reachableWithin(edges, 1, 5)).toEqual(new Map([ [2, 1], [3, 2], [5, 2], [4, 3] ]))
|
||||
})
|
||||
|
||||
it('never includes the origin and handles empty/isolated input', () => {
|
||||
expect(reachableWithin(edges, 1, 3).has(1)).toBe(false)
|
||||
expect(reachableWithin([], 1, 2)).toEqual(new Map())
|
||||
expect(reachableWithin([[9, 10]], 1, 2)).toEqual(new Map())
|
||||
})
|
||||
|
||||
it('accepts double-directed route rows (the save.ts input shape) identically', () => {
|
||||
const directed: [number, number][] = [[1, 2], [2, 1], [2, 3], [3, 2]]
|
||||
expect(reachableWithin(directed, 1, 2)).toEqual(new Map([ [2, 1], [3, 2] ]))
|
||||
})
|
||||
|
||||
it('on a fresh start region every system is one hop away — two-hop targets only exist after an expansion', () => {
|
||||
const region = generateStartRegion(mulberry32(42)) // edges index into [start, ...neighbors], start = 0
|
||||
expect(reachableWithin(region.edges, 0, 1).size).toBe(region.neighbors.length)
|
||||
expect(reachableWithin(region.edges, 0, 2).size).toBe(region.neighbors.length)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user