public void FindSender_GivenThereIsNoSender_ReturnsNull()
        {
            // Act
            var sender = capacityZeroPipe.FindSender(capacityZeroPipe.Outlet);

            // Assert
            sender.Should().BeNull();
        }
        public void FindSender_GivenThePipeIsHoldingAMessage_ReturnsThatMessage()
        {
            // Arrange
            const int message = 14;

            capacityThreePipe.Inlet.Send(message);

            // Act
            var sender = capacityThreePipe.FindSender(capacityThreePipe.Outlet);

            // Assert
            sender.Should().NotBeNull();
            sender().Should().Be(message);
        }
        public void FindSender_AppliedToConnectedCapacityPipes_ReturnsTheMessagesFromAllConnectedPipesInTheRightOrder()
        {
            // Arrange
            capacityThreePipe.Outlet.ConnectTo(capacityTwoPipe.Inlet);

            const int expectedFirstMessage  = 1;
            const int expectedSecondMessage = 2;
            const int expectedThirdMessage  = 3;
            const int expectedFourthMessage = 4;
            const int expectedFifthMessage  = 5;
            const int expectedSixthMessage  = 6;

            capacityThreePipe.FindReceiver(capacityThreePipe.Inlet)(expectedFirstMessage);
            capacityThreePipe.FindReceiver(capacityThreePipe.Inlet)(expectedSecondMessage);
            capacityThreePipe.FindReceiver(capacityThreePipe.Inlet)(expectedThirdMessage);
            capacityThreePipe.FindReceiver(capacityThreePipe.Inlet)(expectedFourthMessage);
            capacityThreePipe.FindReceiver(capacityThreePipe.Inlet)(expectedFifthMessage);

            var thread = new Thread(() => capacityThreePipe.Inlet.Send(expectedSixthMessage));

            thread.Start();
            Thread.Sleep(500);

            // Act
            var actualFirstMessage  = capacityTwoPipe.FindSender(capacityTwoPipe.Outlet)();
            var actualSecondMessage = capacityTwoPipe.FindSender(capacityTwoPipe.Outlet)();
            var actualThirdMessage  = capacityTwoPipe.FindSender(capacityTwoPipe.Outlet)();
            var actualFourthMessage = capacityTwoPipe.FindSender(capacityTwoPipe.Outlet)();
            var actualFifthMessage  = capacityTwoPipe.FindSender(capacityTwoPipe.Outlet)();
            var actualSixthMessage  = capacityTwoPipe.FindSender(capacityTwoPipe.Outlet)();

            // Assert
            actualFirstMessage.Should().Be(expectedFirstMessage);
            actualSecondMessage.Should().Be(expectedSecondMessage);
            actualThirdMessage.Should().Be(expectedThirdMessage);
            actualFourthMessage.Should().Be(expectedFourthMessage);
            actualFifthMessage.Should().Be(expectedFifthMessage);
            actualSixthMessage.Should().Be(expectedSixthMessage);
        }