public void Day16_TestDecoder_VersionSums_OK(string hexInput, int expected)
        {
            var sut = new PaketDecoder(hexInput);

            sut.ParseAllPackets();
            int actual = sut.VersionSum();

            Assert.Equal(expected, actual);
        }
        public void Day16_Puzzle2_OK()
        {
            var sut = new PaketDecoder(Data);

            sut.ParseAllPackets();
            long actual = sut.Packets[0].GetValue();

            Assert.Equal(2536453523344, actual);
        }
        public void Day16_TestDecoder_Calculate_OK(string hexInput, long expected)
        {
            var sut = new PaketDecoder(hexInput);

            sut.ParseAllPackets();
            long actual = sut.Packets[0].GetValue();

            Assert.Equal(expected, actual);
        }
        public void Day16_Puzzle1_OK()
        {
            var sut = new PaketDecoder(Data);

            sut.ParseAllPackets();
            int actual = sut.VersionSum();

            Assert.Equal(917, actual);
        }
        public void Day16_TestDecoder_GetLiteralValuePaket_OK()
        {
            string hexInput = "D2FE28";

            var sut = new PaketDecoder(hexInput);

            var          paket = sut.ParsePaket();
            LiteralValue lv    = paket as LiteralValue;

            Assert.Equal(6, lv.Version);
            Assert.Equal(4, lv.TypeID);
            Assert.Equal(2021, lv.Value);
        }
        public void Day16_TestDecoder_GetOperatorPaket1_OK()
        {
            string hexInput = "EE00D40C823060";

            var sut = new PaketDecoder(hexInput);

            var            paket = sut.ParsePaket();
            OperatorPacket op    = paket as OperatorPacket;

            Assert.NotNull(op);
            Assert.Equal(7, op.Version);
            Assert.Equal(3, op.TypeID);
            Assert.True(op.Iflag);
            OperatorSubPackets olb = paket as OperatorSubPackets;

            Assert.NotNull(olb);
            Assert.Equal(3, olb.SubPackets);
            Assert.Equal(3, olb.Packets.Count);
        }
        public void Day16_TestDecoder_GetOperatorPaket0_OK()
        {
            string hexInput = "38006F45291200";

            var sut = new PaketDecoder(hexInput);

            var            paket = sut.ParsePaket();
            OperatorPacket op    = paket as OperatorPacket;

            Assert.NotNull(op);
            Assert.Equal(1, op.Version);
            Assert.Equal(6, op.TypeID);
            Assert.False(op.Iflag);
            OperatorLenBits olb = paket as OperatorLenBits;

            Assert.NotNull(olb);
            Assert.Equal(27, olb.LenBits);
            Assert.Equal(2, olb.Packets.Count);
        }
        public void Day16_TestDecoder_GetBits_OK()
        {
            string hexInput = "D2FE28";
            //string expectedBinary = "110100101111111000101000";

            var sut = new PaketDecoder(hexInput);

            string actual = sut.GetBits(3);

            Assert.Equal("110", actual);
            actual = sut.GetBits(3);
            Assert.Equal("100", actual);
            actual = sut.GetBits(5);
            Assert.Equal("10111", actual);
            actual = sut.GetBits(5);
            Assert.Equal("11110", actual);
            actual = sut.GetBits(5);
            Assert.Equal("00101", actual);
            actual = sut.Flush();
            Assert.Equal("000", actual);
        }