omdl  v0.6.1
OpenSCAD Mechanical Design Library
Script
include <console.scad>;
include <datatypes/datatypes-base.scad>;
include <datatypes/datatypes_table.scad>;
include <validation.scad>;
show_passing = true; // show passing tests
show_skipped = true; // show skipped tests
echo( str("OpenSCAD Version ", version()) );
// test-values columns
test_c =
[
["id", "identifier"],
["td", "description"],
["tv", "test value"]
];
// test-values rows
test_r =
[
["t01", "The undefined value", undef],
["t02", "The empty list", empty_lst],
["t03", "A range", [0:0.5:9]],
["t04", "A string", "A string"],
["t05", "Test list 01", ["orange","apple","grape","banana"]],
["t06", "Test list 02", ["b","a","n","a","n","a","s"]],
["t07", "Test list 03", [undef]],
["t08", "Test list 04", [[1,2],[2,3]]],
["t09", "Test list 05", ["ab",[1,2],[2,3],[4,5]]],
["t10", "Test list 06", [[1,2,3],[4,5,6],[7,8,9],["a","b","c"]]],
["t11", "Vector of integers 0 to 15", [for (i=[0:15]) i]]
];
test_ids = get_table_ridl( test_r );
// expected columns: ("id" + one column for each test)
good_c = pmerge([concat("id", test_ids), concat("identifier", test_ids)]);
// expected rows: ("golden" test results), use 's' to skip test
skip = -1; // skip test
good_r =
[ // function
["lstr",
undef, // t01
empty_str, // t02
"[0 : 0.5 : 9]", // t03
"A string", // t04
"orangeapplegrapebanana", // t05
"bananas", // t06
"undef", // t07
"[1, 2][2, 3]", // t08
"ab[1, 2][2, 3][4, 5]", // t09
"[1, 2, 3][4, 5, 6][7, 8, 9][\"a\", \"b\", \"c\"]", // t10
"0123456789101112131415" // t11
],
["lstr_html_B",
"<b>undef</b>", // t01
empty_str, // t02
"<b>[0 : 0.5 : 9]</b>", // t03
"<b>A string</b>", // t04
"<b>orange</b><b>apple</b><b>grape</b><b>banana</b>",
"<b>b</b><b>a</b><b>n</b><b>a</b><b>n</b><b>a</b><b>s</b>",
"<b>undef</b>", // t07
"<b>[1, 2]</b><b>[2, 3]</b>", // t08
"<b>ab</b><b>[1, 2]</b><b>[2, 3]</b><b>[4, 5]</b>", // t09
"<b>[1, 2, 3]</b><b>[4, 5, 6]</b><b>[7, 8, 9]</b><b>[\"a\", \"b\", \"c\"]</b>",
"<b>0</b><b>1</b><b>2</b><b>3</b><b>4</b><b>5</b><b>6</b><b>7</b><b>8</b><b>9</b><b>10</b><b>11</b><b>12</b><b>13</b><b>14</b><b>15</b>"
],
["consts",
empty_lst, // t01
empty_lst, // t02
empty_lst, // t03
empty_lst, // t04
empty_lst, // t05
empty_lst, // t06
empty_lst, // t07
empty_lst, // t08
empty_lst, // t09
empty_lst, // t10
empty_lst // t11
],
["get_index",
empty_lst, // t01
empty_lst, // t02
empty_lst, // t03
[0,1,2,3,4,5,6,7], // t04
[0,1,2,3], // t05
[0,1,2,3,4,5,6], // t06
[0], // t07
[0,1], // t08
[0,1,2,3], // t09
[0,1,2,3], // t10
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] // t11
],
["pad_9",
[undef,0,0,0,0,0,0,0,0], // t01
[0,0,0,0,0,0,0,0,0], // t02
[[0:0.5:9],0,0,0,0,0,0,0,0], // t03
["A string",0], // t04
["orange","apple","grape","banana",0,0,0,0,0], // t05
["b","a","n","a","n","a","s",0,0], // t06
[undef,0,0,0,0,0,0,0,0], // t07
[[1,2],[2,3],0,0,0,0,0,0,0], // t08
["ab",[1,2],[2,3],[4,5],0,0,0,0,0], // t09
[[1,2,3],[4,5,6],[7,8,9],["a","b","c"],0,0,0,0,0], // t10
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] // t11
],
["limit_12",
undef, // t01
empty_lst, // t02
[0:0.5:9], // t03
"A string", // t04
["orange","apple","grape","banana"], // t05
["b","a","n","a","n","a","s"], // t06
[undef], // t07
[[1,2],[2,2]], // t08
["ab",[1,2],[2,2],[2,2]], // t09
[[1,2,2],[2,2,2],[2,2,2],["a","b","c"]], // t10
[1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2] // t11
],
["sum",
undef, // t01
0, // t02
85.5, // t03
undef, // t04
undef, // t05
undef, // t06
undef, // t07
[3,5], // t08
undef, // t09
[undef,undef,undef], // t10
120 // t11
],
["mean",
undef, // t01
0, // t02
4.5, // t03
undef, // t04
undef, // t05
undef, // t06
undef, // t07
[1.5,2.5], // t08
undef, // t09
[undef,undef,undef], // t10
7.5 // t11
],
["eselect_F",
undef, // t01
empty_lst, // t02
undef, // t03
["A"," ","s","t","r","i","n","g"], // t04
["o","a","g","b"], // t05
["b","a","n","a","n","a","s"], // t06
[undef], // t07
[1,2], // t08
["a",1,2,4], // t09
[1,4,7,"a"], // t10
skip // t11
],
["eselect_L",
undef, // t01
empty_lst, // t02
undef, // t03
["A"," ","s","t","r","i","n","g"], // t04
["e","e","e","a"], // t05
["b","a","n","a","n","a","s"], // t06
[undef], // t07
[2,3], // t08
["b",2,3,5], // t09
[3,6,9,"c"], // t10
skip // t11
],
["eselect_1",
undef, // t01
empty_lst, // t02
undef, // t03
skip, // t04
["r","p","r","a"], // t05
skip, // t06
[undef], // t07
[2,3], // t08
["b",2,3,5], // t09
[2,5,8,"b"], // t10
skip // t11
],
["smerge",
undef, // t01
empty_lst, // t02
[[0:0.5:9]], // t03
["A string"], // t04
["orange","apple","grape","banana"], // t05
["b","a","n","a","n","a","s"], // t06
[undef], // t07
[1,2,2,3], // t08
["ab",1,2,2,3,4,5], // t09
[1,2,3,4,5,6,7,8,9,"a","b","c"], // t10
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] // t11
],
["pmerge",
undef, // t01
empty_lst, // t02
undef, // t03
["A string"], // t04
[
["o","a","g","b"],["r","p","r","a"],
["a","p","a","n"],["n","l","p","a"],
["g","e","e","n"]
], // t05
[["b","a","n","a","n","a","s"]], // t06
undef, // t07
[[1,2],[2,3]], // t08
[["a",1,2,4],["b",2,3,5]], // t09
[[1,4,7,"a"],[2,5,8,"b"],[3,6,9,"c"]], // t10
undef // t11
],
["qsort",
undef, // t01
empty_lst, // t02
undef, // t03
undef, // t04
["apple","banana","grape","orange"], // t05
["a","a","a","b","n","n","s"], // t06
[undef], // t07
skip, // t08
skip, // t09
skip, // t10
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] // t11
],
["qsort_1R",
undef, // t01
empty_lst, // t02
undef, // t03
undef, // t04
["orange","grape","apple","banana"], // t05
skip, // t06
skip, // t07
[[2,3],[1,2]], // t08
[[4,5],[2,3],[1,2],"ab"], // t09
[[7,8,9],[4,5,6],[1,2,3],["a","b","c"]], // t10
skip // t11
],
["qsort2_1R",
undef, // t01
empty_lst, // t02
undef, // t03
undef, // t04
["orange","grape","apple","banana"], // t05
skip, // t06
skip, // t07
[[2,3],[1,2]], // t08
["ab",[4,5],[2,3],[1,2]], // t09
[["a","b","c"],[7,8,9],[4,5,6],[1,2,3]], // t10
skip // t11
],
["qsort2_HR",
undef, // t01
empty_lst, // t02
undef, // t03
undef, // t04
["orange","grape","banana","apple"], // t05
["s","n","n","b","a","a","a"], // t06
[undef], // t07
[[3,2],[2,1]], // t08
[[5,4],[3,2],[2,1],"ab"], // t09
[["c","b","a"],[9,8,7],[6,5,4],[3,2,1]], // t10
[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0] // t11
]
];
// sanity-test tables
table_check( test_r, test_c, false );
table_check( good_r, good_c, false );
// validate helper function and module
function get_value( vid ) = get_table_v(test_r, test_c, vid, "tv");
module run_test( fname, fresult, vid )
{
value_text = get_table_v(test_r, test_c, vid, "td");
pass_value = get_table_v(good_r, good_c, fname, vid);
test_pass = validate( cv=fresult, t="equals", ev=pass_value, pf=true );
test_text = validate( str(fname, "(", get_value(vid), ")=", pass_value), fresult, "equals", pass_value );
if ( pass_value != skip )
{
if ( !test_pass )
log_warn( str(vid, "(", value_text, ") ", test_text) );
else if ( show_passing )
log_info( str(vid, " ", test_text) );
}
else if ( show_skipped )
log_info( str(vid, " *skip*: '", fname, "(", value_text, ")'") );
}
// Indirect function calls would be very useful here!!!
for (vid=test_ids) run_test( "lstr", lstr(get_value(vid)), vid );
for (vid=test_ids) run_test( "lstr_html_B", lstr_html(get_value(vid),p="b"), vid );
for (vid=test_ids) run_test( "consts", consts(get_value(vid)), vid );
for (vid=test_ids) run_test( "get_index", get_index(get_value(vid)), vid );
for (vid=test_ids) run_test( "pad_9", pad(get_value(vid), w=9), vid );
log_info( "not testing: dround()" );
log_info( "not testing: sround()" );
for (vid=test_ids) run_test( "limit_12", limit(get_value(vid),1,2), vid );
for (vid=test_ids) run_test( "sum", sum(get_value(vid)), vid );
for (vid=test_ids) run_test( "mean", mean(get_value(vid)), vid );
log_info( "not testing: ciselect()" );
log_info( "not testing: cmvselect()" );
for (vid=test_ids) run_test( "eselect_F", eselect(get_value(vid),f=true), vid );
for (vid=test_ids) run_test( "eselect_L", eselect(get_value(vid),l=true), vid );
for (vid=test_ids) run_test( "eselect_1", eselect(get_value(vid),i=1), vid );
for (vid=test_ids) run_test( "smerge", smerge(get_value(vid)), vid );
for (vid=test_ids) run_test( "pmerge", pmerge(get_value(vid)), vid );
for (vid=test_ids) run_test( "qsort", qsort(get_value(vid)), vid );
for (vid=test_ids) run_test( "qsort_1R", qsort(get_value(vid), i=1, r=true), vid );
for (vid=test_ids) run_test( "qsort2_1R", qsort2(get_value(vid), i=1, r=true), vid );
for (vid=test_ids) run_test( "qsort2_HR", qsort2(get_value(vid), d=5, r=true), vid );
// end-of-tests