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", "An odd integer", 1],
["t03", "An small even integer", 10],
["t04", "A large integer", 100000000],
["t05", "A small decimal (epsilon)", aeps],
["t06", "The max number", number_max],
["t07", "The min number", number_min],
["t08", "The max number^2", number_max * number_max],
["t09", "The invalid number nan", 0 / 0],
["t10", "The boolean true", true],
["t11", "The boolean false", false],
["t12", "A character string", "a"],
["t13", "A string", "This is a longer string"],
["t14", "The empty string", empty_str],
["t15", "The empty list", empty_lst],
["t16", "A 1-tuple list of undef", [undef]],
["t17", "A 1-tuple list", [10]],
["t18", "A 3-tuple list", [1, 2, 3]],
["t19", "A list of lists", [[1,2,3], [4,5,6], [7,8,9]]],
["t20", "A shorthand range", [0:9]],
["t21", "A range", [0:0.5:9]]
];
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
t = true; // shortcuts
f = false;
u = undef;
s = -1; // skip test
good_r =
[ // function 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21
["is_defined", f, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t],
["not_defined", t, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f],
["is_nan", f, f, f, f, f, f, f, f, t, f, f, f, f, f, f, f, f, f, f, f, f],
["is_inf", f, f, f, f, f, f, f, t, f, f, f, f, f, f, f, f, f, f, f, f, f],
["is_scalar", t, t, t, t, t, t, t, t, t, t, t, f, f, f, f, f, f, f, f, s, s],
["is_iterable", f, f, f, f, f, f, f, f, f, f, f, t, t, t, t, t, t, t, t, s, s],
["is_empty", f, f, f, f, f, f, f, f, f, f, f, f, f, t, t, f, f, f, f, f, f],
["is_number", f, t, t, t, t, t, t, t, t, f, f, f, f, f, f, f, f, f, f, f, f],
["is_integer", f, t, t, t, f, t, t, f, f, f, f, f, f, f, f, f, f, f, f, f, f],
["is_decimal", f, f, f, f, t, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f],
["is_boolean", f, f, f, f, f, f, f, f, f, t, t, f, f, f, f, f, f, f, f, f, f],
["is_string", f, f, f, f, f, f, f, f, f, f, f, t, t, t, f, f, f, f, f, f, f],
["is_list", f, f, f, f, f, f, f, f, f, f, f, f, f, f, t, t, t, t, t, s, s],
["is_range", f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, t, t],
["is_even", s, f, t, t, f, t, t, s, s, s, s, s, s, s, s, s, s, s, s, s, s],
["is_odd", s, t, f, f, f, f, f, s, s, s, s, s, s, s, s, s, s, s, s, s, s],
["is_between_MM", f, t, t, t, t, t, t, f, f, t, t, f, f, f, f, f, f, f, f, f, f]
];
// 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=pass_value, pf=true );
test_text = validate( str(fname, "(", get_value(vid), ")=", pass_value), fresult, pass_value );
if ( pass_value != s )
{
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( "is_defined", is_defined(get_value(vid)), vid );
for (vid=test_ids) run_test( "not_defined", not_defined(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_nan", is_nan(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_inf", is_inf(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_scalar", is_scalar(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_iterable", is_iterable(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_empty", is_empty(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_number", is_number(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_integer", is_integer(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_decimal", is_decimal(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_boolean", is_boolean(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_string", is_string(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_list", is_list(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_range", is_range(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_even", is_even(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_odd", is_odd(get_value(vid)), vid );
for (vid=test_ids) run_test( "is_between_MM", is_between(get_value(vid),number_min,number_max), vid );
// end-of-tests