[ {"name": "15 mg/kg for 12.4 kg is 186 mg; at 120 mg/5 mL that is 7.75 mL, an exact tie between 0.1 mL steps, so it goes down to 7.7 mL (184.8 mg, 0.65% under)", "args": [12400, 15000, null, 120000, 5000, 100], "expect": {"calculatedMicrograms": 186000, "cappedAtMaximum": false, "targetMicrograms": 186000, "volumeMicrolitres": 7700, "deliveredMicrograms": 184800, "differenceBasisPoints": -65}}, {"name": "15 mg/kg for 12.6 kg is 189 mg = 7.875 mL, nearest 0.1 mL step is up: 7.9 mL (189.6 mg, 0.32% over)", "args": [12600, 15000, 500000, 120000, 5000, 100], "expect": {"calculatedMicrograms": 189000, "cappedAtMaximum": false, "targetMicrograms": 189000, "volumeMicrolitres": 7900, "deliveredMicrograms": 189600, "differenceBasisPoints": 32}}, {"name": "20 mg/kg for 60 kg is 1200 mg, capped at the 1000 mg maximum: 500 mg/5 mL in 0.5 mL steps is exactly 10 mL", "args": [60000, 20000, 1000000, 500000, 5000, 500], "expect": {"calculatedMicrograms": 1200000, "cappedAtMaximum": true, "targetMicrograms": 1000000, "volumeMicrolitres": 10000, "deliveredMicrograms": 1000000, "differenceBasisPoints": 0}}, {"name": "capped at 1000 mg, 120 mg/5 mL is 41.667 mL; the nearest 0.1 mL step (41.7 mL, 1000.8 mg) would exceed the maximum, so 41.6 mL", "args": [60000, 20000, 1000000, 120000, 5000, 100], "expect": {"calculatedMicrograms": 1200000, "cappedAtMaximum": true, "targetMicrograms": 1000000, "volumeMicrolitres": 41600, "deliveredMicrograms": 998400, "differenceBasisPoints": -16}}, {"name": "a dose exactly at the maximum is not capped", "args": [50000, 20000, 1000000, 500000, 5000, 500], "expect": {"calculatedMicrograms": 1000000, "cappedAtMaximum": false, "targetMicrograms": 1000000, "volumeMicrolitres": 10000, "deliveredMicrograms": 1000000, "differenceBasisPoints": 0}}, {"name": "a neonate on an oral syringe marked in 0.01 mL: 3.45 kg x 15 mg/kg = 51.75 mg = 2.15625 mL, nearest 2.16 mL", "args": [3450, 15000, null, 120000, 5000, 10], "expect": {"calculatedMicrograms": 51750, "cappedAtMaximum": false, "targetMicrograms": 51750, "volumeMicrolitres": 2160, "deliveredMicrograms": 51840, "differenceBasisPoints": 17}}, {"name": "a 1 mL measure: 157.5 mg at 250 mg/5 mL is 3.15 mL, so 3 mL (150 mg, 4.76% under)", "args": [21000, 7500, null, 250000, 5000, 1000], "expect": {"calculatedMicrograms": 157500, "cappedAtMaximum": false, "targetMicrograms": 157500, "volumeMicrolitres": 3000, "deliveredMicrograms": 150000, "differenceBasisPoints": -476}}, {"name": "half a microgram: the target is shown half-up (1235) but the difference is measured from the exact 1234.5, and the tie in steps goes down", "args": [12345, 100, null, 1000, 1000, 1], "expect": {"calculatedMicrograms": 1235, "cappedAtMaximum": false, "targetMicrograms": 1235, "volumeMicrolitres": 1234, "deliveredMicrograms": 1234, "differenceBasisPoints": -4}}, {"name": "an awkward strength stays exact: 1 g in 3 mL, 10 mg/kg for 20 kg is 200 mg = 0.6 mL", "args": [20000, 10000, null, 1000000, 3000, 100], "expect": {"calculatedMicrograms": 200000, "cappedAtMaximum": false, "targetMicrograms": 200000, "volumeMicrolitres": 600, "deliveredMicrograms": 200000, "differenceBasisPoints": 0}}, {"name": "a dose smaller than one measuring increment is an error, not zero", "args": [1000, 100, null, 120000, 5000, 100], "expectError": "dose is less than one measuring increment"}, {"name": "an exact half increment rounds down to nothing and is refused", "args": [1000, 1200, null, 120000, 5000, 100], "expectError": "dose is less than one measuring increment"}, {"name": "weight below 200 g is refused", "args": [199, 15000, null, 120000, 5000, 100], "expectError": "weightGrams must be a whole number from 200 to 500000"}, {"name": "weight in kilograms by mistake (12.4) is refused, not rounded", "args": [12.4, 15000, null, 120000, 5000, 100], "expectError": "weightGrams must be a whole number from 200 to 500000"}, {"name": "a fractional weight in grams is refused", "args": [12400.5, 15000, null, 120000, 5000, 100], "expectError": "weightGrams must be a whole number from 200 to 500000"}, {"name": "weight above 500 kg is refused", "args": [500001, 15000, null, 120000, 5000, 100], "expectError": "weightGrams must be a whole number from 200 to 500000"}, {"name": "a zero dose per kg is refused", "args": [12400, 0, null, 120000, 5000, 100], "expectError": "dosePerKgMicrograms must be a whole number from 1 to 1000000"}, {"name": "a zero maximum is refused, not read as no maximum", "args": [12400, 15000, 0, 120000, 5000, 100], "expectError": "maxSingleDoseMicrograms must be a whole number from 1 to 100000000"}, {"name": "a zero strength is refused", "args": [12400, 15000, null, 0, 5000, 100], "expectError": "strengthMicrograms must be a whole number from 1 to 100000000"}, {"name": "a zero strength volume is refused", "args": [12400, 15000, null, 120000, 0, 100], "expectError": "strengthVolumeMicrolitres must be a whole number from 1 to 1000000"}, {"name": "a measuring increment over 100 mL is refused", "args": [12400, 15000, null, 120000, 5000, 100001], "expectError": "measuringIncrementMicrolitres must be a whole number from 1 to 100000"} ]