130 lines
3.7 KiB
Crystal
130 lines
3.7 KiB
Crystal
require "./spec_helper"
|
|
|
|
describe Ulid::ULID do
|
|
# TODO: Write tests
|
|
|
|
it "should initialize" do
|
|
bytes = Bytes.new(16, 0u8)
|
|
ulid = Ulid::ULID.new(bytes)
|
|
ulid.bytes.should eq bytes
|
|
end
|
|
|
|
it "should refuse slice of wrong size" do
|
|
not_enough_bytes = Bytes.new(10, 0u8)
|
|
too_many_bytes = Bytes.new(20, 0u8)
|
|
expect_raises Ulid::ULID::Error, "Not enough bytes" do
|
|
Ulid::ULID.new not_enough_bytes
|
|
end
|
|
expect_raises Ulid::ULID::Error, "Too many bytes" do
|
|
Ulid::ULID.new too_many_bytes
|
|
end
|
|
end
|
|
|
|
it "should serialize a date" do
|
|
time = Time.utc(2019, 9, 29, 10, 55, 22, nanosecond: 123_456_789)
|
|
random = Bytes.new(10) { |i| (201 + i).to_u8 }
|
|
ulid = Ulid::ULID.new(time, random)
|
|
ulid.bytes.to_a.should eq [
|
|
1, 109, 124, 169, 34, 11,
|
|
201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
|
|
] of UInt8
|
|
end
|
|
|
|
it "should generate random" do
|
|
time = Time.utc(2019, 9, 29, 10, 55, 22, nanosecond: 123_456_789)
|
|
generator = NotRandom.new(200)
|
|
ulid = Ulid::ULID.new(time, generator: generator)
|
|
ulid.bytes.to_a.should eq [
|
|
1, 109, 124, 169, 34, 11,
|
|
201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
|
|
]
|
|
end
|
|
|
|
it "should generate random and use current date" do
|
|
time = Time.utc(2019, 9, 29, 10, 55, 22, nanosecond: 123_456_789)
|
|
generator = NotRandom.new(200)
|
|
ulid = nil
|
|
Timecop.freeze(time) do
|
|
ulid = Ulid::ULID.new(generator: generator)
|
|
end
|
|
ulid.not_nil!.bytes.to_a.should eq [
|
|
1, 109, 124, 169, 34, 11,
|
|
201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
|
|
]
|
|
end
|
|
|
|
it "#to_s should return Crockford's Base32 of bytes" do
|
|
bytes = array_slice [
|
|
101, 102, 103, 104, 105, 106,
|
|
107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
|
|
] of UInt8
|
|
ulid = Ulid::ULID.new(bytes)
|
|
ulid.to_s.should eq "CNK6ET39D9NPRVBEDXR72WKKEG"
|
|
end
|
|
|
|
it "should instantiate from a string" do
|
|
ulid = Ulid::ULID.new "CNK6ET39D9NPRVBEDXR72WKKEG"
|
|
ulid.to_s.should eq "CNK6ET39D9NPRVBEDXR72WKKEG"
|
|
end
|
|
|
|
it "should return back time" do
|
|
time = Time.utc(2019, 9, 29, 10, 55, 22, nanosecond: 123_456_789)
|
|
random = Bytes.new(10) { |i| (201 + i).to_u8 }
|
|
ulid = Ulid::ULID.new(time, random)
|
|
ulid.time.should eq Time.utc(2019, 9, 29, 10, 55, 22, nanosecond: 123_000_000)
|
|
end
|
|
|
|
it "should be comparable" do
|
|
ulid1 = Ulid::ULID.new(array_slice [
|
|
1, 2, 3, 4, 5, 6, 7, 8,
|
|
9, 10, 11, 12, 13, 14, 15, 16,
|
|
] of UInt8)
|
|
ulid2 = Ulid::ULID.new(array_slice [
|
|
2, 2, 3, 4, 5, 6, 7, 8,
|
|
9, 10, 11, 12, 13, 14, 15, 16,
|
|
] of UInt8)
|
|
ulid3 = Ulid::ULID.new(array_slice [
|
|
1, 2, 3, 4, 5, 6, 7, 8,
|
|
9, 10, 11, 12, 13, 14, 15, 17,
|
|
] of UInt8)
|
|
ulid4 = Ulid::ULID.new(array_slice [
|
|
1, 2, 3, 4, 5, 6, 7, 8,
|
|
9, 10, 11, 12, 13, 14, 15, 16,
|
|
] of UInt8)
|
|
|
|
(ulid2 > ulid1).should be_true
|
|
(ulid3 > ulid1).should be_true
|
|
(ulid2 > ulid3).should be_true
|
|
end
|
|
|
|
it "should only compare bytes" do
|
|
bytes = array_slice [
|
|
1, 2, 3, 4, 5, 6, 7, 8,
|
|
9, 10, 11, 12, 13, 14, 15, 16,
|
|
] of UInt8
|
|
ulid1 = Ulid::ULID.new(bytes)
|
|
ulid2 = Ulid::ULID.new(bytes)
|
|
|
|
# Generate time instance cache
|
|
ulid2.time
|
|
|
|
(ulid1 == ulid2).should be_true
|
|
end
|
|
|
|
it "should return a readonly slice" do
|
|
ulid = Ulid::ULID.new
|
|
ulid.bytes.read_only?.should be_true
|
|
|
|
ulid = Ulid::ULID.new(array_slice [
|
|
1, 2, 3, 4, 5, 6, 7, 8,
|
|
9, 10, 11, 12, 13, 14, 15, 16,
|
|
] of UInt8)
|
|
ulid.bytes.read_only?.should be_true
|
|
|
|
time = Time.utc(2019, 9, 29, 10, 55, 22, nanosecond: 123_456_789)
|
|
random = Bytes.new(10) { |i| (201 + i).to_u8 }
|
|
ulid = Ulid::ULID.new(time, random)
|
|
ulid.bytes.read_only?.should be_true
|
|
end
|
|
end
|