--- /dev/null
+This test verifies PerfTestRunner.computeStatistics(), including: min, max, median, mean, sum, variance, and stdev.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Ensure no latent divide by 0's for an odd number of elements.
+data = [0,0,0,0,0]
+PASS stats.min is 0
+PASS stats.max is 0
+PASS stats.median is 0
+PASS stats.mean is 0
+PASS stats.sum is 0
+PASS stats.variance is 0
+PASS stats.stdev is 0
+
+This test will catch if any order dependencies in the data, such as
+needing to be numerically sorted, are not resolved by the algorithm.
+This variant covers an odd number of elements.
+data = [1,10,2,20,5]
+PASS stats.min is 1
+PASS stats.max is 20
+PASS stats.median is 5
+PASS stats.mean is 7.6
+PASS stats.sum is 38
+PASS stats.min is 1
+PASS stats.max is 20
+PASS stats.median is 5
+PASS stats.mean is 7.6
+PASS stats.sum is 38
+PASS stats.variance is within 0.0001 of 48.239999999999995
+PASS stats.stdev is within 0.0001 of 6.945502141674135
+
+This test will catch if any order dependencies in the data, such as
+needing to be numerically sorted, are not resolved by the algorithm.
+This variant covers an odd number of elements, and negative values.
+data = [-1,-10,-2,-20,-5]
+PASS stats.min is -20
+PASS stats.max is -1
+PASS stats.median is -5
+PASS stats.mean is -7.6
+PASS stats.sum is -38
+PASS stats.min is -20
+PASS stats.max is -1
+PASS stats.median is -5
+PASS stats.mean is -7.6
+PASS stats.sum is -38
+PASS stats.variance is within 0.0001 of 48.239999999999995
+PASS stats.stdev is within 0.0001 of 6.945502141674135
+
+Ensure no latent divide by 0's for an even number of elements.
+data = [0,0,0,0]
+PASS stats.median is 0
+
+This test verifies that median is handled correctly for
+an even number of elements.
+data = [1,10,2,20,5,6]
+PASS stats.median is 5.5
+PASS stats.median is 5.5
+
+This test verifies that median is handled correctly for
+an even number of elements, including negative numbers.
+data = [-1,-10,-2,-20,-5,-6]
+PASS stats.median is -5.5
+PASS stats.median is -5.5
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../fast/js/resources/js-test-pre.js"></script>
+<script src="../../../../PerformanceTests/resources/runner.js"></script>
+<script type="text/javascript">
+var alternateComputeStatistics = {
+ min: function(array) {
+ return Math.min.apply(Math, array);
+ },
+ max: function(array) {
+ return Math.max.apply(Math, array);
+ },
+ median: function(originalData) {
+ // don't want side effects on the input array, so...
+ var array = originalData.slice(0);
+ array.sort(function(a,b) { return a - b; });
+ var mid = Math.floor(array.length / 2);
+ if (array.length % 2)
+ return array[mid];
+ else
+ return (array[mid-1] + array[mid]) / 2;
+ },
+ mean: function(array) {
+ return alternateComputeStatistics.sum(array)/array.length;
+ },
+ sum: function(array) {
+ var total = 0;
+ for (var index in array)
+ total += array[index];
+ return total;
+ },
+ variance: function(array) {
+ var mean = alternateComputeStatistics.mean(array);
+ var arrayOfSquaredDiffs = [];
+ for (var index in array) {
+ var squaredDiff = array[index] - mean;
+ squaredDiff *= squaredDiff;
+ arrayOfSquaredDiffs.push(squaredDiff);
+ };
+ return alternateComputeStatistics.mean(arrayOfSquaredDiffs);
+ },
+ stdev: function(array) {
+ return Math.sqrt(alternateComputeStatistics.variance(array));
+ }
+};
+</script>
+</head>
+<body>
+
+<div id="description"></div>
+
+<script type="text/javascript">
+description("This test verifies PerfTestRunner.computeStatistics(), " +
+ "including: min, max, median, mean, sum, variance, and stdev.");
+</script>
+
+<div id="console"></div>
+
+<script type="text/javascript">
+var data = [];
+var stats = [];
+
+data = [0, 0, 0, 0, 0];
+debug("Ensure no latent divide by 0's for an odd number of elements.");
+debug("data = " + JSON.stringify(data));
+stats = PerfTestRunner.computeStatistics(data);
+shouldEvaluateTo("stats.min", 0);
+shouldEvaluateTo("stats.max", 0);
+shouldEvaluateTo("stats.median", 0);
+shouldEvaluateTo("stats.mean", 0);
+shouldEvaluateTo("stats.sum", 0);
+shouldEvaluateTo("stats.variance", 0);
+shouldEvaluateTo("stats.stdev", 0);
+debug("");
+
+data = [1, 10, 2, 20, 5];
+debug("This test will catch if any order dependencies in the data, such as");
+debug("needing to be numerically sorted, are not resolved by the algorithm.");
+debug("This variant covers an odd number of elements.");
+debug("data = " + JSON.stringify(data));
+stats = PerfTestRunner.computeStatistics(data);
+// hand calculated
+shouldEvaluateTo("stats.min", 1);
+shouldEvaluateTo("stats.max", 20);
+shouldEvaluateTo("stats.median", 5);
+shouldEvaluateTo("stats.mean", (38/5));
+shouldEvaluateTo("stats.sum", (1+2+5+10+20));
+// using alternate implementation
+shouldEvaluateTo("stats.min", alternateComputeStatistics.min(data));
+shouldEvaluateTo("stats.max", alternateComputeStatistics.max(data));
+shouldEvaluateTo("stats.median", alternateComputeStatistics.median(data));
+shouldEvaluateTo("stats.mean", alternateComputeStatistics.mean(data));
+shouldEvaluateTo("stats.sum", alternateComputeStatistics.sum(data));
+shouldBeCloseTo("stats.variance", alternateComputeStatistics.variance(data), 0.0001);
+shouldBeCloseTo("stats.stdev", alternateComputeStatistics.stdev(data), 0.0001);
+debug("");
+
+data = [-1, -10, -2, -20, -5];
+debug("This test will catch if any order dependencies in the data, such as");
+debug("needing to be numerically sorted, are not resolved by the algorithm.");
+debug("This variant covers an odd number of elements, and negative values.");
+debug("data = " + JSON.stringify(data));
+stats = PerfTestRunner.computeStatistics(data);
+// hand calculated
+shouldEvaluateTo("stats.min", -20);
+shouldEvaluateTo("stats.max", -1);
+shouldEvaluateTo("stats.median", -5);
+shouldEvaluateTo("stats.mean", (-38/5));
+shouldEvaluateTo("stats.sum", (-1-2-5-10-20));
+// using alternate implementation
+shouldEvaluateTo("stats.min", alternateComputeStatistics.min(data));
+shouldEvaluateTo("stats.max", alternateComputeStatistics.max(data));
+shouldEvaluateTo("stats.median", alternateComputeStatistics.median(data));
+shouldEvaluateTo("stats.mean", alternateComputeStatistics.mean(data));
+shouldEvaluateTo("stats.sum", alternateComputeStatistics.sum(data));
+shouldBeCloseTo("stats.variance", alternateComputeStatistics.variance(data), 0.0001);
+shouldBeCloseTo("stats.stdev", alternateComputeStatistics.stdev(data), 0.0001);
+debug("");
+
+data = [0, 0, 0, 0];
+debug("Ensure no latent divide by 0's for an even number of elements.");
+debug("data = " + JSON.stringify(data));
+stats = PerfTestRunner.computeStatistics(data);
+shouldEvaluateTo("stats.median", 0);
+debug("");
+
+data = [1, 10, 2, 20, 5, 6];
+debug("This test verifies that median is handled correctly for");
+debug("an even number of elements.");
+debug("data = " + JSON.stringify(data));
+stats = PerfTestRunner.computeStatistics(data);
+shouldEvaluateTo("stats.median", 5.5);
+shouldEvaluateTo("stats.median", alternateComputeStatistics.median(data));
+debug("");
+
+data = [-1, -10, -2, -20, -5, -6];
+debug("This test verifies that median is handled correctly for");
+debug("an even number of elements, including negative numbers.");
+debug("data = " + JSON.stringify(data));
+stats = PerfTestRunner.computeStatistics(data);
+shouldEvaluateTo("stats.median", -5.5);
+shouldEvaluateTo("stats.median", alternateComputeStatistics.median(data));
+debug("");
+
+// runner.js marks this as an async test so we need to call notifyDone.
+if (window.layoutTestController)
+ layoutTestController.notifyDone();
+</script>
+
+<script src="../../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>