from slsdet.bits import clearbit, clearbit_arr, setbit, setbit_arr
import numpy as np


def test_clearbit_on_python_int():
    val = 5  # 0b101
    r = clearbit(0, val)
    assert r == 4
    assert val == 5

def test_setbit_on_python_int():
    val = 5  # 0b101
    r = setbit(1, val)
    assert r == 7
    assert val == 5


def test_setbit_doesnt_change_type():
    word = np.int32(5)
    ret = setbit(0, word)
    assert isinstance(ret, np.int32)


def test_clearbit_doesnt_change_type():
    word = np.uint8(5)
    ret = clearbit(0, word)
    assert isinstance(ret, np.uint8)



def test_setbit_on_array_element():
    arr = np.zeros(10, dtype=np.uint64)
    arr[5] = setbit(0, arr[5])
    arr[5] = setbit(1, arr[5])
    arr[5] = setbit(4, arr[5])
    assert arr[4] == 0
    assert arr[5] == 19  # 0b10011
    assert arr[6] == 0


def test_setbit_arr():
    arr = np.zeros(10, dtype=np.int32)
    setbit_arr(3, arr[3:9])
    assert all(arr == np.array((0, 0, 0, 8, 8, 8, 8, 8, 8, 0), dtype=np.int32))


def test_clearbit_arr():
    arr = np.array((5, 5, 5), dtype=np.int8)
    clearbit_arr(0, arr)
    assert all(arr == (4, 4, 4))