[
{
"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"
}
]