1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/bitfield/bitfield_test.v
Nick Treleaven 4400efeb9f
checker: Revert part of small_unsigned == signed (#13967) (#14075)
`gcc -W` doesn't error for e.g. u16 == i32, only for u32 == i16.
Any u16 value can fit in an i32.
2022-04-18 21:30:09 +03:00

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
}