import stormpy


class TestBitvector:
    def test_init_default(self):
        bit = stormpy.BitVector()
        assert bit.size() == 0
        assert bit.number_of_set_bits() == 0

    def test_init_length(self):
        bit = stormpy.BitVector(10)
        assert bit.size() == 10
        assert bit.number_of_set_bits() == 0
        bit = stormpy.BitVector(5, True)
        assert bit.size() == 5
        assert bit.number_of_set_bits() == 5

    def test_init_vector(self):
        bit = stormpy.BitVector(5, [2, 3])
        assert bit.size() == 5
        assert bit.number_of_set_bits() == 2
        assert bit.get(0) is False
        assert bit.get(1) is False
        assert bit.get(2) is True
        assert bit.get(3) is True
        assert bit.get(4) is False

    def test_init_bitvector(self):
        bit = stormpy.BitVector(7, [0, 6])
        bit2 = stormpy.BitVector(bit)
        assert bit == bit2
        assert bit2.get(0) is True
        assert bit2.get(6) is True

    def test_negate(self):
        bit = stormpy.BitVector(7, [0, 6])
        bit2 = stormpy.BitVector(bit)
        bit = ~bit
        assert bit.get(0) is False
        assert bit.get(6) is False
        for i in range(bit.size()):
            assert bit.get(i) is not bit2.get(i)