Functional Weave
Code in TypeScript

stats.mean-median@1.0.0

vectors.json

4,002 bytes · view raw

[
  { "name": "an even count has a fractional mean and median", "args": [[1, 2, 3, 4]], "expect": { "count": 4, "sum": 10, "mean": { "numerator": 5, "denominator": 2 }, "meanValue": 2.5, "median": { "numerator": 5, "denominator": 2 }, "medianValue": 2.5, "modes": [1, 2, 3, 4], "modeFrequency": 1 } },
  { "name": "the mean of 3 and 4 is 7/2, not the 3 integer division gives", "args": [[3, 4]], "expect": { "count": 2, "sum": 7, "mean": { "numerator": 7, "denominator": 2 }, "meanValue": 3.5, "median": { "numerator": 7, "denominator": 2 }, "medianValue": 3.5, "modes": [3, 4], "modeFrequency": 1 } },
  { "name": "unsorted odd-length input takes the middle of the sorted values", "args": [[2, 2, 3, 9, 1]], "expect": { "count": 5, "sum": 17, "mean": { "numerator": 17, "denominator": 5 }, "meanValue": 3.4, "median": { "numerator": 2, "denominator": 1 }, "medianValue": 2, "modes": [2], "modeFrequency": 2 } },
  { "name": "the median sorts numerically, not as strings (10 is not before 9)", "args": [[10, 9, 1]], "expect": { "count": 3, "sum": 20, "mean": { "numerator": 20, "denominator": 3 }, "meanValue": 6.666666666666667, "median": { "numerator": 9, "denominator": 1 }, "medianValue": 9, "modes": [1, 9, 10], "modeFrequency": 1 } },
  { "name": "tied modes are all returned, ascending", "args": [[5, 3, 5, 3, 1]], "expect": { "count": 5, "sum": 17, "mean": { "numerator": 17, "denominator": 5 }, "meanValue": 3.4, "median": { "numerator": 3, "denominator": 1 }, "medianValue": 3, "modes": [3, 5], "modeFrequency": 2 } },
  { "name": "negative values keep the sign on the numerator", "args": [[-3, -2]], "expect": { "count": 2, "sum": -5, "mean": { "numerator": -5, "denominator": 2 }, "meanValue": -2.5, "median": { "numerator": -5, "denominator": 2 }, "medianValue": -2.5, "modes": [-3, -2], "modeFrequency": 1 } },
  { "name": "a single value is its own mean, median and mode", "args": [[7]], "expect": { "count": 1, "sum": 7, "mean": { "numerator": 7, "denominator": 1 }, "meanValue": 7, "median": { "numerator": 7, "denominator": 1 }, "medianValue": 7, "modes": [7], "modeFrequency": 1 } },
  { "name": "a zero mean is 0/1 in lowest terms", "args": [[-4, 4]], "expect": { "count": 2, "sum": 0, "mean": { "numerator": 0, "denominator": 1 }, "meanValue": 0, "median": { "numerator": 0, "denominator": 1 }, "medianValue": 0, "modes": [-4, 4], "modeFrequency": 1 } },
  { "name": "fractions are reduced to lowest terms", "args": [[2, 4, 6, 8]], "expect": { "count": 4, "sum": 20, "mean": { "numerator": 5, "denominator": 1 }, "meanValue": 5, "median": { "numerator": 5, "denominator": 1 }, "medianValue": 5, "modes": [2, 4, 6, 8], "modeFrequency": 1 } },
  { "name": "a repeating mean is exact as a fraction", "args": [[1, 1, 2]], "expect": { "count": 3, "sum": 4, "mean": { "numerator": 4, "denominator": 3 }, "meanValue": 1.3333333333333333, "median": { "numerator": 1, "denominator": 1 }, "medianValue": 1, "modes": [1], "modeFrequency": 2 } },
  { "name": "values at the edge of the safe range", "args": [[9007199254740991, -9007199254740991]], "expect": { "count": 2, "sum": 0, "mean": { "numerator": 0, "denominator": 1 }, "meanValue": 0, "median": { "numerator": 0, "denominator": 1 }, "medianValue": 0, "modes": [-9007199254740991, 9007199254740991], "modeFrequency": 1 } },
  { "name": "an empty list is an error", "args": [[]], "expectError": "values must not be empty" },
  { "name": "a fractional value is an error", "args": [[1, 2.5]], "expectError": "values must be integers" },
  { "name": "a value past 2^53 - 1 is an error", "args": [[9007199254740992]], "expectError": "values must be safe integers" },
  { "name": "a sum past the safe range is an error, not a rounded answer", "args": [[9007199254740991, 1]], "expectError": "sum exceeds the safe integer range" },
  { "name": "an odd median pair past the safe range is an error", "args": [[-9007199254740991, 4503599627370496, 4503599627370497, 4503599627370497]], "expectError": "median exceeds the safe integer range" }
]