LlListStatistics Test

# Create a Cube and place the following script inside.
# Verify the the object reports all tests Passed.
[llListStatistics Automated Test]
// Global constants
integer NUM_STAT_FUNCTIONS = 10; // The total number of statistics functions being tested
float PRECISION = 0.000001; // Precision for deciding if two floats are equal.
// Lists of random numbers and expected results for list statistic tests.
list pos_i_nums = [60, 9, 52, 46, 15, 93, 1, 38, 2, 2, 19, 35, 98, 40, 81, 63, 33, 7, 14, 57];
list pos_i_nums_exp = [21.946033, 98.000000, 38.250000, 36.500000, 1.000000, 20.000000, 97.000000, 30.322607, 765.000000, 46731.000000];
list i_nums = [-70, 13, 57, 40, 64, 69, -4, -82, 65, 12, -38, -2, -87, -56, 16, -3, 42, 72, 88, 9];
list i_nums_exp = [0.000000, 88.000000, 10.250000, 12.500000, -87.000000, 20.000000, 175.000000, 53.789917, 205.000000, 57075.000000];
list pos_f_nums = [82.417809, 91.809250, 76.745857, 30.112839, 59.592426, 69.273590, 45.307995, 75.208054, 76.048752, 68.020439, 8.152950, 75.462746, 41.539265, 29.632532, 78.000549, 92.402588, 6.669974, 27.978504, 5.558228, 39.094364];
list pos_f_nums_exp = [41.926147, 92.402588, 53.951435, 63.806435, 5.558228, 20.000000, 86.844360, 28.696329, 1079.028687, 73861.257812];
list f_nums = [-0.139381, -27.304054, 94.030289, 13.192818, -47.015236, -65.352325, -19.218590, -46.622826, 74.704987, 81.610138, 77.102188, 37.365799, 71.920914, -6.563972, 75.492142, -66.262222, -14.630196, 42.237671, 50.809509, 60.678391];
list f_nums_exp = [0.000000, 94.030289, 19.301802, 25.279308, -66.262222, 20.000000, 160.292511, 53.549522, 386.036041, 61934.664062];
list pos_nums = [73.602554, 51, 81.272957, 1, 99.056290, 51, 49, 4, 40, 7.409000, 14.304935, 33.760963, 55, 74.717239, 93, 62, 79.556740, 80.807838, 68, 6];
list pos_nums_exp = [33.224949, 99.056290, 51.224426, 53.000000, 1.000000, 20.000000, 98.056290, 31.284027, 1024.488525, 71073.953125];
list nums = [83.584778, -60.052635, 18, -8.325104, 96, 38.019531, 8.437393, 43, -68.145966, 47.279388, -34.522865, -66.681480, 57, -52, 76.156738, -79.752159, -6.773018, -25.028397, -2, -12];
list nums_exp = [0.000000, 96.000000, 2.609810, -4.386509, -79.752159, 20.000000, 175.752167, 53.745258, 52.196205, 55018.726562];
list mix = [<54.256630, 3.637493, 84.144615>, <29.411591, 13.690305, 41.204464, 47.844841>, <75.334404, 88.659325, 45.068050>, "hb", <81.319321, 28.139233, 44.470226, 90.885689>, "+:N:5[9-e", "=", <59.082222, 22.229565, 52.013420>, 23, -65.739204,-95.452667, <62.925495, 44.109821, 87.012184, 41.697239>, <82.293236, 35.758636, 34.232937>, <99.836624, 42.692303, 93.425766, 4.260778>, 63, 94, "ja 4q", "bp", "c", <70.304001, 52.908825, 50.068676>];
list mix_exp = [0.000000, 94.000000, 3.761626, 23.000000, -95.452667, 5.000000, 189.452667, 81.694717, 18.808128, 26766.855469];
// Floats don't behave well with ==. 
// This function does a 'close enough' equals, as determined by PRECISION.
integer equal(float a, float b)
{
 return ( llFabs(a-b) < PRECISION );
}
// Test a single list statistic function
// list test The list being tested
// list expected The expected results of each list statistics function. Order matters.
// integer stat The statistics function to test
// string name The name of the list being tested
// string stat_name The name of the statistics function being tested
integer stat_test(list test, float exp, integer stat, string name, string stat_name)
{
 float res;
 
 res = llListStatistics(stat,test);
 if (!equal(res,exp))
 {
 llOwnerSay(" * Test Failed: " + stat_name + " for " + name);
 llOwnerSay(" Expected: " + (string)exp + " Actual: " + (string)res);
 return FALSE;
 }
 return TRUE;
}
// Run the full suite of list statistics on a given list
// list test The list being tested
// list expected The expected results of each list statistics function. Order matters.
// string name The name of the list being tested
integer list_stats_test(list test, list expected, string name)
{
 integer i;
 integer pass;
 
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_GEOMETRIC_MEAN,name,"LIST_STAT_GEOMETRIC_MEAN");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_MAX,name,"LIST_STAT_MAX");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_MEAN,name,"LIST_STAT_MEAN");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_MEDIAN,name,"LIST_STAT_MEDIAN");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_MIN,name,"LIST_STAT_MIN");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_NUM_COUNT,name,"LIST_STAT_NUM_COUNT");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_RANGE,name,"LIST_STAT_RANGE");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_STD_DEV,name,"LIST_STAT_STD_DEV");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_SUM,name,"LIST_STAT_SUM");
 pass += stat_test(test,llList2Float(expected,i++),LIST_STAT_SUM_SQUARES,name,"LIST_STAT_SUM_SQUARES");
 
 if (pass == NUM_STAT_FUNCTIONS)
 {
 llOwnerSay("All tests passed for " + name);
 }
 return pass;
}
// Used to get all the statistics results for a given list.
get(list test)
{
 list results;
 results += llListStatistics(LIST_STAT_GEOMETRIC_MEAN,test);
 results += llListStatistics(LIST_STAT_MAX,test);
 results += llListStatistics(LIST_STAT_MEAN,test);
 results += llListStatistics(LIST_STAT_MEDIAN,test);
 results += llListStatistics(LIST_STAT_MIN,test);
 results += llListStatistics(LIST_STAT_NUM_COUNT,test);
 results += llListStatistics(LIST_STAT_RANGE,test);
 results += llListStatistics(LIST_STAT_STD_DEV,test);
 results += llListStatistics(LIST_STAT_SUM,test);
 results += llListStatistics(LIST_STAT_SUM_SQUARES,test);
 llOwnerSay(llList2CSV(results));
}
default
{
 state_entry()
 {
 integer passed;
 integer total_passed;
 integer total_failed;
 
 passed = list_stats_test(pos_i_nums,pos_i_nums_exp,"Positive Integers");
 total_passed += passed;
 total_failed += (NUM_STAT_FUNCTIONS - passed);
 
 passed = list_stats_test(i_nums,i_nums_exp,"Integers");
 total_passed += passed;
 total_failed += (NUM_STAT_FUNCTIONS - passed);
 
 passed = list_stats_test(pos_f_nums,pos_f_nums_exp,"Positive Floats");
 total_passed += passed;
 total_failed += (NUM_STAT_FUNCTIONS - passed);
 
 passed = list_stats_test(f_nums,f_nums_exp,"Floats");
 total_passed += passed;
 total_failed += (NUM_STAT_FUNCTIONS - passed);
 
 passed = list_stats_test(pos_nums,pos_nums_exp,"Positive Numbers");
 total_passed += passed;
 total_failed += (NUM_STAT_FUNCTIONS - passed);
 
 passed = list_stats_test(nums,nums_exp,"Numbers");
 total_passed += passed;
 total_failed += (NUM_STAT_FUNCTIONS - passed);
 
 passed = list_stats_test(mix,mix_exp,"Mixed Types");
 total_passed += passed;
 total_failed += (NUM_STAT_FUNCTIONS - passed);
 
 llOwnerSay("Free Memory: " + (string)llGetFreeMemory());
 llOwnerSay("Passed: " + (string)total_passed + " Failed: " + (string)total_failed);
 }
}
Category:QA Portal
Category:Quality Assurance