// Copyright 2021 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.

// This file contains tests for the deepequalerrors checker.

package a

import (
	"io"
	"os"
	"reflect"
)

type myError int

func (myError) Error() string { return "" }

func bad[T any]() T {
	var t T
	return t
}

type s1 struct {
	s2 *s2[myError2]
	i  int
}

type myError2 error

type s2[T any] struct {
	s1   *s1
	errs []*T
}

func hasError() {
	var e error
	var m myError2
	reflect.DeepEqual(bad[error](), e)    // want `avoid using reflect.DeepEqual with errors`
	reflect.DeepEqual(io.EOF, io.EOF)     // want `avoid using reflect.DeepEqual with errors`
	reflect.DeepEqual(e, &e)              // want `avoid using reflect.DeepEqual with errors`
	reflect.DeepEqual(e, m)               // want `avoid using reflect.DeepEqual with errors`
	reflect.DeepEqual(e, s1{})            // want `avoid using reflect.DeepEqual with errors`
	reflect.DeepEqual(e, [1]error{})      // want `avoid using reflect.DeepEqual with errors`
	reflect.DeepEqual(e, map[error]int{}) // want `avoid using reflect.DeepEqual with errors`
	reflect.DeepEqual(e, map[int]error{}) // want `avoid using reflect.DeepEqual with errors`
	// We catch the next not because *os.PathError implements error, but because it contains
	// a field Err of type error.
	reflect.DeepEqual(&os.PathError{}, io.EOF) // want `avoid using reflect.DeepEqual with errors`

}

func notHasError() {
	reflect.ValueOf(4)                    // not reflect.DeepEqual
	reflect.DeepEqual(3, 4)               // not errors
	reflect.DeepEqual(5, io.EOF)          // only one error
	reflect.DeepEqual(myError(1), io.EOF) // not types that implement error
}
