BuiltInOperatorsTest.java

package zserio.runtime;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.math.BigInteger;

import org.junit.jupiter.api.Test;

public class BuiltInOperatorsTest
{
    private static class DummyBitmask implements ZserioBitmask
    {
        public DummyBitmask(short value)
        {
            this.value = value;
        }

        @Override
        public Number getGenericValue()
        {
            return value;
        }

        public static final class Values
        {
            public static final DummyBitmask READ = new DummyBitmask((short)1);
            public static final DummyBitmask WRITE = new DummyBitmask((short)2);
            public static final DummyBitmask CREATE = new DummyBitmask((short)(1 | 2));
        }

        public DummyBitmask or(DummyBitmask other)
        {
            return new DummyBitmask((short)(value | other.value));
        }

        private short value;
    }

    @Test
    public void isSet()
    {
        assertTrue(BuiltInOperators.isSet(DummyBitmask.Values.READ, DummyBitmask.Values.READ));
        assertTrue(BuiltInOperators.isSet(DummyBitmask.Values.CREATE, DummyBitmask.Values.READ));
        assertTrue(BuiltInOperators.isSet(DummyBitmask.Values.CREATE, DummyBitmask.Values.WRITE));
        assertTrue(BuiltInOperators.isSet(DummyBitmask.Values.CREATE, DummyBitmask.Values.CREATE));
        assertTrue(BuiltInOperators.isSet(
                DummyBitmask.Values.CREATE, DummyBitmask.Values.READ.or(DummyBitmask.Values.WRITE)));
        assertFalse(BuiltInOperators.isSet(DummyBitmask.Values.READ, DummyBitmask.Values.WRITE));
        assertFalse(BuiltInOperators.isSet(DummyBitmask.Values.READ, DummyBitmask.Values.CREATE));
    }

    @Test
    public void numBits()
    {
        assertEquals(0, BuiltInOperators.numBits(0));
        assertEquals(1, BuiltInOperators.numBits(1));
        assertEquals(1, BuiltInOperators.numBits(2));
        assertEquals(2, BuiltInOperators.numBits(3));
        assertEquals(2, BuiltInOperators.numBits(4));
        assertEquals(3, BuiltInOperators.numBits(5));
        assertEquals(3, BuiltInOperators.numBits(6));
        assertEquals(3, BuiltInOperators.numBits(7));
        assertEquals(3, BuiltInOperators.numBits(8));
        assertEquals(4, BuiltInOperators.numBits(16));
        assertEquals(5, BuiltInOperators.numBits(32));
        assertEquals(6, BuiltInOperators.numBits(64));
        assertEquals(7, BuiltInOperators.numBits(128));
        assertEquals(8, BuiltInOperators.numBits(256));
        assertEquals(9, BuiltInOperators.numBits(512));
        assertEquals(10, BuiltInOperators.numBits(1024));
        assertEquals(11, BuiltInOperators.numBits(2048));
        assertEquals(12, BuiltInOperators.numBits(4096));
        assertEquals(13, BuiltInOperators.numBits(8192));
        assertEquals(14, BuiltInOperators.numBits(16384));
        assertEquals(15, BuiltInOperators.numBits(32768));
        assertEquals(16, BuiltInOperators.numBits(65536));

        assertEquals(63, BuiltInOperators.numBits(BigInteger.ONE.shiftLeft(63)));
        assertEquals(64, BuiltInOperators.numBits(BigInteger.ONE.shiftLeft(63).add(BigInteger.ONE)));
    }

    @Test
    void lengthOf()
    {
        assertEquals(0, BuiltInOperators.lengthOf(""));
        assertEquals(3, BuiltInOperators.lengthOf("abc"));
        assertEquals(3, BuiltInOperators.lengthOf("€"));
        assertEquals(1, BuiltInOperators.lengthOf("$"));
        assertEquals(4, BuiltInOperators.lengthOf("€$"));
    }
}