diff options
Diffstat (limited to 'test/runner/lib/generateHash.js')
-rw-r--r-- | test/runner/lib/generateHash.js | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/test/runner/lib/generateHash.js b/test/runner/lib/generateHash.js new file mode 100644 index 000000000..dbbd4b476 --- /dev/null +++ b/test/runner/lib/generateHash.js @@ -0,0 +1,50 @@ +import crypto from "node:crypto"; + +export function generateHash( string ) { + const hash = crypto.createHash( "md5" ); + hash.update( string ); + + // QUnit hashes are 8 characters long + // We use 10 characters to be more visually distinct + return hash.digest( "hex" ).slice( 0, 10 ); +} + +/** + * A copy of the generate hash function from QUnit, + * used to generate a hash for the module name. + * + * QUnit errors on passing multiple modules to the + * module query parameter. We need to know + * the hash for each module before loading QUnit + * in order to pass multiple moduleId parameters instead. + */ +export function generateModuleId( module, browser ) { + + // QUnit normally hashes the test name, but + // we've repurposed this function to generate + // report IDs for module/browser combinations. + // We still use it without the browser parameter + // to get the same module IDs as QUnit to pass + // multiple ahead-of-time in the query string. + const str = module + "\x1C" + browser; + let hash = 0; + + for ( let i = 0; i < str.length; i++ ) { + hash = ( hash << 5 ) - hash + str.charCodeAt( i ); + hash |= 0; + } + + let hex = ( 0x100000000 + hash ).toString( 16 ); + if ( hex.length < 8 ) { + hex = "0000000" + hex; + } + + return hex.slice( -8 ); +} + +export function printModuleHashes( modules ) { + console.log( "Module hashes:" ); + modules.forEach( ( module ) => { + console.log( ` ${ module }: ${ generateModuleId( module ) }` ); + } ); +} |