Compare commits
2 commits
1bbdcd3e40
...
7862c65fcd
Author | SHA1 | Date | |
---|---|---|---|
7862c65fcd | |||
9f9aba2510 |
1 changed files with 240 additions and 33 deletions
273
src/main.zig
273
src/main.zig
|
@ -473,6 +473,31 @@ pub const DateTime = struct {
|
|||
left = left[year.len..];
|
||||
date.weekday = DayOfWeek.dayOfWeek(date.year, date.month, date.day);
|
||||
},
|
||||
.MMMM => {
|
||||
const map = std.ComptimeStringMapWithEql(Month, .{
|
||||
.{ "january", .Jan },
|
||||
.{ "february", .Feb },
|
||||
.{ "march", .Mar },
|
||||
.{ "april", .Apr },
|
||||
.{ "may", .May },
|
||||
.{ "june", .Jun },
|
||||
.{ "july", .Jul },
|
||||
.{ "august", .Aug },
|
||||
.{ "september", .Sep },
|
||||
.{ "october", .Oct },
|
||||
.{ "november", .Nov },
|
||||
.{ "december", .Dec },
|
||||
}, std.comptime_string_map.eqlAsciiIgnoreCase);
|
||||
date.month = month: {
|
||||
for (1..left.len) |l| {
|
||||
if (map.get(left[0..l])) |m| {
|
||||
left = left[l..];
|
||||
break :month m;
|
||||
}
|
||||
}
|
||||
return error.ParseError;
|
||||
};
|
||||
},
|
||||
.SSSSSSSSS => {
|
||||
date.nanosecond = try readFrac(left, 9);
|
||||
left = left[9..];
|
||||
|
@ -796,6 +821,188 @@ test "parseTest" {
|
|||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "january",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Jan,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "february",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Feb,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "march",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Mar,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "apr",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Apr,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "may",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .May,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "june",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Jun,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "july",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Jul,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "august",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Aug,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "september",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Sep,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "october",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Oct,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "november",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Jan,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "december",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Dec,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
.{
|
||||
.value = "january",
|
||||
.fmt = "MMMM",
|
||||
.expected = .{
|
||||
.nanosecond = 0,
|
||||
.second = 0,
|
||||
.minute = 0,
|
||||
.hour = 0,
|
||||
.day = 1,
|
||||
.month = .Jan,
|
||||
.year = 1970,
|
||||
.weekday = .Thu,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
inline for (cases) |case| {
|
||||
|
@ -1481,36 +1688,36 @@ test "isLeap" {
|
|||
try std.testing.expectEqual(true, isLeap(2400));
|
||||
}
|
||||
|
||||
// test "bigTest" {
|
||||
// const ystart = -1000000;
|
||||
// var prev_z: i32 = daysFromCivil(ystart, .Jan, 1) - 1;
|
||||
// try std.testing.expect(prev_z < 0);
|
||||
// var prev_wd = DayOfWeek.weekdayFromDays(prev_z);
|
||||
// try std.testing.expect(0 <= @intFromEnum(prev_wd) and @intFromEnum(prev_wd) <= 6);
|
||||
// var y: Year = ystart;
|
||||
// while (y <= -ystart) {
|
||||
// for ([_]Month{ .Jan, .Feb, .Mar, .Apr, .May, .Jun, .Jul, .Aug, .Sep, .Oct, .Nov, .Dec }) |m| {
|
||||
// var d: Day = 1;
|
||||
// const e = m.lastDay(y);
|
||||
// while (d <= e) {
|
||||
// // std.debug.print("{d} {d} {d}\n", .{ y, @intFromEnum(m), d });
|
||||
// const z = daysFromCivil(y, m, d);
|
||||
// // std.debug.print("{d} {d}\n", .{ prev_z, z });
|
||||
// try std.testing.expect(prev_z < z);
|
||||
// try std.testing.expect(z == prev_z + 1);
|
||||
// const date = civilFromDays(z);
|
||||
// try std.testing.expect(y == date.year);
|
||||
// try std.testing.expect(m == date.month);
|
||||
// try std.testing.expect(d == date.day);
|
||||
// const wd = DayOfWeek.weekdayFromDays(z);
|
||||
// try std.testing.expect(0 <= @intFromEnum(wd) and @intFromEnum(wd) <= 6);
|
||||
// try std.testing.expect(wd == prev_wd.next());
|
||||
// try std.testing.expect(prev_wd == wd.prev());
|
||||
// prev_z = z;
|
||||
// prev_wd = wd;
|
||||
// d += 1;
|
||||
// }
|
||||
// }
|
||||
// y += 1;
|
||||
// }
|
||||
// }
|
||||
test "bigTest" {
|
||||
const ystart = -1000000;
|
||||
var prev_z: i32 = daysFromCivil(ystart, .Jan, 1) - 1;
|
||||
try std.testing.expect(prev_z < 0);
|
||||
var prev_wd = DayOfWeek.weekdayFromDays(prev_z);
|
||||
try std.testing.expect(0 <= @intFromEnum(prev_wd) and @intFromEnum(prev_wd) <= 6);
|
||||
var y: Year = ystart;
|
||||
while (y <= -ystart) {
|
||||
for ([_]Month{ .Jan, .Feb, .Mar, .Apr, .May, .Jun, .Jul, .Aug, .Sep, .Oct, .Nov, .Dec }) |m| {
|
||||
var d: Day = 1;
|
||||
const e = m.lastDay(y);
|
||||
while (d <= e) {
|
||||
// std.debug.print("{d} {d} {d}\n", .{ y, @intFromEnum(m), d });
|
||||
const z = daysFromCivil(y, m, d);
|
||||
// std.debug.print("{d} {d}\n", .{ prev_z, z });
|
||||
try std.testing.expect(prev_z < z);
|
||||
try std.testing.expect(z == prev_z + 1);
|
||||
const date = civilFromDays(z);
|
||||
try std.testing.expect(y == date.year);
|
||||
try std.testing.expect(m == date.month);
|
||||
try std.testing.expect(d == date.day);
|
||||
const wd = DayOfWeek.weekdayFromDays(z);
|
||||
try std.testing.expect(0 <= @intFromEnum(wd) and @intFromEnum(wd) <= 6);
|
||||
try std.testing.expect(wd == prev_wd.next());
|
||||
try std.testing.expect(prev_wd == wd.prev());
|
||||
prev_z = z;
|
||||
prev_wd = wd;
|
||||
d += 1;
|
||||
}
|
||||
}
|
||||
y += 1;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue