#!/usr/bin/python3-dbg
# -*- coding: utf-8 -*-


# Tests minimalistes pour valider la construction de chemins relatifs et absolus.


from chrysacase import ChrysalideTestCase
from pychrysalide.common import bitfield


class TestBitfields(ChrysalideTestCase):
    """TestCase for common.bitfield*"""

    def testDuplicateBitfield(self):
        """Check duplicated bitfield value."""

        bf = bitfield(10, 0)

        bf2 = bf.dup()

        self.assertEqual(bf, bf2)


    def testBitfieldValues(self):
        """Evaluate bitfields basic values."""

        bf_a = bitfield(75, 1)

        bf_b = bitfield(75, 0)

        self.assertNotEqual(bf_a, bf_b)

        bf_a = bitfield(75, 1)

        bf_b = bitfield(75, 0)
        bf_b.set_all()

        self.assertEqual(bf_a, bf_b)

        bf_a = bitfield(75, 1)
        bf_a.reset_all()

        bf_b = bitfield(75, 0)

        self.assertEqual(bf_a, bf_b)


    def testBitfieldLogicalOperations(self):
        """Perform logical operations on bitfields."""

        bf_a = bitfield(75, 1)

        bf_b = bitfield(75, 0)

        bf_f = bf_a & bf_b

        self.assertEqual(bf_f, bf_b)

        bf_f = bf_a | bf_b

        self.assertEqual(bf_f, bf_a)


    def testBitfieldSwitch(self):
        """Switch various bits in bitfields."""

        bf_1 = bitfield(75, 1)

        bf_0 = bitfield(75, 0)

        bf_t = bitfield(75, 0)

        for i in range(75):
            bf_t.set(i, 1)

        self.assertEqual(bf_t, bf_1)

        for i in range(75):
            bf_t.reset(i, 1)

        self.assertEqual(bf_t, bf_0)


    def testBitfieldBits(self):
        """Test bits in bitfields."""

        bf = bitfield(54, 1)

        self.assertTrue(bf.test(0))

        self.assertTrue(bf.test(53))

        self.assertTrue(bf.test_all(0, 54))

        self.assertFalse(bf.test_none(0, 54))

        bf = bitfield(54, 0)

        self.assertFalse(bf.test(0))

        self.assertFalse(bf.test(53))

        self.assertFalse(bf.test_all(0, 54))

        self.assertTrue(bf.test_none(0, 54))