1 describe("Lua star", function()
3 -- start is always top left (1,1)
4 -- goal is always bottom right (10, 10)
5 local start = { x = 1, y = 1, z = 1 }
6 local goal = { x = 10, y = 10, z = 1 }
9 -- define some test maps (10 x 10)
24 local openmapSolution = {
25 { x = 1, y = 1, z = 1 },
26 { x = 2, y = 2, z = 1 },
27 { x = 3, y = 3, z = 1 },
28 { x = 4, y = 4, z = 1 },
29 { x = 5, y = 5, z = 1 },
30 { x = 6, y = 6, z = 1 },
31 { x = 7, y = 7, z = 1 },
32 { x = 8, y = 8, z = 1 },
33 { x = 9, y = 9, z = 1 },
34 { x = 10, y = 10, z = 1 },
50 local simplemapSolution = {
51 { x = 1, y = 1, z = 1 },
52 { x = 2, y = 2, z = 1 },
53 { x = 3, y = 3, z = 1 },
54 { x = 4, y = 4, z = 1 },
55 { x = 4, y = 5, z = 1 },
56 { x = 3, y = 6, z = 1 },
57 { x = 2, y = 7, z = 1 },
58 { x = 1, y = 8, z = 1 },
59 { x = 2, y = 9, z = 1 },
60 { x = 3, y = 10, z = 1 },
61 { x = 4, y = 10, z = 1 },
62 { x = 5, y = 10, z = 1 },
63 { x = 6, y = 10, z = 1 },
64 { x = 7, y = 10, z = 1 },
65 { x = 8, y = 10, z = 1 },
66 { x = 9, y = 10, z = 1 },
67 { x = 10, y = 10, z = 1 },
70 local simplemapDiagonalSolution = {
71 { x = 1, y = 1, z = 1 },
72 { x = 1, y = 2, z = 1 },
73 { x = 1, y = 3, z = 1 },
74 { x = 1, y = 4, z = 1 },
75 { x = 1, y = 5, z = 1 },
76 { x = 1, y = 6, z = 1 },
77 { x = 1, y = 7, z = 1 },
78 { x = 1, y = 8, z = 1 },
79 { x = 1, y = 9, z = 1 },
80 { x = 2, y = 9, z = 1 },
81 { x = 3, y = 9, z = 1 },
82 { x = 4, y = 9, z = 1 },
83 { x = 5, y = 9, z = 1 },
84 { x = 6, y = 9, z = 1 },
85 { x = 7, y = 9, z = 1 },
86 { x = 8, y = 9, z = 1 },
87 { x = 9, y = 9, z = 1 },
88 { x = 9, y = 10, z = 1 },
89 { x = 10, y = 10, z = 1 },
105 local complexmapSolution = {
106 { x = 1, y = 1, z = 1 },
107 { x = 2, y = 1, z = 1 },
108 { x = 3, y = 1, z = 1 },
109 { x = 4, y = 1, z = 1 },
110 { x = 5, y = 1, z = 1 },
111 { x = 6, y = 1, z = 1 },
112 { x = 7, y = 1, z = 1 },
113 { x = 8, y = 1, z = 1 },
114 { x = 9, y = 1, z = 1 },
115 { x = 10, y = 2, z = 1 },
116 { x = 9, y = 3, z = 1 },
117 { x = 8, y = 3, z = 1 },
118 { x = 7, y = 3, z = 1 },
119 { x = 6, y = 3, z = 1 },
120 { x = 5, y = 3, z = 1 },
121 { x = 4, y = 3, z = 1 },
122 { x = 3, y = 3, z = 1 },
123 { x = 2, y = 3, z = 1 },
124 { x = 1, y = 4, z = 1 },
125 { x = 1, y = 5, z = 1 },
126 { x = 1, y = 6, z = 1 },
127 { x = 2, y = 7, z = 1 },
128 { x = 3, y = 6, z = 1 },
129 { x = 4, y = 5, z = 1 },
130 { x = 5, y = 6, z = 1 },
131 { x = 5, y = 7, z = 1 },
132 { x = 5, y = 8, z = 1 },
133 { x = 6, y = 9, z = 1 },
134 { x = 7, y = 9, z = 1 },
135 { x = 8, y = 8, z = 1 },
136 { x = 7, y = 7, z = 1 },
137 { x = 7, y = 6, z = 1 },
138 { x = 8, y = 5, z = 1 },
139 { x = 9, y = 6, z = 1 },
140 { x = 10, y = 7, z = 1 },
141 { x = 10, y = 8, z = 1 },
142 { x = 10, y = 9, z = 1 },
143 { x = 10, y = 10, z = 1 },
146 local unsolvablemap = [[
159 -- convert a string map into a table
160 local function makemap(template)
162 template:gsub(".", function(c)
163 if c == "0" or c == "1" then
169 -- get the value at position xy on a map
170 local function mapTileIsOpen(x, y, z)
171 return z == 1 and map[ ((y-1) * 10) + x ] == "0"
174 local function printSolution(path)
175 print(#path, "points")
176 for i, v in ipairs(path) do
177 print(string.format("{ x = %d, y = %d },", v.x, v.y))
182 for _, p in ipairs(path) do
183 if p.x == w and p.y == h then
199 it("find a path with no obstacles", function()
201 local luastar = require("lua-star")
203 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen)
204 --printSolution(path)
205 assert.are.equal(10, #path)
206 assert.are.same(openmapSolution, path)
210 it("find a path on a simple map", function()
212 local luastar = require("lua-star")
214 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen)
215 --printSolution(path)
216 assert.are.equal(17, #path)
217 assert.are.same(simplemapSolution, path)
221 it("find a path on a simple map without diagonam movement", function ()
223 local luastar = require("lua-star")
224 local excludeDiagonals = true
226 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen, false, excludeDiagonals)
227 --printSolution(path)
228 assert.are.equal(19, #path)
229 assert.are.same(simplemapDiagonalSolution, path)
233 it("find a path on a complex map", function()
235 local luastar = require("lua-star")
237 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen)
238 --printSolution(path)
239 assert.are.equal(38, #path)
240 assert.are.same(complexmapSolution, path)
244 it("find no path", function()
246 local luastar = require("lua-star")
247 makemap(unsolvablemap)
248 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen)
249 assert.is_false(path)
253 it("find no diagonal path", function()
255 local luastar = require("lua-star")
256 local excludeDiagonals = true
257 makemap(unsolvablemap)
258 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen, false, excludeDiagonals)
259 assert.is_false(path)
263 it("find no diagonal path on a complex map", function()
265 local luastar = require("lua-star")
266 local excludeDiagonals = true
268 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen, false, excludeDiagonals)
269 assert.is_false(path)
273 it("does not cache paths by default", function()
275 local luastar = require("lua-star")
277 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen)
278 local samepath = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen)
279 assert.is_not.equal(path, samepath)
283 it("caches paths", function()
285 local luastar = require("lua-star")
287 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen, true)
288 local samepath = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen, true)
289 assert.are.equal(path, samepath)
293 it("clears cached paths", function()
295 local luastar = require("lua-star")
297 local path = luastar:find(mapsize, mapsize, 1, start, goal, mapTileIsOpen, true)
298 luastar:clearCached()
299 assert.is_nil(luastar.cache)