public void Serialization_SerializeAndDeserialize_NeverThrowsAndPropertiesAsEqual()
        {
            try
            {
                IBitCharger instance = this.CreateInstance();

                instance.SetBitAt(0, true);
                instance.SetBitAt(242, true);

                using (MemoryStream stream = new MemoryStream())
                {
                    BinaryFormatter formatter = new BinaryFormatter();

                    formatter.Serialize(stream, instance);

                    stream.Position = 0;

                    IBitCharger actual = formatter.Deserialize(stream) as IBitCharger;

                    Assert.That(actual, Is.Not.Null);
                    Assert.That(actual.Capacity, Is.EqualTo(instance.Capacity));
                    Assert.That(actual.Length, Is.EqualTo(instance.Length));
                    Assert.That(actual.Content, Is.EqualTo(instance.Content));
                }
            }
            catch (Exception error)
            {
                Assert.That(false, error.Message);
            }
        }
        public void GetBytes_OffsetZeroLengthUnused_ResultAsExpected()
        {
            IBitCharger instance = this.CreateInstance();

            // 10101100 (0xAC, 172)
            instance.SetBitAt(2, true);
            instance.SetBitAt(3, true);
            instance.SetBitAt(5, true);
            instance.SetBitAt(7, true);

            Byte[] actual = instance.GetBytes(0);

            Assert.That(actual.Length, Is.EqualTo(1));
            Assert.That(actual[0], Is.EqualTo(172));
        }
        public void SetBytes_SourceIsEmptyOffsetUnused_ContentRemainsUnchanged()
        {
            IBitCharger instance = this.CreateInstance();

            instance.SetBitAt(2, true);
            instance.SetBitAt(3, true);
            instance.SetBitAt(5, true);
            instance.SetBitAt(7, true);

            String expected = instance.Content;

            instance.SetBytes(new Byte[0]);

            Assert.That(instance.Content, Is.EqualTo(expected));
        }
        public void GetBytes_OffsetZeroLengthZero_ResultIsEmpty()
        {
            IBitCharger instance = this.CreateInstance();

            instance.SetBitAt(15, false);

            Assert.That(instance.GetBytes(0, 0), Is.Empty);
        }
        public void GetBytes_OffsetZeroLengthBeyondMax_ThrowsArgumentOutOfRangeException()
        {
            IBitCharger instance = this.CreateInstance();

            instance.SetBitAt(15, false);

            Assert.That(() => instance.GetBytes(0, instance.Bytes + 1), Throws.InstanceOf <ArgumentOutOfRangeException>());
        }
        public void HasBitAt_IndexIsInRange_ResultAsExpected(Int32 index, Int32 actual, Boolean expected)
        {
            IBitCharger instance = this.CreateInstance();

            instance.SetBitAt(index, true);

            Assert.That(instance.HasBitAt(actual), Is.EqualTo(expected));
        }
        public void SetBitAt_WithIndexAndEnabled_ContentAsExpected(Int32 index, String expected)
        {
            IBitCharger instance = this.CreateInstance();

            instance.SetBitAt(index, true);

            Assert.That(instance.Content, Is.EqualTo(expected));
        }
        public void SetBitAt_IndexIsLessThanDefaultLength_PropertiesAsExpected()
        {
            IBitCharger instance = this.CreateInstance();

            instance.SetBitAt(7, true);

            Assert.That(instance.Length, Is.EqualTo(8));
        }
        public void SetBitAt_IndexIsGreaterThanDefaultLength_PropertiesAsExpected()
        {
            IBitCharger instance = this.CreateInstance();

            instance.SetBitAt(135, true);

            Assert.That(instance.Capacity, Is.EqualTo(264));
            Assert.That(instance.Length, Is.EqualTo(136));
        }
        public void SetBytes_SourceThreeBytesOffsetThreeBE_ContentAsExpected()
        {
            IBitCharger instance = this.CreateInstance();

            this.byteOrder.SetupGet(x => x.IsLittleEndian).Returns(false);

            // 10101100 (0xAC, 172) -> Bits to keep...
            instance.SetBitAt(2, true);
            instance.SetBitAt(3, true);
            instance.SetBitAt(5, true);
            instance.SetBitAt(7, true);

            String expected = this.MakeExpected(new Byte[] { 0x81, 0x82, 0x83, 0x00, 0x00, 0xAC });

            Byte[] source = new Byte[] { 0x83, 0x82, 0x81 };

            instance.SetBytes(source, 3);

            Assert.That(instance.Content, Is.EqualTo(expected));
        }
        public void GetBytes_OffsetZeroLengthOne_ResultAsExpected()
        {
            IBitCharger instance = this.CreateInstance();

            // 10101100 (0xAC, 172)
            instance.SetBitAt(2, true);
            instance.SetBitAt(3, true);
            instance.SetBitAt(5, true);
            instance.SetBitAt(7, true);

            // 11110000 (0xF0, 240)
            instance.SetBitAt(12, true);
            instance.SetBitAt(13, true);
            instance.SetBitAt(14, true);
            instance.SetBitAt(15, true);

            Byte[] actual = instance.GetBytes(0, 2);

            Assert.That(actual.Length, Is.EqualTo(2));
            Assert.That(actual[0], Is.EqualTo(240));
            Assert.That(actual[1], Is.EqualTo(172));
        }
        public void Clone_CloneInstance_ClonePropertiesAreEqual()
        {
            IBitCharger instance = this.CreateInstance();

            // 0x02 => 00000010
            instance.SetBitAt(0, false);
            instance.SetBitAt(1, true);
            instance.SetBitAt(2, false);
            instance.SetBitAt(3, false);
            instance.SetBitAt(4, false);
            instance.SetBitAt(5, false);
            instance.SetBitAt(6, false);
            instance.SetBitAt(7, false);

            // 0xCE => 11001110
            instance.SetBitAt(8, false);
            instance.SetBitAt(9, true);
            instance.SetBitAt(10, true);
            instance.SetBitAt(11, true);
            instance.SetBitAt(12, false);
            instance.SetBitAt(13, false);
            instance.SetBitAt(14, true);
            instance.SetBitAt(15, true);

            // 0xDA => 11011010
            instance.SetBitAt(16, false);
            instance.SetBitAt(17, true);
            instance.SetBitAt(18, false);
            instance.SetBitAt(19, true);
            instance.SetBitAt(20, true);
            instance.SetBitAt(21, false);
            instance.SetBitAt(22, true);
            instance.SetBitAt(23, true);

            IBitCharger actual = instance.Clone() as IBitCharger;

            Assert.That(actual, Is.Not.Null);
            Assert.That(actual.Capacity, Is.EqualTo(instance.Capacity));
            Assert.That(actual.Length, Is.EqualTo(instance.Length));
            Assert.That(actual.Bytes, Is.EqualTo(instance.Bytes));
            Assert.That(actual.Content, Is.EqualTo(instance.Content));
        }
        public void GetBytes_SourceInt32OffsetZeroBE_ResultAsExpected()
        {
            IBitCharger instance = this.CreateInstance();

            this.byteOrder.SetupGet(x => x.IsLittleEndian).Returns(false);

            Int32 expected = 47110815; // BE: 0x02CEDA9F => 00000010 11001110 11011010 10011111

            // BE: 0x9F => 10011111
            instance.SetBitAt(0, true);
            instance.SetBitAt(1, true);
            instance.SetBitAt(2, true);
            instance.SetBitAt(3, true);
            instance.SetBitAt(4, true);
            instance.SetBitAt(5, false);
            instance.SetBitAt(6, false);
            instance.SetBitAt(7, true);

            // BE: 0xDA => 11011010
            instance.SetBitAt(8, false);
            instance.SetBitAt(9, true);
            instance.SetBitAt(10, false);
            instance.SetBitAt(11, true);
            instance.SetBitAt(12, true);
            instance.SetBitAt(13, false);
            instance.SetBitAt(14, true);
            instance.SetBitAt(15, true);

            // BE: 0xCE => 11001110
            instance.SetBitAt(16, false);
            instance.SetBitAt(17, true);
            instance.SetBitAt(18, true);
            instance.SetBitAt(19, true);
            instance.SetBitAt(20, false);
            instance.SetBitAt(21, false);
            instance.SetBitAt(22, true);
            instance.SetBitAt(23, true);

            // BE: 0x02 => 00000010
            instance.SetBitAt(24, false);
            instance.SetBitAt(25, true);
            instance.SetBitAt(26, false);
            instance.SetBitAt(27, false);
            instance.SetBitAt(28, false);
            instance.SetBitAt(29, false);
            instance.SetBitAt(30, false);
            instance.SetBitAt(31, false);

            Byte[] result = instance.GetBytes(0, sizeof(Int32));

            Int32 actual = BitConverter.ToInt32(result, 0);

            Assert.That(actual, Is.EqualTo(expected));
        }
        public void SetBitAt_IndexIsLessThanZero_ThrowsArgumentOutOfRangeException()
        {
            IBitCharger instance = this.CreateInstance();

            Assert.That(() => instance.SetBitAt(-1, false), Throws.InstanceOf <ArgumentOutOfRangeException>());
        }