// Generated by Lisette bindgen
// Source: testing/quick (Go stdlib)
// Go: 1.25.10
// Lisette: 0.3.0

import "go:math/rand"
import "go:reflect"

/// Check looks for an input to f, any function that returns bool,
/// such that f returns false. It calls f repeatedly, with arbitrary
/// values for each argument. If f returns false on a given input,
/// Check returns that input as a *[CheckError].
/// For example:
/// 
/// 	func TestOddMultipleOfThree(t *testing.T) {
/// 		f := func(x int) bool {
/// 			y := OddMultipleOfThree(x)
/// 			return y%2 == 1 && y%3 == 0
/// 		}
/// 		if err := quick.Check(f, nil); err != nil {
/// 			t.Error(err)
/// 		}
/// 	}
pub fn Check(f: Unknown, config: Ref<Config>) -> Result<(), error>

/// CheckEqual looks for an input on which f and g return different results.
/// It calls f and g repeatedly with arbitrary values for each argument.
/// If f and g return different answers, CheckEqual returns a *[CheckEqualError]
/// describing the input and the outputs.
pub fn CheckEqual(f: Unknown, g: Unknown, config: Ref<Config>) -> Result<(), error>

/// Value returns an arbitrary value of the given type.
/// If the type implements the [Generator] interface, that will be used.
/// Note: To create arbitrary values for structs, all the fields must be exported.
pub fn Value(t: reflect.Type, rand: Ref<rand.Rand>) -> Option<reflect.Value>

/// A CheckEqualError is the result [CheckEqual] finding an error.
pub struct CheckEqualError {
  pub CheckError: CheckError,
  pub Out1: Slice<Unknown>,
  pub Out2: Slice<Unknown>,
}

/// A CheckError is the result of Check finding an error.
pub struct CheckError {
  pub Count: int,
  pub In: Slice<Unknown>,
}

/// A Config structure contains options for running a test.
pub struct Config {
  pub MaxCount: int,
  pub MaxCountScale: float64,
  pub Rand: Option<Ref<rand.Rand>>,
  pub Values: Option<fn(Slice<reflect.Value>, Ref<rand.Rand>) -> ()>,
}

/// A Generator can generate random values of its own type.
pub interface Generator {
  fn Generate(rand: Ref<rand.Rand>, size: int) -> reflect.Value
}

/// A SetupError is the result of an error in the way that check is being
/// used, independent of the functions being tested.
pub struct SetupError(string)

impl CheckEqualError {
  fn Error(self: Ref<CheckEqualError>) -> string
}

impl CheckError {
  fn Error(self: Ref<CheckError>) -> string
}

impl SetupError {
  fn Error(self) -> string
}
