mirror of
https://github.com/vlang/v.git
synced 2025-09-08 14:51:53 -04:00
137 lines
3.1 KiB
V
137 lines
3.1 KiB
V
import time
|
|
import rand
|
|
|
|
fn validate_separators(uuid string) {
|
|
assert uuid[8] == `-`
|
|
assert uuid[13] == `-`
|
|
assert uuid[18] == `-`
|
|
assert uuid[23] == `-`
|
|
assert uuid.len == 36
|
|
}
|
|
|
|
// uuid_v4:
|
|
fn test_rand_uuid_v4() {
|
|
uuid1 := rand.uuid_v4()
|
|
uuid2 := rand.uuid_v4()
|
|
uuid3 := rand.uuid_v4()
|
|
validate_separators(uuid1)
|
|
validate_separators(uuid2)
|
|
validate_separators(uuid3)
|
|
assert uuid1 != uuid2
|
|
assert uuid1 != uuid3
|
|
assert uuid2 != uuid3
|
|
for i in 0 .. 1000 {
|
|
x := rand.uuid_v4()
|
|
// check the version field is always 4:
|
|
assert x[14] == `4`
|
|
// and the clock_seq_hi_and_reserved field is valid too:
|
|
assert x[19] in [`8`, `9`, `a`, `b`]
|
|
validate_separators(x)
|
|
}
|
|
}
|
|
|
|
// uuid_v7:
|
|
fn test_rand_uuid_v7() {
|
|
uuid1 := rand.uuid_v7()
|
|
uuid2 := rand.uuid_v7()
|
|
uuid3 := rand.uuid_v7()
|
|
validate_separators(uuid1)
|
|
validate_separators(uuid2)
|
|
validate_separators(uuid3)
|
|
assert uuid1 != uuid2
|
|
assert uuid1 != uuid3
|
|
assert uuid2 != uuid3
|
|
for i in 0 .. 1000 {
|
|
x := rand.uuid_v7()
|
|
// check the version field is always 7:
|
|
assert x[14] == `7`
|
|
// and variant field is always 0b10:
|
|
assert x[19] in [`8`, `9`, `a`, `b`]
|
|
validate_separators(x)
|
|
}
|
|
}
|
|
|
|
// uuid_v7_session:
|
|
fn test_rand_uuid_v7_session() {
|
|
mut u := rand.new_uuid_v7_session()
|
|
uuid1 := u.next()
|
|
uuid2 := u.next()
|
|
uuid3 := u.next()
|
|
assert uuid1 != uuid2
|
|
assert uuid1 != uuid3
|
|
assert uuid2 != uuid3
|
|
assert uuid1.len == 36
|
|
assert uuid2.len == 36
|
|
assert uuid3.len == 36
|
|
mut prev_counter := `3`
|
|
for i in 0 .. 1000 {
|
|
x := u.next()
|
|
// check the version field is always 7:
|
|
assert x[14] == `7`
|
|
// and variant field is always 0b10:
|
|
assert x[19] in [`8`, `9`, `a`, `b`]
|
|
|
|
// verify counter increase
|
|
assert x[17] == prev_counter
|
|
if prev_counter == `9` {
|
|
prev_counter = `a`
|
|
} else if prev_counter == `f` {
|
|
prev_counter = `0`
|
|
} else {
|
|
prev_counter++
|
|
}
|
|
}
|
|
}
|
|
|
|
// ulids:
|
|
fn test_ulids_are_unique() {
|
|
ulid1 := rand.ulid()
|
|
ulid2 := rand.ulid()
|
|
ulid3 := rand.ulid()
|
|
assert ulid1.len == 26
|
|
assert ulid2.len == 26
|
|
assert ulid3.len == 26
|
|
assert ulid1 != ulid2
|
|
assert ulid1 != ulid3
|
|
assert ulid2 != ulid3
|
|
}
|
|
|
|
fn test_ulids_max_start_character_is_ok() {
|
|
ulid1 := rand.ulid()
|
|
// the largest valid ULID encoded in Base32 is 7ZZZZZZZZZZZZZZZZZZZZZZZZZ
|
|
assert (int(ulid1[0]) - 48) <= 7
|
|
}
|
|
|
|
fn test_ulids_generated_in_the_same_millisecond_have_the_same_prefix() {
|
|
t := u64(time.utc().unix_milli())
|
|
mut ulid1 := ''
|
|
mut ulid2 := ''
|
|
mut ulid3 := ''
|
|
ulid1 = rand.ulid_at_millisecond(t)
|
|
ulid2 = rand.ulid_at_millisecond(t)
|
|
ulid3 = rand.ulid_at_millisecond(t)
|
|
ulid1_prefix := ulid1[0..10]
|
|
ulid2_prefix := ulid2[0..10]
|
|
ulid3_prefix := ulid3[0..10]
|
|
assert ulid1_prefix == ulid2_prefix
|
|
assert ulid1_prefix == ulid3_prefix
|
|
}
|
|
|
|
fn test_ulids_should_be_lexicographically_ordered_when_not_in_same_millisecond() {
|
|
ulid1 := rand.ulid()
|
|
time.sleep(1 * time.millisecond)
|
|
ulid2 := rand.ulid()
|
|
time.sleep(1 * time.millisecond)
|
|
ulid3 := rand.ulid()
|
|
mut all := [ulid3, ulid2, ulid1]
|
|
// eprintln('all before: $all')
|
|
all.sort()
|
|
// eprintln('all after: $all')
|
|
s1 := all[0]
|
|
s2 := all[1]
|
|
s3 := all[2]
|
|
assert s1 == ulid1
|
|
assert s2 == ulid2
|
|
assert s3 == ulid3
|
|
}
|