]> git.lizzy.rs Git - lua-star.git/blobdiff - tests/lua-star_spec.lua
Add lua star, example and documentation.
[lua-star.git] / tests / lua-star_spec.lua
diff --git a/tests/lua-star_spec.lua b/tests/lua-star_spec.lua
new file mode 100644 (file)
index 0000000..65a8722
--- /dev/null
@@ -0,0 +1,250 @@
+describe("Lua star", function()
+
+    -- start is always top left (1,1)
+    -- goal is always bottom right (10, 10)
+    local start = { x = 1, y = 1 }
+    local goal = { x = 10, y = 10 }
+    local map = nil
+
+    -- define some test maps (10 x 10)
+    local mapsize = 10
+    local openmap = [[
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                ]]
+
+    local openmapSolution = {
+        { x = 1, y = 1 },
+        { x = 2, y = 2 },
+        { x = 3, y = 3 },
+        { x = 4, y = 4 },
+        { x = 5, y = 5 },
+        { x = 6, y = 6 },
+        { x = 7, y = 7 },
+        { x = 8, y = 8 },
+        { x = 9, y = 9 },
+        { x = 10, y = 10 },
+    }
+
+    local simplemap = [[
+                0000000000
+                0000000110
+                0000001110
+                0000011100
+                0000111000
+                0001110000
+                0011100000
+                0111000000
+                0000000000
+                0000000000
+                ]]
+
+    local simplemapSolution = {
+        { x = 1, y = 1 },
+        { x = 2, y = 2 },
+        { x = 3, y = 3 },
+        { x = 4, y = 4 },
+        { x = 4, y = 5 },
+        { x = 3, y = 6 },
+        { x = 2, y = 7 },
+        { x = 1, y = 8 },
+        { x = 2, y = 9 },
+        { x = 3, y = 10 },
+        { x = 4, y = 10 },
+        { x = 5, y = 10 },
+        { x = 6, y = 10 },
+        { x = 7, y = 10 },
+        { x = 8, y = 10 },
+        { x = 9, y = 10 },
+        { x = 10, y = 10 },
+    }
+
+    local complexmap = [[
+                0000000000
+                1111111110
+                0000000000
+                0111111111
+                0100110000
+                0101010100
+                0001010110
+                1111011010
+                0000000010
+                0000000010
+                ]]
+
+    local complexmapSolution = {
+        { x = 1, y = 1 },
+        { x = 2, y = 1 },
+        { x = 3, y = 1 },
+        { x = 4, y = 1 },
+        { x = 5, y = 1 },
+        { x = 6, y = 1 },
+        { x = 7, y = 1 },
+        { x = 8, y = 1 },
+        { x = 9, y = 1 },
+        { x = 10, y = 2 },
+        { x = 9, y = 3 },
+        { x = 8, y = 3 },
+        { x = 7, y = 3 },
+        { x = 6, y = 3 },
+        { x = 5, y = 3 },
+        { x = 4, y = 3 },
+        { x = 3, y = 3 },
+        { x = 2, y = 3 },
+        { x = 1, y = 4 },
+        { x = 1, y = 5 },
+        { x = 1, y = 6 },
+        { x = 2, y = 7 },
+        { x = 3, y = 6 },
+        { x = 4, y = 5 },
+        { x = 5, y = 6 },
+        { x = 5, y = 7 },
+        { x = 5, y = 8 },
+        { x = 6, y = 9 },
+        { x = 7, y = 9 },
+        { x = 8, y = 8 },
+        { x = 7, y = 7 },
+        { x = 7, y = 6 },
+        { x = 8, y = 5 },
+        { x = 9, y = 6 },
+        { x = 10, y = 7 },
+        { x = 10, y = 8 },
+        { x = 10, y = 9 },
+        { x = 10, y = 10 },
+    }
+
+    local unsolvablemap = [[
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                1111111111
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                0000000000
+                ]]
+
+    -- convert a string map into a table
+    local function makemap(template)
+        map = { }
+        template:gsub(".", function(c)
+            if c == "0" or c == "1" then
+                table.insert(map, c)
+            end
+        end)
+    end
+
+    -- get the value at position xy on a map
+    local function mapTileIsOpen(x, y)
+        return map[ ((y-1) * 10) + x ] == "0"
+    end
+
+    local function printSolution(path)
+        print(#path, "points")
+        for i, v in ipairs(path) do
+            print(string.format("{ x = %d, y = %d },", v.x, v.y))
+        end
+        for h=1, mapsize do
+            for w=1, mapsize do
+                local walked = false
+                for _, p in ipairs(path) do
+                    if p.x == w and p.y == h then
+                        walked = true
+                    end
+                end
+                if walked then
+                    io.write(".")
+                else
+                    io.write("#")
+                end
+            end
+            io.write("\n")
+        end
+    end
+
+    -- begin tests
+
+    it("find a path with no obstacles", function()
+
+        local luastar = require("lua-star")
+        makemap(openmap)
+        local path = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen)
+        --printSolution(path)
+        assert.are.equal(10, #path)
+        assert.are.same(openmapSolution, path)
+
+    end)
+
+    it("find a path on a simple map", function()
+
+        local luastar = require("lua-star")
+        makemap(simplemap)
+        local path = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen)
+        --printSolution(path)
+        assert.are.equal(17, #path)
+        assert.are.same(simplemapSolution, path)
+
+    end)
+
+    it("find a path on a complex map", function()
+
+        local luastar = require("lua-star")
+        makemap(complexmap)
+        local path = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen)
+        --printSolution(path)
+        assert.are.equal(38, #path)
+        assert.are.same(complexmapSolution, path)
+
+    end)
+
+    it("find no path", function()
+
+        local luastar = require("lua-star")
+        makemap(unsolvablemap)
+        local path = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen)
+        assert.is_false(path)
+
+    end)
+
+    it("does not cache paths by default", function()
+
+        local luastar = require("lua-star")
+        makemap(openmap)
+        local path = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen)
+        local samepath = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen)
+        assert.is_not.equal(path, samepath)
+
+    end)
+
+    it("caches paths", function()
+
+        local luastar = require("lua-star")
+        makemap(openmap)
+        local path = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen, true)
+        local samepath = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen, true)
+        assert.are.equal(path, samepath)
+
+    end)
+
+    it("clears cached paths", function()
+
+        local luastar = require("lua-star")
+        makemap(openmap)
+        local path = luastar:find(mapsize, mapsize, start, goal, mapTileIsOpen, true)
+        luastar:clearCached()
+        assert.is_nil(luastar.cache)
+
+    end)
+
+end)
+