func testObjKVs(t *testing.T) { counter, countingValidator := createCountingValidator() sch := v.Object( v.ObjKV(nil, v.And(v.String(v.StrIs("1")), v.Function(countingValidator))), v.ObjKV("1", v.And(v.String(v.StrIs("b")), v.Function(countingValidator))), v.ObjKV(true, v.And(v.Number(v.NumIs(3)), v.Function(countingValidator))), ) m := maep{ nil: "1", "1": "b", true: 3, } test(t, "mixed objkvs", true, sch, m) if *counter != 3 { t.Fatalf("value counter should be 3, got %d", *counter) } m = maep{ nil: "1", "1": 2, true: 3, } test(t, "!mixed objkvs", false, sch, m) m = maep{ nil: "1", "1": nil, true: 3, } test(t, "!mixed objkvs (nil)", false, sch, m) }
func TestFunction(t *testing.T) { counter, countingValidator := createCountingValidator() test(t, "combination1", false, v.Function(dogeValidator), "cat") test(t, "combination2", true, v.Function(dogeValidator), "cate") test(t, "combination3", true, v.Function(countingValidator), "doge") test(t, "combination4", true, v.Function(countingValidator), "doge") if *counter != 2 { t.Fatalf("counting validator count should be 2, is %d", *counter) } }
func testObjValues(t *testing.T) { counter, countingValidator := createCountingValidator() sch := v.Object( v.ObjValues(v.String()), v.ObjValues(v.Function(countingValidator)), ) m := maep{ nil: "1", 1: "b", true: "c", } test(t, "only string objvalues", true, sch, m) if *counter != 3 { t.Fatalf("value counter should be 3, got %d", *counter) } m = maep{ nil: "1", 1: 1, } test(t, "!only string objvalues", false, sch, m) }
func testObjKeys(t *testing.T) { counter, countingValidator := createCountingValidator() sch := v.Object( v.ObjKeys(v.String()), v.ObjKeys(v.Function(countingValidator)), ) m := maep{ "a": nil, "b": 1, "c": true, } test(t, "only string objkeys", true, sch, m) if *counter != 3 { t.Fatalf("key counter should be 3, got %d", *counter) } m = maep{ "a": nil, 1: 1, } test(t, "!only string objkeys", false, sch, m) }
func init() { // set up raw json data rawJson := []byte(` { "status": true, "data": { "token": "CAFED00D", "debug": 69306, "items": [ { "url": "https://news.ycombinator.com/", "comment": "clickbaits" }, { "url": "http://golang.org/", "comment": "some darn gophers" }, { "url": "http://www.kickstarter.com/", "comment": "opensource projects. yeah.." } ], "ghost2": null, "meta": { "g": 1, "xyzzy": 0.25, "blöö": 0.5 } } }`) // decode json if err := json.Unmarshal(rawJson, &decoded); err != nil { log.Panic("JSON parsing failed. Err =", err) } // set up a custom validator function myValidatorFunc := func(data interface{}) (path string, err error) { path = "myValidatorFunc" validate, ok := data.(string) if !ok { return path, fmt.Errorf("expected string, got %v", reflect.TypeOf(data)) } if validate != "CAFED00D" { return path, fmt.Errorf("expected CAFED00D, got %s", validate) } return "", nil } // construct the schema which is used to validate data schema = v.Object( v.ObjKV("status", v.Boolean()), v.ObjKV("data", v.Object( v.ObjKV("token", v.Function(myValidatorFunc)), v.ObjKV("debug", v.Number(v.NumMin(1), v.NumMax(99999))), v.ObjKV("items", v.Array(v.ArrEach(v.Object( v.ObjKV("url", v.String(v.StrMin(1))), v.ObjKV("comment", v.Optional(v.String())), )))), v.ObjKV("ghost", v.Optional(v.String())), v.ObjKV("ghost2", v.Optional(v.String())), v.ObjKV("meta", v.Object( v.ObjKeys(v.String()), v.ObjValues(v.Or(v.Number(v.NumMin(.01), v.NumMax(1.1)), v.String())), )), )), ) }