Functional Weave
Code in Rust

finance.markup-price@1.0.0

vectors.json

5,487 bytes · view raw

[
  {
    "name": "60.00 at a 40 percent margin is 100.00, as finance.margin says",
    "args": [
      {
        "minor": 6000,
        "currency": "GBP"
      },
      4000,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 10000,
      "currency": "GBP"
    }
  },
  {
    "name": "100.00 at a 50 percent markup is 150.00",
    "args": [
      {
        "minor": 10000,
        "currency": "GBP"
      },
      5000,
      "markup",
      "half-up"
    ],
    "expect": {
      "minor": 15000,
      "currency": "GBP"
    }
  },
  {
    "name": "100.00 at a 50 percent margin is 200.00, not 150.00",
    "args": [
      {
        "minor": 10000,
        "currency": "GBP"
      },
      5000,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 20000,
      "currency": "GBP"
    }
  },
  {
    "name": "6.99 at a 30.03 percent margin is 9.99, finance.margin backwards",
    "args": [
      {
        "minor": 699,
        "currency": "GBP"
      },
      3003,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 999,
      "currency": "GBP"
    }
  },
  {
    "name": "6.99 at a 42.92 percent markup is 9.99, finance.margin backwards",
    "args": [
      {
        "minor": 699,
        "currency": "GBP"
      },
      4292,
      "markup",
      "half-up"
    ],
    "expect": {
      "minor": 999,
      "currency": "GBP"
    }
  },
  {
    "name": "10.00 at a 30 percent margin rounds half-up to 14.29",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      3000,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 1429,
      "currency": "GBP"
    }
  },
  {
    "name": "rounding down misses a 30 percent margin: 14.28 is 29.97 percent",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      3000,
      "margin",
      "down"
    ],
    "expect": {
      "minor": 1428,
      "currency": "GBP"
    }
  },
  {
    "name": "rounding up never falls short of the target",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      3000,
      "margin",
      "up"
    ],
    "expect": {
      "minor": 1429,
      "currency": "GBP"
    }
  },
  {
    "name": "an exact half penny rounds to even: 1.5 becomes 2",
    "args": [
      {
        "minor": 1,
        "currency": "GBP"
      },
      5000,
      "markup",
      "half-even"
    ],
    "expect": {
      "minor": 2,
      "currency": "GBP"
    }
  },
  {
    "name": "zero margin is the cost",
    "args": [
      {
        "minor": 4321,
        "currency": "GBP"
      },
      0,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 4321,
      "currency": "GBP"
    }
  },
  {
    "name": "zero markup is the cost",
    "args": [
      {
        "minor": 4321,
        "currency": "GBP"
      },
      0,
      "markup",
      "half-up"
    ],
    "expect": {
      "minor": 4321,
      "currency": "GBP"
    }
  },
  {
    "name": "zero cost is a zero price",
    "args": [
      {
        "minor": 0,
        "currency": "GBP"
      },
      4000,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 0,
      "currency": "GBP"
    }
  },
  {
    "name": "a negative markup is a discount below cost",
    "args": [
      {
        "minor": 10000,
        "currency": "GBP"
      },
      -2000,
      "markup",
      "half-up"
    ],
    "expect": {
      "minor": 8000,
      "currency": "GBP"
    }
  },
  {
    "name": "a markup of -100 percent is a giveaway",
    "args": [
      {
        "minor": 500,
        "currency": "GBP"
      },
      -10000,
      "markup",
      "half-up"
    ],
    "expect": {
      "minor": 0,
      "currency": "GBP"
    }
  },
  {
    "name": "a negative margin prices below cost, as finance.margin reports it",
    "args": [
      {
        "minor": 12000,
        "currency": "GBP"
      },
      -2000,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 10000,
      "currency": "GBP"
    }
  },
  {
    "name": "yen at a 20 percent margin",
    "args": [
      {
        "minor": 800,
        "currency": "JPY"
      },
      2000,
      "margin",
      "half-up"
    ],
    "expect": {
      "minor": 1000,
      "currency": "JPY"
    }
  },
  {
    "name": "a 100 percent margin has no finite price",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      10000,
      "margin",
      "half-up"
    ],
    "expectError": "has no finite price"
  },
  {
    "name": "a markup below -100 percent would be a negative price",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      -10001,
      "markup",
      "half-up"
    ],
    "expectError": "gives a negative price"
  },
  {
    "name": "a negative cost is an error",
    "args": [
      {
        "minor": -1000,
        "currency": "GBP"
      },
      2000,
      "markup",
      "half-up"
    ],
    "expectError": "cost must not be negative"
  },
  {
    "name": "the basis has no default and must be named",
    "args": [
      {
        "minor": 1000,
        "currency": "GBP"
      },
      2000,
      "profit",
      "half-up"
    ],
    "expectError": "unknown pricing basis"
  },
  {
    "name": "a calculation beyond 2^53 - 1 is refused",
    "args": [
      {
        "minor": 900719925474100,
        "currency": "GBP"
      },
      0,
      "margin",
      "half-up"
    ],
    "expectError": "exceeds 2^53 - 1"
  }
]