Пример #1
0
 public static void DetectSeparator()
 {
     using (var file = new TestFile(";"))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.Single(tr.Strings);
         Assert.Equal(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile(","))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.Single(tr.Strings);
         Assert.Equal(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile("\t"))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.Single(tr.Strings);
         Assert.Equal(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile(":"))
     {
         Assert.Throws <InvalidDataException>(() => {
             var tr = new TimetableReader(file.FileName);
         });
     }
 }
Пример #2
0
 public void DetectSeparatorTest()
 {
     using (var file = new TestFile(";"))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.AreEqual(1, tr.Strings.Count);
         Assert.AreEqual(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile(","))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.AreEqual(1, tr.Strings.Count);
         Assert.AreEqual(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile("\t"))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.AreEqual(1, tr.Strings.Count);
         Assert.AreEqual(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile(":"))
     {
         Assert.ThrowsException <InvalidDataException>(() => {
             var tr = new TimetableReader(file.FileName);
         });
     }
 }
Пример #3
0
        //================================================================================================//
        /// <summary>
        /// Read pool files
        /// </summary>
        /// <param name="arguments"></param>
        /// <param name="cancellation"></param>
        /// <returns></returns>
        public Dictionary <string, TimetableTurntablePool> ProcessTurntables(string fileName, CancellationToken cancellationToken)
        {
            Dictionary <string, TimetableTurntablePool> turntables = new Dictionary <string, TimetableTurntablePool>();
            List <string> filenames;

            // get filenames to process
            filenames = GetTurntableFilenames(fileName);

            // get file contents as strings
            Trace.Write("\n");
            foreach (string filePath in filenames)
            {
                // get contents as strings
                Trace.Write("Turntable File : " + filePath + "\n");
                var turntableInfo = new TimetableReader(filePath);

                // read lines from input until 'Name' definition is found
                int lineindex = 1;
                while (lineindex < turntableInfo.Strings.Count)
                {
                    switch (turntableInfo.Strings[lineindex][0].ToLower().Trim())
                    {
                    // skip comment
                    case "#comment":
                        lineindex++;
                        break;

                    // process name
                    // do not increase lineindex as that is done in called method
                    case "#name":
                        TimetableTurntablePool newTurntable = new TimetableTurntablePool(turntableInfo, ref lineindex, simulator);
                        // store if valid pool
                        if (!String.IsNullOrEmpty(newTurntable.PoolName))
                        {
                            if (turntables.ContainsKey(newTurntable.PoolName))
                            {
                                Trace.TraceWarning("Duplicate turntable defined : " + newTurntable.PoolName);
                            }
                            else
                            {
                                turntables.Add(newTurntable.PoolName, newTurntable);
                            }
                        }
                        break;

                    default:
                        if (!String.IsNullOrEmpty(turntableInfo.Strings[lineindex][0]))
                        {
                            Trace.TraceInformation("Invalid definition in file " + filePath + " at line " + lineindex + " : " +
                                                   turntableInfo.Strings[lineindex][0].ToLower().Trim() + "\n");
                        }
                        lineindex++;
                        break;
                    }
                }
            }

            return(turntables);
        }
Пример #4
0
        /// <summary>
        /// Try to load the file.
        /// Possibly this might raise an exception. That exception is not caught here
        /// </summary>
        /// <param name="file">The file that needs to be loaded</param>
        public override void TryLoading(string file)
        {
            String extension = Path.GetExtension(file).ToLowerInvariant();

            if (extension.Contains("table"))
            {
                var timeTableList = new TimetableGroupFile(file);
            }
            else
            {
                var timeTable = new TimetableReader(file);
            }
        }
Пример #5
0
 public void ParseStructureTest()
 {
     using (var file = new TestFile(";b;c;d\n1;2;3\nA;B;C;D;E"))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.AreEqual(3, tr.Strings.Count);
         Assert.AreEqual(4, tr.Strings[0].Length);
         Assert.AreEqual(3, tr.Strings[1].Length);
         Assert.AreEqual(5, tr.Strings[2].Length);
         CollectionAssert.AreEqual(new[] { "", "b", "c", "d" }, tr.Strings[0]);
         CollectionAssert.AreEqual(new[] { "1", "2", "3" }, tr.Strings[1]);
         CollectionAssert.AreEqual(new[] { "A", "B", "C", "D", "E" }, tr.Strings[2]);
     }
 }
Пример #6
0
        /// <summary>
        /// Try to load the file.
        /// Possibly this might raise an exception. That exception is not caught here
        /// </summary>
        /// <param name="file">The file that needs to be loaded</param>
        public override void TryLoading(string file)
        {
#pragma warning disable CA1308 // Normalize strings to uppercase
            string extension = Path.GetExtension(file).ToLowerInvariant();
#pragma warning restore CA1308 // Normalize strings to uppercase
            if (extension.Contains("table"))
            {
                _ = new TimetableGroupFile(file);
            }
            else
            {
                _ = new TimetableReader(file);
            }
        }
Пример #7
0
        public Activity(Content content)
        {
            Debug.Assert(content.Type == ContentType.Activity);
            if (System.IO.Path.GetExtension(content.PathName).Equals(".act", StringComparison.OrdinalIgnoreCase))
            {
                var file = new ActivityFile(content.PathName);
                Name           = file.Tr_Activity.Tr_Activity_Header.Name;
                Description    = file.Tr_Activity.Tr_Activity_Header.Description;
                Briefing       = file.Tr_Activity.Tr_Activity_Header.Briefing;
                PlayerServices = new[] { String.Format("Player|{0}", file.Tr_Activity.Tr_Activity_File.Player_Service_Definition.Name) };
                if (file.Tr_Activity.Tr_Activity_File.Traffic_Definition != null)
                {
                    Services = file.Tr_Activity.Tr_Activity_File.Traffic_Definition.ServiceDefinitionList.Select((service, index) =>
                                                                                                                 String.Format("AI|{0}|{1}|{2}", service.Name, file.Tr_Activity.Tr_Activity_File.Traffic_Definition.Name, index)
                                                                                                                 );
                }
                else
                {
                    Services = new string[0];
                }
            }
            else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase) ||
                     System.IO.Path.GetExtension(content.PathName).Equals(".timetable-or", StringComparison.OrdinalIgnoreCase))
            {
                // TODO: Make common timetable parser.
                var file = new TimetableReader(content.PathName);
                Name = content.Name;

                var services = new List <string>();
                for (var column = 0; column < file.Strings[0].Length; column++)
                {
                    if (String.IsNullOrEmpty(file.Strings[0][column]) || file.Strings[0][column].StartsWith("#"))
                    {
                        continue;
                    }

                    services.Add(file.Strings[0][column]);
                }
                PlayerServices = services;
                Services       = new string[0];
            }
        }
Пример #8
0
        public Activity(Content content)
        {
            Debug.Assert(content.Type == ContentType.Activity);
            if (System.IO.Path.GetExtension(content.PathName).Equals(".act", StringComparison.OrdinalIgnoreCase))
            {
                var file = new ActivityFile(content.PathName);
                Name           = file.Activity.Header.Name;
                Description    = file.Activity.Header.Description;
                Briefing       = file.Activity.Header.Briefing;
                PlayerServices = new[] { $"Player|{file.Activity.PlayerServices.Name}" };
                if (file.Activity.Traffic != null)
                {
                    Services = file.Activity.Traffic.Services.Select((service, index) =>
                                                                     $"AI|{service.Name}|{file.Activity.Traffic.Name}|{index}"
                                                                     );
                }
                else
                {
                    Services = Array.Empty <string>();
                }
            }
            else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase))
            {
                // TODO: Make common timetable parser.
                var file = new TimetableReader(content.PathName);
                Name = content.Name;

                var services = new List <string>();
                for (var column = 0; column < file.Strings[0].Length; column++)
                {
                    if (String.IsNullOrEmpty(file.Strings[0][column]) || file.Strings[0][column].StartsWith("#"))
                    {
                        continue;
                    }

                    services.Add(file.Strings[0][column]);
                }
                PlayerServices = services;
                Services       = Array.Empty <string>();
            }
        }
Пример #9
0
 public static void DetectSeparator()
 {
     using (var file = new TestFile(";"))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.Equal(1, tr.Strings.Count);
         Assert.Equal(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile(","))
     {
         var tr = new TimetableReader(file.FileName);
         Assert.Equal(1, tr.Strings.Count);
         Assert.Equal(2, tr.Strings[0].Length);
     }
     using (var file = new TestFile("\t"))
     {
         Assert.Throws(typeof(InvalidDataException), () => {
             var tr = new TimetableReader(file.FileName);
         });
     }
 }
Пример #10
0
 public void Init()
 {
     source    = File.ReadAllText(@"name.txt");
     timetable = new TimetableReader(source);
 }
Пример #11
0
        public Service(Content content)
        {
            Debug.Assert(content.Type == ContentType.Service);
            if (System.IO.Path.GetExtension(content.PathName).Equals(".srv", StringComparison.OrdinalIgnoreCase))
            {
                var file = new ServiceFile(content.PathName);
                Name    = file.Name;
                Consist = file.Train_Config;
                Path    = file.PathID;

                Debug.Assert(content is ContentMSTSService);
                var msts    = content as ContentMSTSService;
                var actFile = new ActivityFile(content.Parent.PathName);
                if (msts.IsPlayer)
                {
                    var activityTraffic = actFile.Tr_Activity.Tr_Activity_File.Player_Service_Definition.Player_Traffic_Definition;

                    ID        = "0";
                    StartTime = MSTSTimeToDateTime(activityTraffic.Time);
                    Stops     = from stop in activityTraffic.Player_Traffic_List
                                select new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(stop.ArrivalTime), MSTSTimeToDateTime(stop.DepartTime));
                }
                else
                {
                    var trfFile         = new TrafficFile(msts.TrafficPathName);
                    var activityService = actFile.Tr_Activity.Tr_Activity_File.Traffic_Definition.ServiceDefinitionList[msts.TrafficIndex];
                    var trafficService  = trfFile.TrafficDefinition.TrafficItems[msts.TrafficIndex];

                    ID        = activityService.UiD.ToString();
                    StartTime = MSTSTimeToDateTime(activityService.Time);
                    Stops     = trafficService.TrafficDetails.Zip(activityService.ServiceList, (tt, stop) => new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(tt.ArrivalTime), MSTSTimeToDateTime(tt.DepartTime)));
                }
            }
            else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase))
            {
                // TODO: Make common timetable parser.
                var file = new TimetableReader(content.PathName);
                Name = content.Name;

                var serviceColumn = -1;
                var consistRow    = -1;
                var pathRow       = -1;
                var startRow      = -1;
                for (var row = 0; row < file.Strings.Count; row++)
                {
                    if (file.Strings[row][0] == "#consist" && consistRow == -1)
                    {
                        consistRow = row;
                    }
                    else if (file.Strings[row][0] == "#path" && pathRow == -1)
                    {
                        pathRow = row;
                    }
                    else if (file.Strings[row][0] == "#start" && startRow == -1)
                    {
                        startRow = row;
                    }
                }
                for (var column = 0; column < file.Strings[0].Length; column++)
                {
                    if (file.Strings[0][column] == content.Name && serviceColumn == -1)
                    {
                        serviceColumn = column;
                    }
                }
                ID = serviceColumn.ToString();
                var timeRE         = new Regex(@"^(\d\d):(\d\d)(?:-(\d\d):(\d\d))?");
                var startTimeMatch = timeRE.Match(file.Strings[startRow][serviceColumn]);
                if (startTimeMatch.Success)
                {
                    StartTime = new DateTime(2000, 1, 1, int.Parse(startTimeMatch.Groups[1].Value), int.Parse(startTimeMatch.Groups[2].Value), 0);
                }
                var stops = new List <Stop>();
                for (var row = 0; row < file.Strings.Count; row++)
                {
                    if (row != startRow)
                    {
                        var timeMatch = timeRE.Match(file.Strings[row][serviceColumn]);
                        if (timeMatch.Success)
                        {
                            var arrivalTime   = new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[1].Value), int.Parse(timeMatch.Groups[2].Value), 0);
                            var departureTime = timeMatch.Groups[3].Success ? new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[3].Value), int.Parse(timeMatch.Groups[4].Value), 0) : arrivalTime;
                            // If the time is prior to this train's start time, assume it is rolling over in to "tomorrow".
                            if (arrivalTime < StartTime)
                            {
                                arrivalTime   = arrivalTime.AddDays(1);
                                departureTime = departureTime.AddDays(1);
                            }
                            stops.Add(new Stop(file.Strings[row][0].Replace(" $hold", "").Replace(" $forcehold", ""), arrivalTime, departureTime));
                        }
                    }
                }
                Stops    = stops.OrderBy(s => s.ArrivalTime);
                Consist  = file.Strings[consistRow][serviceColumn].Replace(" $reverse", "");
                Reversed = file.Strings[consistRow][serviceColumn].Contains(" $reverse");
                Path     = file.Strings[pathRow][serviceColumn];
            }
        }