{"id":"v001","input":{"g1":2,"g2":-3,"length1":"300 ft","length2":"300 ft","pvi_station":"10+00","pvi_elevation":"100 ft"},"expect":{"result.pvc_station":"7+00.00","result.pvc_elevation.value":94.0,"result.turning_station":"9+40.00","result.turning_elevation.value":96.4,"ok":true},"source":"add-survey-suite scenarios","sourceVersion":"2026","tolerance":{"result.pvc_elevation.value":{"rel":1e-12,"abs":1e-09},"result.turning_elevation.value":{"rel":1e-12,"abs":1e-09}}}
{"id":"v002","input":{"g1":2,"g2":-3,"length1":"200 ft","length2":"400 ft","pvi_station":"10+00.00","pvi_elevation":"100 ft"},"expect":{"result.cvc_elevation.value":96.66666666666667,"result.cvc_grade":-1.3333333333333335,"result.pvc_elevation.value":96.0,"result.pvt_elevation.value":88.0,"result.turning_station":"9+20.00","result.turning_elevation.value":97.2,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.cvc_elevation.value":{"rel":1e-11,"abs":1e-09},"result.cvc_grade":{"rel":1e-11,"abs":1e-09},"result.pvc_elevation.value":{"rel":1e-11,"abs":1e-09},"result.pvt_elevation.value":{"rel":1e-11,"abs":1e-09},"result.turning_elevation.value":{"rel":1e-11,"abs":1e-09}}}
{"id":"v003","input":{"g1":-4,"g2":1.5,"length1":"350 ft","length2":"150 ft","pvi_station":"25+00.00","pvi_elevation":"250 ft"},"expect":{"result.cvc_elevation.value":252.8875,"result.cvc_grade":-2.35,"result.pvc_elevation.value":264.0,"result.pvt_elevation.value":252.25,"result.turning_station":"25+91.56","result.turning_elevation.value":251.8116883116883,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.cvc_elevation.value":{"rel":1e-11,"abs":1e-09},"result.cvc_grade":{"rel":1e-11,"abs":1e-09},"result.pvc_elevation.value":{"rel":1e-11,"abs":1e-09},"result.pvt_elevation.value":{"rel":1e-11,"abs":1e-09},"result.turning_elevation.value":{"rel":1e-11,"abs":1e-09}}}
{"id":"v004","input":{"g1":1,"g2":3,"length1":"100 ft","length2":"300 ft","pvi_station":"5+00.00","pvi_elevation":"50 ft"},"expect":{"result.cvc_elevation.value":50.75,"result.cvc_grade":2.5,"result.pvc_elevation.value":49.0,"result.pvt_elevation.value":59.0,"result.turning":"no high or low point lies on the curve","ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.cvc_elevation.value":{"rel":1e-11,"abs":1e-09},"result.cvc_grade":{"rel":1e-11,"abs":1e-09},"result.pvc_elevation.value":{"rel":1e-11,"abs":1e-09},"result.pvt_elevation.value":{"rel":1e-11,"abs":1e-09}}}
{"id":"v005","input":{"g1":2,"g2":-3,"length1":"200 ft","length2":"400 ft","pvi_station":"10+00","pvi_elevation":"100 ft","at_station":"11+50"},"expect":{"result.elevation.value":94.19791666666667,"ok":true},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{"result.elevation.value":{"rel":1e-11,"abs":1e-09}}}
{"id":"v006","input":{"g1":2,"g2":-3,"length1":"0 ft","length2":"400 ft","pvi_station":"10+00","pvi_elevation":"100 ft"},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Surveying formulas (Ghilani & Wolf 2018) evaluated in Python (tools/vectors/gen_survey.py)","sourceVersion":"15th edition (2018)","tolerance":{}}
{"id":"v007","input":{"g1":2,"g2":-3,"length1":"300 ft","length2":"300 ft","pvi_station":"10+00","pvi_elevation":"100 ft"},"expect":{"result.cvc_elevation.value":96.25,"summary":"The curve runs PVC 7+00.00 to PVT 13+00.00. At the PVI station it is at 96.25 ft, and the PVI is at 100 ft; the high point is on the curve.","ok":true},"source":"Worked by hand: curve elevation at the PVI station = 100 + 300 x 300 x (-0.03 - 0.02) / (2 x 600) = 96.25 ft, 3.75 ft below the PVI (Ghilani and Wolf 2021, ch. 25)","sourceVersion":"Elementary Surveying, 16th edition (2021)","tolerance":{"result.cvc_elevation.value":{"rel":1e-12,"abs":1e-09}}}
