mirror of
https://github.com/luau-lang/luau.git
synced 2024-11-15 14:25:44 +08:00
36e0e64715
* Include `windows.h` rather than `Windows.h` to make things compile on MinGW. * Custom implementation of timegm/os.time for all platforms * Disable builtin constant folding when getfenv/setfenv are used * Fixes https://github.com/Roblox/luau/issues/1042 * Fixes https://github.com/Roblox/luau/issues/1043 New Type Checker * Initial work toward type states. * Rework most overloadable operators to use type families. * Initial work toward our new nonstrict mode. Native Codegen * Fix native code generation for dead loops * Annotate top-level functions as cold * Slightly smaller/faster x64 Luau calls * emitInstCall used to not set savedpc itself, but now it does for consistency with all other implementations * Implement cmov support for X64 * Fix assertion in luau-compile when module is empty * Optimize A64 calls at some code size cost * Inline constant array index offset into the load/store instruction * Increase x64 spill slots from 5 to 13 --------- Co-authored-by: Arseny Kapoulkine <arseny.kapoulkine@gmail.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com> Co-authored-by: Lily Brown <lbrown@roblox.com> Co-authored-by: Aaron Weiss <aaronweiss@roblox.com> Co-authored-by: Alexander McCord <amccord@roblox.com>
107 lines
4.8 KiB
Lua
107 lines
4.8 KiB
Lua
-- This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
-- This file is based on Lua 5.x tests -- https://github.com/lua/lua/tree/master/testes
|
|
print "testing datetime library"
|
|
|
|
local function checkerr (msg, f, ...)
|
|
local stat, err = pcall(f, ...)
|
|
assert(not stat and string.find(err, msg, 1, true))
|
|
end
|
|
|
|
assert(os.date("") == "")
|
|
assert(os.date("!") == "")
|
|
local x = string.rep("a", 10000)
|
|
assert(os.date(x) == x)
|
|
local t = os.time()
|
|
D = os.date("*t", t)
|
|
assert(os.date(string.rep("%d", 1000), t) ==
|
|
string.rep(os.date("%d", t), 1000))
|
|
assert(os.date(string.rep("%", 200)) == string.rep("%", 100))
|
|
assert(os.date("", -1) == nil)
|
|
|
|
assert(os.time({ year = 1969, month = 12, day = 31, hour = 23, min = 59, sec = 59}) == nil) -- just before start
|
|
assert(os.time({ year = 1970, month = 1, day = 1, hour = 0, min = 0, sec = 0}) == 0) -- start
|
|
assert(os.time({ year = 3000, month = 12, day = 31, hour = 23, min = 59, sec = 59}) == 32535215999) -- just before Windows max range
|
|
assert(os.time({ year = 1970, month = 1, day = 1, hour = 0, min = 0, sec = -1}) == nil) -- going before using time fields
|
|
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = 0, sec = 0}) == 960595200)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = 0, sec = -86400}) == 960508800)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = 0, sec = 86400}) == 960681600)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = -600, sec = 0}) == 960559200)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = 600, sec = 0}) == 960631200)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = -600, min = 0, sec = 0}) == 958435200)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 600, min = 0, sec = 0}) == 962755200)
|
|
assert(os.time({ year = 2000, month = 6, day = -100, hour = 0, min = 0, sec = 0}) == 951091200)
|
|
assert(os.time({ year = 2000, month = 6, day = 1000, hour = 0, min = 0, sec = 0}) == 1046131200)
|
|
assert(os.time({ year = 2000, month = -60, day = 10, hour = 0, min = 0, sec = 0}) == 787017600)
|
|
assert(os.time({ year = 2000, month = 60, day = 10, hour = 0, min = 0, sec = 0}) == 1102636800)
|
|
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = 0, sec = -86400000}) == 874195200)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = 0, sec = 86400000}) == 1046995200)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = -600000, sec = 0}) == 924595200)
|
|
assert(os.time({ year = 2000, month = 6, day = 10, hour = 0, min = 600000, sec = 0}) == 996595200)
|
|
assert(os.time({ year = 2100, month = 6, day = 10, hour = -600000, min = 0, sec = 0}) == 1956268800)
|
|
assert(os.time({ year = 2100, month = 6, day = 10, hour = 600000, min = 0, sec = 0}) == 6276268800)
|
|
assert(os.time({ year = 2100, month = 6, day = -10000, hour = 0, min = 0, sec = 0}) == 3251404800)
|
|
assert(os.time({ year = 2100, month = 6, day = 100000, hour = 0, min = 0, sec = 0}) == 12755404800)
|
|
assert(os.time({ year = 2100, month = -600, day = 10, hour = 0, min = 0, sec = 0}) == 2522707200)
|
|
assert(os.time({ year = 2100, month = 600, day = 10, hour = 0, min = 0, sec = 0}) == 5678380800)
|
|
|
|
local function checkDateTable (t)
|
|
local D = os.date("!*t", t)
|
|
assert(os.time(D) == t)
|
|
local DC = os.date("!%Y %m %d %H %M %S %w %j"):split(" ")
|
|
assert(D.year == tonumber(DC[1]))
|
|
assert(D.month == tonumber(DC[2]))
|
|
assert(D.day == tonumber(DC[3]))
|
|
assert(D.hour == tonumber(DC[4]))
|
|
assert(D.min == tonumber(DC[5]))
|
|
assert(D.sec == tonumber(DC[6]))
|
|
assert(D.wday == tonumber(DC[7]) + 1)
|
|
assert(D.yday == tonumber(DC[8]))
|
|
end
|
|
|
|
checkDateTable(os.time())
|
|
|
|
checkerr("invalid conversion specifier", os.date, "%9")
|
|
checkerr("invalid conversion specifier", os.date, "%O")
|
|
checkerr("invalid conversion specifier", os.date, "%E")
|
|
checkerr("invalid conversion specifier", os.date, "%Ea")
|
|
|
|
checkerr("missing", os.time, {hour = 12}) -- missing date
|
|
|
|
do
|
|
local D = os.date("*t")
|
|
local t = os.time(D)
|
|
if D.isdst == nil then
|
|
print("no daylight saving information")
|
|
else
|
|
assert(type(D.isdst) == 'boolean')
|
|
end
|
|
D.isdst = nil
|
|
local t1 = os.time(D)
|
|
assert(t == t1) -- if isdst is absent uses correct default
|
|
end
|
|
|
|
local D = os.date("*t")
|
|
t = os.time(D)
|
|
D.year = D.year-1;
|
|
local t1 = os.time(D)
|
|
-- allow for leap years
|
|
assert(math.abs(os.difftime(t,t1)/(24*3600) - 365) < 2)
|
|
|
|
-- should not take more than 1 second to execute these two lines
|
|
t = os.time()
|
|
t1 = os.time(os.date("!*t"))
|
|
local diff = os.difftime(t1,t)
|
|
assert(0 <= diff and diff <= 1)
|
|
diff = os.difftime(t,t1)
|
|
assert(-1 <= diff and diff <= 0)
|
|
|
|
local t1 = os.time{year=2000, month=10, day=1, hour=23, min=12}
|
|
local t2 = os.time{year=2000, month=10, day=1, hour=23, min=10, sec=19}
|
|
assert(os.difftime(t1,t2) == 60*2-19)
|
|
|
|
assert(os.time({ year = 1970, day = 1, month = 1, hour = 0}) == 0)
|
|
|
|
return 'OK'
|