public void Can_parse_track_header() { var(roundStartTime, duration) = RoundDefParser.ParseTrackHeader("Track 30"); roundStartTime.Should().Be(DateTime.MinValue); duration.Should().Be(TimeSpan.FromSeconds(30)); (roundStartTime, duration) = RoundDefParser.ParseTrackHeader("Track 2018-05-06T21:30:15 48:16"); roundStartTime.Should().Be(new DateTime(2018, 5, 6, 21, 30, 15, DateTimeKind.Utc)); duration.Should().Be(new TimeSpan(0, 48, 16)); }
static async Task Main(string[] args) { if (!Directory.Exists(OutputDir)) { Directory.CreateDirectory(OutputDir); } var cb = new MySqlConnectionStringBuilder { Server = "localhost", UserID = "root", Password = "", Database = "racelog" }; await using var con = new MySqlConnection(cb.ConnectionString); await con.OpenAsync(); var events = await con.QueryAsync <Event>("select * from Events order by Date"); var allLaps = (await con.QueryAsync <Lap>("select * from Laps order by Number")).ToList(); foreach (var ev in events) { Console.WriteLine(ev.Name); var schedules = await con.QueryAsync <Schedule>("SELECT distinct s.* from Schedules s INNER join ScheduleToClass stc ON s.ScheduleId = stc.ScheduleId where s.EventId = @EventId and Published = 1", ev); foreach (var sch in schedules) { var roundRating = (await con.QueryAsync <RoundRating>("SELECT * FROM RoundRatings WHERE ScheduleId = @ScheduleId", sch)) .OrderBy(x => x.ClassId != null).FirstOrDefault(); if (roundRating == null) { continue; } var checkpoints = await con.QueryAsync <Checkpoint>("SELECT * FROM Checkpoints WHERE ScheduleId = @ScheduleId ORDER BY `Timestamp`", sch); var results = await con.QueryAsync <RoundRiderResult>("SELECT * FROM RoundRiderResults WHERE RoundRatingId = @RoundRatingId and LapsCount > 0 order by Position", roundRating); var riders = checkpoints.GroupBy(x => x.RiderRegistrationId) .ToDictionary(x => x.Key, x => x.First().Number.ToString()); Console.WriteLine($" {sch.ScheduleId} {sch.Name}, {sch.ActualStartTime}, {sch.Duration} Checkpoints: {checkpoints.Count()} Results: {results.Count()}"); var file = Path.Combine(OutputDir, $"{ev.Name} {sch.Name}.txt"); await using var sw = new StreamWriter(file, false); sw.Write($"{RoundDefParser.Track} {sch.Duration.ToShortString()}"); sw.WriteLine(RoundDefParser.FormatCheckpoints(checkpoints, sch.ActualStartTime)); sw.WriteLine($"{RoundDefParser.Rating}"); foreach (var res in results) { if (res.Finished) { sw.Write("F"); } var laps = allLaps.Where(x => x.RoundRiderResultId == res.RoundRiderResultId).Select(x => x.AggDuration.ToShortString()); sw.WriteLine($"{riders[res.RiderRegistrationId]} {res.LapsCount} [{string.Join(" ", laps)}]"); } } } }
public void Can_parse_checkpoint_without_timestamp() { var cp = RoundDefParser.ParseCheckpoint("11", default); cp.RiderId.Should().Be("11"); cp.Timestamp.Should().Be(default);