Pixel-Composer/scripts/panel_test/panel_test.gml
2024-12-25 11:51:24 +07:00

401 lines
No EOL
10 KiB
Text

globalvar ASSERTING, ASSERT_LOG, ASSERT_AMOUNT, ASSERT_PASSED;
ASSERTING = false;
ASSERT_LOG = [];
ASSERT_AMOUNT = 0;
ASSERT_PASSED = 0;
function Panel_Test() : PanelContent() constructor {
w = ui(960);
h = ui(480);
title = "Tester";
auto_pin = true;
padding = ui(4);
content_w = ui(320);
test_dir = "";
tb_test_dir = new textBox(TEXTBOX_INPUT.text, function(txt) /*=>*/ { setTestDir(txt); });
tb_index = new textBox(TEXTBOX_INPUT.number, function(txt) /*=>*/ { start_index = txt; });
tb_amount = new textBox(TEXTBOX_INPUT.number, function(txt) /*=>*/ { test_amount = txt; });
testing = false;
test_files = [];
start_index = 0;
end_index = 0;
test_amount = 100;
test_index = start_index;
test_step = 0;
test_result = [];
test_result_total = {
projects: 0,
project_pass: 0,
assertion: 0,
assertion_pass: 0,
}
wait_step = 5;
waiting = 0;
load_param = new __loadParams(true);
function onResize() { sc_content.resize(content_w, h - padding * 2 - ui(8 * 2) - ui(24)); }
sc_content = new scrollPane(content_w, h - padding * 2 - ui(8 * 2) - ui(24), function(_y, _m) {
draw_clear_alpha(COLORS.panel_bg_clear_inner, 1);
var _h = 0;
var yy = _y;
var ww = sc_content.surface_w;
var wh = ui(20);
for( var i = 0, n = array_length(test_files); i < n; i++ ) {
var _f = test_files[i];
var _d = test_files[i][1];
var _n = filename_name_only(_f[0]);
var cc = COLORS._main_text_sub;
if(start_index <= i && i < start_index + test_amount)
cc = COLORS._main_text;
var _hover = sc_content.hover && point_in_rectangle(_m[0], _m[1], 0, yy, ww, yy + wh - 1);
if(_hover) {
draw_sprite_stretched_ext(THEME.s_box_r2_clr, 0, 0, yy, ww, wh, c_white, 1);
if(mouse_press(mb_left, pFOCUS))
LOAD_AT(_f[0]);
}
if(testing && i == test_index) {
cc = COLORS._main_accent;
draw_sprite_stretched_ext(THEME.s_box_r2, 0, 0, yy, ww * test_step / 4, wh, cc, 0.1);
sc_content.scroll_y_to = -_h + sc_content.surface_h / 2;
} else {
var _res = array_safe_get(test_result, i);
if(is_array(_res)) {
var _a_amo = _res[0];
var _a_pas = _res[1];
var c = _a_pas == _a_amo? COLORS._main_value_positive : COLORS._main_value_negative;
cc = merge_color(c, c_white, 0.5);
if(_a_amo == 0) draw_sprite_stretched_ext(THEME.s_box_r2, 0, 0, yy, ww, wh, c, 0.1);
else draw_sprite_stretched_ext(THEME.s_box_r2, 0, 0, yy, ww * _a_pas / _a_amo, wh, c, 0.1);
draw_set_text(f_p3, fa_right, fa_center, cc);
draw_text_add(ww - ui(8), yy + wh / 2, $"{_a_pas} / {_a_amo}");
}
}
draw_set_text(f_p3, fa_left, fa_center, cc);
draw_text_add(ui(8), yy + wh / 2, _n);
draw_set_text(f_p3, fa_left, fa_center, COLORS._main_text_sub, 0.5);
draw_text_add(ww - ui(100), yy + wh / 2, _d);
draw_set_alpha(1);
_h += wh;
yy += wh;
}
_h += wh;
return _h;
});
sc_log = new scrollPane(content_w, h - padding * 2 - ui(8 * 2), function(_y, _m) {
draw_clear_alpha(COLORS.panel_bg_clear_inner, 1);
var _h = 0;
var yy = _y;
var ww = sc_log.surface_w - ui(32);
for( var i = 0, n = array_length(ASSERT_LOG); i < n; i++ ) {
var _f = ASSERT_LOG[i];
if(_f.type == 0) {
if(i >= n - 1) continue;
if(ASSERT_LOG[i + 1].type >= 0) continue;
if(i) {
_h += ui(4);
yy += ui(4);
}
}
draw_set_font(f_p3);
var wh = string_height_ext(_f.text, -1, ww);
var cc = COLORS._main_text_sub;
var tx = ui(8);
var hv = sc_log.hover && point_in_rectangle(_m[0], _m[1], 0, yy, sc_log.surface_w, yy + wh - 1);
if(hv) draw_sprite_stretched_ext(THEME.s_box_r2_clr, 0, 0, yy, sc_log.surface_w, wh, c_white, 1);
switch(_f.type) {
case -1 :
cc = merge_color(COLORS._main_value_negative, c_white, 0.5);
tx = ui(16);
if(hv) TOOLTIP = _f[$ "tooltip"] ?? "";
break;
case 0 :
cc = COLORS._main_text_sub;
tx = ui(8);
if(hv && mouse_press(mb_left, pFOCUS))
LOAD_AT(_f.file);
break;
case 1 :
cc = merge_color(COLORS._main_value_positive, c_white, 0.5);
tx = ui(16);
break;
}
draw_set_text(f_p3, fa_left, fa_top, cc);
draw_text_ext_add(tx, yy, _f.text, -1, ww);
_h += wh + ui(0);
yy += wh + ui(0);
}
_h += ui(16);
return _h;
});
function setTestDir(dir) {
test_dir = dir;
test_files = [];
scanDir(test_dir);
}
function scanDir(dir) {
if(!directory_exists(dir)) return;
var f = file_find_first($"{dir}/*", fa_none);
var v = filename_name(dir);
while(f != "") {
var path = $"{dir}/{f}";
f = file_find_next();
if(filename_ext_raw(path) == "pxc")
array_push(test_files, [ path, v ]);
}
file_find_close();
var f = file_find_first($"{dir}/*", fa_directory);
var _dir = [];
while(f != "") {
var path = $"{dir}/{f}";
f = file_find_next();
array_push(_dir, path);
}
file_find_close();
for( var i = 0, n = array_length(_dir); i < n; i++ )
scanDir(_dir[i]);
}
function startTesting() {
if(testing) return;
end_index = min(start_index + test_amount, array_length(test_files));
testing = true;
test_index = start_index;
test_result = array_create(array_length(test_files));
ASSERT_LOG = [];
TEST_ERROR = true;
test_result_total.projects = 0;
test_result_total.project_pass = 0;
test_result_total.assertion = 0;
test_result_total.assertion_pass = 0;
__start_time = get_timer();
}
function doTesting() {
var _cur = test_files[test_index][0];
try {
switch(test_step) {
case 0 :
array_append(ASSERT_LOG, {
type: 0,
text: $"Testing {filename_name_only(_cur)}",
file: _cur,
});
test_result_total.projects++;
test_step++;
break;
case 1 :
LOAD_AT(_cur, load_param);
test_step++;
waiting = 0;
break;
case 2 :
if(waiting++ > wait_step) test_step++;
break;
case 3 :
if(!instance_exists(project_loader)) {
ASSERTING = true;
Render();
ASSERTING = false;
test_step++;
}
break;
case 4 :
closeProject(PROJECT);
test_result[test_index] = [ ASSERT_AMOUNT, ASSERT_PASSED ];
test_result_total.assertion += ASSERT_AMOUNT;
test_result_total.assertion_pass += ASSERT_PASSED;
if(ASSERT_AMOUNT == ASSERT_PASSED) test_result_total.project_pass++;
ASSERT_AMOUNT = 0;
ASSERT_PASSED = 0;
test_step++;
break;
}
} catch(e) {
array_append(ASSERT_LOG, {
type: -1,
text: $"Test failed: {e}",
});
}
if(test_step < 5) return;
test_step = 0;
test_index++;
if(test_index < end_index) return;
testing = false;
TEST_ERROR = false;
var ts = test_result_total;
var _time = (get_timer() - __start_time) / 1000;
var _summ = $"Testing completed in {_time}ms. ";
_summ += $"\n{ts.project_pass}/{ts.projects} projects passed [{ts.project_pass / ts.projects * 100}%].";
_summ += $"\n{ts.assertion_pass}/{ts.assertion} assertions passed [{ts.assertion == 0? "-" : ts.assertion_pass / ts.assertion * 100}%].";
array_append(ASSERT_LOG, {
type: 1,
text: _summ,
});
}
function drawContent(panel) {
draw_clear_alpha(COLORS.panel_bg_clear, 1);
// Lists
var _pd = padding;
var ndx = _pd;
var ndy = _pd + ui(24);
var ndw = content_w + ui(16);
var ndh = h - _pd * 2 - ui(24);
draw_sprite_stretched(THEME.ui_panel_bg, 1, ndx, ndy, ndw, ndh);
draw_set_text(f_p2, fa_left, fa_top, COLORS._main_text_sub);
draw_text_add(ndx + ui(8), ui(4), $"{test_amount} / {array_length(test_files)} Files");
sc_content.setFocusHover(pFOCUS, pHOVER);
sc_content.draw(ndx + ui(8), ndy + ui(8), mx - ndx - ui(8), my - ndy - ui(8));
// Data
var yy = ui(8);
var lx = ndx + ndw + ui(8);
var lw = ui(100);
var dw = w - lx - lw - _pd;
var hh = TEXTBOX_HEIGHT;
tb_test_dir.setFocusHover(pFOCUS, pHOVER);
tb_index.setFocusHover(pFOCUS, pHOVER);
tb_amount.setFocusHover(pFOCUS, pHOVER);
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text_sub);
draw_text_add(lx + ui(8), yy + hh / 2, "Directory");
tb_test_dir.draw(lx + lw, yy, dw, hh, test_dir, [ mx, my ]);
yy += hh + ui(8);
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text_sub);
draw_text_add(lx + ui(8), yy + hh / 2, "Start");
tb_index.draw(lx + lw, yy, dw, hh, start_index, [ mx, my ]);
yy += hh + ui(8);
draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text_sub);
draw_text_add(lx + ui(8), yy + hh / 2, "Amount");
tb_amount.draw(lx + lw, yy, dw, hh, test_amount, [ mx, my ]);
yy += hh + ui(8);
// Log
var ndx = lx;
var ndy = yy;
var ndw = w - _pd - lx;
var ndh = h - _pd - ndy - hh - ui(8);
draw_sprite_stretched(THEME.ui_panel_bg, 1, ndx, ndy, ndw, ndh);
var log_w = ndw - ui(16);
var log_h = ndh - ui(16);
if(sc_log.w != log_w || sc_log.h != log_h) sc_log.resize(log_w, log_h);
sc_log.setFocusHover(pFOCUS, pHOVER);
sc_log.draw(ndx + ui(8), ndy + ui(8), mx - ndx - ui(8), my - ndy - ui(8));
// Button
var bw = w - _pd - lx;
var bh = hh;
var bx = lx;
var by = h - _pd - bh;
if(testing) {
var _a = end_index - start_index;
var _w = bw * (test_index - start_index) / _a;
draw_sprite_stretched(THEME.progress_bar, 0, bx, by, bw, bh);
draw_sprite_stretched(THEME.progress_bar, 1, bx, by, _w, bh);
draw_set_text(f_p2, fa_center, fa_center, COLORS._main_text_sub);
draw_text_add(bx + bw / 2, by + bh / 2, $"Testing {test_index - start_index}/{_a}");
doTesting();
} else {
if(buttonInstant(THEME.button_def, bx, by, bw, bh, [ mx, my ], pHOVER, pFOCUS) == 2)
startTesting();
draw_set_text(f_p2, fa_center, fa_center, COLORS._main_text);
draw_text_add(bx + bw / 2, by + bh / 2, "Start test");
}
}
setTestDir("D:/Project/MakhamDev/LTS-PixelComposer/TEST/Others");
}