// Copyright 2015 go-fuzz project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE.
// Modified from original file https://github.com/dvyukov/go-fuzz-corpus/blob/master/json/json.go

package jsonfuzz

import (
	"encoding/json"
	"fmt"
	jsoniter "github.com/json-iterator/go"
	"reflect"
)

func Fuzz(data []byte) int {
	score := 0
	for _, ctor := range []func() interface{}{
		//func() interface{} { return nil },
		func() interface{} { return new([]interface{}) },
		func() interface{} { m := map[string]string{}; return &m },
		func() interface{} { m := map[string]interface{}{}; return &m },
		func() interface{} { return new(S) },
	} {
		v := ctor()
		if jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, v) != nil {
			continue
		}
		score = 1
		vj := ctor()
		err := json.Unmarshal(data, vj)
		if err != nil {
			panic(err)
		}
		if !reflect.DeepEqual(v, vj) {
			fmt.Printf("v0: %#v\n", v)
			fmt.Printf("v1: %#v\n", vj)
			panic("not equal")
		}

		data1, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(v)
		if err != nil {
			panic(err)
		}
		v1 := ctor()
		if jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data1, v1) != nil {
			continue
		}
		if !reflect.DeepEqual(v, v1) {
			fmt.Printf("v0: %#v\n", v)
			fmt.Printf("v1: %#v\n", v1)
			panic("not equal")
		}
	}
	return score
}

type S struct {
	A int    `json:",omitempty"`
	B string `json:"B1,omitempty"`
	C float64
	D bool
	E uint8
	F []byte
	G interface{}
	H map[string]interface{}
	I map[string]string
	J []interface{}
	K []string
	L S1
	M *S1
	N *int
	O **int
	//	P json.RawMessage
	Q Marshaller
	R int `json:"-"`
	S int `json:",string"`
}

type S1 struct {
	A int
	B string
}

type Marshaller struct {
	v string
}

func (m *Marshaller) MarshalJSON() ([]byte, error) {
	return jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(m.v)
}

func (m *Marshaller) UnmarshalJSON(data []byte) error {
	return jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, &m.v)
}
