[
{
"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"
}
]