// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package jsonschema_test

import (
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
	"golang.org/x/tools/internal/mcp/jsonschema"
)

func forType[T any]() *jsonschema.Schema {
	s, err := jsonschema.For[T]()
	if err != nil {
		panic(err)
	}
	return s
}

func TestForType(t *testing.T) {
	type schema = jsonschema.Schema
	tests := []struct {
		name string
		got  *jsonschema.Schema
		want *jsonschema.Schema
	}{
		{"string", forType[string](), &schema{Type: "string"}},
		{"int", forType[int](), &schema{Type: "integer"}},
		{"int16", forType[int16](), &schema{Type: "integer"}},
		{"uint32", forType[int16](), &schema{Type: "integer"}},
		{"float64", forType[float64](), &schema{Type: "number"}},
		{"bool", forType[bool](), &schema{Type: "boolean"}},
		{"intmap", forType[map[string]int](), &schema{
			Type:                 "object",
			AdditionalProperties: &schema{Type: "integer"},
		}},
		{"anymap", forType[map[string]any](), &schema{
			Type:                 "object",
			AdditionalProperties: &schema{},
		}},
		{"struct", forType[struct {
			F           int `json:"f"`
			G           []float64
			P           *bool
			Skip        string `json:"-"`
			NoSkip      string `json:",omitempty"`
			unexported  float64
			unexported2 int `json:"No"`
		}](), &schema{
			Type: "object",
			Properties: map[string]*schema{
				"f":      {Type: "integer"},
				"G":      {Type: "array", Items: &schema{Type: "number"}},
				"P":      {Type: "boolean"},
				"NoSkip": {Type: "string"},
			},
			Required:             []string{"f", "G", "P"},
			AdditionalProperties: &jsonschema.Schema{Not: &jsonschema.Schema{}},
		}},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			if diff := cmp.Diff(test.want, test.got, cmpopts.IgnoreUnexported(jsonschema.Schema{})); diff != "" {
				t.Errorf("ForType mismatch (-want +got):\n%s", diff)
			}
		})
	}
}
