mirror of
https://github.com/Reuh/candran.git
synced 2025-10-27 17:59:30 +00:00
285 lines
5 KiB
Lua
285 lines
5 KiB
Lua
local candran = dofile(arg[1] or "../candran.lua")
|
|
|
|
-- test helper
|
|
local results = {} -- tests result
|
|
local function test(name, candranCode, expectedResult, options)
|
|
results[name] = { result = "not finished", message = "no info" }
|
|
local self = results[name]
|
|
|
|
-- make code
|
|
local success, code = pcall(candran.make, candranCode, options)
|
|
if not success then
|
|
self.result = "error"
|
|
self.message = "error while making code:\n"..code
|
|
return
|
|
end
|
|
|
|
-- load code
|
|
local success, func = pcall(loadstring or load, code)
|
|
if not success then
|
|
self.result = "error"
|
|
self.message = "error while loading code:\n"..func
|
|
return
|
|
end
|
|
|
|
-- run code
|
|
local success, output = pcall(func)
|
|
if not success then
|
|
self.result = "error"
|
|
self.message = "error while running code:\n"..output
|
|
return
|
|
end
|
|
|
|
-- check result
|
|
if output ~= expectedResult then
|
|
self.result = "fail"
|
|
self.message = "invalid result from the code; it returned "..tostring(output).." instead of "..tostring(expectedResult)
|
|
return
|
|
else
|
|
self.result = "success"
|
|
return
|
|
end
|
|
end
|
|
|
|
-- tests
|
|
print("Running tests...")
|
|
|
|
------------------
|
|
-- PREPROCESSOR --
|
|
------------------
|
|
|
|
test("preprocessor", [[
|
|
#local foo = true
|
|
return true
|
|
]], true)
|
|
|
|
test("preprocessor condition", [[
|
|
#local foo = true
|
|
#if not foo then
|
|
return false
|
|
#else
|
|
return true
|
|
#end
|
|
]], true)
|
|
|
|
test("preprocessor candran table", [[
|
|
#write(("return %q"):format(candran.VERSION))
|
|
]], candran.VERSION)
|
|
|
|
test("preprocessor output variable", [[
|
|
#output = "return 5"
|
|
]], 5)
|
|
|
|
test("preprocessor import function", [[
|
|
#import("toInclude")
|
|
return toInclude
|
|
]], 5)
|
|
|
|
test("preprocessor include function", [[
|
|
#include('toInclude.lua')
|
|
]], 5)
|
|
|
|
test("preprocessor write function", [[
|
|
#write("local a = true")
|
|
return a
|
|
]], true)
|
|
|
|
test("preprocessor placeholder function", [[
|
|
#placeholder('foo')
|
|
]], 5, { foo = "return 5" })
|
|
|
|
test("preprocessor options", [[
|
|
#if not foo == "sky" then
|
|
# error("Invalid foo argument")
|
|
#end
|
|
return true
|
|
]], true, { foo = "sky" })
|
|
|
|
----------------------
|
|
-- SYNTAX ADDITIONS --
|
|
----------------------
|
|
|
|
-- Assignement operators
|
|
test("+=", [[
|
|
local a = 5
|
|
a += 2
|
|
return a
|
|
]], 7)
|
|
test("-=", [[
|
|
local a = 5
|
|
a -= 2
|
|
return a
|
|
]], 3)
|
|
test("*=", [[
|
|
local a = 5
|
|
a *= 2
|
|
return a
|
|
]], 10)
|
|
test("/=", [[
|
|
local a = 5
|
|
a /= 2
|
|
return a
|
|
]], 5/2)
|
|
test("//=", [[
|
|
local a = 5
|
|
a //= 2
|
|
return a
|
|
]], 2)
|
|
test("^=", [[
|
|
local a = 5
|
|
a ^= 2
|
|
return a
|
|
]], 25)
|
|
test("%=", [[
|
|
local a = 5
|
|
a %= 2
|
|
return a
|
|
]], 5%2)
|
|
test("..=", [[
|
|
local a = "hello"
|
|
a ..= " world"
|
|
return a
|
|
]], "hello world")
|
|
test("and=", [[
|
|
local a = true
|
|
a and= "world"
|
|
return a
|
|
]], "world")
|
|
test("or=", [[
|
|
local a = false
|
|
a or= "world"
|
|
return a
|
|
]], "world")
|
|
test("&=", [[
|
|
local a = 5
|
|
a &= 3
|
|
return a
|
|
]], 1)
|
|
test("|=", [[
|
|
local a = 5
|
|
a |= 3
|
|
return a
|
|
]], 7)
|
|
test("<<=", [[
|
|
local a = 23
|
|
a <<= 2
|
|
return a
|
|
]], 92)
|
|
test(">>=", [[
|
|
local a = 23
|
|
a >>= 2
|
|
return a
|
|
]], 5)
|
|
|
|
test("right assigments operators", [[
|
|
local a = 5
|
|
a =+ 2 assert(a == 7, "=+")
|
|
a =- 2 assert(a == -5, "=-")
|
|
a =* -2 assert(a == 10, "=*")
|
|
a =/ 2 assert(a == 0.2, "=/")
|
|
a =// 2 assert(a == 10, "=//")
|
|
a =^ 2 assert(a == 1024, "=^")
|
|
a =% 2000 assert(a == 976, "=%")
|
|
|
|
a = "world"
|
|
a =.. "hello " assert(a == "hello world", "=..")
|
|
a =and true assert(a == "hello world", "=and")
|
|
|
|
a = false
|
|
a =or nil assert(a == false, "=or")
|
|
|
|
a = 3
|
|
a =& 5 assert(a == 1, '=&')
|
|
a =| 20 assert(a == 21, "=|")
|
|
a =<< 1 assert(a == 2097152, "=<<")
|
|
|
|
a = 2
|
|
a =>> 23 assert(a == 5, "=>>")
|
|
]], nil)
|
|
|
|
test("some left+right assigments operators", [[
|
|
local a = 5
|
|
a -=+ 2 assert(a == 8, "-=+")
|
|
|
|
a = "hello"
|
|
a ..=.. " world " assert(a == "hello world hello", "..=..")
|
|
]], nil)
|
|
|
|
-- Default function parameters
|
|
test("default parameters", [[
|
|
local function test(hey, def="re", no, foo=("bar"):gsub("bar", "batru"))
|
|
return def..foo
|
|
end
|
|
return test(78, "SANDWICH", true)
|
|
]], "SANDWICHbatru")
|
|
|
|
-- @ self alias
|
|
test("@ as self alias", [[
|
|
local a = {}
|
|
function a:hey()
|
|
return @ == self
|
|
end
|
|
return a:hey()
|
|
]], true)
|
|
test("@ as self alias and indexation", [[
|
|
local a = {
|
|
foo = "Hoi"
|
|
}
|
|
function a:hey()
|
|
return @.foo
|
|
end
|
|
return a:hey()
|
|
]], "Hoi")
|
|
test("@name indexation", [[
|
|
local a = {
|
|
foo = "Hoi"
|
|
}
|
|
function a:hey()
|
|
return @foo
|
|
end
|
|
return a:hey()
|
|
]], "Hoi")
|
|
test("@[expt] indexation", [[
|
|
local a = {
|
|
foo = "Hoi"
|
|
}
|
|
function a:hey()
|
|
return @["foo"]
|
|
end
|
|
return a:hey()
|
|
]], "Hoi")
|
|
|
|
-- Short anonymous functions declaration
|
|
test("short anonymous function declaration", [[
|
|
local a = (arg1)
|
|
return arg1
|
|
end
|
|
return a(5)
|
|
]], 5)
|
|
test("short anonymous method declaration", [[
|
|
local a = :(arg1)
|
|
return self + arg1
|
|
end
|
|
return a(2, 3)
|
|
]], 5)
|
|
|
|
-- results
|
|
local resultCounter = {}
|
|
local testCounter = 0
|
|
for name, t in pairs(results) do
|
|
-- print errors & fails
|
|
if t.result ~= "success" then
|
|
print(name.." test: "..t.result)
|
|
if t.message then print(t.message) end
|
|
print("----------")
|
|
end
|
|
-- count tests results
|
|
resultCounter[t.result] = (resultCounter[t.result] or 0) + 1
|
|
testCounter = testCounter + 1
|
|
end
|
|
|
|
-- print final results
|
|
for name, count in pairs(resultCounter) do
|
|
print(count.." "..name.." (" .. math.floor((count / testCounter * 100)*100)/100 .. "%)")
|
|
end
|
|
print(testCounter.." total")
|