public void EmptyElementDataChangedNotification()
        {
            ElementList <AvailableElementData> elementList = null;
            RTPISDataStoreEventArgs            eventArgs   = new RTPISDataStoreEventArgs("DummyMission", null);

            this._rtpisDataStore.Raise(m => m.Changed -= null, eventArgs);
            this._train2groundClientMock.Verify(foo => foo.GetAvailableElementDataListByMissionCode(It.IsAny <string>(), out elementList), Times.Once());
        }
        public void MissionChangedNotificationMultipleElements()
        {
            int numberOfElements = 10;
            ElementList <AvailableElementData> elementList = new ElementList <AvailableElementData>();

            System.Collections.Generic.List <TrainServerSimulator.RealTimeTrainService> trainList = new System.Collections.Generic.List <TrainServerSimulator.RealTimeTrainService>();
            trainList.Capacity = numberOfElements;
            System.Collections.Generic.List <ServiceInfo> serviceInfoList = new System.Collections.Generic.List <ServiceInfo>();

            try
            {
                string missionCode = "Mission1";

                for (int i = 0; i < numberOfElements; i++)
                {
                    elementList.Add(new AvailableElementData()
                    {
                        ElementNumber           = "Train" + i,
                        MissionCommercialNumber = "Mission" + i,
                        MissionOperatorCode     = "Mission" + i + "Seg" + i,
                        MissionState            = MissionStateEnum.MI,
                        OnlineStatus            = true,
                        PisBasicPackageVersion  = "1.0.0.0",
                        LmtPackageVersion       = "1.0.0.0",
                        PisBaselineData         = new PisBaseline()
                        {
                            FutureVersionPisInfotainmentOut = "1.0.0.0",
                            FutureVersionLmtOut             = "1.0.0.0",
                            FutureActivationDateOut         = "1.0.0.0",
                            FutureExpirationDateOut         = "1.0.0.0",
                            FutureValidOut                    = "1.0.0.0",
                            FutureVersionOut                  = "1.0.0.0",
                            FutureVersionPisBaseOut           = "1.0.0.0",
                            FutureVersionPisMissionOut        = "1.0.0.0",
                            CurrentVersionLmtOut              = "1.0.0.0",
                            CurrentExpirationDateOut          = "1.0.0.0",
                            CurrentVersionPisMissionOut       = "1.0.0.0",
                            CurrentVersionPisInfotainmentOut  = "1.0.0.0",
                            CurrentVersionOut                 = "1.0.0.0",
                            CurrentVersionPisBaseOut          = "1.0.0.0",
                            CurrentForcedOut                  = "1.0.0.0",
                            CurrentValidOut                   = "1.0.0.0",
                            ArchivedValidOut                  = "1.0.0.0",
                            ArchivedVersionOut                = "1.0.0.0",
                            ArchivedVersionPisBaseOut         = "1.0.0.0",
                            ArchivedVersionPisMissionOut      = "1.0.0.0",
                            ArchivedVersionPisInfotainmentOut = "1.0.0.0",
                            ArchivedVersionLmtOut             = "1.0.0.0"
                        }
                    });

                    string      systemId    = "Train" + i;
                    ServiceInfo serviceInfo = new ServiceInfo(
                        (ushort)eServiceID.eSrvSIF_RealTimeServer,
                        "RealTimeServer",
                        (ushort)i,
                        (ushort)i,
                        true,
                        "localhost",
                        "1908",
                        "1908",
                        (ushort)(65000 + i));

                    serviceInfoList.Add(serviceInfo);

                    TrainServerSimulator.RealTimeTrainService train = new TrainServerSimulator.RealTimeTrainService(serviceInfo.ServiceIPAddress, serviceInfo.ServicePortNumber);
                    trainList.Add(train);
                    train.ExpectedMissionCode = missionCode;
                    train.Start();

                    this._train2groundClientMock.Setup(foo => foo.GetAvailableServiceData(systemId, (int)eServiceID.eSrvSIF_RealTimeServer, out serviceInfo));
                }

                RTPISDataStoreEventArgs eventArgs = new RTPISDataStoreEventArgs(missionCode, null);
                RealTimeInformationType newRealTimeInformationType = new RealTimeInformationType();

                this._rtpisDataStore.Setup(foo => foo.GetMissionRealTimeInformation(missionCode)).Returns(newRealTimeInformationType);
                this._train2groundClientMock.Setup(foo => foo.GetAvailableElementDataListByMissionCode(missionCode, out elementList));

                try
                {
                    this._rtpisDataStore.Raise(m => m.Changed -= null, eventArgs);
                }
                finally
                {
                    for (int i = 0; i < numberOfElements && i < trainList.Count; i++)
                    {
                        trainList[i].Stop();
                    }
                }

                this._train2groundClientMock.Verify(foo => foo.GetAvailableElementDataListByMissionCode(missionCode, out elementList), Times.Once());

                for (int i = 0; i < numberOfElements; i++)
                {
                    ServiceInfo serviceInfo = serviceInfoList[i];
                    Assert.IsNotNull(trainList[i].LastMissionRealTimeRequest, "RealTime mission information not updated on train {0}.", i);
                    this._train2groundClientMock.Verify(foo => foo.GetAvailableServiceData("Train" + i, (int)eServiceID.eSrvSIF_RealTimeServer, out serviceInfo), Times.Once());
                }
            }
            finally
            {
                foreach (var train in trainList)
                {
                    train.Dispose();
                }
            }
        }