Functional Weave
Code in TypeScript

construction.retention@1.0.0

vectors.json

6,213 bytes · view raw

[
  {
    "name": "5% on 100,000.00 before practical completion: all 5,000.00 held",
    "args": [
      {
        "minor": 10000000,
        "currency": "GBP"
      },
      500,
      "interim"
    ],
    "expect": {
      "full": {
        "minor": 500000,
        "currency": "GBP"
      },
      "held": {
        "minor": 500000,
        "currency": "GBP"
      },
      "released": {
        "minor": 0,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "at practical completion half is released",
    "args": [
      {
        "minor": 10000000,
        "currency": "GBP"
      },
      500,
      "practical-completion"
    ],
    "expect": {
      "full": {
        "minor": 500000,
        "currency": "GBP"
      },
      "held": {
        "minor": 250000,
        "currency": "GBP"
      },
      "released": {
        "minor": 250000,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "after the defects are made good the rest is released",
    "args": [
      {
        "minor": 10000000,
        "currency": "GBP"
      },
      500,
      "final"
    ],
    "expect": {
      "full": {
        "minor": 500000,
        "currency": "GBP"
      },
      "held": {
        "minor": 0,
        "currency": "GBP"
      },
      "released": {
        "minor": 500000,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "3% on 12,345.67 is 370.37... so 370.37 held",
    "args": [
      {
        "minor": 1234567,
        "currency": "GBP"
      },
      300,
      "interim"
    ],
    "expect": {
      "full": {
        "minor": 37037,
        "currency": "GBP"
      },
      "held": {
        "minor": 37037,
        "currency": "GBP"
      },
      "released": {
        "minor": 0,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "3% on 12,345.67 at practical completion: 1.5% is 185.185... so 185.19 held",
    "args": [
      {
        "minor": 1234567,
        "currency": "GBP"
      },
      300,
      "practical-completion"
    ],
    "expect": {
      "full": {
        "minor": 37037,
        "currency": "GBP"
      },
      "held": {
        "minor": 18519,
        "currency": "GBP"
      },
      "released": {
        "minor": 18518,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "half the percentage, not half the rounded retention: 5% of 10,000.10 is 500.005 (500.01), 2.5% is 250.0025 (250.00)",
    "args": [
      {
        "minor": 1000010,
        "currency": "GBP"
      },
      500,
      "practical-completion"
    ],
    "expect": {
      "full": {
        "minor": 50001,
        "currency": "GBP"
      },
      "held": {
        "minor": 25000,
        "currency": "GBP"
      },
      "released": {
        "minor": 25001,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "the full retention on the same value rounds half up",
    "args": [
      {
        "minor": 1000010,
        "currency": "GBP"
      },
      500,
      "interim"
    ],
    "expect": {
      "full": {
        "minor": 50001,
        "currency": "GBP"
      },
      "held": {
        "minor": 50001,
        "currency": "GBP"
      },
      "released": {
        "minor": 0,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "no retention agreed",
    "args": [
      {
        "minor": 10000000,
        "currency": "GBP"
      },
      0,
      "interim"
    ],
    "expect": {
      "full": {
        "minor": 0,
        "currency": "GBP"
      },
      "held": {
        "minor": 0,
        "currency": "GBP"
      },
      "released": {
        "minor": 0,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "nothing certified yet",
    "args": [
      {
        "minor": 0,
        "currency": "GBP"
      },
      500,
      "interim"
    ],
    "expect": {
      "full": {
        "minor": 0,
        "currency": "GBP"
      },
      "held": {
        "minor": 0,
        "currency": "GBP"
      },
      "released": {
        "minor": 0,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "100% retention holds the whole value",
    "args": [
      {
        "minor": 12345,
        "currency": "GBP"
      },
      10000,
      "interim"
    ],
    "expect": {
      "full": {
        "minor": 12345,
        "currency": "GBP"
      },
      "held": {
        "minor": 12345,
        "currency": "GBP"
      },
      "released": {
        "minor": 0,
        "currency": "GBP"
      }
    }
  },
  {
    "name": "the currency is carried through",
    "args": [
      {
        "minor": 777700,
        "currency": "EUR"
      },
      300,
      "practical-completion"
    ],
    "expect": {
      "full": {
        "minor": 23331,
        "currency": "EUR"
      },
      "held": {
        "minor": 11666,
        "currency": "EUR"
      },
      "released": {
        "minor": 11665,
        "currency": "EUR"
      }
    }
  },
  {
    "name": "a negative value",
    "args": [
      {
        "minor": -1,
        "currency": "GBP"
      },
      500,
      "interim"
    ],
    "expectError": "cumulativeValue must not be negative"
  },
  {
    "name": "a percentage above 100",
    "args": [
      {
        "minor": 100,
        "currency": "GBP"
      },
      10001,
      "interim"
    ],
    "expectError": "basisPoints must be a whole number from 0 to 10000"
  },
  {
    "name": "a negative percentage",
    "args": [
      {
        "minor": 100,
        "currency": "GBP"
      },
      -1,
      "interim"
    ],
    "expectError": "basisPoints must be a whole number from 0 to 10000"
  },
  {
    "name": "a fractional percentage",
    "args": [
      {
        "minor": 100,
        "currency": "GBP"
      },
      2.5,
      "interim"
    ],
    "expectError": "basisPoints must be a whole number from 0 to 10000"
  },
  {
    "name": "an unknown stage",
    "args": [
      {
        "minor": 100,
        "currency": "GBP"
      },
      500,
      "retained"
    ],
    "expectError": "unknown retention stage \"retained\""
  },
  {
    "name": "a value too large to multiply exactly",
    "args": [
      {
        "minor": 1000000000000,
        "currency": "GBP"
      },
      10000,
      "interim"
    ],
    "expectError": "exceeds 2^53 - 1"
  }
]