[ { "name": "a third plus a sixth is a half", "args": [ { "numerator": 1, "denominator": 3 }, "add", { "numerator": 1, "denominator": 6 } ], "expect": { "numerator": 1, "denominator": 2 } }, { "name": "one tenth plus two tenths is exactly three tenths, unlike 0.1 + 0.2", "args": [ { "numerator": 1, "denominator": 10 }, "add", { "numerator": 2, "denominator": 10 } ], "expect": { "numerator": 3, "denominator": 10 } }, { "name": "subtracting past zero gives a negative numerator", "args": [ { "numerator": 3, "denominator": 4 }, "subtract", { "numerator": 5, "denominator": 4 } ], "expect": { "numerator": -1, "denominator": 2 } }, { "name": "equal values subtract to zero over one", "args": [ { "numerator": 1, "denominator": 2 }, "subtract", { "numerator": 2, "denominator": 4 } ], "expect": { "numerator": 0, "denominator": 1 } }, { "name": "multiplying reduces the result", "args": [ { "numerator": 2, "denominator": 3 }, "multiply", { "numerator": 9, "denominator": 4 } ], "expect": { "numerator": 3, "denominator": 2 } }, { "name": "dividing by a quarter doubles a half into a whole number", "args": [ { "numerator": 1, "denominator": 2 }, "divide", { "numerator": 1, "denominator": 4 } ], "expect": { "numerator": 2, "denominator": 1 } }, { "name": "dividing by a negative puts the sign on the numerator", "args": [ { "numerator": 1, "denominator": 3 }, "divide", { "numerator": -2, "denominator": 3 } ], "expect": { "numerator": -1, "denominator": 2 } }, { "name": "unreduced inputs with a negative denominator are normalised", "args": [ { "numerator": 2, "denominator": -4 }, "add", { "numerator": 0, "denominator": 5 } ], "expect": { "numerator": -1, "denominator": 2 } }, { "name": "negative over negative is positive", "args": [ { "numerator": -3, "denominator": -9 }, "multiply", { "numerator": 1, "denominator": 1 } ], "expect": { "numerator": 1, "denominator": 3 } }, { "name": "unreduced products past 2^53 still reduce exactly", "args": [ { "numerator": 9007199254740991, "denominator": 2 }, "multiply", { "numerator": 2, "denominator": 9007199254740991 } ], "expect": { "numerator": 1, "denominator": 1 } }, { "name": "a common denominator past 2^53 before reducing", "args": [ { "numerator": 1, "denominator": 4503599627370496 }, "add", { "numerator": 1, "denominator": 4503599627370496 } ], "expect": { "numerator": 1, "denominator": 2251799813685248 } }, { "name": "an exchange rate and its inverse multiply to exactly one", "args": [ { "numerator": 11734, "denominator": 10000 }, "multiply", { "numerator": 10000, "denominator": 11734 } ], "expect": { "numerator": 1, "denominator": 1 } }, { "name": "a numerator past 2^53 - 1 is an overflow, not a rounded number", "args": [ { "numerator": 9007199254740991, "denominator": 1 }, "add", { "numerator": 1, "denominator": 1 } ], "expectError": "rational overflow" }, { "name": "a denominator past 2^53 - 1 is an overflow", "args": [ { "numerator": 1, "denominator": 9007199254740991 }, "multiply", { "numerator": 1, "denominator": 2 } ], "expectError": "rational overflow" }, { "name": "dividing by zero is an error", "args": [ { "numerator": 1, "denominator": 2 }, "divide", { "numerator": 0, "denominator": 5 } ], "expectError": "division by zero" }, { "name": "a zero denominator is an error", "args": [ { "numerator": 1, "denominator": 0 }, "add", { "numerator": 1, "denominator": 2 } ], "expectError": "denominator must not be zero" }, { "name": "an unknown operation is an error", "args": [ { "numerator": 1, "denominator": 2 }, "power", { "numerator": 1, "denominator": 2 } ], "expectError": "unknown operation" } ]