{"id":"v001","input":{"grade":"3H:1V"},"expect":{"result.percent":33.33333333333333,"result.degrees.value":18.43494882292201,"result.per_mille":333.3333333333333,"ok":true},"source":"add-survey-suite scenarios","sourceVersion":"2026","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09},"result.degrees.value":{"rel":1e-12,"abs":1e-09},"result.per_mille":{"rel":1e-12,"abs":1e-09}}}
{"id":"v002","input":{"grade":"1V:3H"},"expect":{"result.percent":33.33333333333333,"result.degrees.value":18.43494882292201,"result.per_mille":333.3333333333333,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09},"result.degrees.value":{"rel":1e-12,"abs":1e-09},"result.per_mille":{"rel":1e-12,"abs":1e-09}}}
{"id":"v003","input":{"grade":"5%"},"expect":{"result.percent":5.0,"result.degrees.value":2.862405226111748,"result.per_mille":50.0,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09},"result.degrees.value":{"rel":1e-12,"abs":1e-09},"result.per_mille":{"rel":1e-12,"abs":1e-09}}}
{"id":"v004","input":{"grade":"2.5°"},"expect":{"result.percent":4.366094290851206,"result.degrees.value":2.5,"result.per_mille":43.660942908512055,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09},"result.degrees.value":{"rel":1e-12,"abs":1e-09},"result.per_mille":{"rel":1e-12,"abs":1e-09}}}
{"id":"v005","input":{"grade":"50‰"},"expect":{"result.percent":5.0,"result.degrees.value":2.862405226111748,"result.per_mille":50.0,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09},"result.degrees.value":{"rel":1e-12,"abs":1e-09},"result.per_mille":{"rel":1e-12,"abs":1e-09}}}
{"id":"v006","input":{"grade":"0.125"},"expect":{"result.percent":12.5,"result.degrees.value":7.125016348901798,"result.per_mille":125.0,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09},"result.degrees.value":{"rel":1e-12,"abs":1e-09},"result.per_mille":{"rel":1e-12,"abs":1e-09}}}
{"id":"v007","input":{"grade":"3:1","convention":"V:H"},"expect":{"result.percent":300.0,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09}}}
{"id":"v008","input":{"grade":"3:1"},"expect":{"ok":false,"error.code":"INVALID_INPUT","error.field":"/convention"},"source":"add-survey-suite scenarios","sourceVersion":"2026","tolerance":{}}
{"id":"v009","input":{"rise":"5 ft","run":"100 ft"},"expect":{"result.percent":5.0,"result.slope_length.value":100.12492197250393,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.percent":{"rel":1e-12,"abs":1e-09},"result.slope_length.value":{"rel":1e-12,"abs":1e-09}}}
{"id":"v010","input":{"grade":"2%","run":"250 m"},"expect":{"result.rise.value":5.0,"result.slope_length.value":250.04999500099973,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.rise.value":{"rel":1e-12,"abs":1e-09},"result.slope_length.value":{"rel":1e-12,"abs":1e-09}}}
