package geojson import ( "encoding/json" "fmt" "log" "testing" ) func P(x, y float64) Position { return Position{x, y, 0} } func P3(x, y, z float64) Position { return Position{x, y, z} } const testPolyHoles = ` {"type":"Polygon","coordinates":[ [[0,0],[0,6],[12,-6],[12,0],[0,0]], [[1,1],[1,2],[2,2],[2,1],[1,1]], [[11,-1],[11,-3],[9,-1],[11,-1]] ]}` func tPoint(x, y float64) Point { o, err := ObjectJSON(fmt.Sprintf(`{"type":"Point","coordinates":[%f,%f]}`, x, y)) if err != nil { log.Fatal(err) } return testConvertToPoint(o) } func doesJSONMatch(js1, js2 string) bool { var m1, m2 map[string]interface{} json.Unmarshal([]byte(js1), &m1) json.Unmarshal([]byte(js2), &m2) b1, _ := json.Marshal(m1) b2, _ := json.Marshal(m2) return string(b1) == string(b2) } func testJSON(t *testing.T, jstr string) Object { t.Helper() o, err := ObjectJSON(jstr) if err != nil { t.Fatal(err) } if !doesJSONMatch(o.JSON(), jstr) { t.Fatalf("expected '%v', got '%v'", o.JSON(), jstr) } return o } func testInvalidJSON(t *testing.T, js string, expecting error) { t.Helper() _, err := ObjectJSON(js) if err == nil { t.Fatalf("expecting an error for json '%s'", js) } if err.Error() != expecting.Error() { t.Fatalf("\nInvalid error for json:\n'%s'\ngot '%s'\nexpected '%s'", js, err.Error(), expecting.Error()) } } func TestInvalidJSON(t *testing.T) { testInvalidJSON(t, `{}`, errInvalidTypeMember) testInvalidJSON(t, `{"type":"Poin"}`, fmt.Errorf(fmtErrTypeIsUnknown, "Poin")) testInvalidJSON(t, `{"type":"Point"}`, errCoordinatesRequired) testInvalidJSON(t, `{"type":"Point","coordinates":[]}`, errInvalidNumberOfPositionValues) testInvalidJSON(t, `{"type":"Point","coordinates":[1]}`, errInvalidNumberOfPositionValues) testInvalidJSON(t, `{"type":"Point","coordinates":[1,2,"asd"]}`, errInvalidPositionValue) testInvalidJSON(t, `{"type":"Point","coordinates":[[1,2]]}`, errInvalidPositionValue) testInvalidJSON(t, `{"type":"Point","coordinates":[[1,2],[1,3]]}`, errInvalidPositionValue) testInvalidJSON(t, `{"type":"MultiPoint","coordinates":[1,2]}`, errInvalidCoordinates) testInvalidJSON(t, `{"type":"MultiPoint","coordinates":[[]]}`, errInvalidNumberOfPositionValues) testInvalidJSON(t, `{"type":"MultiPoint","coordinates":[[1]]}`, errInvalidNumberOfPositionValues) testInvalidJSON(t, `{"type":"MultiPoint","coordinates":[[1,2,"asd"]]}`, errInvalidPositionValue) testInvalidJSON(t, `{"type":"LineString","coordinates":[]}`, errLineStringInvalidCoordinates) testInvalidJSON(t, `{"type":"MultiLineString","coordinates":[[]]}`, errLineStringInvalidCoordinates) testInvalidJSON(t, `{"type":"MultiLineString","coordinates":[[[]]]}`, errInvalidNumberOfPositionValues) testInvalidJSON(t, `{"type":"MultiLineString","coordinates":[[[]]]}`, errInvalidNumberOfPositionValues) testInvalidJSON(t, `{"type":"Polygon","coordinates":[[1,1],[2,2],[3,3],[4,4]]}`, errInvalidCoordinates) testInvalidJSON(t, `{"type":"Polygon","coordinates":[[[1,1],[2,2],[3,3],[4,4]]]}`, errMustBeALinearRing) testInvalidJSON(t, `{"type":"Polygon","coordinates":[[[1,1],[2,2],[3,3],[1,1]],[[1,1],[2,2],[3,3],[4,4]]]}`, errMustBeALinearRing) testInvalidJSON(t, `{"type":"Point","coordinates":[1,2,3],"bbox":123}`, errBBoxInvalidType) testInvalidJSON(t, `{"type":"Point","coordinates":[1,2,3],"bbox":[]}`, errBBoxInvalidNumberOfValues) testInvalidJSON(t, `{"type":"Point","coordinates":[1,2,3],"bbox":[1,2,3]}`, errBBoxInvalidNumberOfValues) testInvalidJSON(t, `{"type":"Point","coordinates":[1,2,3],"bbox":[1,2,3,"a"]}`, errBBoxInvalidValue) }