include <math.scad>;
use <table.scad>;
use <console.scad>;
use <validation.scad>;
show_passing = true;
show_skipped = true;
echo( str("OpenSCAD Version ", version()) );
test_c =
[
["id", "identifier"],
["td", "description"],
["tv", "test value"]
];
test_r =
[
["fac", "Function argument count", undef],
["crp", "Result precision", undef],
["t01", "All undefined", [undef,undef,undef,undef,undef,undef]],
["t03", "All scalars", [60, 50, 40, 30, 20, 10]],
["t04", "All 1D vectors", [[99], [58], [12], [42], [15], [1]]],
["t05", "All 2D vectors", [
[99,2], [58,16], [12,43],
[42,13], [15,59], [1,85]
]],
["t06", "All 3D vectors", [
[199,20,55], [158,116,75], [12,43,90],
[42,13,34], [15,59,45], [62,33,69]
]],
["t07", "All 4D vectors", [
[169,27,35,10], [178,016,25,20], [12,43,90,30],
[42,13,34,60], [15,059,45,50], [62,33,69,40]
]],
["t08", "Orthogonal vectors", [
]],
["t09", "Coplanar vectors", [
]]
];
good_c =
pmerge([concat(
"id", test_ids), concat(
"identifier", test_ids)]);
skip = -1;
good_r =
[
["distance_pp",
2,
4,
undef,
undef,
undef,
41,
43.3244,
106.2873,
undef,
1.4142,
1.4142
],
["dot_vv",
4,
4,
undef,
undef,
400,
1392,
1269,
17888,
22599,
1,
-2
],
["cross_vv",
4,
4,
skip,
skip,
skip,
skip,
917,
[2662,-11727,21929],
skip,
[1,-1,1],
[0,0,-1]
],
["striple_vvv",
6,
4,
skip,
skip,
skip,
skip,
[-75981,14663],
199188,
skip,
8,
0
],
["angle_vv",
4,
4,
undef,
undef,
undef,
undef,
35.8525,
54.4261,
undef,
60,
153.4350
],
["angle_vvn",
6,
4,
skip,
skip,
skip,
skip,
skip,
83.2771,
skip,
90,
0
],
["unit_v",
2,
4,
undef,
undef,
undef,
[1],
[0.9464,-0.3231],
[0.3857,-0.9032,-0.1882],
undef,
[0.7071,-0.7071,0],
[0.7071,-0.7071,0]
],
["are_coplanar_vvv",
6,
4,
skip,
skip,
skip,
skip,
skip,
false,
skip,
false,
true
]
];
function get_value( vid ) =
table_get(test_r, test_c, vid,
"tv");
function gv( vid, e ) = get_value( vid )[e];
module run( fname, vid )
{
value_text =
table_get(test_r, test_c, vid,
"td");
if (
table_get(good_r, good_c, fname, vid) != skip )
children();
else if ( show_skipped )
log_info( str(
"*skip*: ", vid,
" '", fname,
"(", value_text,
")'") );
}
module test( fname, fresult, vid )
{
value_text =
table_get(test_r, test_c, vid,
"td");
fname_argc =
table_get(good_r, good_c, fname,
"fac");
comp_prcsn =
table_get(good_r, good_c, fname,
"crp");
pass_value =
table_get(good_r, good_c, fname, vid);
test_pass =
validate(cv=fresult, t=
"almost", ev=pass_value, p=comp_prcsn, pf=
true);
farg_text =
vstr(
eappend(
", ",
rselect(get_value(vid), [0:fname_argc-1]), r=
false, j=
false, l=
false));
test_text =
validate(str(fname,
"(", farg_text,
")=~", pass_value), fresult,
"almost", pass_value, comp_prcsn);
if ( pass_value != skip )
{
if ( !test_pass )
log_warn( str(vid,
"(", value_text,
") ", test_text) );
else if ( show_passing )
}
else if ( show_skipped )
log_info( str(vid,
" *skip*: '", fname,
"(", value_text,
")'") );
}
run_ids = delete( test_ids, mv=["fac", "crp"] );
for (vid=run_ids) run("distance_pp",vid) test( "distance_pp", distance_pp(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );
for (vid=run_ids) run("dot_vv",vid) test( "dot_vv", dot_vv(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );
for (vid=run_ids) run("cross_vv",vid) test( "cross_vv", cross_vv(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );
for (vid=run_ids) run("striple_vvv",vid) test( "striple_vvv", striple_vvv(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );
for (vid=run_ids) run("angle_vv",vid) test( "angle_vv", angle_vv(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );
for (vid=run_ids) run("angle_vvn",vid) test( "angle_vvn", angle_vvn(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );
for (vid=run_ids) run("unit_v",vid) test( "unit_v", unit_v(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );
for (vid=run_ids) run("are_coplanar_vvv",vid) test( "are_coplanar_vvv", are_coplanar_vvv(gv(vid,0),gv(vid,1),gv(vid,2),gv(vid,3),gv(vid,4),gv(vid,5)), vid );