Mock sr reworked.

NGCPXAvp just for caller/callee
squeeze-backports
Victor Seva 13 years ago
parent d10eb3a14b
commit a5f9d77b65

@ -6,7 +6,7 @@ require 'ngcp.utils'
pvMock = {
__class__ = 'pvMock',
vars = {},
_logger = logging.file("reports/sr_pv_%s.log", "%Y-%m-%d"),
_logger = logging.file('reports/sr_pv_%s.log', '%Y-%m-%d'),
_logger_levels = {
dbg = logging.DEBUG,
info = logging.INFO,
@ -21,41 +21,167 @@ pvMock = {
t.__class__ = 'pvMock'
t.vars = {}
function t.get(id)
if type(t.vars[id]) == 'table' then
return t.vars[id]:list()
function t._is_xavp(id)
local _id, indx, key
local patterns = {
'%$xavp%(([%w_]+)=>([%w_]+)%)$',
'%$xavp%(([%w_^%[]+)%[(%d+)%]=>([%w_]+)%)$'
}
for _,v in pairs(patterns) do
for _id, indx, key in string.gmatch(id, v) do
if not key then
key = indx
indx = nil
else
return t.vars[id]
indx = tonumber(indx)
end
return { id=_id, key=key, indx=indx, type='xavp' }
end
end
end
function t._addvalue(id, value)
if string.starts(id, "$xavp(") then
local l = explode("=>", id)
-- $xavp(key=>key2) -> $xavp(key[0]=>key2)
if not string.ends(l[1],"]") then
id = l[1] .. "[0]=>" .. l[2]
function t._clean_id(id)
local k
k = string.gsub(id, 's:', '')
k = string.gsub(k, 'i:', '')
return k
end
function t._is_avp(id)
local i, _id
local patterns = {
'%$avp%(([%w_]+)%)$',
'%$%(avp%(([%w_]+)%)%)$',
'%$%(avp%(([%w_]+)%)%[%*%]%)$'
}
_id = t._clean_id(id)
for _,v in pairs(patterns) do
for i in string.gmatch(_id, v) do
return { id=i, clean=(v==patterns[3]), type='avp' }
end
end
end
function t._is_var(id)
local key, _, v
local patterns = {
'%$var%(([%w_]+)%)$',
'%$%(var%(([%w_]+)%)%)$',
}
for _,v in pairs(patterns) do
for key in string.gmatch(id, v) do
return { id=key, clean=false, type='var' }
end
end
end
function t._is(id)
if not id then
error("id empty")
end
local result = t._is_xavp(id)
if not result then
result = t._is_avp(id)
end
if not result then
result = t._is_var(id)
end
if not result then
error(string.format("not implemented or wrong id:%s", id))
end
result.private_id = result.type .. ':' .. result.id
return result
end
function t.get(id)
local result = t._is(id)
if not result then
return
end
if result.type == 'var' then
return t.vars[result.private_id]
elseif result.type == 'xavp' then
if not result.indx then
result.indx = 0
end
if not t.vars[result.private_id] then
return
end
if string.ends(id,"[*]") then
result.real_indx = #t.vars[result.private_id]._et - result.indx
if t.vars[result.private_id]._et[result.real_indx] then
--print(string.format("t.vars[%s]._et[%d]:%s", result.private_id, result.real_indx, table.tostring(t.vars[result.private_id]._et[result.indx+1])))
return t.vars[result.private_id]._et[result.real_indx][result.key]
end
elseif result.type == 'avp' then
if result.clean then
return t.vars[result.private_id]:list()
end
if t.vars[result.private_id] then
local l = t.vars[result.private_id]:list()
if #l == 1 then
return l[1]
end
end
end
end
function t._addvalue_new(result, value)
local temp
if result.type == 'var' then
t.vars[result.private_id] = value
elseif result.type == 'xavp' then
if not result.indx then
result.indx = 0
end
if result.indx ~= 0 then
error(string.format("xavp(%s) has not been initilizated", result.id))
end
t.vars[result.private_id] = Stack:new()
temp = {}
temp[result.key] = value
t.vars[result.private_id]:push(temp)
elseif result.type == 'avp' then
t.vars[result.private_id] = Stack:new()
t.vars[result.private_id]:push(value)
end
end
function t._addvalue_with_value(result, value)
local temp
if result.type == 'var' then
t.vars[result.private_id] = value
elseif result.type == 'xavp' then
if not result.indx then
temp = {}
temp[result.key] = value
t.vars[result.private_id]:push(temp)
else
result.real_indx = #t.vars[result.private_id]._et - result.indx
if not t.vars[result.private_id]._et[result.real_indx] then
error(string.format("xavp(%s[%d] does not exist", result.id, result.indx))
end
t.vars[result.private_id]._et[result.real_indx][result.key] = value
end
elseif result.type == 'avp' then
t.vars[result.private_id]:push(value)
end
end
function t._addvalue(id, value)
local result = t._is(id)
if result.clean then
-- clean var
id = string.sub(id,1,-4)
t.log("dbg",string.format("sr.pv erase [%s]", id))
t.vars[id] = nil
end
if not t.vars[id] then
t.vars[id] = value
t.log("dbg", string.format("sr.pv added [%s]:%s", id, value))
elseif type(t.vars[id]) == 'table' then
t.vars[id]:push(value)
t.log("dbg", string.format("sr.pv push [%s]:%s", id, value))
t.log("dbg",string.format("sr.pv erase avp[%s]", result.id))
t.vars[result.private_id] = nil
end
if not t.vars[result.private_id] then
t._addvalue_new(result, value)
else
local old = t.vars[id]
t.vars[id] = Stack:new()
t.vars[id]:push(old, value)
t.log("dbg", string.format("sr.pv push [%s]:%s", id, value))
t._addvalue_with_value(result, value)
end
t.log("dbg", string.format("sr.pv [%s]:%s", id, tostring(t.vars[id])))
t.log("dbg", string.format("sr.pv vars:%s", table.tostring(t.vars)))
end
function t.seti(id, value)
@ -73,27 +199,28 @@ pvMock = {
end
function t.unset(id)
if string.starts(id, "$xavp(") then
local l = explode("=>", id)
local s = l[1]
if #l == 1 then
-- remove the last ')' char
s = string.sub(l[1],1,string.len(l[1])-1)
end
for k,_ in pairs(t.vars) do
if string.starts(k,s) then
--print("clean: " .. k)
t.vars[k] = nil
local result = t._is(id)
if result.type == 'xavp' then
if not result.indx then
result.indx = 0
end
if t.vars[result.private_id] then
result.real_indx = #t.vars[result.private_id]._et - result.indx
t.vars[result.private_id]._et[result.real_indx] = nil
end
else
--print("clean: " .. id)
t.vars[id] = nil
elseif result.type == 'avp' then
t.vars[result.private_id] = nil
elseif result.type == 'var' then
t.vars[result.private_id] = nil
end
end
function t.is_null(id)
if not t.vars[id] then
local result = t._is(id)
if not result then
return true
end
if not t.vars[result.private_id] then
return true
end
return false

@ -5,19 +5,31 @@ NGCPXAvp = {
__class__ = 'NGCPXAvp'
}
NGCPXAvp_MT = {
__index = NGCPXAvp,
__index = NGCPXAvp
}
function NGCPXAvp:new(level,group,l)
if level ~= 'caller' and level ~= 'callee' then
error("unknown level. It has to be [caller|callee]")
end
if not l or #l == 0 then
error("list empty")
end
local t = {
level = level,
group = group,
group = group
}
NGCPXAvp._create(level,group,l)
if level == 'callee' then
t.level = 1
else
t.level = 0
end
NGCPXAvp._create(t.level,group,l)
NGCPXAvp_MT.__call = function(t, key, value)
if not key then
error("key is empty")
end
local id = string.format("$xavp(%s[%d]=>%s)", t.group, t.level, key)
--print(string.format("id:%s", id))
if not value then
return sr.pv.get(id)
elseif type(value) == "number" then
@ -33,21 +45,42 @@ NGCPXAvp_MT = {
end
function NGCPXAvp._setvalue(id, vtype, value)
local check = nil
-- sr.log("info", string.format("vtype:[%s]:%d", type(vtype), vtype))
if type(vtype) == "string" then
vtype = tonumber(vtype)
end
if vtype == 0 then
sr.log("info",string.format("sr.pv.sets->%s:%s", id, value))
sr.pv.sets(id, value)
elseif vtype == 1 then
if type(value) == "string" then
value = tonumber(value)
end
sr.pv.seti(id, value)
else
sr.log("err",string.format("can't set value:%s of type:%d", value, vtype))
end
if value and id then
check = sr.pv.get(id)
if check then
if type(check) == 'table' then
check = table.tostring(check)
end
sr.log("info", string.format("%s:%s", id, check))
else
sr.log("err", string.format("%s:nil", id))
end
end
end
function NGCPXAvp._create(level, group, l)
local i, name
-- create dummy vars
name = string.format("$xavp(%s=>%s)[*]", group, 'dummy')
sr.pv.sets(name, "")
name = string.format("$xavp(%s=>dummy)", group)
NGCPXAvp._setvalue(name, 0, "callee") -- callee -> [1]
name = string.format("$xavp(%s=>dummy)", group)
NGCPXAvp._setvalue(name, 0, "caller") -- caller -> [0]
for i=1,#l do
name = string.format("$xavp(%s[%d]=>%s)", group, level, l[i].attribute)
NGCPXAvp._setvalue(name, l[i].type, l[i].value)
@ -58,7 +91,7 @@ NGCPXAvp_MT = {
--print("NGCPXAvp:clean")
--print(table.tostring(getmetatable(self)))
--print(table.tostring(self))
sr.pv.unset(string.format("$xavp(%s[%d])", self.group, self.level))
sr.pv.unset(string.format("$xavp(%s)", self.group))
end
-- class
--EOF

@ -24,30 +24,166 @@ TestSRMock = {}
assertTrue(self.sr.pv)
end
function TestSRMock:test_sets()
function TestSRMock:test_clean_id()
assertEquals(self.sr.pv._clean_id('s:u25'), 'u25')
assertEquals(self.sr.pv._clean_id('i:u25'), 'u25')
assertEquals(self.sr.pv._clean_id('u25'), 'u25')
end
function TestSRMock:test_is_xavp_simple()
local result
result = self.sr.pv._is_xavp("$xavp(id=>key)")
assertTrue(result)
assertEquals(result.type, 'xavp')
assertEquals(result.id, 'id')
assertEquals(result.key, 'key')
assertFalse(result.clean)
end
function TestSRMock:test_is_xavp_complex()
local result
result = self.sr.pv._is_xavp("$xavp(id1[8]=>key3g2)")
assertTrue(result)
assertEquals(result.type, 'xavp')
assertEquals(result.id, 'id1')
assertEquals(result.key, 'key3g2')
assertEquals(result.indx, 8)
assertFalse(result.clean)
result = self.sr.pv._is_xavp("$xavp(id2g1f[9]=>keygg33_f)")
assertTrue(result)
assertEquals(result.type, 'xavp')
assertEquals(result.id, 'id2g1f')
assertEquals(result.key, 'keygg33_f')
assertEquals(result.indx, 9)
assertFalse(result.clean)
end
function TestSRMock:test_is_avp_simple()
local result
result = self.sr.pv._is_avp("$avp(id2_f)")
assertTrue(result)
assertEquals(result.type, 'avp')
--print(table.tostring(result))
assertEquals(result.id, 'id2_f')
assertFalse(result.clean)
end
function TestSRMock:test_is_avp_simple1()
local result
result = self.sr.pv._is_avp("$(avp(s:id))")
assertTrue(result)
assertEquals(result.type, 'avp')
--print(table.tostring(result))
assertEquals(result.id, 'id')
assertFalse(result.clean)
end
function TestSRMock:test_is_avp_simple2()
local result
result = self.sr.pv._is_avp("$(avp(s:id)[*])")
assertTrue(result)
assertEquals(result.type, 'avp')
assertEquals(result.id, 'id')
--print(table.tostring(result))
assertTrue(result.clean)
end
function TestSRMock:test_is_var_simple()
local result
result = self.sr.pv._is_var("$var(id)")
assertTrue(result)
assertEquals(result.type, 'var')
assertEquals(result.id, 'id')
--print(table.tostring(result))
assertFalse(result.clean)
end
function TestSRMock:test_var_sets()
self.sr.pv.sets("$var(hithere)", "value")
assertEquals(self.sr.pv.get("$var(hithere)"), "value")
assertError(self.sr.pv.sets, "$var(hithere)", 1)
assertError(self.sr.pv.sets, "$var(s:hithere)", "1")
assertError(self.sr.pv.sets, "$(var(hithere)[*])", "1")
assertError(self.sr.pv.sets, "$(var(s:hithere))", "1")
self.sr.pv.sets("$(var(hithere))", "new_value")
assertEquals(self.sr.pv.get("$var(hithere)"), "new_value")
assertEquals(self.sr.pv.vars["var:hithere"], "new_value")
end
function TestSRMock:test_var_seti()
self.sr.pv.seti("$var(hithere)", 0)
assertEquals(self.sr.pv.get("$var(hithere)"), 0)
assertError(self.sr.pv.seti, "$var(hithere)", "1")
assertError(self.sr.pv.sets, "$var(s:hithere)", 1)
assertError(self.sr.pv.sets, "$(var(hithere)[*])", 1)
assertError(self.sr.pv.sets, "$(var(s:hithere))", 1)
assertEquals(self.sr.pv.get("$var(hithere)"), 0)
self.sr.pv.seti("$var(hithere)", 1)
assertEquals(self.sr.pv.get("$var(hithere)"), 1)
assertEquals(self.sr.pv.vars["var:hithere"], 1)
end
function TestSRMock:test_avp_sets()
self.sr.pv.sets("$avp(s:hithere)", "value")
assertEquals(self.sr.pv.vars["$avp(s:hithere)"], "value")
assertEquals(self.sr.pv.get("$avp(s:hithere)"), "value")
assertError(self.sr.pv.sets, "$avp(s:hithere)", 1)
end
function TestSRMock:test_seti()
function TestSRMock:test_avp_sets_all()
self.sr.pv.sets("$avp(s:hithere)", "value")
assertEquals(self.sr.pv.get("$avp(hithere)"), "value")
assertEquals(self.sr.pv.get("$(avp(hithere)[*])"), {"value"})
self.sr.pv.sets("$avp(s:hithere)", "value1")
assertEquals(self.sr.pv.get("$(avp(hithere)[*])"), {"value1","value"})
end
function TestSRMock:test_avp_seti()
self.sr.pv.seti("$avp(s:hithere)", 0)
assertEquals(self.sr.pv.vars["$avp(s:hithere)"], 0)
assertEquals(self.sr.pv.get("$avp(s:hithere)"), 0)
assertError(self.sr.pv.seti, "$avp(s:hithere)", "1")
end
function TestSRMock:test_get()
local vals = {1,2,3}
function TestSRMock:test_xavp_sets()
self.sr.pv.sets("$xavp(g=>hithere)", "value")
assertEquals(self.sr.pv.get("$xavp(g=>hithere)"), "value")
self.sr.pv.sets("$xavp(g=>bythere)", "value_bye")
assertEquals(self.sr.pv.get("$xavp(g=>bythere)"), "value_bye")
end
function TestSRMock:test_xavp_sets1()
self.sr.pv.sets("$xavp(g=>hithere)", "value")
assertEquals(self.sr.pv.get("$xavp(g=>hithere)"), "value")
self.sr.pv.sets("$xavp(g=>hithere)", "value_bye")
assertEquals(self.sr.pv.get("$xavp(g=>hithere)"), "value_bye")
assertEquals(self.sr.pv.get("$xavp(g[1]=>hithere)"), "value")
end
function TestSRMock:test_xavp_seti()
self.sr.pv.seti("$xavp(t=>hithere)", 0)
assertEquals(self.sr.pv.get("$xavp(t[0]=>hithere)"), 0)
assertEquals(self.sr.pv.get("$xavp(t=>hithere)"), 0)
assertError(self.sr.pv.seti, "$xavp(t=>hithere)", "1")
assertError(self.sr.pv.seti, "$xavp(t[6]=>hithere)", "1")
end
function TestSRMock:test_avp_get_simple()
self.sr.pv.sets("$avp(s:hithere)", "value")
assertEquals(self.sr.pv.get("$avp(s:hithere)"), "value")
self.sr.pv.unset("$avp(s:hithere)")
end
function TestSRMock:test_avp_get_simple2()
self.sr.pv.seti("$avp(s:hithere)", 1)
assertEquals(self.sr.pv.get("$avp(s:hithere)"), 1)
end
function TestSRMock:test_avp_get()
local vals = {1,2,3}
for i=1,#vals do
self.sr.pv.seti("$avp(s:hithere)", vals[i])
end
local l = self.sr.pv.get("$avp(s:hithere)")
local l = self.sr.pv.get("$(avp(s:hithere)[*])")
assertTrue(type(l), 'table')
assertEquals(#l,#vals)
--print(table.tostring(l))
v = 1
for i=#vals,1,-1 do
@ -56,26 +192,41 @@ TestSRMock = {}
end
end
function TestSRMock:test_unset()
function TestSRMock:test_avp_get_all()
self.sr.pv.sets("$avp(s:hithere)", "value")
self.sr.pv.unset("$avp(s:hithere)")
assertEquals(self.sr.pv.vars["$avp(s:hithere)"], nil)
self.sr.pv.unset("$avp(s:hithere)")
assertEquals(self.sr.pv.vars["$avp(s:hithere)"], nil)
assertEquals(self.sr.pv.get("$avp(hithere)"), "value")
assertEquals(self.sr.pv.get("$(avp(hithere)[*])"), {"value"})
self.sr.pv.sets("$avp(s:hithere)", "value1")
assertEquals(self.sr.pv.get("$(avp(hithere)[*])"), {"value1","value"})
self.sr.pv.sets("$(avp(s:hithere)[*])", "new_value")
assertEquals(self.sr.pv.get("$avp(s:hithere)"), "new_value")
assertEquals(self.sr.pv.get("$(avp(s:hithere)[*])"), {"new_value"})
end
self.sr.pv.sets("$xavp(g=>t)", "value")
assertEquals(self.sr.pv.vars["$xavp(g[0]=>t)"], "value")
assertEquals(self.sr.pv.vars["$xavp(g=>t)"], nil)
function TestSRMock:test_unset_var()
self.sr.pv.sets("$var(hithere)", "value")
assertEquals(self.sr.pv.get("$var(hithere)"), "value")
self.sr.pv.unset("$var(hithere)")
assertEquals(self.sr.pv.get("$var(hithere)"), nil)
self.sr.pv.unset("$var(hithere)")
end
self.sr.pv.sets("$xavp(g[0]=>v)", "value")
self.sr.pv.unset("$xavp(g[1])")
assertEquals(self.sr.pv.vars["$xavp(g[1])"], nil)
assertEquals(self.sr.pv.vars["$xavp(g[0]=>t)"], "value")
assertEquals(self.sr.pv.vars["$xavp(g[0]=>v)"], "value")
function TestSRMock:test_unset_avp()
self.sr.pv.sets("$avp(s:hithere)", "value")
assertEquals(self.sr.pv.get("$avp(hithere)"), "value")
self.sr.pv.unset("$avp(s:hithere)")
assertEquals(self.sr.pv.get("$avp(hithere)"), nil)
self.sr.pv.unset("$avp(s:hithere)")
assertEquals(self.sr.pv.get("$avp(s:hithere)"), nil)
end
self.sr.pv.sets("$xavp(g[1]=>v)", "value")
self.sr.pv.unset("$xavp(g[1])")
assertEquals(self.sr.pv.vars["$xavp(g[1]=>v)"], nil)
function TestSRMock:test_unset_xavp()
self.sr.pv.sets("$xavp(g=>t)", "value_t")
assertEquals(self.sr.pv.get("$xavp(g=>t)"), "value_t")
self.sr.pv.unset("$xavp(g=>t)")
assertEquals(self.sr.pv.get("$xavp(g=>t)"), nil)
self.sr.pv.unset("$xavp(g)")
assertEquals(self.sr.pv.get("$xavp(g)"), nil)
end
function TestSRMock:test_is_null()
@ -94,15 +245,13 @@ TestSRMock = {}
assertError(self.sr.log, "debug", "Hi dude!")
end
function TestSRMock:test_set_clean()
self.sr.pv.seti("$avp(s:hithere)[*]", 0)
assertEquals(self.sr.pv.vars["$avp(s:hithere)"], 0)
assertFalse(self.sr.pv.vars["$avp(s:hithere)[*]"])
self.sr.pv.seti("$avp(s:hithere)[*]", 1)
assertEquals(self.sr.pv.vars["$avp(s:hithere)"], 1)
assertFalse(self.sr.pv.vars["$avp(s:hithere)[*]"])
self.sr.pv.seti("$avp(s:hithere)", 0)
assertEquals(table.tostring(self.sr.pv.get("$avp(s:hithere)")), "{0,1}")
function TestSRMock:test_avp_set_clean()
self.sr.pv.seti("$(avp(s:hithere)[*])", 0)
assertEquals(self.sr.pv.get("$avp(s:hithere)"), 0)
assertEquals(self.sr.pv.get("$(avp(s:hithere)[*])"), {0})
self.sr.pv.seti("$(avp(s:hithere)[*])", 1)
assertEquals(self.sr.pv.get("$avp(s:hithere)"), 1)
assertEquals(self.sr.pv.get("$(avp(s:hithere)[*])"), {1})
end
---- Control test output:
lu = LuaUnit

@ -4,11 +4,8 @@ require 'mocks.sr'
require 'ngcp.xavp'
sr = srMock:new()
TestNGCPXAvp = {} --class
function TestNGCPXAvp:setUp()
self.vals = {}
self.vals[1] = {
vals = {
{
id = 1,
uuid = "ae736f72-21d1-4ea6-a3ea-4d7f56b3887c",
username = "testuser1",
@ -17,8 +14,8 @@ TestNGCPXAvp = {} --class
type = 1,
value = 2,
last_modified = "1900-01-01 00:00:01"
}
self.vals[2] = {
},
{
id = 2,
uuid = "94023caf-dfba-4f33-8bdb-b613ce627613",
username = "testuser2",
@ -27,8 +24,8 @@ TestNGCPXAvp = {} --class
type = 1,
value = 2,
last_modified = "1900-01-01 00:00:01"
}
self.vals[3] = {
},
{
id = 3,
uuid = "94023caf-dfba-4f33-8bdb-b613ce627613",
username = "testuser2",
@ -38,7 +35,10 @@ TestNGCPXAvp = {} --class
value = "2",
last_modified = "1900-01-01 00:00:01"
}
self.xavp = NGCPXAvp:new(1, "peer", self.vals)
}
TestNGCPXAvp = {} --class
function TestNGCPXAvp:setUp()
self.xavp = NGCPXAvp:new("caller", "peer", vals)
end
function TestNGCPXAvp:tearDown()
@ -46,51 +46,32 @@ TestNGCPXAvp = {} --class
end
function TestNGCPXAvp:test_xavp_id()
assertEquals(self.xavp.level, 1)
assertEquals(self.xavp.level, 0)
assertEquals(self.xavp.group, "peer")
end
function TestNGCPXAvp:test_xavp_get()
sr.pv.sets("$xavp(peer[1]=>testid)", "value")
sr.pv.sets("$xavp(peer[0]=>testid)", "value")
assertEquals(self.xavp("testid"), "value")
sr.pv.sets("$xavp(peer[1]=>testid)", "1")
assertItemsEquals(self.xavp("testid"),{"1","value"})
sr.pv.sets("$xavp(peer[0]=>testid)", "1")
assertItemsEquals(self.xavp("testid"), "1")
end
function TestNGCPXAvp:test_xavp_set()
local vals = {1,2,3}
local vals = {1,"2",3,nil}
for i=1,#vals do
self.xavp("testid",vals[i])
end
local l = self.xavp("testid")
assertTrue(type(l), 'table')
--print(table.tostring(l))
v = 1
for i=#vals,1,-1 do
assertEquals(l[i],vals[v])
v = v + 1
end
end
function TestNGCPXAvp:test_xavp_set2()
local vals = {1,2,"3"}
for i=1,#vals do
self.xavp("testid", vals[i])
end
local l = self.xavp("testid")
assertTrue(type(l), 'table')
--print(table.tostring(l))
v = 1
for i=#vals,1,-1 do
assertEquals(l[i],vals[v])
v = v + 1
assertEquals(self.xavp("testid"), vals[i])
assertEquals(sr.pv.get("$xavp(peer[0]=>testid)"),vals[i])
end
end
function TestNGCPXAvp:test_clean()
self.xavp("testid", 1)
assertEquals(sr.pv.get("$xavp(peer[0]=>testid)"),1)
self.xavp:clean()
assertFalse(self.xavp("testid"))
assertFalse(sr.pv.get("$xavp(peer[0]=>testid)"))
end
-- class TestNGCPXAvp

@ -59,6 +59,8 @@ TestUtils = {} --class
assertTrue(string.starts("goga", "goga"))
assertFalse(string.starts("goga", "a"))
assertError(string.starts, "goga", nil)
assertTrue(string.starts("$goga", "$"))
assertTrue(string.starts("(goga)", "("))
end
function TestUtils:test_ends()

Loading…
Cancel
Save