mirror of
				https://github.com/vlang/v.git
				synced 2023-08-10 21:13:21 +03:00 
			
		
		
		
	 4400efeb9f
			
		
	
	4400efeb9f
	
	
	
		
			
			`gcc -W` doesn't error for e.g. u16 == i32, only for u32 == i16. Any u16 value can fit in an i32.
		
			
				
	
	
		
			334 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			V
		
	
	
	
	
	
			
		
		
	
	
			334 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			V
		
	
	
	
	
	
| import bitfield
 | |
| import rand
 | |
| 
 | |
| fn test_bf_new_size() {
 | |
| 	instance := bitfield.new(75)
 | |
| 	assert instance.get_size() == 75
 | |
| }
 | |
| 
 | |
| fn test_bf_set_clear_toggle_get() {
 | |
| 	mut instance := bitfield.new(75)
 | |
| 	instance.set_bit(47)
 | |
| 	assert instance.get_bit(47) == 1
 | |
| 	instance.clear_bit(47)
 | |
| 	assert instance.get_bit(47) == 0
 | |
| 	instance.toggle_bit(47)
 | |
| 	assert instance.get_bit(47) == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_insert_extract() {
 | |
| 	mut instance := bitfield.new(11)
 | |
| 	instance.set_all()
 | |
| 	instance.insert(2, 9, 3)
 | |
| 	assert instance.extract(2, 1) == 0
 | |
| 	assert instance.extract(2, 8) == 1
 | |
| 	assert instance.extract(10, 1) == 1
 | |
| 	instance.set_all()
 | |
| 	instance.insert_lowest_bits_first(2, 9, 3)
 | |
| 	assert instance.extract_lowest_bits_first(2, 1) == 1
 | |
| 	assert instance.extract_lowest_bits_first(2, 8) == 3
 | |
| 	assert instance.extract_lowest_bits_first(10, 1) == 0
 | |
| }
 | |
| 
 | |
| fn test_bf_and_not_or_xor() {
 | |
| 	len := 80
 | |
| 	mut input1 := bitfield.new(len)
 | |
| 	mut input2 := bitfield.new(len)
 | |
| 	mut i := 0
 | |
| 	for i < len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input1.set_bit(i)
 | |
| 		}
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input2.set_bit(i)
 | |
| 		}
 | |
| 		i++
 | |
| 	}
 | |
| 	output1 := bitfield.bf_xor(input1, input2)
 | |
| 	bf_and := bitfield.bf_and(input1, input2)
 | |
| 	bf_or := bitfield.bf_or(input1, input2)
 | |
| 	bf_not := bitfield.bf_not(bf_and)
 | |
| 	output2 := bitfield.bf_and(bf_or, bf_not)
 | |
| 	mut result := 1
 | |
| 	for i < len {
 | |
| 		if output1.get_bit(i) != output2.get_bit(i) {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_clone_cmp() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input.set_bit(i)
 | |
| 		}
 | |
| 	}
 | |
| 	output := input.clone()
 | |
| 	assert output.get_size() == len
 | |
| 	assert input == output
 | |
| }
 | |
| 
 | |
| fn test_slice_join() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input.set_bit(i)
 | |
| 		}
 | |
| 	}
 | |
| 	mut result := 1
 | |
| 	for point := 1; point < (len - 1); point++ {
 | |
| 		// divide a bitfield into two subfields
 | |
| 		chunk1 := input.slice(0, point)
 | |
| 		chunk2 := input.slice(point, input.get_size())
 | |
| 		// concatenate them back into one and compare to the original
 | |
| 		output := bitfield.join(chunk1, chunk2)
 | |
| 		if input != output {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_pop_count() {
 | |
| 	len := 80
 | |
| 	mut count0 := 0
 | |
| 	mut input := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input.set_bit(i)
 | |
| 			count0++
 | |
| 		}
 | |
| 	}
 | |
| 	count1 := input.pop_count()
 | |
| 	assert count0 == count1
 | |
| }
 | |
| 
 | |
| fn test_hamming() {
 | |
| 	len := 80
 | |
| 	mut count := 0
 | |
| 	mut input1 := bitfield.new(len)
 | |
| 	mut input2 := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		match rand.intn(4) or { 0 } {
 | |
| 			0, 1 {
 | |
| 				input1.set_bit(i)
 | |
| 				count++
 | |
| 			}
 | |
| 			2 {
 | |
| 				input2.set_bit(i)
 | |
| 				count++
 | |
| 			}
 | |
| 			3 {
 | |
| 				input1.set_bit(i)
 | |
| 				input2.set_bit(i)
 | |
| 			}
 | |
| 			else {}
 | |
| 		}
 | |
| 	}
 | |
| 	assert count == bitfield.hamming(input1, input2)
 | |
| }
 | |
| 
 | |
| fn test_bf_from_bytes() {
 | |
| 	input := [u8(0x01), 0xF0, 0x0F, 0xF0, 0xFF]
 | |
| 	output := bitfield.from_bytes(input).str()
 | |
| 	assert output == '00000001' + '11110000' + '00001111' + '11110000' + '11111111'
 | |
| 	newoutput := bitfield.from_str(output).str()
 | |
| 	assert newoutput == output
 | |
| }
 | |
| 
 | |
| fn test_bf_from_bytes_lowest_bits_first() {
 | |
| 	input := [u8(0x01), 0xF0]
 | |
| 	output := bitfield.from_bytes_lowest_bits_first(input).str()
 | |
| 	assert output == '10000000' + '00001111'
 | |
| 	newoutput := bitfield.from_str(output).str()
 | |
| 	assert newoutput == output
 | |
| }
 | |
| 
 | |
| fn test_bf_from_str() {
 | |
| 	len := 80
 | |
| 	mut input := ''
 | |
| 	for _ in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input = input + '1'
 | |
| 		} else {
 | |
| 			input = input + '0'
 | |
| 		}
 | |
| 	}
 | |
| 	output := bitfield.from_str(input)
 | |
| 	mut result := 1
 | |
| 	for i in 0 .. len {
 | |
| 		if input[i] != output.get_bit(i) + 48 {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_bf2str() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input.set_bit(i)
 | |
| 		}
 | |
| 	}
 | |
| 	mut check := ''
 | |
| 	for i in 0 .. len {
 | |
| 		if input.get_bit(i) == 1 {
 | |
| 			check = check + '1'
 | |
| 		} else {
 | |
| 			check = check + '0'
 | |
| 		}
 | |
| 	}
 | |
| 	output := input.str()
 | |
| 	mut result := 1
 | |
| 	for i in 0 .. len {
 | |
| 		if check[i] != output[i] {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_set_all() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(len)
 | |
| 	input.set_all()
 | |
| 	mut result := 1
 | |
| 	for i in 0 .. len {
 | |
| 		if input.get_bit(i) != 1 {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_clear_all() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input.set_bit(i)
 | |
| 		}
 | |
| 	}
 | |
| 	input.clear_all()
 | |
| 	mut result := 1
 | |
| 	for i in 0 .. len {
 | |
| 		if input.get_bit(i) != 0 {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_reverse() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 1 {
 | |
| 			input.set_bit(i)
 | |
| 		}
 | |
| 	}
 | |
| 	check := input.clone()
 | |
| 	output := input.reverse()
 | |
| 	mut result := 1
 | |
| 	for i in 0 .. len {
 | |
| 		if output.get_bit(i) != check.get_bit(len - i - 1) {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_resize() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(rand.intn(len) or { 0 } + 1)
 | |
| 	for _ in 0 .. 100 {
 | |
| 		input.resize(rand.intn(len) or { 0 } + 1)
 | |
| 		input.set_bit(input.get_size() - 1)
 | |
| 	}
 | |
| 	assert input.get_bit(input.get_size() - 1) == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_pos() {
 | |
| 	/*
 | |
| 	*
 | |
| 	 * set haystack size to 80
 | |
| 	 * test different sizes of needle, from 1 to 80
 | |
| 	 * test different positions of needle, from 0 to where it fits
 | |
| 	 * all haystacks here contain exactly one instanse of needle,
 | |
| 	 * so search should return non-negative-values
 | |
| 	*
 | |
| 	*/
 | |
| 	len := 80
 | |
| 	mut result := 1
 | |
| 	for i := 1; i < len; i++ { // needle size
 | |
| 		for j in 0 .. len - i { // needle position in the haystack
 | |
| 			// create the needle
 | |
| 			mut needle := bitfield.new(i)
 | |
| 			// fill the needle with random values
 | |
| 			for k in 0 .. i {
 | |
| 				if rand.intn(2) or { 0 } == 1 {
 | |
| 					needle.set_bit(k)
 | |
| 				}
 | |
| 			}
 | |
| 			// make sure the needle contains at least one set bit, selected randomly
 | |
| 			r := rand.intn(i) or { 0 }
 | |
| 			needle.set_bit(r)
 | |
| 			// create the haystack, make sure it contains the needle
 | |
| 			mut haystack := needle.clone()
 | |
| 			// if there is space between the start of the haystack and the sought needle, fill it with zeroes
 | |
| 			if j > 0 {
 | |
| 				start := bitfield.new(j)
 | |
| 				tmp := bitfield.join(start, haystack)
 | |
| 				haystack = tmp
 | |
| 			}
 | |
| 			// if there is space between the sought needle and the end of haystack, fill it with zeroes
 | |
| 			if j + i < len {
 | |
| 				end := bitfield.new(len - j - i)
 | |
| 				tmp2 := bitfield.join(haystack, end)
 | |
| 				haystack = tmp2
 | |
| 			}
 | |
| 			// now let's test
 | |
| 			// the result should be equal to j
 | |
| 			if haystack.pos(needle) != j {
 | |
| 				result = 0
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_rotate() {
 | |
| 	mut result := 1
 | |
| 	len := 80
 | |
| 	for i := 1; i < 80 && result == 1; i++ {
 | |
| 		mut chunk1 := bitfield.new(i)
 | |
| 		chunk2 := bitfield.new(len - i)
 | |
| 		chunk1.set_all()
 | |
| 		input := bitfield.join(chunk1, chunk2)
 | |
| 		output := input.rotate(i)
 | |
| 		if output.get_bit(len - i - 1) != 0 || output.get_bit(len - i) != 1 {
 | |
| 			result = 0
 | |
| 		}
 | |
| 	}
 | |
| 	assert result == 1
 | |
| }
 | |
| 
 | |
| fn test_bf_printing() {
 | |
| 	len := 80
 | |
| 	mut input := bitfield.new(len)
 | |
| 	for i in 0 .. len {
 | |
| 		if rand.intn(2) or { 0 } == 0 {
 | |
| 			input.set_bit(i)
 | |
| 		}
 | |
| 	}
 | |
| 	// the following should convert the bitfield input into a string automatically
 | |
| 	println(input)
 | |
| 	assert true
 | |
| }
 |