Functional Weave
Code in TypeScript

math.rational@1.0.0

vectors.json

5,179 bytes · view raw

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