Functional Weave
Code in TypeScript

money.convert@1.0.0

vectors.json

7,186 bytes · view raw

[
  {
    "name": "100.00 GBP at 1.1734 is 117.34 EUR",
    "args": [
      {
        "minor": 10000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 11734,
          "denominator": 10000
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 11734,
      "currency": "EUR"
    }
  },
  {
    "name": "12.34 GBP at 1.1734 is 14.479756 EUR, rounded half-up",
    "args": [
      {
        "minor": 1234,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 11734,
          "denominator": 10000
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 1448,
      "currency": "EUR"
    }
  },
  {
    "name": "the same rounded down",
    "args": [
      {
        "minor": 1234,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 11734,
          "denominator": 10000
        }
      },
      "down"
    ],
    "expect": {
      "minor": 1447,
      "currency": "EUR"
    }
  },
  {
    "name": "a refund converts symmetrically",
    "args": [
      {
        "minor": -1234,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 11734,
          "denominator": 10000
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": -1448,
      "currency": "EUR"
    }
  },
  {
    "name": "pounds to yen: 10.00 at 190.12 is 1,901 yen, not 190,120",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "JPY",
        "rate": {
          "numerator": 19012,
          "denominator": 100
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 1901,
      "currency": "JPY"
    }
  },
  {
    "name": "yen back to pounds at the exact reciprocal",
    "args": [
      {
        "minor": 1901,
        "currency": "JPY"
      },
      {
        "base": "JPY",
        "quote": "GBP",
        "rate": {
          "numerator": 100,
          "denominator": 19012
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 1000,
      "currency": "GBP"
    }
  },
  {
    "name": "pounds to Kuwaiti dinar, three decimal places",
    "args": [
      {
        "minor": 10000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "KWD",
        "rate": {
          "numerator": 3812,
          "denominator": 10000
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 38120,
      "currency": "KWD"
    }
  },
  {
    "name": "1.005 exactly rounds up where a float gives 100.49999999999999",
    "args": [
      {
        "minor": 100,
        "currency": "EUR"
      },
      {
        "base": "EUR",
        "quote": "USD",
        "rate": {
          "numerator": 1005,
          "denominator": 1000
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 101,
      "currency": "USD"
    }
  },
  {
    "name": "half a cent rounds up under half-up",
    "args": [
      {
        "minor": 5,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 1,
          "denominator": 2
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 3,
      "currency": "EUR"
    }
  },
  {
    "name": "half a cent rounds to even under half-even",
    "args": [
      {
        "minor": 5,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 1,
          "denominator": 2
        }
      },
      "half-even"
    ],
    "expect": {
      "minor": 2,
      "currency": "EUR"
    }
  },
  {
    "name": "an unreduced rate is read as its value",
    "args": [
      {
        "minor": 10000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 23468,
          "denominator": 20000
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 11734,
      "currency": "EUR"
    }
  },
  {
    "name": "zero converts to zero",
    "args": [
      {
        "minor": 0,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 11734,
          "denominator": 10000
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 0,
      "currency": "EUR"
    }
  },
  {
    "name": "a same-currency rate of one is the identity",
    "args": [
      {
        "minor": 4321,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "GBP",
        "rate": {
          "numerator": 1,
          "denominator": 1
        }
      },
      "half-up"
    ],
    "expect": {
      "minor": 4321,
      "currency": "GBP"
    }
  },
  {
    "name": "a GBP to EUR rate on a USD amount is an error",
    "args": [
      {
        "minor": 1000,
        "currency": "USD"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 11734,
          "denominator": 10000
        }
      },
      "half-up"
    ],
    "expectError": "exchange rate converts GBP to EUR, not USD"
  },
  {
    "name": "a zero rate is an error",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 0,
          "denominator": 1
        }
      },
      "half-up"
    ],
    "expectError": "exchange rate must be positive"
  },
  {
    "name": "a negative rate is an error",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": -11734,
          "denominator": 10000
        }
      },
      "half-up"
    ],
    "expectError": "exchange rate must be positive"
  },
  {
    "name": "a zero denominator is an error",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 1,
          "denominator": 0
        }
      },
      "half-up"
    ],
    "expectError": "denominator must not be zero"
  },
  {
    "name": "gold has no minor unit to convert into",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "XAU",
        "rate": {
          "numerator": 1,
          "denominator": 3000
        }
      },
      "half-up"
    ],
    "expectError": "no ISO 4217 minor unit"
  },
  {
    "name": "a product too large to hold exactly is refused",
    "args": [
      {
        "minor": 9007199254740991,
        "currency": "GBP"
      },
      {
        "base": "GBP",
        "quote": "EUR",
        "rate": {
          "numerator": 3,
          "denominator": 2
        }
      },
      "half-up"
    ],
    "expectError": "rational overflow"
  }
]