spec/util_datetime_spec.lua
author Kim Alvefur <zash@zash.se>
Sun, 14 Aug 2022 16:57:31 +0200
changeset 12633 4c1d3f817063
parent 12632 b95da9a593be
child 12759 a09dacf660d2
permissions -rw-r--r--
util.datetime: Add support for sub-second precision timestamps Lua since 5.3 raises a fuss when time functions are handed a number with a fractional part and the underlying C functions are all based on integer seconds without support for more precision.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local util_datetime = require "util.datetime";
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
describe("util.datetime", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
	it("should have been loaded", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
		assert.is_table(util_datetime);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
	end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
	describe("#date", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
		local date = util_datetime.date;
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
		it("should exist", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
			assert.is_function(date);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
		it("should return a string", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
			assert.is_string(date());
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
		it("should look like a date", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
			assert.truthy(string.find(date(), "^%d%d%d%d%-%d%d%-%d%d$"));
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
		it("should work", function ()
12632
b95da9a593be util.datetime: Fix argument order in tests
Kim Alvefur <zash@zash.se>
parents: 8395
diff changeset
    19
			assert.equals("2006-01-02", date(1136239445));
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
		end);
12633
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    21
		it("should ignore fractional parts", function ()
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    22
			assert.equals("2006-01-02", date(1136239445.5));
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    23
		end);
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	describe("#time", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
		local time = util_datetime.time;
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
		it("should exist", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
			assert.is_function(time);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
		it("should return a string", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
			assert.is_string(time());
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		it("should look like a timestamp", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
			-- Note: Sub-second precision and timezones are ignored
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
			assert.truthy(string.find(time(), "^%d%d:%d%d:%d%d"));
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
		it("should work", function ()
12632
b95da9a593be util.datetime: Fix argument order in tests
Kim Alvefur <zash@zash.se>
parents: 8395
diff changeset
    38
			assert.equals("22:04:05", time(1136239445));
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		end);
12633
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    40
		it("should handle precision", function ()
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    41
			assert.equal("14:46:32.158200", time(1660488392.1582))
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    42
		end)
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
	describe("#datetime", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		local datetime = util_datetime.datetime;
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
		it("should exist", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
			assert.is_function(datetime);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
		it("should return a string", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
			assert.is_string(datetime());
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
		it("should look like a timestamp", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
			-- Note: Sub-second precision and timezones are ignored
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
			assert.truthy(string.find(datetime(), "^%d%d%d%d%-%d%d%-%d%dT%d%d:%d%d:%d%d"));
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
		it("should work", function ()
12632
b95da9a593be util.datetime: Fix argument order in tests
Kim Alvefur <zash@zash.se>
parents: 8395
diff changeset
    57
			assert.equals("2006-01-02T22:04:05Z", datetime(1136239445));
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
		end);
12633
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    59
		it("should handle precision", function ()
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    60
			assert.equal("2022-08-14T14:46:32.158200Z", datetime(1660488392.1582))
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    61
		end)
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
	end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
	describe("#legacy", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
		local legacy = util_datetime.legacy;
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
		it("should exist", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
			assert.is_function(legacy);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
	end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
	describe("#parse", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
		local parse = util_datetime.parse;
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
		it("should exist", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
			assert.is_function(parse);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
		it("should work", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
			-- Timestamp used by Go
12632
b95da9a593be util.datetime: Fix argument order in tests
Kim Alvefur <zash@zash.se>
parents: 8395
diff changeset
    76
			assert.equals(1511114293, parse("2017-11-19T17:58:13Z"));
b95da9a593be util.datetime: Fix argument order in tests
Kim Alvefur <zash@zash.se>
parents: 8395
diff changeset
    77
			assert.equals(1511114330, parse("2017-11-19T18:58:50+0100"));
b95da9a593be util.datetime: Fix argument order in tests
Kim Alvefur <zash@zash.se>
parents: 8395
diff changeset
    78
			assert.equals(1136239445, parse("2006-01-02T15:04:05-0700"));
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
		end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
		it("should handle timezones", function ()
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
			-- https://xmpp.org/extensions/xep-0082.html#example-2 and 3
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
			assert.equals(parse("1969-07-21T02:56:15Z"), parse("1969-07-20T21:56:15-05:00"));
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
		end);
12633
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    84
		it("should handle precision", function ()
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    85
			-- floating point comparison is not an exact science
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    86
			assert.truthy(math.abs(1660488392.1582 - parse("2022-08-14T14:46:32.158200Z")) < 0.001)
4c1d3f817063 util.datetime: Add support for sub-second precision timestamps
Kim Alvefur <zash@zash.se>
parents: 12632
diff changeset
    87
		end)
8395
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
	end);
ff8e122526f4 util.datetime: Add tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
end);