[ { "name": "ammonium nitrate 34.5-0-0 for 150 kg N/ha on 10 ha", "args": [ { "nitrogen": 34.5, "phosphate": 0, "potash": 0 }, { "nitrogen": 150, "phosphate": 0, "potash": 0 }, 10 ], "expect": { "limitingNutrient": "nitrogen", "productKgPerHectare": 434.8, "totalProductKg": 4348, "supplied": { "nitrogen": 150, "phosphate": 0, "potash": 0 }, "balance": { "nitrogen": 0, "phosphate": 0, "potash": 0 } } }, { "name": "a 20-10-10 compound: nitrogen limits at 500 kg/ha and P and K fall 10 kg short", "args": [ { "nitrogen": 20, "phosphate": 10, "potash": 10 }, { "nitrogen": 100, "phosphate": 60, "potash": 60 }, 1 ], "expect": { "limitingNutrient": "nitrogen", "productKgPerHectare": 500, "totalProductKg": 500, "supplied": { "nitrogen": 100, "phosphate": 50, "potash": 50 }, "balance": { "nitrogen": 0, "phosphate": -10, "potash": -10 } } }, { "name": "a 0-20-30 PK: phosphate limits, potash falls 15 kg short", "args": [ { "nitrogen": 0, "phosphate": 20, "potash": 30 }, { "nitrogen": 0, "phosphate": 50, "potash": 90 }, 1 ], "expect": { "limitingNutrient": "phosphate", "productKgPerHectare": 250, "totalProductKg": 250, "supplied": { "nitrogen": 0, "phosphate": 50, "potash": 75 }, "balance": { "nitrogen": 0, "phosphate": 0, "potash": -15 } } }, { "name": "a tie goes to the first nutrient in N, P, K order", "args": [ { "nitrogen": 0, "phosphate": 24, "potash": 24 }, { "nitrogen": 0, "phosphate": 60, "potash": 60 }, 1 ], "expect": { "limitingNutrient": "phosphate", "productKgPerHectare": 250, "totalProductKg": 250, "supplied": { "nitrogen": 0, "phosphate": 60, "potash": 60 }, "balance": { "nitrogen": 0, "phosphate": 0, "potash": 0 } } }, { "name": "a targeted nutrient the product lacks does not limit; it is a shortfall", "args": [ { "nitrogen": 34.5, "phosphate": 0, "potash": 0 }, { "nitrogen": 100, "phosphate": 40, "potash": 0 }, 1 ], "expect": { "limitingNutrient": "nitrogen", "productKgPerHectare": 289.9, "totalProductKg": 289.9, "supplied": { "nitrogen": 100, "phosphate": 0, "potash": 0 }, "balance": { "nitrogen": 0, "phosphate": -40, "potash": 0 } } }, { "name": "urea 46-0-0 for 40 kg N: 86.96 kg rounds to 87.0 and supplies 40.0", "args": [ { "nitrogen": 46, "phosphate": 0, "potash": 0 }, { "nitrogen": 40, "phosphate": 0, "potash": 0 }, 1 ], "expect": { "limitingNutrient": "nitrogen", "productKgPerHectare": 87, "totalProductKg": 87, "supplied": { "nitrogen": 40, "phosphate": 0, "potash": 0 }, "balance": { "nitrogen": 0, "phosphate": 0, "potash": 0 } } }, { "name": "a rate on the half tenth rounds up: 1 kg N from a 16% product is 6.25, set to 6.3", "args": [ { "nitrogen": 16, "phosphate": 0, "potash": 0 }, { "nitrogen": 1, "phosphate": 0, "potash": 0 }, 1 ], "expect": { "limitingNutrient": "nitrogen", "productKgPerHectare": 6.3, "totalProductKg": 6.3, "supplied": { "nitrogen": 1, "phosphate": 0, "potash": 0 }, "balance": { "nitrogen": 0, "phosphate": 0, "potash": 0 } } }, { "name": "the total is the rounded rate over a part-hectare field", "args": [ { "nitrogen": 20, "phosphate": 10, "potash": 10 }, { "nitrogen": 100, "phosphate": 60, "potash": 60 }, 2.5 ], "expect": { "limitingNutrient": "nitrogen", "productKgPerHectare": 500, "totalProductKg": 1250, "supplied": { "nitrogen": 100, "phosphate": 50, "potash": 50 }, "balance": { "nitrogen": 0, "phosphate": -10, "potash": -10 } } }, { "name": "potash limits a 15-15-15 when K is the smallest need per unit", "args": [ { "nitrogen": 15, "phosphate": 15, "potash": 15 }, { "nitrogen": 120, "phosphate": 60, "potash": 30 }, 4 ], "expect": { "limitingNutrient": "potash", "productKgPerHectare": 200, "totalProductKg": 800, "supplied": { "nitrogen": 30, "phosphate": 30, "potash": 30 }, "balance": { "nitrogen": -90, "phosphate": -30, "potash": 0 } } }, { "name": "the analysis is taken to 0.1%: 34.54 is 34.5", "args": [ { "nitrogen": 34.54, "phosphate": 0, "potash": 0 }, { "nitrogen": 150, "phosphate": 0, "potash": 0 }, 10 ], "expect": { "limitingNutrient": "nitrogen", "productKgPerHectare": 434.8, "totalProductKg": 4348, "supplied": { "nitrogen": 150, "phosphate": 0, "potash": 0 }, "balance": { "nitrogen": 0, "phosphate": 0, "potash": 0 } } }, { "name": "no targets is an error", "args": [ { "nitrogen": 20, "phosphate": 10, "potash": 10 }, { "nitrogen": 0, "phosphate": 0, "potash": 0 }, 1 ], "expectError": "at least one target must be above zero" }, { "name": "a product with none of the targeted nutrients is an error", "args": [ { "nitrogen": 0, "phosphate": 20, "potash": 30 }, { "nitrogen": 100, "phosphate": 0, "potash": 0 }, 1 ], "expectError": "the product contains none of the targeted nutrients" }, { "name": "an analysis over 100% is an error", "args": [ { "nitrogen": 50, "phosphate": 30, "potash": 21 }, { "nitrogen": 100, "phosphate": 0, "potash": 0 }, 1 ], "expectError": "analysis must not total more than 100%" }, { "name": "a negative analysis is an error", "args": [ { "nitrogen": -1, "phosphate": 0, "potash": 0 }, { "nitrogen": 100, "phosphate": 0, "potash": 0 }, 1 ], "expectError": "analysis nitrogen must be a finite percentage from 0 to 100" }, { "name": "a fractional target is an error", "args": [ { "nitrogen": 34.5, "phosphate": 0, "potash": 0 }, { "nitrogen": 100.5, "phosphate": 0, "potash": 0 }, 1 ], "expectError": "target nitrogen must be a whole number of kg/ha from 0 to 1000" }, { "name": "zero area is an error", "args": [ { "nitrogen": 34.5, "phosphate": 0, "potash": 0 }, { "nitrogen": 100, "phosphate": 0, "potash": 0 }, 0 ], "expectError": "areaHectares must be a finite number greater than 0" } ]