Functional Weave
Code in Rust

agri.fertiliser-application@1.0.0

vectors.json

8,049 bytes · view raw

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