• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Run for enough iterations that we're likely to catch edge-cases, like
2// failing to set a reserved bit:
3const iterations = 256;
4// Track all the UUIDs generated during test run, bail if we ever collide:
5const uuids = new Set()
6function randomUUID() {
7    const uuid = self.crypto.randomUUID();
8    if (uuids.has(uuid)) {
9        throw new Error(`uuid collision ${uuid}`)
10    }
11    uuids.add(uuid);
12    return uuid;
13}
14
15// UUID is in namespace format (16 bytes separated by dashes):
16test(function() {
17    const UUIDRegex = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/
18    for (let i = 0; i < iterations; i++) {
19        assert_true(UUIDRegex.test(randomUUID()));
20    }
21}, "namespace format");
22
23// Set the 4 most significant bits of array[6], which represent the UUID
24// version, to 0b0100:
25test(function() {
26    for (let i = 0; i < iterations; i++) {
27        let value = parseInt(randomUUID().split('-')[2].slice(0, 2), 16);
28        value &= 0b11110000;
29        assert_true(value === 0b01000000);
30    }
31}, "version set");
32
33// Set the 2 most significant bits of array[8], which represent the UUID
34// variant, to 0b10:
35test(function() {
36    for (let i = 0; i < iterations; i++) {
37        // Grab the byte representing array[8]:
38        let value = parseInt(randomUUID().split('-')[3].slice(0, 2), 16);
39        value &= 0b11000000
40        assert_true(value === 0b10000000);
41    }
42}, "variant set");
43