public void CaptureReader_Selects_The_Correct_IStateController_During_Reads()
        {
            var immlStateController = new Mock<IStateController>();
            var immlStateControllerId = (short)100;
            var immlStateControllerGuid = Guid.NewGuid();
            immlStateController.Setup(g => g.Guid).Returns(immlStateControllerGuid);

            var boneNodeStateController = new Mock<IStateController>();
            var boneNodeStateControllerId = (short)123;
            var boneNodeStateControllerGuid = Guid.NewGuid();
            boneNodeStateController.Setup(g => g.Guid).Returns(boneNodeStateControllerGuid);

            //build 2 different state mappings
            var ms = new ConcurrentStream(new MemoryStream());

            //header
            var header = _CreateContinuumHeader(1000, 10000);
            ms.Write(header, 0, header.Length);

            //sat
            ms.Write(BitConverter.GetBytes(2), 0, 4); //count

            //mapping for imml
            ms.Write(BitConverter.GetBytes(immlStateControllerId), 0, 2);
            ms.Write(immlStateControllerGuid.ToByteArray(), 0, 16);

            //mapping for bones
            ms.Write(BitConverter.GetBytes(boneNodeStateControllerId), 0, 2);
            ms.Write(boneNodeStateControllerGuid.ToByteArray(), 0, 16);

            //generate 2 dummy states, one for each controller
            var firstRandomBytes = new byte[1024];
            new Random().NextBytes(firstRandomBytes);

            ms.Write(BitConverter.GetBytes(immlStateControllerId), 0, 2);
            ms.Write(BitConverter.GetBytes(DateTime.UtcNow.ToBinary()), 0, 8);
            ms.Write(BitConverter.GetBytes((int)firstRandomBytes.Length), 0, 4);
            ms.Write(firstRandomBytes, 0, firstRandomBytes.Length);

            var secondRandomBytes = new byte[2048];
            new Random().NextBytes(secondRandomBytes);

            ms.Write(BitConverter.GetBytes(boneNodeStateControllerId), 0, 2);
            ms.Write(BitConverter.GetBytes(DateTime.UtcNow.ToBinary()), 0, 8);
            ms.Write(BitConverter.GetBytes((int)secondRandomBytes.Length), 0, 4);
            ms.Write(secondRandomBytes, 0, secondRandomBytes.Length);

            ms.Position = 0;

            //perform the reads and verify
            var stateResolver = new StateResolver();
            stateResolver.Add(immlStateController.Object);
            stateResolver.Add(boneNodeStateController.Object);

            var captureReader = new CaptureReader(ms, stateResolver);
            captureReader.Read();
            captureReader.Read();

            boneNodeStateController.Verify(c => c.Create(It.IsAny<byte[]>(), It.IsAny<DateTime>(), It.IsAny<double>()), Times.Once());
            immlStateController.Verify(c => c.Create(It.IsAny<byte[]>(), It.IsAny<DateTime>(), It.IsAny<double>()), Times.Once());
        }
        public void State_Allocation_Table_Is_Correctly_Populated()
        {
            var expectedId = (short)123;
            var expectedGuid = Guid.NewGuid();

            var ms = new ConcurrentStream(new MemoryStream());
            var idBytes = BitConverter.GetBytes(expectedId);
            var guidBytes = expectedGuid.ToByteArray();

            //write the header
            var header = _CreateContinuumHeader(1000, 10000);
            ms.Write(header.ToArray(), 0, header.Length);

            //write the SAT
            ms.Write(BitConverter.GetBytes(1), 0, 4);
            ms.Write(idBytes, 0, idBytes.Length);
            ms.Write(guidBytes, 0, guidBytes.Length);

            //rewind the stream
            ms.Position = 0;

            var stateController = new Mock<IStateController>();
            var stateResolver = new Mock<IStateResolver>();

            stateResolver.Setup(s => s.Find(It.IsAny<Guid>())).Returns(stateController.Object);

            var captureReader = new CaptureReader(ms, stateResolver.Object);

            Assert.NotEmpty(captureReader.StateAllocationTable);
            Assert.Equal(expectedId, captureReader.StateAllocationTable.First().Key);
            Assert.Equal(expectedGuid, captureReader.StateAllocationTable.First().Value);
            Assert.Equal(1, captureReader.StateAllocationTable.Count);
        }
        public void CaptureReader_Loads_A_Valid_Continuum_Stream()
        {
            var satCount = 5;
            var header = _CreateContinuumHeader(1000, 10000);
            var sat = _CreateSAT(satCount);

            var baseStream = new ConcurrentStream(new MemoryStream());
            baseStream.Write(header.ToArray(), 0, header.Length);
            baseStream.Write(sat, 0, sat.Length);
            baseStream.Position = 0;

            var stateController = new Mock<IStateController>();
            var stateResolver = new Mock<IStateResolver>();

            stateResolver.Setup(s => s.Find(It.IsAny<Guid>())).Returns(stateController.Object);

            var captureReader = new CaptureReader(baseStream, stateResolver.Object);

            Assert.Equal(satCount, captureReader.StateAllocationTable.Count);
        }