Functional Weave
Code in Rust

money.parse@1.0.0

vectors.json

6,929 bytes · view raw

[
  {
    "name": "pounds with a thousands comma",
    "args": [
      "£1,234.50",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 123450,
      "currency": "GBP"
    }
  },
  {
    "name": "euros written the German way, symbol after",
    "args": [
      "1.234,50 €",
      "EUR",
      "dot-comma"
    ],
    "expect": {
      "minor": 123450,
      "currency": "EUR"
    }
  },
  {
    "name": "euros written the Irish way",
    "args": [
      "€1,234.50",
      "EUR",
      "comma-dot"
    ],
    "expect": {
      "minor": 123450,
      "currency": "EUR"
    }
  },
  {
    "name": "millions in the German style",
    "args": [
      "1.234.567,89 €",
      "EUR",
      "dot-comma"
    ],
    "expect": {
      "minor": 123456789,
      "currency": "EUR"
    }
  },
  {
    "name": "no grouping and one decimal digit",
    "args": [
      "1234.5",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 123450,
      "currency": "GBP"
    }
  },
  {
    "name": "whole pounds",
    "args": [
      "£5",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 500,
      "currency": "GBP"
    }
  },
  {
    "name": "pence only",
    "args": [
      "£0.05",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 5,
      "currency": "GBP"
    }
  },
  {
    "name": "minus before the symbol",
    "args": [
      "-£12.34",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": -1234,
      "currency": "GBP"
    }
  },
  {
    "name": "minus after the symbol",
    "args": [
      "£-12.34",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": -1234,
      "currency": "GBP"
    }
  },
  {
    "name": "negative zero is zero",
    "args": [
      "-0.00",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 0,
      "currency": "GBP"
    }
  },
  {
    "name": "yen have no decimal places",
    "args": [
      "¥1,500",
      "JPY",
      "comma-dot"
    ],
    "expect": {
      "minor": 1500,
      "currency": "JPY"
    }
  },
  {
    "name": "dinar have three decimal places",
    "args": [
      "KD 1.500",
      "KWD",
      "comma-dot"
    ],
    "expect": {
      "minor": 1500,
      "currency": "KWD"
    }
  },
  {
    "name": "Swiss apostrophe grouping with the ISO code",
    "args": [
      "CHF 1'234'567.89",
      "CHF",
      "apostrophe-dot"
    ],
    "expect": {
      "minor": 123456789,
      "currency": "CHF"
    }
  },
  {
    "name": "Swedish space grouping, trailing symbol",
    "args": [
      "1 234,56 kr",
      "SEK",
      "space-comma"
    ],
    "expect": {
      "minor": 123456,
      "currency": "SEK"
    }
  },
  {
    "name": "no-break spaces, as word processors write them",
    "args": [
      "1 234,56 kr",
      "SEK",
      "space-comma"
    ],
    "expect": {
      "minor": 123456,
      "currency": "SEK"
    }
  },
  {
    "name": "French narrow no-break space grouping",
    "args": [
      "1 234,56 €",
      "EUR",
      "space-comma"
    ],
    "expect": {
      "minor": 123456,
      "currency": "EUR"
    }
  },
  {
    "name": "an ISO code after the number",
    "args": [
      "10.00 GBP",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 1000,
      "currency": "GBP"
    }
  },
  {
    "name": "a dollar sign is fine once the caller says Canadian dollars",
    "args": [
      "$5.00",
      "CAD",
      "comma-dot"
    ],
    "expect": {
      "minor": 500,
      "currency": "CAD"
    }
  },
  {
    "name": "US$ is recognised as one symbol",
    "args": [
      "US$9.99",
      "USD",
      "comma-dot"
    ],
    "expect": {
      "minor": 999,
      "currency": "USD"
    }
  },
  {
    "name": "surrounding spaces are ignored",
    "args": [
      "  £5.00 ",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 500,
      "currency": "GBP"
    }
  },
  {
    "name": "one space between symbol and number",
    "args": [
      "£ 5.00",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 500,
      "currency": "GBP"
    }
  },
  {
    "name": "the largest amount that is still exact",
    "args": [
      "90071992547409.91",
      "GBP",
      "comma-dot"
    ],
    "expect": {
      "minor": 9007199254740991,
      "currency": "GBP"
    }
  },
  {
    "name": "three decimals for pounds is refused, not rounded",
    "args": [
      "£1,234.567",
      "GBP",
      "comma-dot"
    ],
    "expectError": "too many decimal places"
  },
  {
    "name": "1.500 yen is not fifteen hundred yen in comma-dot style",
    "args": [
      "1.500",
      "JPY",
      "comma-dot"
    ],
    "expectError": "too many decimal places"
  },
  {
    "name": "a German thousand read in the UK style is refused, not read as 1.23",
    "args": [
      "£1.234",
      "GBP",
      "comma-dot"
    ],
    "expectError": "too many decimal places"
  },
  {
    "name": "lakh grouping is not thousands grouping",
    "args": [
      "£1,23,456.00",
      "GBP",
      "comma-dot"
    ],
    "expectError": "is not a valid amount"
  },
  {
    "name": "the other style's separators are refused",
    "args": [
      "1,234.50",
      "EUR",
      "dot-comma"
    ],
    "expectError": "is not a valid amount"
  },
  {
    "name": "a symbol for another currency is refused",
    "args": [
      "€5.00",
      "GBP",
      "comma-dot"
    ],
    "expectError": "does not match GBP"
  },
  {
    "name": "R$ is Brazilian real, not rand",
    "args": [
      "R$10,00",
      "ZAR",
      "space-comma"
    ],
    "expectError": "does not match ZAR"
  },
  {
    "name": "letters are refused",
    "args": [
      "12abc",
      "GBP",
      "comma-dot"
    ],
    "expectError": "is not a valid amount"
  },
  {
    "name": "a symbol alone is refused",
    "args": [
      "£",
      "GBP",
      "comma-dot"
    ],
    "expectError": "is not a valid amount"
  },
  {
    "name": "an empty string is refused",
    "args": [
      "",
      "GBP",
      "comma-dot"
    ],
    "expectError": "is not a valid amount"
  },
  {
    "name": "a trailing decimal point is refused",
    "args": [
      "£5.",
      "GBP",
      "comma-dot"
    ],
    "expectError": "is not a valid amount"
  },
  {
    "name": "accounting brackets are refused",
    "args": [
      "(£5.00)",
      "GBP",
      "comma-dot"
    ],
    "expectError": "is not a valid amount"
  },
  {
    "name": "beyond 2^53 - 1 minor units is refused",
    "args": [
      "90071992547409.92",
      "GBP",
      "comma-dot"
    ],
    "expectError": "amount is too large"
  },
  {
    "name": "an unknown currency is an error",
    "args": [
      "5.00",
      "XYZ",
      "comma-dot"
    ],
    "expectError": "no ISO 4217 minor unit"
  },
  {
    "name": "an unknown style is an error",
    "args": [
      "5.00",
      "GBP",
      "indian"
    ],
    "expectError": "unknown number style"
  }
]