77 * Copyright (c) 2011-2017 Digital Bazaar, Inc. All rights reserved.
88 */
99const EarlReport = require ( './earl-report' ) ;
10+ const benchmark = require ( 'benchmark' ) ;
1011const join = require ( 'join-path-js' ) ;
1112
1213module . exports = function ( options ) {
@@ -269,14 +270,22 @@ function addTest(manifest, test, tests) {
269270 test . manifest = manifest ;
270271 const description = test_id + ' ' + ( test . purpose || test . name ) ;
271272
272- tests . push ( {
273- title : description + ' (promise)' ,
274- f : makeFn ( { useCallbacks : false } )
275- } ) ;
276- tests . push ( {
277- title : description + ' (callback)' ,
278- f : makeFn ( { useCallbacks : true } )
279- } ) ;
273+ if ( options . benchmark ) {
274+ // only promises
275+ tests . push ( {
276+ title : description ,
277+ f : makeFn ( { useCallbacks : false } )
278+ } ) ;
279+ } else {
280+ tests . push ( {
281+ title : description + ' (promise)' ,
282+ f : makeFn ( { useCallbacks : false } )
283+ } ) ;
284+ tests . push ( {
285+ title : description + ' (callback)' ,
286+ f : makeFn ( { useCallbacks : true } )
287+ } ) ;
288+ }
280289
281290 function makeFn ( { useCallbacks} ) {
282291 return function ( done ) {
@@ -340,8 +349,7 @@ function addTest(manifest, test, tests) {
340349 } ) ;
341350
342351 const fn = testInfo . fn ;
343- let params = testInfo . params ;
344- params = params . map ( function ( param ) { return param ( test ) ; } ) ;
352+ const params = testInfo . params . map ( param => param ( test ) ) ;
345353 const callback = function ( err , result ) {
346354 Promise . resolve ( ) . then ( ( ) => {
347355 if ( isNegativeTest ( test ) ) {
@@ -353,6 +361,43 @@ function addTest(manifest, test, tests) {
353361 }
354362 return testInfo . compare ( test , result ) ;
355363 }
364+ } ) . then ( ( ) => {
365+ if ( options . benchmark ) {
366+ // pre-load params to avoid doc loader and parser timing
367+ const benchParams = testInfo . params . map ( param => param ( test , {
368+ load : true
369+ } ) ) ;
370+ return Promise . all ( benchParams ) ;
371+ }
372+ } ) . then ( values => {
373+ if ( options . benchmark ) {
374+ return new Promise ( ( resolve , reject ) => {
375+ const suite = new benchmark . Suite ( ) ;
376+ suite . add ( {
377+ name : test . name ,
378+ defer : true ,
379+ fn : deferred => {
380+ jsonld [ fn ] . apply ( null , values ) . then ( ( ) => {
381+ deferred . resolve ( ) ;
382+ } ) ;
383+ }
384+ } ) ;
385+ suite
386+ . on ( 'start' , e => {
387+ self . timeout ( ( e . target . maxTime + 2 ) * 1000 ) ;
388+ } )
389+ . on ( 'cycle' , e => {
390+ console . log ( String ( e . target ) ) ;
391+ } )
392+ . on ( 'error' , err => {
393+ reject ( new Error ( err ) ) ;
394+ } )
395+ . on ( 'complete' , e => {
396+ resolve ( ) ;
397+ } )
398+ . run ( { async : true } ) ;
399+ } ) ;
400+ }
356401 } ) . then ( ( ) => {
357402 if ( options . earl . report ) {
358403 options . earl . report . addAssertion ( test , true ) ;
@@ -458,10 +503,15 @@ function readManifestEntry(manifest, entry) {
458503}
459504
460505function readTestUrl ( property ) {
461- return function ( test ) {
506+ return function ( test , options ) {
462507 if ( ! test [ property ] ) {
463508 return null ;
464509 }
510+ if ( options && options . load ) {
511+ // always load
512+ return joinPath ( test . dirname , test [ property ] )
513+ . then ( readJson ) ;
514+ }
465515 return test . manifest . baseIri + test [ property ] ;
466516 } ;
467517}
0 commit comments