// Copyright 2025 The Go MCP SDK Authors. All rights reserved. // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. package jsonschema import ( "encoding/json" "os" "path/filepath" "testing" ) // The test for validation uses the official test suite, expressed as a set of JSON files. // Each file is an array of group objects. // A testGroup consists of a schema and some tests on it. type testGroup struct { Description string Schema *Schema Tests []test } // A test consists of a JSON instance to be validated and the expected result. type test struct { Description string Data any Valid bool } func TestValidate(t *testing.T) { files, err := filepath.Glob(filepath.FromSlash("testdata/draft2020-12/*.json")) if err != nil { t.Fatal(err) } if len(files) == 0 { t.Fatal("no files") } for _, file := range files { base := filepath.Base(file) t.Run(base, func(t *testing.T) { f, err := os.Open(file) if err != nil { t.Fatal(err) } defer f.Close() dec := json.NewDecoder(f) var groups []testGroup if err := dec.Decode(&groups); err != nil { t.Fatal(err) } for _, g := range groups { t.Run(g.Description, func(t *testing.T) { rs := &ResolvedSchema{root: g.Schema} for s := range g.Schema.all() { if s.Defs != nil || s.Ref != "" { t.Skip("schema or subschema has unimplemented keywords") } } for _, test := range g.Tests { t.Run(test.Description, func(t *testing.T) { err = rs.Validate(test.Data) if err != nil && test.Valid { t.Errorf("wanted success, but failed with: %v", err) } if err == nil && !test.Valid { t.Error("succeeded but wanted failure") } if t.Failed() { t.Errorf("schema: %s", g.Schema.json()) t.Fatalf("instance: %v", test.Data) } }) } }) } }) } }