You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zeus/website/backend/lor/spec/trie/complex_cases_spec.lua

97 lines
2.6 KiB
Lua

before_each(function()
Trie = _G.Trie
t = Trie:new()
t1 = Trie:new()
t2 = Trie:new()
end)
after_each(function()
Trie = nil
t = nil
t1 = nil
t2 = nil
_debug = nil
end)
describe("complex use cases: ", function()
it("should match the correct colon node.", function()
local n1 = t:add_node("/a/b/c/e")
local colon_n1 = t:add_node("/a/b/:name/d")
local m1 = t:match("/a/b/c/d")
--print(t:gen_graph())
assert.are.same(colon_n1, m1.node)
end)
it("same prefix while different suffix.", function()
local n1 = t:add_node("/a/b/c/e/f")
local colon_n1 = t:add_node("/a/b/:name/d/g")
local colon_n2 = t:add_node("/a/b/:name/e/f")
local m1 = t:match("/a/b/c/d/g")
assert.are.same(colon_n1, m1.node)
local m2 = t:match("/a/b/other/e/f")
assert.are.same(colon_n2, m2.node)
end)
it("confused prefix node", function()
local n1 = t:add_node("/people/:id")
local n2 = t:add_node("/people/list/:id")
local n3 = t:add_node("/people/list")
local m1 = t:match("/people/123")
assert.are.same(n1, m1.node)
local m2 = t:match("/people/list")
assert.are.same(n3, m2.node)
local m3 = t:match("/people/list/123")
assert.are.same(n2, m3.node)
local m4 = t:match("/people/list/123/456")
assert.are.same(nil, m4.node)
end)
it("should succeed to match colon & common node.", function()
local n1 = t:add_node("/user")
local n2 = t:add_node("/user/123")
local n3 = t:add_node("/user/:id/create")
local m1 = t:match("/user/123/create")
assert.are.same(n3, m1.node) -- should not match n2
assert.is.equals("123", m1.params["id"])
end)
it("a complicated example.", function()
local n1 = t:add_node("/a/:p1/:p2/:p3/g")
local n2 = t:add_node("/a/:p1/:p2/f/h")
local n3 = t:add_node("/a/:p1/:p2/f")
local n4 = t:add_node("/a/:p1/e")
local n5 = t:add_node("/a/:p1/c/o")
local n6 = t:add_node("/a/d/c")
local n7 = t:add_node("/a/m")
local m1 = t:match("/a/d/c/o")
local m2 = t:match("/a/n/e/f")
local m3 = t:match("/a/n/e/f/g")
assert.are.same(n5, m1.node)
assert.is.equals("d", m1.params["p1"])
assert.are.same(n3, m2.node)
assert.is.equals("n", m2.params["p1"])
assert.is.equals("e", m2.params["p2"])
assert.are.same(n1, m3.node)
assert.is.equals("n", m3.params["p1"])
assert.is.equals("e", m3.params["p2"])
assert.is.equals("f", m3.params["p3"])
end)
end)