return as_text.trim().split('\n').map(parse_line);
}
-function parse_tax_table(as_text) {
- return parse_table(as_text).map(([start, rate], i, table) =>
+function tax_table_from_table(table) {
+ return table.map(([start, rate], i, table) =>
[start, i < table.length - 1 ? table[i+1][0] : Infinity, rate / 100.0]);
}
+function parse_tax_table(as_text) {
+ return tax_table_from_table(parse_table(as_text));
+}
+
function sum(nums) {
return nums.reduce((total, num) => total + num, 0);
}
f();
}
+function near(a, b, epsilon = 1e-6) {
+ return Math.abs(a - b) < epsilon;
+}
+
function rand(limit = 100) {
return Math.round(Math.random() * limit);
}
-function make_random_tax_table(min_threshold) {
- if (rand(2)) return [];
- const start = min_threshold === undefined ? rand() : min_threshold;
- const end = start + 1 + rand();
- return [[start, end, rand()]].concat(make_random_tax_table(end));
+function make_random_tax_table() {
+ function make_random_table(min_threshold) {
+ if (rand(2)) return [];
+ const start = min_threshold === undefined ? rand() : min_threshold;
+ const end = start + 1 + rand();
+ return [[start, rand()]].concat(make_random_table(end));
+ }
+ return tax_table_from_table(make_random_table());
}
test("parse tax table", () => {
const combined = merge_tax_tables(t1, t2);
for (var j = 0; j < 10; j++) {
const income = rand(250);
- assert.strictEqual(tax(t1, income) + tax(t2, income), tax(combined, income));
+ assert.ok(near(tax(t1, income) + tax(t2, income), tax(combined, income)));
}
}
});