/*
Adds 2 JS test methods to global mwDev.tools.test object to measure site performance on the browser side
See detailed documentation in Dev/mediawiki
deferrable:NO -- This scripts tests performance and needs to be fired asap
*/

(function() {
	
	// mwDev is globally available
	
	let jammerHandle = null;
	mwDev.tools.test.jsJammer = function( bursts = 10, pause = 300, runs = 100 ) {
		if( bursts == false ) {
			clearInterval( jammerHandle );
			return;
		}
		
		console.info( 'mwDev.tools.test.jsJammer : starting ' + runs + ' runs, ' + bursts + ' bursts, ' + pause + ' pause' );
		
		var count = runs;
		jammerHandle = setInterval( function() {
			count--;
			if( count <= 0 ) {
				clearInterval( jammerHandle );
				console.info( 'mwDev.tools.test.jsJammer : runs completed' );
				return;
			}
			
			console.info( 'mwDev.tools.test.jsJammer : ' + count + ' runs to go' );
			
			// Performance intensive infinite loop
			let a = [];
			for( var i = 0; i < bursts * 1000000; i++ ) {
				if( typeof a == 'object' ) {
					a = 0;
				} else {
					a = [];
				}
			}
		}, pause );
	};
	
	mwDev.tools.test.scrollPageTest = function( time = 600, runs = 10 ) {
		
		console.info( 'mwDev.tools.test.scrollPageTest : starting ' + runs + ' runs, ' + time + ' time' );
		
		var count = runs;
		var start, diff;
		
		function fn1() {
			start = Date.now();
			$("html").animate({ scrollTop: $(document).height() }, time, fn2 );
		}
		
		function fn2() {
			$("html").animate({ scrollTop: 0 }, time, function() {
				count--;
				if( count <= 0 ) {
					console.info( 'mwDev.tools.test.scrollPageTest : runs completed' );
					return;
				}
				
				diff = Date.now() - start;
				console.info( 'mwDev.tools.test.scrollPageTest : ' + count + ' runs to go. Current, expected: '
					+ ( 2 * time ) + ', measured: ' + diff + ', deviation: '
					+ ( 100 * ( diff - 2 * time ) / ( 2 * time ) ).toFixed(2) + '%'
				);
				
				fn1();
			});
		}
		
		fn1();
	};
	
})();

/*
[[Category: MultiWiki]]
*/