public void Register_ThenAllocHGlobalForBuffer()
        {
            // ARRANGE
            var mockedBroadcastDeviceInterfaceFactory = new Mock<IBroadcastDeviceInterfaceFactory>();
            var mockedMarshallWrapper = new Mock<IMarshalWrapper>();
            var mockedUnsafeNativeMethodsWrapper = new Mock<IUnsafeNativeMethodsWrapper>();
            var mockedProcessHandleResultFactory = new Mock<IProcessHandleResultFactory>();
            var deviceManagement = new DeviceNotifications(
                mockedBroadcastDeviceInterfaceFactory.Object,
                mockedMarshallWrapper.Object,
                mockedUnsafeNativeMethodsWrapper.Object,
                mockedProcessHandleResultFactory.Object);
            var handleReceivesNotifications = new IntPtr(42);
            var devBroadcastDeviceInterface = new BroadcastDeviceInterface();

            mockedBroadcastDeviceInterfaceFactory.Setup(x => x.CreateBroadcastDeviceInterface()).Returns(devBroadcastDeviceInterface);

            // ACT
            deviceManagement.Register(handleReceivesNotifications);

            // ASSERT
            mockedMarshallWrapper.Verify(x => x.AllocHGlobal(devBroadcastDeviceInterface.Size), Times.Once);
        }
        public void Unregister_ThenUnsafeNativeMethodUnregisterDeviceNotificationsIsCalled()
        {
            // ARRANGE
            var mockedBroadcastDeviceInterfaceFactory = new Mock<IBroadcastDeviceInterfaceFactory>();
            var mockedMarshallWrapper = new Mock<IMarshalWrapper>();
            var mockedUnsafeNativeMethodsWrapper = new Mock<IUnsafeNativeMethodsWrapper>();
            var mockedProcessHandleResultFactory = new Mock<IProcessHandleResultFactory>();
            var deviceManagement = new DeviceNotifications(
                mockedBroadcastDeviceInterfaceFactory.Object,
                mockedMarshallWrapper.Object,
                mockedUnsafeNativeMethodsWrapper.Object,
                mockedProcessHandleResultFactory.Object);
            var unregisterHandle = new IntPtr(42);

            // ACT
            deviceManagement.UnRegister(unregisterHandle);

            // ASSERT
            mockedUnsafeNativeMethodsWrapper.Verify(x => x.UnRegisterDeviceNotification(unregisterHandle), Times.Once);
        }
        public void Register_WhenStructureToPointerThrowsException_ThenFreeGlobalIsCalled()
        {
            // ARRANGE
            var mockedBroadcastDeviceInterfaceFactory = new Mock<IBroadcastDeviceInterfaceFactory>();
            var mockedMarshallWrapper = new Mock<IMarshalWrapper>();
            var mockedUnsafeNativeMethodsWrapper = new Mock<IUnsafeNativeMethodsWrapper>();
            var mockedProcessHandleResultFactory = new Mock<IProcessHandleResultFactory>();
            var deviceManagement = new DeviceNotifications(
                mockedBroadcastDeviceInterfaceFactory.Object,
                mockedMarshallWrapper.Object,
                mockedUnsafeNativeMethodsWrapper.Object,
                mockedProcessHandleResultFactory.Object);
            var handleReceivesNotifications = new IntPtr(42);
            var devBroadcastDeviceInterface = new BroadcastDeviceInterface();
            var intPtrForBuffer = new IntPtr(111);

            mockedBroadcastDeviceInterfaceFactory.Setup(x => x.CreateBroadcastDeviceInterface()).Returns(devBroadcastDeviceInterface);
            mockedMarshallWrapper.Setup(x => x.AllocHGlobal(devBroadcastDeviceInterface.Size)).Returns(intPtrForBuffer);
            mockedMarshallWrapper.Setup(x => x.StructureToPointer(devBroadcastDeviceInterface, intPtrForBuffer, false)).Throws<InvalidOperationException>();

            // ACT
            var testDelegate = new Assert.ThrowsDelegate(() => deviceManagement.Register(handleReceivesNotifications));

            // ASSERT
            Assert.Throws<InvalidOperationException>(testDelegate);
            mockedMarshallWrapper.Verify(x => x.FreeHGlobal(intPtrForBuffer), Times.Once);
        }