import { assert } from 'chai'; import { hashInt32 } from '../../../../lib/functional/hash/murmurhash'; import { HexagonalGrid } from '../../../../lib/graphics/grids/HexagonalGrid'; import { Hexagon } from '../../../../lib/graphics/grids/Hexagon'; function hashIntHexagon(hex: Hexagon, seed?: number) { seed = hashInt32(hex.q, seed); seed = hashInt32(hex.r, seed); seed = hashInt32(hex.s, seed); return seed; } function arrayToHexagons(array: number[], width: number) { return array.map((value, index) => [value, index]) .filter(([value, _]) => value === 0) .map(([_, index]) => Hexagon.fromAxial(index % width, index / width | 0)) } describe('graphics.grids.HexagonalGrid', () => { const map = [ // 0, 1, 2, 3, 4, 5, 6 1, 1, 1, 0, 0, 0, 0, // 0 1, 1, 0, 1, 1, 0, 0, // 1 1, 0, 0, 0, 1, 1, 0, // 2 0, 1, 1, 0, 1, 0, 0, // 3 0, 0, 1, 1, 1, 0, 1, // 4 1, 1, 0, 0, 0, 1, 1, // 5 0, 1, 0, 0, 1, 1, 1, // 6 ]; describe('dijkstraSearch', () => { const grid = new HexagonalGrid(hashIntHexagon, Hexagon.equal, arrayToHexagons(map, 7)); test.each([ [ grid, Hexagon.fromAxial(6, 0), Hexagon.fromAxial(1, 4), [ Hexagon.fromAxial(1, 4), Hexagon.fromAxial(0, 4), Hexagon.fromAxial(0, 3), Hexagon.fromAxial(1, 2), Hexagon.fromAxial(2, 1), Hexagon.fromAxial(3, 0), Hexagon.fromAxial(4, 0), Hexagon.fromAxial(5, 0), Hexagon.fromAxial(6, 0) ], undefined, undefined ], [ grid, Hexagon.fromAxial(1, 4), Hexagon.fromAxial(6, 0), [ Hexagon.fromAxial(6, 0), Hexagon.fromAxial(5, 0), Hexagon.fromAxial(4, 0), Hexagon.fromAxial(3, 0), Hexagon.fromAxial(2, 1), Hexagon.fromAxial(1, 2), Hexagon.fromAxial(0, 3), Hexagon.fromAxial(0, 4), Hexagon.fromAxial(1, 4) ], undefined, undefined ], [ grid, Hexagon.fromAxial(1, 4), Hexagon.fromAxial(6, 0), [ Hexagon.fromAxial(6, 0), Hexagon.fromAxial(5, 0), Hexagon.fromAxial(4, 0), Hexagon.fromAxial(3, 0), Hexagon.fromAxial(2, 1), Hexagon.fromAxial(1, 2), Hexagon.fromAxial(0, 3), Hexagon.fromAxial(0, 4), Hexagon.fromAxial(1, 4) ], function (this: any, current: Hexagon, _: HexagonalGrid) { return this.target.equals(current) }, { target: Hexagon.fromAxial(6, 0) } ], [ grid, Hexagon.fromAxial(0, 6), Hexagon.fromAxial(6, 0), [], undefined, undefined ], ])('dijkstraSearch#%#', (grid: HexagonalGrid, source: Hexagon, target: Hexagon, result: Hexagon[], visitfn?: (u: Hexagon, grid: HexagonalGrid) => boolean, thisArg?: any) => { const search = grid.dijkstraSearch(source, visitfn, thisArg); const path = grid.findPath(search, source, target); assert.deepEqual(path, result); }); }); describe('breadthFirstSearch', () => { const grid = new HexagonalGrid(); arrayToHexagons(map, 7).forEach(hex => { grid.add(hex); }); test.each([ [ grid, Hexagon.fromAxial(6, 0), Hexagon.fromAxial(1, 4), [ Hexagon.fromAxial(1, 4), Hexagon.fromAxial(0, 4), Hexagon.fromAxial(0, 3), Hexagon.fromAxial(1, 2), Hexagon.fromAxial(2, 1), Hexagon.fromAxial(3, 0), Hexagon.fromAxial(4, 0), Hexagon.fromAxial(5, 0), Hexagon.fromAxial(6, 0) ], undefined, undefined ], [ grid, Hexagon.fromAxial(1, 4), Hexagon.fromAxial(6, 0), [ Hexagon.fromAxial(6, 0), Hexagon.fromAxial(5, 0), Hexagon.fromAxial(4, 0), Hexagon.fromAxial(3, 0), Hexagon.fromAxial(2, 1), Hexagon.fromAxial(1, 2), Hexagon.fromAxial(0, 3), Hexagon.fromAxial(0, 4), Hexagon.fromAxial(1, 4) ], undefined, undefined ], [ grid, Hexagon.fromAxial(1, 4), Hexagon.fromAxial(6, 0), [ Hexagon.fromAxial(6, 0), Hexagon.fromAxial(5, 0), Hexagon.fromAxial(4, 0), Hexagon.fromAxial(3, 0), Hexagon.fromAxial(2, 1), Hexagon.fromAxial(1, 2), Hexagon.fromAxial(0, 3), Hexagon.fromAxial(0, 4), Hexagon.fromAxial(1, 4) ], function (this: any, current: Hexagon, _: HexagonalGrid) { return this.target.equals(current) }, { target: Hexagon.fromAxial(6, 0) } ], [ grid, Hexagon.fromAxial(0, 6), Hexagon.fromAxial(6, 0), [], undefined, undefined ], ])('breadthFirstSearch#%#', (grid: HexagonalGrid, source: Hexagon, target: Hexagon, result: Hexagon[], visitfn?: (u: Hexagon, grid: HexagonalGrid) => boolean, thisArg?: any) => { const search = grid.breadthFirstSearch(source, visitfn, thisArg); const path = grid.findPath(search, source, target); assert.deepEqual(path, result); }); }); });