package main

import . "swigtests/overload_template_fast"

func main() {
	_ = Foo()

	_ = Maximum(3, 4)
	_ = Maximum(3.4, 5.2)

	// mix 1
	if Mix1("hi") != 101 {
		panic("mix1(const char*)")
	}

	if Mix1(1.0, 1.0) != 102 {
		panic("mix1(double, const double &)")
	}

	if Mix1(1.0) != 103 {
		panic("mix1(double)")
	}

	// mix 2
	if Mix2("hi") != 101 {
		panic("mix2(const char*)")
	}

	if Mix2(1.0, 1.0) != 102 {
		panic("mix2(double, const double &)")
	}

	if Mix2(1.0) != 103 {
		panic("mix2(double)")
	}

	// mix 3
	if Mix3("hi") != 101 {
		panic("mix3(const char*)")
	}

	if Mix3(1.0, 1.0) != 102 {
		panic("mix3(double, const double &)")
	}

	if Mix3(1.0) != 103 {
		panic("mix3(double)")
	}

	// Combination 1
	if Overtparams1(100) != 10 {
		panic("overtparams1(int)")
	}

	if Overtparams1(100.0, 100) != 20 {
		panic("overtparams1(double, int)")
	}

	// Combination 2
	if Overtparams2(100.0, 100) != 40 {
		panic("overtparams2(double, int)")
	}

	// Combination 3
	if Overloaded() != 60 {
		panic("overloaded()")
	}

	if Overloaded(100.0, 100) != 70 {
		panic("overloaded(double, int)")
	}

	// Combination 4
	if Overloadedagain("hello") != 80 {
		panic("overloadedagain(const char *)")
	}

	if Overloadedagain() != 90 {
		panic("overloadedagain(double)")
	}

	// specializations
	if Specialization(10) != 202 {
		panic("specialization(int)")
	}

	if Specialization(10.0) != 203 {
		panic("specialization(double)")
	}

	if Specialization(10, 10) != 204 {
		panic("specialization(int, int)")
	}

	if Specialization(10.0, 10.0) != 205 {
		panic("specialization(double, double)")
	}

	if Specialization("hi", "hi") != 201 {
		panic("specialization(const char *, const char *)")
	}

	// simple specialization
	Xyz()
	Xyz_int()
	Xyz_double()

	// a bit of everything
	if Overload("hi") != 0 {
		panic("overload()")
	}

	if Overload(1) != 10 {
		panic("overload(int t)")
	}

	if Overload(1, 1) != 20 {
		panic("overload(int t, const int &)")
	}

	if Overload(1, "hello") != 30 {
		panic("overload(int t, const char *)")
	}

	k := NewKlass()
	if Overload(k) != 10 {
		panic("overload(Klass t)")
	}

	if Overload(k, k) != 20 {
		panic("overload(Klass t, const Klass &)")
	}

	if Overload(k, "hello") != 30 {
		panic("overload(Klass t, const char *)")
	}

	if Overload(10.0, "hi") != 40 {
		panic("overload(double t, const char *)")
	}

	if Overload() != 50 {
		panic("overload(const char *)")
	}

	// everything put in a namespace
	if Nsoverload("hi") != 1000 {
		panic("nsoverload()")
	}

	if Nsoverload(1) != 1010 {
		panic("nsoverload(int t)")
	}

	if Nsoverload(1, 1) != 1020 {
		panic("nsoverload(int t, const int &)")
	}

	if Nsoverload(1, "hello") != 1030 {
		panic("nsoverload(int t, const char *)")
	}

	if Nsoverload(k) != 1010 {
		panic("nsoverload(Klass t)")
	}

	if Nsoverload(k, k) != 1020 {
		panic("nsoverload(Klass t, const Klass &)")
	}

	if Nsoverload(k, "hello") != 1030 {
		panic("nsoverload(Klass t, const char *)")
	}

	if Nsoverload(10.0, "hi") != 1040 {
		panic("nsoverload(double t, const char *)")
	}

	if Nsoverload() != 1050 {
		panic("nsoverload(const char *)")
	}

	AFoo(1)
	b := NewB()
	b.Foo(1)
}
