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