aboutsummaryrefslogtreecommitdiffstats
path: root/test/runner/lib/generateHash.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/runner/lib/generateHash.js')
-rw-r--r--test/runner/lib/generateHash.js50
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 ) }` );
+ } );
+}