package main

import . "swigtests/reference_global_vars"

func main() {
	// const class reference variable
	if GetconstTC().GetNum() != 33 {
		panic(0)
	}

	// primitive reference variables
	SetVar_bool(Createref_bool(false))
	if Value_bool(GetVar_bool()) != false {
		println(1, GetVar_bool(), Value_bool(GetVar_bool()))
		panic(0)
	}

	SetVar_bool(Createref_bool(true))
	if Value_bool(GetVar_bool()) != true {
		println(2, GetVar_bool(), Value_bool(GetVar_bool()))
		panic(0)
	}

	SetVar_char(Createref_char('w'))
	if Value_char(GetVar_char()) != 'w' {
		println(3, GetVar_char(), Value_char(GetVar_char()))
		panic(0)
	}

	SetVar_unsigned_char(Createref_unsigned_char(10))
	if Value_unsigned_char(GetVar_unsigned_char()) != 10 {
		println(4, GetVar_unsigned_char(), Value_unsigned_char(GetVar_unsigned_char()))
		panic(0)
	}

	SetVar_signed_char(Createref_signed_char(10))
	if Value_signed_char(GetVar_signed_char()) != 10 {
		panic(0)
	}

	SetVar_short(Createref_short(10))
	if Value_short(GetVar_short()) != 10 {
		panic(0)
	}

	SetVar_unsigned_short(Createref_unsigned_short(10))
	if Value_unsigned_short(GetVar_unsigned_short()) != 10 {
		panic(0)
	}

	SetVar_int(Createref_int(10))
	if Value_int(GetVar_int()) != 10 {
		panic(0)
	}

	SetVar_unsigned_int(Createref_unsigned_int(10))
	if Value_unsigned_int(GetVar_unsigned_int()) != 10 {
		panic(0)
	}

	SetVar_long(Createref_long(10))
	if Value_long(GetVar_long()) != 10 {
		panic(0)
	}

	SetVar_unsigned_long(Createref_unsigned_long(10))
	if Value_unsigned_long(GetVar_unsigned_long()) != 10 {
		panic(0)
	}

	SetVar_long_long(Createref_long_long(0x6FFFFFFFFFFFFFF8))
	if Value_long_long(GetVar_long_long()) != 0x6FFFFFFFFFFFFFF8 {
		panic(0)
	}

	//ull = abs(0xFFFFFFF2FFFFFFF0)
	ull := uint64(55834574864)
	SetVar_unsigned_long_long(Createref_unsigned_long_long(ull))
	if Value_unsigned_long_long(GetVar_unsigned_long_long()) != ull {
		panic(0)
	}

	SetVar_float(Createref_float(10.5))
	if Value_float(GetVar_float()) != 10.5 {
		panic(0)
	}

	SetVar_double(Createref_double(10.5))
	if Value_double(GetVar_double()) != 10.5 {
		panic(0)
	}

	// class reference variable
	SetVar_TestClass(Createref_TestClass(NewTestClass(20)))
	if Value_TestClass(GetVar_TestClass()).GetNum() != 20 {
		panic(0)
	}
}
