cc-libs/tests/libtui.lua

134 lines
3.1 KiB
Lua

-- luacheck: globals term
local createLibTest = require('/apis/libtest');
local createTui = require('/apis/libtui');
local testlib = createLibTest({ ... });
local function fakeEventLoop()
local onStart = nil;
local onStop = nil;
return {
onStart = function(fn) onStart = fn; end,
onStop = function(fn) onStop = fn; end,
register = function() end,
startLoop = function()
if onStart then
onStart();
end
return true;
end,
stopLoop = function()
if onStop then
onStop();
end
end,
isRunningLoop = function()
return false;
end,
};
end
local function withFakeTerm(fn)
local originalTerm = term;
local writes = {};
local state = {
textColor = colors.white,
bgColor = colors.black,
cursorX = 1,
cursorY = 1,
cursorBlink = false,
width = 20,
height = 5,
};
term = {
setCursorBlink = function(value) state.cursorBlink = value; end,
setTextColor = function(value) state.textColor = value; end,
setBackgroundColor = function(value) state.bgColor = value; end,
clear = function() writes[#writes + 1] = { kind = 'clear' }; end,
getTextColor = function() return state.textColor; end,
getBackgroundColor = function() return state.bgColor; end,
getCursorPos = function() return state.cursorX, state.cursorY; end,
getCursorBlink = function() return state.cursorBlink; end,
setCursorPos = function(x, y)
state.cursorX = x;
state.cursorY = y;
end,
getSize = function() return state.width, state.height; end,
write = function(text)
writes[#writes + 1] = {
kind = 'write',
text = text,
x = state.cursorX,
y = state.cursorY,
color = state.textColor,
bgColor = state.bgColor,
};
state.cursorX = state.cursorX + string.len(text);
end,
};
local ok, err = pcall(fn, writes, state);
term = originalTerm;
if not ok then
error(err, 0);
end
end
testlib.test('text nodes pad utf8 text by characters', function()
withFakeTerm(function(writes)
local ui = createTui(fakeEventLoop());
ui.render(ui.Box({
children = {
ui.Box({
width = 3,
height = 1,
children = { ui.Text('é') },
}),
},
}));
local found = false;
for _, item in ipairs(writes) do
if item.kind == 'write' and item.text == 'é ' then
found = true;
break;
end
end
testlib.assertTrue(found, 'expected padded utf8 text');
end);
end);
testlib.test('box borders keep utf8 titles intact', function()
withFakeTerm(function(writes)
local ui = createTui(fakeEventLoop());
ui.render(ui.Box({
children = {
ui.Box({
width = 5,
height = 3,
border = true,
title = 'Ç',
children = {},
}),
},
}));
local found = false;
for _, item in ipairs(writes) do
if item.kind == 'write' and item.text == '+ Ç +' then
found = true;
break;
end
end
testlib.assertTrue(found, 'expected utf8 border title');
end);
end);
testlib.run();