module datatypes

fn test_exists() {
	mut set := Set[string]{}
	set.add('foo')
	assert set.exists('foo')
	assert set.exists('bar') == false
}

fn test_remove() {
	mut set := Set[string]{}
	set.remove('foo')
	set.add('foo')
	assert set.exists('foo')
	set.remove('foo')
	assert set.exists('foo') == false
}

fn test_size() {
	mut set := Set[string]{}
	set.add('foo')
	set.add('foo')
	assert set.size() == 1
}

fn test_pop() {
	mut set := Set[string]{}
	set.add('foo')
	set.pop() or { return }
	assert set.exists('foo') == false
}

fn test_clear() {
	mut set := Set[string]{}
	set.add('foo')
	set.clear()
	assert set.size() == 0
}

fn test_rest() {
	mut set := Set[string]{}
	set.add('foo')
	set.add('bar')
	array := set.rest() or { return }
	assert array.len == 1
}

fn test_equal() {
	mut first_set := Set[string]{}
	mut second_set := Set[string]{}
	first_set.add('foo')
	assert second_set != first_set
	second_set.add('foo')
	assert second_set == first_set
}

fn test_is_empty() {
	mut set := Set[string]{}
	assert set.is_empty()
	set.add('foo')
	assert set.is_empty() == false
}

fn test_union() {
	mut first_set := Set[string]{}
	mut second_set := Set[string]{}
	first_set.add_all(['b', 'c', 'd'])
	second_set.add_all(['a', 'e'])
	mut third_set := first_set.@union(second_set)
	assert first_set.elements.len == 3
	assert third_set.exists('a')
	assert third_set.exists('b')
	assert third_set.exists('c')
	assert third_set.exists('d')
	assert third_set.exists('e')
}

fn test_intersection() {
	mut first_set := Set[string]{}
	first_set.add_all(['foo', 'bar', 'baz'])
	mut second_set := Set[string]{}
	second_set.add_all(['bar', 'baz', 'boo'])
	mut third_set := first_set.intersection(second_set)
	assert first_set.exists('foo') == true
	assert third_set.exists('foo') == false
	assert third_set.exists('bar')
	assert third_set.exists('baz')
	assert third_set.exists('boo') == false
}

fn test_difference() {
	mut first_set := Set[string]{}
	mut second_set := Set[string]{}
	first_set.add_all(['foo', 'bar', 'baz'])
	second_set.add_all(['bar', 'baz', 'boo'])
	mut third_set := first_set - second_set
	assert third_set.exists('foo')
	assert third_set.exists('bar') == false
	assert third_set.exists('baz') == false
	assert third_set.exists('boo') == false
	first_set.clear()
	second_set.clear()
	third_set.clear()
	first_set.add_all(['bar', 'baz', 'boo'])
	second_set.add_all(['foo', 'bar', 'baz'])
	third_set = first_set - second_set
	assert third_set.exists('foo') == false
	assert third_set.exists('bar') == false
	assert third_set.exists('baz') == false
	assert third_set.exists('boo')
}

fn test_diff() {
	m := ['a', 'b', 'c']
	n := ['a', 'b', 'c']
	assert m == n
	mut set_m := Set[string]{}
	mut set_n := Set[string]{}
	set_m.add_all(m)
	set_n.add_all(n)
	assert set_m == set_n
	diff1 := set_m - set_n
	diff2 := set_n - set_m
	assert diff1 == diff2
}

fn test_subset() {
	mut set := Set[string]{}
	set.add_all(['a', 'b', 'c'])
	mut subset := Set[string]{}
	subset.add_all(['b', 'c'])
	assert set.subset(subset)
}

fn test_array() {
	mut set := Set[string]{}
	set.add_all(['a', 'b', 'c'])
	assert set.array().len == 3
}
