import os

fn former_handler(signal os.Signal) {
	println('former_handler')
	exit(0)
}

fn default_handler(signal os.Signal) {
	println('default_handler')
	exit(0)
}

fn test_signal_opt() {
	os.signal_opt(.int, default_handler) or { assert false }
}

fn test_signal_opt_invalid_argument() {
	// Can't register a signal on SIGKILL
	if _ := os.signal_opt(.kill, default_handler) {
		assert false
	}
	os.signal_opt(.kill, default_handler) or {
		assert err.msg() == 'Invalid argument; code: 22'
		assert err.code() == 22
	}
}

fn test_signal_opt_return_former_handler() {
	func1 := os.signal_opt(.term, former_handler) or { panic('unexpected error') }
	assert isnil(func1)
	func2 := os.signal_opt(.term, default_handler) or { panic('unexpected error') }
	assert !isnil(func2)
	// this should work, but makes the CI fail because of a bug in clang -fsanitize=memory
	// assert func2 == former_handler
}

fn signal_ignore_in_background_thread() {
	os.signal_ignore(.pipe, .urg)
	assert true
}

fn test_signal_ignore() {
	os.signal_ignore(.pipe, .urg)
	assert true
	t := spawn signal_ignore_in_background_thread()
	t.wait()
}
