public void When_adding_a_device_in_role_start_timer_it_must_be_stored()
        {
            // Arrange
            NetworkComposition composition = new NetworkCompositionBuilder().Build();

            // Act
            composition = composition.ChangeRolesFor(DeviceAddress, DeviceCapabilities.StartSensor,
                DeviceRoles.StartTimer);

            // Assert
            composition.IsInRoleStartTimer(DeviceAddress).Should().BeTrue();
        }
        public void When_setting_a_negative_delay_it_must_fail()
        {
            // Arrange
            TimeSpan negativeTime = -1.Minutes();
            NetworkComposition composition = new NetworkCompositionBuilder().Build();
            CompetitionClassRequirements requirements = composition.Requirements;

            // Act
            Action action = () => requirements.ChangeStartFinishMinDelayForSingleSensor(negativeTime);

            // Assert
            action.ShouldThrow<ArgumentOutOfRangeException>();
        }
        public void When_no_delay_is_specified_and_start_and_finish_is_same_sensor_it_must_fail()
        {
            // Arrange
            NetworkComposition composition = new NetworkCompositionBuilder()
                .WithoutStartFinishMinDelayForSingleSensor()
                .WithDeviceInRoles(DeviceAddress, DeviceCapabilities.TimeSensor,
                    DeviceRoles.StartTimer | DeviceRoles.FinishTimer)
                .Build();

            // Act
            IList<NetworkComplianceMismatch> mismatches = composition.AssertComplianceWithRequirements();

            // Assert
            mismatches.Should().HaveCount(1);
            mismatches[0].Name.Should().Be("MissingDelayForStartFinishTimer");
        }
        public void When_delay_is_specified_and_start_and_finish_is_same_sensor_it_must_succeed()
        {
            // Arrange
            TimeSpan minDelay = 1.Minutes();
            NetworkComposition composition = new NetworkCompositionBuilder()
                .WithStartFinishMinDelayForSingleSensor(minDelay)
                .Build();

            // Act
            composition = composition.ChangeRolesFor(DeviceAddress, DeviceCapabilities.TimeSensor,
                DeviceRoles.StartTimer | DeviceRoles.FinishTimer);

            // Assert
            composition.IsInRoleStartTimer(DeviceAddress).Should().BeTrue();
            composition.IsInRoleFinishTimer(DeviceAddress).Should().BeTrue();
            composition.Requirements.StartFinishMinDelayForSingleSensor.Should().Be(minDelay);
            composition.IsStartFinishGate(DeviceAddress).Should().BeTrue();
        }
        public void When_adding_devices_in_role_intermediate_timer_they_must_be_stored()
        {
            // Arrange
            var timer1 = new WirelessNetworkAddress("AAAAAA");
            var timer2 = new WirelessNetworkAddress("BBBBBB");
            var timer3 = new WirelessNetworkAddress("CCCCCC");
            NetworkComposition composition = new NetworkCompositionBuilder().Build();

            // Act
            composition = composition.ChangeRolesFor(timer1, DeviceCapabilities.IntermediateSensor,
                DeviceRoles.IntermediateTimer1);
            composition = composition.ChangeRolesFor(timer2, DeviceCapabilities.IntermediateSensor,
                DeviceRoles.IntermediateTimer2);
            composition = composition.ChangeRolesFor(timer3, DeviceCapabilities.IntermediateSensor,
                DeviceRoles.IntermediateTimer3);

            // Assert
            composition.IsInRoleIntermediateTimer1(timer1).Should().BeTrue();
            composition.IsInRoleIntermediateTimer2(timer2).Should().BeTrue();
            composition.IsInRoleIntermediateTimer3(timer3).Should().BeTrue();
        }
        public void When_adding_a_device_with_an_empty_role_it_must_not_be_in_any_known_roles()
        {
            // Arrange
            const DeviceRoles emptyRole = DeviceRoles.None;
            NetworkComposition composition = new NetworkCompositionBuilder().Build();

            // Act
            composition = composition.ChangeRolesFor(DeviceAddress, DeviceCapabilities.FinishSensor, emptyRole);

            // Assert
            composition.IsInRoleStartTimer(DeviceAddress).Should().BeFalse();
            composition.IsInRoleIntermediateTimer1(DeviceAddress).Should().BeFalse();
            composition.IsInRoleIntermediateTimer2(DeviceAddress).Should().BeFalse();
            composition.IsInRoleIntermediateTimer3(DeviceAddress).Should().BeFalse();
            composition.IsInRoleFinishTimer(DeviceAddress).Should().BeFalse();
            composition.IsStartFinishGate(DeviceAddress).Should().BeFalse();
        }
        public void When_adding_an_empty_device_it_must_fail()
        {
            // Arrange
            const WirelessNetworkAddress missingDevice = null;
            NetworkComposition composition = new NetworkCompositionBuilder().Build();

            // Act
            // ReSharper disable once AssignNullToNotNullAttribute
            // Reason: The goal of this test is to cause failure when no device is specified.
            Action action = () => composition = composition.ChangeRolesFor(missingDevice,
                DeviceCapabilities.FinishSensor, DeviceRoles.FinishTimer);

            // Assert
            action.ShouldThrow<ArgumentNullException>();
        }
        public void When_adding_a_device_in_role_display_it_must_be_stored()
        {
            // Arrange
            NetworkComposition composition = new NetworkCompositionBuilder().Build();

            // Act
            composition = composition.ChangeRolesFor(DeviceAddress, DeviceCapabilities.Display,
                DeviceRoles.Display);

            // Assert
            composition.IsInRoleDisplay(DeviceAddress).Should().BeTrue();
        }