Files
Ananta-ps/Ananta.Proxy/proxy/node_modules/fengari/test/lstrlib.test.js
T

453 lines
12 KiB
JavaScript

"use strict";
const lua = require('../src/lua.js');
const lauxlib = require('../src/lauxlib.js');
const lualib = require('../src/lualib.js');
const {to_luastring} = require("../src/fengaricore.js");
test('string.len', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
local a = "world"
return string.len("hello"), a:len()
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tointeger(L, -2)).toBe(5);
expect(lua.lua_tointeger(L, -1)).toBe(5);
});
test('string.char', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.char(104, 101, 108, 108, 111)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -1)).toBe("hello");
});
test('string.upper, string.lower', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.upper("hello"), string.lower("HELLO")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -2)).toBe("HELLO");
expect(lua.lua_tojsstring(L, -1)).toBe("hello");
});
test('string.rep', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.rep("hello", 3, ", ")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -1)).toBe("hello, hello, hello");
});
test('string.reverse', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.reverse("olleh")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -1)).toBe("hello");
});
test('string.byte', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.byte("hello", 2, 4)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tointeger(L, -3)).toBe(101);
expect(lua.lua_tointeger(L, -2)).toBe(108);
expect(lua.lua_tointeger(L, -1)).toBe(108);
});
test('string.format', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.format("%%%d %010d", 10, 23)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -1)).toBe("%10 0000000023");
});
test('string.format', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.format("%07X", 0xFFFFFFF)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -1)).toBe("FFFFFFF");
});
test('string.format', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.format("%q", 'a string with "quotes" and \\n new line')
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -1)).toBe('"a string with \\"quotes\\" and \\\n new line"',
"Correct element(s) on the stack"
);
});
test('string.sub', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.sub("123456789",2,4), -- "234"
string.sub("123456789",7), -- "789"
string.sub("123456789",7,6), -- ""
string.sub("123456789",7,7), -- "7"
string.sub("123456789",0,0), -- ""
string.sub("123456789",-10,10), -- "123456789"
string.sub("123456789",1,9), -- "123456789"
string.sub("123456789",-10,-20), -- ""
string.sub("123456789",-1), -- "9"
string.sub("123456789",-4), -- "6789"
string.sub("123456789",-6, -4) -- "456"
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -11)).toBe("234");
expect(lua.lua_tojsstring(L, -10)).toBe("789");
expect(lua.lua_tojsstring(L, -9)).toBe("");
expect(lua.lua_tojsstring(L, -8)).toBe("7");
expect(lua.lua_tojsstring(L, -7)).toBe("");
expect(lua.lua_tojsstring(L, -6)).toBe("123456789");
expect(lua.lua_tojsstring(L, -5)).toBe("123456789");
expect(lua.lua_tojsstring(L, -4)).toBe("");
expect(lua.lua_tojsstring(L, -3)).toBe("9");
expect(lua.lua_tojsstring(L, -2)).toBe("6789");
expect(lua.lua_tojsstring(L, -1)).toBe("456");
});
test('string.dump', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
local todump = function()
local s = "hello"
local i = 12
local f = 12.5
local b = true
return s .. i .. f
end
return string.dump(todump)
`;
{
lualib.luaL_openlibs(L);
lauxlib.luaL_loadstring(L, to_luastring(luaCode.trim()));
lua.lua_call(L, 0, -1);
let str = lua.lua_tostring(L, -1);
lua.lua_load(L, function(L, s) {
let r = s.str;
s.str = null;
return r;
}, {str: str}, to_luastring("test"), to_luastring("binary"));
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -1)).toBe("hello1212.5");
});
test('string.pack/unpack/packsize', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
local s1, n, s2 = "hello", 2, "you"
local packed = string.pack("c5jc3", s1, n, s2)
local us1, un, us2 = string.unpack("c5jc3", packed)
return string.packsize("c5jc3"), s1 == us1 and n == un and s2 == us2
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tointeger(L, -2)).toBe(12);
expect(lua.lua_toboolean(L, -1)).toBe(true);
});
test('string.find without pattern', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.find("hello to you", " to ")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tointeger(L, -2)).toBe(6);
expect(lua.lua_tointeger(L, -1)).toBe(9);
});
test('string.find with special pattern (issue #185)', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.find("-", "-")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_gettop(L)).toBe(2);
expect(lua.lua_tointeger(L, -2)).toBe(1);
expect(lua.lua_tointeger(L, -1)).toBe(1);
});
test('string.match', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.match("foo: 123 bar: 456", "(%a+):%s*(%d+)")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -2)).toBe("foo");
expect(lua.lua_tojsstring(L, -1)).toBe("123");
});
test('string.find', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.find("foo: 123 bar: 456", "(%a+):%s*(%d+)")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tointeger(L, -4)).toBe(1);
expect(lua.lua_tointeger(L, -3)).toBe(8);
expect(lua.lua_tojsstring(L, -2)).toBe("foo");
expect(lua.lua_tojsstring(L, -1)).toBe("123");
});
test('string.gmatch', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
local s = "hello world from Lua"
local t = {}
for w in string.gmatch(s, "%a+") do
table.insert(t, w)
end
return table.unpack(t)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -4)).toBe("hello");
expect(lua.lua_tojsstring(L, -3)).toBe("world");
expect(lua.lua_tojsstring(L, -2)).toBe("from");
expect(lua.lua_tojsstring(L, -1)).toBe("Lua");
});
test('string.gsub', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.gsub("hello world", "(%w+)", "%1 %1")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -2)).toBe("hello hello world world");
expect(lua.lua_tointeger(L, -1)).toBe(2);
});
test('string.gsub (number)', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.gsub("hello world", "%w+", "%0 %0", 1)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -2)).toBe("hello hello world");
expect(lua.lua_tointeger(L, -1)).toBe(1);
});
test('string.gsub (pattern)', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -2)).toBe("world hello Lua from");
expect(lua.lua_tointeger(L, -1)).toBe(2);
});
test('string.gsub (function)', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
return string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
return load(s)()
end)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -2)).toBe("4+5 = 9");
expect(lua.lua_tointeger(L, -1)).toBe(1);
});
test('string.gsub (table)', () => {
let L = lauxlib.luaL_newstate();
if (!L) throw Error("failed to create lua state");
let luaCode = `
local t = {name="lua", version="5.3"}
return string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
`;
{
lualib.luaL_openlibs(L);
expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
lua.lua_call(L, 0, -1);
}
expect(lua.lua_tojsstring(L, -2)).toBe("lua-5.3.tar.gz");
expect(lua.lua_tointeger(L, -1)).toBe(2);
});