Beispiel #1
0
        public void ShouldNotPermitTrafficLightsToParticipateInMultipleTetheredClusters()
        {
            var lights = new TrafficLights();

            var l1 = new TrafficLight();
            var l2 = new TrafficLight();
            var l3 = new TrafficLight();
            var l4 = new TrafficLight();
            var l5 = new TrafficLight();

            var t1 = new TetheredTrafficLightCluster {l1, l2}; //l1 assigned to Tethered Cluster
            var t2 = new TetheredTrafficLightCluster {l3, l4};
            var t3 = new TetheredTrafficLightCluster {l5, l1}; //l1 already assigned to Tethered Cluster

            Assert.IsTrue(lights.Add(t1));
            Assert.IsTrue(lights.Add(t2));
            Assert.IsFalse(lights.Add(t3));

            Assert.IsNull(lights.GetClusterFor(l5.Id).TetheredLights);

            Assert.AreEqual(4, lights.Count()); //l5 not added due to invalid cluster
            Assert.AreEqual(2, lights.AllTetheredClusters.Count());  

            Assert.AreEqual(lights.GetClusterFor(l5.Id), (null, null));
        }
Beispiel #2
0
        public void ShouldRaiseEventWhenClusterRequiresUpdating()
        {
            var configuration = new TrafficLightConfig();

            configuration.Add(TrafficLightState.Go, 3);

            var light = new TrafficLight
            {
                Name          = "State Expired Test Light",
                Configuration = configuration
            };

            var cluster = new TetheredTrafficLightCluster {
                light
            };

            var receivedEvents = new List <TetheredClusterRequiresUpdateEventArg>();

            cluster.ClusterRequiresUpdateEvent += (sender, e)
                                                  => receivedEvents.Add(e);

            light.State = TrafficLightState.Go;
            Thread.Sleep(4000);

            Assert.AreEqual(1, receivedEvents.Count);
        }
Beispiel #3
0
        public void ShouldTreatDistinctClustersTypesAsNotEqual()
        {
            var cluster1 = new TetheredTrafficLightCluster();
            var cluster2 = new PolarTrafficLightCluster(new TrafficLight());

            Assert.AreNotEqual(cluster1, cluster2);
        }
Beispiel #4
0
        public void ShouldTreatEmptyTetheredClustersAsEqual()
        {
            var cluster1 = new TetheredTrafficLightCluster();
            var cluster2 = new TetheredTrafficLightCluster();

            Assert.AreEqual(cluster1, cluster2);
        }
Beispiel #5
0
        public void ShouldStartTrafficLightCycle()
        {
            var configuration = new TrafficLightConfig();

            configuration.Add(TrafficLightState.Go, 4);
            configuration.Add(TrafficLightState.Stop, 4);
            SetTrafficLightConfiguration(configuration);

            var lights = new TrafficLights {
                _l1, _l2, _l3, _l4
            };
            var timer = new TrafficLightTimer();

            var tc1 = new TetheredTrafficLightCluster {
                _l1, _l2
            };

            tc1.Name = "TC-1";

            var pc1 = new PolarTrafficLightCluster(_l3)
            {
                { _l4 }
            };

            pc1.Name = "TC-2";

            Assert.IsTrue(lights.Add(tc1));
            Assert.IsTrue(lights.Add(pc1));

            var controller = new TrafficLightController(lights, timer);

            //Assert initial state is where expected
            Assert.AreEqual(TrafficLightState.StopThenGo, _l1.State);
            Assert.AreEqual(TrafficLightState.StopThenGo, _l2.State);
            Assert.AreEqual(TrafficLightState.StopThenGo, _l3.State);
            Assert.AreEqual(TrafficLightState.StopThenGo, _l4.State);

            controller.Start();  //Will trigger traffic light state changes

            Thread.Sleep(2000);
            Assert.AreEqual(TrafficLightState.Go, _l1.State);
            Assert.AreEqual(TrafficLightState.Go, _l2.State);
            Assert.AreEqual(TrafficLightState.Go, _l3.State);
            Assert.AreEqual(TrafficLightState.Stop, _l4.State);

            Thread.Sleep(5000);
            Assert.AreEqual(TrafficLightState.Stop, _l1.State);
            Assert.AreEqual(TrafficLightState.Stop, _l2.State);
            Assert.AreEqual(TrafficLightState.Stop, _l3.State);
            Assert.AreEqual(TrafficLightState.Go, _l4.State);

            controller.Stop();
        }
Beispiel #6
0
        public void ShouldNotPermitPolarSubjectsToBelongToTethers()
        {
            var lights = new TrafficLights();

            var l1 = new TrafficLight { Name = "TL-1" };
            var l2 = new TrafficLight { Name = "TL-2" };
            var l3 = new TrafficLight { Name = "TL-3" };
            var l4 = new TrafficLight { Name = "TL-4" };

            var t1 = new PolarTrafficLightCluster(l1) { l2, l3, }; 
            var t2 = new TetheredTrafficLightCluster { l1, l4 };  
            Assert.IsTrue(lights.Add(t1));
            Assert.IsFalse(lights.Add(t2));
        }
Beispiel #7
0
        public void ShouldConsiderTethersWithOverlappingMembersAsInCompatible()
        {
            var t1 = new TrafficLight();
            var t2 = new TrafficLight();
            var t3 = new TrafficLight();

            var polarCluster = new PolarTrafficLightCluster(t1)
            {
                t2, t3
            };
            var tetheredCluster = new TetheredTrafficLightCluster {
                t2, t3
            };

            Assert.IsFalse(polarCluster.IsCompatible(tetheredCluster));
        }
Beispiel #8
0
        public void ShouldUpdateClusterStateWhenRequested()
        {
            var t1 = new TrafficLight();
            var t2 = new TrafficLight();

            var cluster = new TetheredTrafficLightCluster {
                t1, t2
            };

            Assert.AreEqual(TrafficLightState.StopThenGo, t1.State);
            Assert.AreEqual(TrafficLightState.StopThenGo, t2.State);

            cluster.SetMasterStateTo(TrafficLightState.Go);
            Assert.AreEqual(TrafficLightState.Go, t1.State);
            Assert.AreEqual(TrafficLightState.Go, t2.State);
        }
Beispiel #9
0
        public void ShouldTreatTetheredClustersWithIdenticalSetsAsEqual()
        {
            var t1 = new TrafficLight();
            var t2 = new TrafficLight();

            var cluster1 = new TetheredTrafficLightCluster {
                t1, t2
            };
            var cluster2 = new TetheredTrafficLightCluster {
                t1, t2
            };

            Assert.AreEqual(cluster1, cluster2);

            cluster2.Add(new TrafficLight());
            Assert.AreNotEqual(cluster1, cluster2);
        }
Beispiel #10
0
        public void ShouldPermitTrafficLightToBelongToTetherAndPolarClusters()
        {
            var lights = new TrafficLights();

            var l1 = new TrafficLight { Name = "TL-1" };
            var l2 = new TrafficLight { Name = "TL-2" };
            var l3 = new TrafficLight { Name = "TL-3" };
            var l4 = new TrafficLight { Name = "TL-4" };

            var t1 = new TetheredTrafficLightCluster {{l1, l2}};      //l1 belongs to 
            var t2 = new PolarTrafficLightCluster(l1) { l3, l4 };   //  both clusters.

            Assert.IsTrue(lights.Add(t1));
            Assert.IsTrue(lights.Add(t2));

            Assert.AreEqual(4, lights.Count()); //All unique traffic lights added
            Assert.AreEqual(1, lights.AllTetheredClusters.Count());
            Assert.AreEqual(1, lights.AllPolarClusters.Count());
        }
Beispiel #11
0
        public void ShouldConsiderTethersCompatibleWhenThereAreNoCommonMembers()
        {
            var t1 = new TrafficLight();
            var t2 = new TrafficLight();
            var t3 = new TrafficLight();
            var t4 = new TrafficLight();

            var polarCluster = new PolarTrafficLightCluster(t1)
            {
                t2, t3
            };
            var tetheredCluster = new TetheredTrafficLightCluster {
                t4
            };

            Assert.IsTrue(polarCluster.IsCompatible(tetheredCluster));

            tetheredCluster.Add(t2);
            Assert.IsFalse(polarCluster.IsCompatible(tetheredCluster));
        }
Beispiel #12
0
        public void ShouldNotPermitConflictingTetheredAndPolarClusters()
        {
            var lights = new TrafficLights();

            var l1 = new TrafficLight();
            var l2 = new TrafficLight();
            var l3 = new TrafficLight();
            var l4 = new TrafficLight();
            var l5 = new TrafficLight();
            var l6 = new TrafficLight();

            var t1 = new TetheredTrafficLightCluster { l2, l3 };  // I2 is Tethered to I3, but 
            var t2 = new PolarTrafficLightCluster(l3) { l1, l2, };    // also defined as a l3 Polar -- illogical
            Assert.IsTrue(lights.Add(t1));
            Assert.IsFalse(lights.Add(t2));

            var t3 = new TetheredTrafficLightCluster { l3, l4, l5 };    // Overlapping Traffic Lights,
            var t4 = new PolarTrafficLightCluster(l6) { l4, l5, };          //  this is not allowed.

            Assert.IsTrue(lights.Add(t4));  //Polar cluster first
            Assert.IsFalse(lights.Add(t3)); //  to ensure validation works regardless of order
        }
Beispiel #13
0
        public void ShouldSynchronizedAllTetheredLights()
        {
            var lights = new TrafficLights {
                _l1, _l2, _l3, _l3
            };
            var timer = new TrafficLightTimer();

            var tc1 = new TetheredTrafficLightCluster {
                _l1, _l2
            };

            tc1.Name = "TC-1";

            var tc2 = new TetheredTrafficLightCluster {
                _l3, _l4
            };

            tc2.Name = "TC-2";

            lights.Add(tc1, tc2);

            var controller = new TrafficLightController(lights, timer);

            //Assert initial state is where expected
            Assert.AreEqual(TrafficLightState.StopThenGo, _l1.State);
            Assert.AreEqual(TrafficLightState.StopThenGo, _l2.State);
            Assert.AreEqual(TrafficLightState.StopThenGo, _l3.State);
            Assert.AreEqual(TrafficLightState.StopThenGo, _l4.State);

            controller.Start();  //Will trigger traffic light state changes
            Thread.Sleep(2500);

            Assert.AreEqual(TrafficLightState.Go, _l1.State);
            Assert.AreEqual(TrafficLightState.Go, _l2.State);
            Assert.AreEqual(TrafficLightState.Go, _l3.State);
            Assert.AreEqual(TrafficLightState.Go, _l4.State);

            controller.Stop();
        }