$( document ).on( 'click', '.tt_debug_close_btn', function( e ) { e.preventDefault(); Debug.closePanel(); } ); $( document ).on( 'change', '#tt_debug_enable_checkbox', function( e ) { e.preventDefault(); Debug.setEnable( $( this ).is( ':checked' ) ); } ); $( document ).on( 'click', '#trigger_js_exception_button', function( e ) { e.preventDefault(); var exception_type = $( '#tt_debug_exception_type_select' ).val(); switch ( exception_type ) { case 'js_error': non_existant_variable.non_existant_function(); break; case 'js_load_script_parser_error': var script_path = Global.getViewPathByViewId( 'DeveloperTools' ) + 'triggerParserError.js'; //remove from cache to ensure that we're sending a totally new request delete LocalCacheData.loadedScriptNames[script_path]; //change the js version number to trigger forced reload APIGlobal.pre_login_data.application_build += '_FORCE'; return Global.loadScript( script_path, function( result ) { Debug.Arr( result, 'no error happened.' ); } ); case 'js_load_script_404_error': Global.loadScript( 'nonexistantscript.js', function( result ) { Debug.Arr( result, 'no error happened.' ); } ); break; } } ); $( document ).on( 'click', '#trigger_js_timeout_button', function( e ) { e.preventDefault(); Global.idle_time = 100; Global.doPingIfNecessary(); } ); $( document ).on( 'change', '#tt_debug_exception_verbosity', function( e ) { e.preventDefault(); Debug.setVerbosity( $( this ).val() ); } ); $( document ).on( 'change', '#tt_overlay_disable_checkbox', function( e ) { e.preventDefault(); Global.UNIT_TEST_MODE = $( this ).is( ':checked' ); Global.event_bus.emit( 'tt_left_container', 'rebuild_menu' ); } ); $( document ).on( 'click', '#qunit_test_button', function( e ) { e.preventDefault(); $( '#tt_debug_console' ).css( 'width', '80%' ); $( '#tt_debug_console' ).css( 'margin', '0 auto' ); runUnitTests(); } ); /** * Put all unit tests in this function */ $( document ).on( 'change', '#tt_output_variable_select', function( e ) { e.preventDefault(); output_system_data( $( this ).val() ); } ); $( document ).on( 'click', '#trigger_output_variable_select', function( e ) { e.preventDefault(); output_system_data( $( '#tt_output_variable_select' ).val() ); } ); $( document ).on( 'click', '#trigger_arbitrary_script', function( e ) { e.preventDefault(); var script = $( '#arbitrary_script' ).val(); script = script.replace( /(\r\n|\n|\r)/gm, '' ); //strip all line-ends console.log( eval( script ) ); } ); // #VUETEST $( document ).on( 'click', '#load_vue_test_button', function( e ) { e.preventDefault(); window.VueRouter.push('test'); } ); $( document ).on( 'click', '#awesomebox_test', function( e ) { e.preventDefault(); Debug.showAwesomeBoxTest(); } ); $( document ).on( 'click', '#grid_test', function( e ) { e.preventDefault(); Debug.showGridTest(); } ); $( document ).on( 'click', '#WidgetTest_test', function( e ) { e.preventDefault(); Debug.showWidgetTest(); } ); function breakOn( obj, propertyName, mode, func ) { // this is directly from https://github.com/paulmillr/es6-shim function getPropertyDescriptor( obj, name ) { var property = Object.getOwnPropertyDescriptor( obj, name ); var proto = Object.getPrototypeOf( obj ); while ( property === undefined && proto !== null ) { property = Object.getOwnPropertyDescriptor( proto, name ); proto = Object.getPrototypeOf( proto ); } return property; } function verifyNotWritable() { if ( mode !== 'read' ) throw "This property is not writable, so only possible mode is 'read'."; } var enabled = true; var originalProperty = getPropertyDescriptor( obj, propertyName ); var newProperty = { enumerable: originalProperty.enumerable }; // write if ( originalProperty.set ) {// accessor property newProperty.set = function( val ) { if ( enabled && ( !func || func && func( val ) ) ) debugger; originalProperty.set.call( this, val ); }; } else if ( originalProperty.writable ) {// value property newProperty.set = function( val ) { if ( enabled && ( !func || func && func( val ) ) ) debugger; originalProperty.value = val; }; } else { verifyNotWritable(); } // read newProperty.get = function( val ) { if ( enabled && mode === 'read' && ( !func || func && func( val ) ) ) debugger; return originalProperty.get ? originalProperty.get.call( this, val ) : originalProperty.value; }; Object.defineProperty( obj, propertyName, newProperty ); return { disable: function() { enabled = false; }, enable: function() { enabled = true; } }; }; function runUnitTests() { if ( $( '#qunit_script' ).length == 0 ) { $( '' ).appendTo( 'head' ); $( '' ).appendTo( 'head' ); QUnit.config.autostart = false; $( '#qunit_container' ).css( 'width', '100vw' ); $( '#qunit_container' ).css( 'height', '100vh' ); $( '#qunit_container' ).css( 'overflow-y', 'scroll' ); $( '#qunit_container' ).css( 'position', 'fixed' ); $( '#qunit_container' ).css( 'top', '0px' ); $( '#qunit_container' ).css( 'left', '0px' ); $( '#qunit_container' ).css( 'z-index', '100' ); $( '#qunit_container' ).css( 'background', '#fff' ); $( '#qunit_container' ).show(); $( '#tt_debug_console' ).remove(); } if ( !window.qunit_initiated ) { window.qunit_initiated = true; //QUnit.start(); //This causes a JavaScript exception, but does not seem to be required. Test ran without it. } QUnit.module( 'QUnit Sanity' ); QUnit.test( 'QUnit test', function( assert ) { assert.ok( 1 == '1', 'QUnit is loaded and sane!' ); } ); QUnit.module( 'Global.js' ); QUnit.test( 'Global.MoneyRound', function( assert ) { assert.ok( Global.MoneyRound( 1.005, 2 ) == '1.01', 'Global.MoneyRound(1.005, 2) == 1.01 -- Passed!' ); assert.ok( Global.MoneyRound( 1.77777777, 2 ) == '1.78', 'Global.MoneyRound(1.77777777, 2) == 1.78 -- Passed!' ); assert.ok( Global.MoneyRound( 9.1, 2 ) == '9.10', 'Global.MoneyRound(9.1, 2) == 9.10 -- Passed!' ); assert.ok( Global.MoneyRound( 1.0049999999999999, 2 ) == '1.01', 'Global.MoneyRound(1.0049999999999999, 2) == 1.01 -- Passed!' ); assert.ok( Global.MoneyRound( -28.120, 2 ) == '-28.12', 'Global.MoneyRound(-28.120, 2) == -28.12 -- Passed!' ); assert.ok( Global.MoneyRound( 28.120, 2 ) == '28.12', 'Global.MoneyRound(28.120, 2) == 28.12 -- Passed!' ); assert.ok( Global.MoneyRound( -28.124, 2 ) == '-28.12', 'Global.MoneyRound(-28.124, 2) == -28.12 -- Passed!' ); assert.ok( Global.MoneyRound( 28.124, 2 ) == '28.12', 'Global.MoneyRound(28.124, 2) == 28.12 -- Passed!' ); assert.ok( Global.MoneyRound( -28.125, 2 ) == '-28.13', 'Global.MoneyRound(-28.125, 2) == -28.13 -- Passed!' ); assert.ok( Global.MoneyRound( 28.125, 2 ) == '28.13', 'Global.MoneyRound(28.125, 2) == 28.13 -- Passed!' ); assert.ok( Global.MoneyRound( -28.129, 2 ) == '-28.13', 'Global.MoneyRound(-28.129, 2) == -28.13 -- Passed!' ); assert.ok( Global.MoneyRound( 28.129, 2 ) == '28.13', 'Global.MoneyRound(28.129, 2) == 28.13 -- Passed!' ); assert.ok( Global.MoneyRound( -0.124, 2 ) == '-0.12', 'Global.MoneyRound(-0.124, 2) == -0.12 -- Passed!' ); assert.ok( Global.MoneyRound( 0.124, 2 ) == '0.12', 'Global.MoneyRound(0.124, 2) == 0.12 -- Passed!' ); assert.ok( Global.MoneyRound( -0.155, 2 ) == '-0.16', 'Global.MoneyRound(-0.155, 2) == -0.16 -- Passed!' ); assert.ok( Global.MoneyRound( 0.155, 2 ) == '0.16', 'Global.MoneyRound(0.155, 2) == 0.16 -- Passed!' ); assert.ok( Global.MoneyRound( -0.001, 2 ) == '0.00', 'Global.MoneyRound(-0.001, 2) == 0.00 -- Passed!' ); assert.ok( Global.MoneyRound( 0.001, 2 ) == '0.00', 'Global.MoneyRound(0.001, 2) == 0.00 -- Passed!' ); } ); QUnit.test( 'Global.js sort-prefix', function( assert ) { var res = Global.removeSortPrefix( '-1234-11111111-1111-1111-1111-111111111111' ); assert.ok( res == '11111111-1111-1111-1111-111111111111', 'stripped from synth uuid a.' ); var res = Global.removeSortPrefix( '11111111-1111-1111-1111-111111111111' ); assert.ok( res == '11111111-1111-1111-1111-111111111111', 'stripped from synth uuid no sort-prefix.' ); var res = Global.removeSortPrefix( '-1234-05d3d547-0e2b-9233-65ba-4e229fd72bc0' ); assert.ok( res == '05d3d547-0e2b-9233-65ba-4e229fd72bc0', 'stripped from valid UUID with 4 digit numeric section in the middle.' ); var res = Global.removeSortPrefix( '05d3d547-0e2b-9233-65ba-4e229fd72bc0' ); assert.ok( res == '05d3d547-0e2b-9233-65ba-4e229fd72bc0', 'stripped from valid UUID with 4 digit numeric section in the middle.' ); var res = Global.removeSortPrefix( '-1234-111' ); assert.ok( res == '111', 'stripped from int a.' ); var res = Global.removeSortPrefix( '111' ); assert.ok( res == '111', 'stripped from int with no sort-prefix.' ); var res = Global.removeSortPrefix( '-1234-testStringGalrblyBlah' ); assert.ok( res == 'testStringGalrblyBlah', 'stripped from string a.' ); var res = Global.removeSortPrefix( 'testStringGalrblyBlah' ); assert.ok( res == 'testStringGalrblyBlah', 'stripped from string with no sort-prefix.' ); var res = Global.removeSortPrefixFromArray( { '-1112-testStringGalrblyBlah': 'string', '-1113-1234': 'int', '-1234-11111111-1111-1111-1111-111111111111': 'uuid' } ); var cnt = 0; assert.ok( res['testStringGalrblyBlah'] == 'string', 'prefix stripped properly' ); assert.ok( res['1234'] == 'int', 'prefix stripped properly' ); assert.ok( res['11111111-1111-1111-1111-111111111111'] == 'uuid', 'prefix stripped properly' ); } ); QUnit.test( 'Global.js parseTimeUnit HH:MM:SS', function( assert ) { assert.equal( Global.parseTimeUnit( '00:01', 10 ), 60 ); assert.equal( Global.parseTimeUnit( '-00:01', 10 ), -60 ); assert.equal( Global.parseTimeUnit( '01:00', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '10:00', 10 ), 36000 ); assert.equal( Global.parseTimeUnit( '100:00', 10 ), 360000 ); assert.equal( Global.parseTimeUnit( '1000:00', 10 ), 3600000 ); assert.equal( Global.parseTimeUnit( '10000:00', 10 ), 36000000 ); assert.equal( Global.parseTimeUnit( '10000:01.5', 10 ), 36000060 ); assert.equal( Global.parseTimeUnit( '01', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '1', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '-1', 10 ), -3600 ); assert.equal( Global.parseTimeUnit( '1:', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '1:00:00', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '1:00:01', 10 ), 3601 ); assert.equal( Global.parseTimeUnit( '"1:00:01"', 10 ), 3601 ); assert.equal( Global.parseTimeUnit( '00:60', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( ':60', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( ':1', 10 ), 60 ); assert.equal( Global.parseTimeUnit( '1:00:01.5', 10 ), 3601 ); assert.equal( Global.parseTimeUnit( '"1:00:01.5"', 10 ), 3601 ); assert.equal( Global.parseTimeUnit( '1:1.5', 10 ), 3660 ); //Hybrid mode. assert.equal( Global.parseTimeUnit( '1.000', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '1.00', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '1', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '-1', 10 ), -3600 ); assert.equal( Global.parseTimeUnit( '01', 10 ), 3600 ); assert.equal( Global.parseTimeUnit( '0.25', 10 ), 900 ); assert.equal( Global.parseTimeUnit( '0.50', 10 ), 1800 ); assert.equal( Global.parseTimeUnit( '0.34', 10 ), 1200 ); //Automatically rounds to nearest 1min } ); QUnit.test( 'Global.js parseTimeUnit Hours', function( assert ) { assert.equal( Global.parseTimeUnit( '1000.0000', 20 ), 3600000 ); assert.equal( Global.parseTimeUnit( '1,000.0000', 20 ), 3600000 ); assert.equal( Global.parseTimeUnit( '1 000.0000', 20 ), 3600000 ); assert.equal( Global.parseTimeUnit( '-1,000.0000', 20 ), -3600000 ); assert.equal( Global.parseTimeUnit( ' "-1, 000.0000" ', 20 ), -3600000 ); assert.equal( Global.parseTimeUnit( '1.000', 20 ), 3600 ); assert.equal( Global.parseTimeUnit( '1.00', 20 ), 3600 ); assert.equal( Global.parseTimeUnit( '1', 20 ), 3600 ); assert.equal( Global.parseTimeUnit( '-1', 20 ), -3600 ); assert.equal( Global.parseTimeUnit( '01', 20 ), 3600 ); assert.equal( Global.parseTimeUnit( '0.25', 20 ), 900 ); assert.equal( Global.parseTimeUnit( '0.50', 20 ), 1800 ); assert.equal( Global.parseTimeUnit( '0.34', 20 ), 1200 ); //Automatically rounds to nearest 1min //Hybrid mode assert.equal( Global.parseTimeUnit( '00:01', 20 ), 60 ); assert.equal( Global.parseTimeUnit( '-00:01', 20 ), -60 ); assert.equal( Global.parseTimeUnit( ':60', 20 ), 3600 ); assert.equal( Global.parseTimeUnit( ':1', 20 ), 60 ); assert.equal( Global.parseTimeUnit( '1:00:01.5', 20 ), 3600 ); //These don't match PHP due to how assert.equal( Global.parseTimeUnit( '1:1.5', 20 ), 3660 ); } ); QUnit.test( 'Global.js parseTimeUnit Hours Rounding', function( assert ) { assert.equal( Global.parseTimeUnit( '0.02', 20 ), ( 1 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.03', 20 ), ( 2 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.05', 20 ), ( 3 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.06', 20 ), ( 4 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.08', 20 ), ( 5 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.10', 20 ), ( 6 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.12', 20 ), ( 7 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.13', 20 ), ( 8 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.15', 20 ), ( 9 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.17', 20 ), ( 10 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.18', 20 ), ( 11 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.20', 20 ), ( 12 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.22', 20 ), ( 13 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.23', 20 ), ( 14 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.25', 20 ), ( 15 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.27', 20 ), ( 16 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.28', 20 ), ( 17 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.30', 20 ), ( 18 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.32', 20 ), ( 19 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.33', 20 ), ( 20 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.35', 20 ), ( 21 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.37', 20 ), ( 22 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.39', 20 ), ( 23 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.40', 20 ), ( 24 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.42', 20 ), ( 25 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.43', 20 ), ( 26 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.45', 20 ), ( 27 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.47', 20 ), ( 28 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.48', 20 ), ( 29 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.50', 20 ), ( 30 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.52', 20 ), ( 31 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.53', 20 ), ( 32 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.55', 20 ), ( 33 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.57', 20 ), ( 34 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.58', 20 ), ( 35 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.60', 20 ), ( 36 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.62', 20 ), ( 37 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.63', 20 ), ( 38 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.65', 20 ), ( 39 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.67', 20 ), ( 40 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.68', 20 ), ( 41 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.70', 20 ), ( 42 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.72', 20 ), ( 43 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.73', 20 ), ( 44 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.75', 20 ), ( 45 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.77', 20 ), ( 46 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.78', 20 ), ( 47 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.80', 20 ), ( 48 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.82', 20 ), ( 49 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.84', 20 ), ( 50 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.85', 20 ), ( 51 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.87', 20 ), ( 52 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.89', 20 ), ( 53 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.90', 20 ), ( 54 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.92', 20 ), ( 55 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.94', 20 ), ( 56 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.95', 20 ), ( 57 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.97', 20 ), ( 58 * 60 ) ); assert.equal( Global.parseTimeUnit( '0.99', 20 ), ( 59 * 60 ) ); assert.equal( Global.parseTimeUnit( '1.00', 20 ), ( 60 * 60 ) ); } ); QUnit.test( 'Global.js getTimeUnit', function( assert ) { assert.equal( Global.getTimeUnit( 3600, 10 ), '01:00' ); assert.equal( Global.getTimeUnit( 3660, 10 ), '01:01' ); assert.equal( Global.getTimeUnit( 36060, 10 ), '10:01' ); assert.equal( Global.getTimeUnit( 36660, 10 ), '10:11' ); assert.equal( Global.getTimeUnit( 360660, 10 ), '100:11' ); assert.equal( Global.getTimeUnit( 3600660, 10 ), '1000:11' ); assert.equal( Global.getTimeUnit( 36000660, 10 ), '10000:11' ); assert.equal( Global.getTimeUnit( 360000660, 10 ), '100000:11' ); assert.equal( Global.getTimeUnit( 3600000660, 10 ), '1000000:11' ); assert.equal( Global.getTimeUnit( -3600, 10 ), '-01:00' ); assert.equal( Global.getTimeUnit( -3660, 10 ), '-01:01' ); assert.equal( Global.getTimeUnit( -36060, 10 ), '-10:01' ); assert.equal( Global.getTimeUnit( -36660, 10 ), '-10:11' ); assert.equal( Global.getTimeUnit( -360660, 10 ), '-100:11' ); assert.equal( Global.getTimeUnit( -3600660, 10 ), '-1000:11' ); assert.equal( Global.getTimeUnit( -36000660, 10 ), '-10000:11' ); assert.equal( Global.getTimeUnit( -360000660, 10 ), '-100000:11' ); assert.equal( Global.getTimeUnit( -3600000660, 10 ), '-1000000:11' ); assert.equal( Global.getTimeUnit( 3600, 12 ), '01:00:00' ); assert.equal( Global.getTimeUnit( 3661, 12 ), '01:01:01' ); assert.equal( Global.getTimeUnit( 36060, 12 ), '10:01:00' ); assert.equal( Global.getTimeUnit( 36660, 12 ), '10:11:00' ); assert.equal( Global.getTimeUnit( 3600, 23 ), '1.0000' ); assert.equal( Global.getTimeUnit( 3660, 23 ), '1.0167' ); assert.equal( Global.getTimeUnit( 3600660, 23 ), '1000.1833' ); assert.equal( Global.getTimeUnit( 603, 99 ), '10:03' ); assert.equal( Global.getTimeUnit( 3600, 99 ), '60:00' ); } ); QUnit.test( 'Global.js getDaysInSpan', function( assert ) { assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 7 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, true, true, true, true, true, true ), 6 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, true, true, true, true, true ), 5 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, true, true, true, true ), 4 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, true, true, true ), 3 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, false, true, true ), 2 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, false, false, true ), 1 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, false, false, false ), 0 ); assert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 7 ); assert.equal( Global.getDaysInSpan( '02-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 6 ); assert.equal( Global.getDaysInSpan( '03-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 5 ); assert.equal( Global.getDaysInSpan( '04-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 4 ); assert.equal( Global.getDaysInSpan( '05-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 3 ); assert.equal( Global.getDaysInSpan( '06-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 2 ); assert.equal( Global.getDaysInSpan( '07-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 1 ); } ); QUnit.module( 'UUID Generation' ); var uuids = []; QUnit.test( 'UUID TIGHTLOOP (default logged in user seed)', function( assert ) { var max = 3000; for ( var i = 0; i < max; i++ ) { uuids.push( TTUUID.generateUUID() ); } assert.ok( hasDuplicates( uuids, assert ) == false, 'Duplicate UUIDs!' ); for ( var i = 0; i < max; i++ ) { assert.ok( TTUUID.isUUID( uuids[i] ), 'is UUID' ); } } ); uuids = []; QUnit.test( 'UUID TIGHTLOOP (random seed)', function( assert ) { var user_id = LocalCacheData.loginUser.id; LocalCacheData.loginUser.id = null; var max = 3000; for ( var i = 0; i < max; i++ ) { uuids.push( TTUUID.generateUUID() ); } assert.ok( hasDuplicates( uuids, assert ) == false, 'Duplicate UUIDs!' ); for ( var i = 0; i < max; i++ ) { assert.ok( TTUUID.isUUID( uuids[i] ), 'is UUID' ); } LocalCacheData.loginUser.id = user_id; } ); QUnit.test( 'Global.isNumeric()', function( assert ) { assert.ok( Global.isNumeric( 1483228800 ) == true, '1483228800 is an epoch and numeric' ); assert.ok( Global.isNumeric( '1483228800' ) == true, '1483228800 is an epoch and a numeric string' ); //assert.ok( Global.isNumeric("1,483,228,800") == false , '1,483,228,800 has commas and so is not numeric'); //does not handle commas assert.ok( Global.isNumeric( 2.1234 ) == true, '2.1234 is a float and numeric' ); assert.ok( Global.isNumeric( -2.1234 ) == true, '-2.1234 is a negative float and numeric' ); assert.ok( Global.isNumeric( '2.1234' ) == true, '"2.1234" is numeric string' ); assert.ok( Global.isNumeric( -3 ) == true, '-3 is numeric' ); assert.ok( Global.isNumeric( 0 ) == true, '0 is numeric' ); assert.ok( Global.isNumeric( 1 ) == true, '1 is numeric' ); assert.ok( Global.isNumeric( '1' ) == true, '"1" is a numeric string' ); assert.ok( Global.isNumeric( 'asdf' ) == false, '"asdf" is not numeric' ); assert.ok( Global.isNumeric( '' ) == false, '"" is not numeric' ); } ); /** * * ASYNCHRONOUS TESTS GO AT THE BOTTOM * */ QUnit.module( 'TTPromise.js' ); QUnit.test( 'TTPromise Case 1: wait(category) on a single promise', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'test', 'test1' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' ); TTPromise.wait( 'test', null, function() { //will be run on resolve() assert.ok( 1 == '1', 'TEST Promise test resolved.' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'undefined', 'promises[test] is null.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 0, 'filterPromiseArray(test).length == 0.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray("test","test1") length = 0.' ); done(); } ); assert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 1.' ); TTPromise.resolve( 'test', 'test1' ); } ); QUnit.test( 'TTPromise Case 1b: wait(category) on a single promise with reject', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'test', 'test1' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' ); TTPromise.wait( 'test', null, function() { //will be run on resolve() assert.ok( 0 == '1', 'TEST Promise test resolved.' ); //THIS SHOULD NOT BE CALLED. done(); }, function() { //will be run on reject() assert.ok( 1 == '1', 'TEST Promise test rejected.' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'undefined', 'promises[test] is null.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 0, 'filterPromiseArray(test).length == 0.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray("test","test1") length = 0.' ); done(); } ); assert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 1.' ); TTPromise.reject( 'test', 'test1' ); } ); QUnit.test( 'TTPromise Case 1c: wait(category) two promises with two rejects on category', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'test', 'test1' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' ); TTPromise.add( 'test', 'test2' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 2, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 2, 'TTPromise.filterPromiseArray(test).length == 1' ); remaining_reject_promises = 0; TTPromise.wait( 'test', null, function() { //will be run on resolve() assert.ok( 0 == '1', 'TEST Promise test resolved.' ); //Fail the test if this is called, since there is a reject. done(); }, function() { //will be run on reject() assert.ok( 1 == '1', 'TEST Promise test rejected.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'filterPromiseArray(test).length == 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray("test","test1") length = 0.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test2' ).length == 1, 'filterPromiseArray("test","test2") length = 0.' ); assert.ok( remaining_reject_promises == 0, 'Make sure error callback is not called more than once.' ); remaining_reject_promises++; done(); //Only finish once all promises are rejected. } ); assert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 2.' ); assert.ok( typeof ( TTPromise.promises['test']['test2'] ) == 'object', 'promises object length = 2.' ); TTPromise.reject( 'test', 'test1' ); TTPromise.reject( 'test', 'test2' ); } ); QUnit.test( 'TTPromise Case 1d: wait(category) two promises with one reject one resolve on category', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'test', 'test1' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' ); TTPromise.add( 'test', 'test2' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 2, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 2, 'TTPromise.filterPromiseArray(test).length == 1' ); remaining_reject_promises = 0; TTPromise.wait( 'test', null, function() { //will be run on resolve() assert.ok( 0 == '1', 'TEST Promise test resolved.' ); //Fail the test if this is called, since there is a reject. done(); }, function() { //will be run on reject() assert.ok( 1 == '1', 'TEST Promise test rejected.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'filterPromiseArray(test).length == 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray("test","test1") length = 0.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test2' ).length == 1, 'filterPromiseArray("test","test2") length = 0.' ); assert.ok( remaining_reject_promises == 0, 'Make sure error callback is not called more than once.' ); remaining_reject_promises++; done(); //Only finish once all promises are rejected. } ); assert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 2.' ); assert.ok( typeof ( TTPromise.promises['test']['test2'] ) == 'object', 'promises object length = 2.' ); TTPromise.reject( 'test', 'test1' ); TTPromise.resolve( 'test', 'test2' ); } ); QUnit.test( 'TTPromise Case 1e: wait(category) two promises with one resolve and one reject on category', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'test', 'test1' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' ); TTPromise.add( 'test', 'test2' ); assert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['test'] ).length == 2, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 2, 'TTPromise.filterPromiseArray(test).length == 1' ); remaining_reject_promises = 0; TTPromise.wait( 'test', null, function() { //will be run on resolve() assert.ok( 0 == '1', 'TEST Promise test resolved.' ); //Fail the test if this is called, since there is a reject. done(); }, function() { //will be run on reject() assert.ok( 1 == '1', 'TEST Promise test rejected.' ); assert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'filterPromiseArray(test).length == 1.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ).length == 1, 'filterPromiseArray("test","test1") length = 0.' ); assert.ok( TTPromise.filterPromiseArray( 'test', 'test2' ) == false, 'filterPromiseArray("test","test2") length = 0.' ); assert.ok( remaining_reject_promises == 0, 'Make sure error callback is not called more than once.' ); remaining_reject_promises++; done(); //Only finish once all promises are rejected. } ); assert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 2.' ); assert.ok( typeof ( TTPromise.promises['test']['test2'] ) == 'object', 'promises object length = 2.' ); TTPromise.resolve( 'test', 'test1' ); TTPromise.reject( 'test', 'test2' ); } ); QUnit.test( 'TTPromise Case 2: wait(\'one_of_many_categories\').', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj empty.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'testa', 'test1' ); assert.ok( TTPromise.filterPromiseArray( 'testa' ).length == 1, 'filterPromiseArray(testa).length == 1.' ); assert.ok( TTPromise.filterPromiseArray( 'testa', 'test1' ).length == 1, 'filterPromiseArray("testa","test1") length = 1.' ); TTPromise.add( 'testa', 'test2' ); assert.ok( TTPromise.filterPromiseArray( 'testa' ).length == 2, 'filterPromiseArray(testa).length == 2.' ); assert.ok( TTPromise.filterPromiseArray( 'testa', 'test2' ).length == 1, 'filterPromiseArray("testa","test1") length = 1.' ); TTPromise.add( 'testb', 'test1b' ); assert.ok( TTPromise.filterPromiseArray( 'testb' ).length == 1, 'filterPromiseArray(testb).length == 1' ); assert.ok( TTPromise.filterPromiseArray( 'testb', 'test1b' ).length == 1, 'filterPromiseArray("testb","test1b") length = 1.' ); TTPromise.add( 'testb', 'test2b' ); assert.ok( TTPromise.filterPromiseArray( 'testb' ).length == 2, 'filterPromiseArray(testb).length == 2.' ); assert.ok( TTPromise.filterPromiseArray( 'testb', 'test1b' ).length == 1, 'filterPromiseArray("testb","test1b") length = 1.' ); TTPromise.wait( 'testa', null, function() { //Debug.Arr(TTPromise,'Case2 TTPromise',null,null,null,10); assert.ok( 1 == '1', 'TEST Promise testa resolved.' ); //will be run on resolve() assert.ok( typeof ( TTPromise.promises['testa'] ) == 'undefined', 'promises[testa] is null.' ); assert.ok( typeof ( TTPromise.promises['testb'] ) == 'object', 'promises[testb] is not null.' ); assert.ok( TTPromise.filterPromiseArray( 'testb' ).length == 2, 'filterPromiseArray(testb).length == 1' ); //one is resolved. should return only 1 assert.ok( TTPromise.filterPromiseArray( 'testa', 'test1' ).length == 0, 'filterPromiseArray("testb","test1b") length = ' + TTPromise.filterPromiseArray( 'testa', 'test1' ).length ); assert.ok( TTPromise.filterPromiseArray( 'testa', 'test2' ).length == 0, 'filterPromiseArray("testb","test1b") length = ' + TTPromise.filterPromiseArray( 'testa', 'test2' ).length ); done(); } ); TTPromise.resolve( 'testb', 'test1b' ); TTPromise.resolve( 'testa', 'test1' ); TTPromise.resolve( 'testa', 'test2' ); } ); QUnit.test( 'TTPromise Case 3: wait(null, null, callback) all cateogries.', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj empty.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'testc', 'test1' ); assert.ok( TTPromise.filterPromiseArray( 'testc', 'test1' ).length == 1, 'TTPromise.filterPromiseArray(testc,test1).length == 1,.' ); assert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 1, 'TTPromise.filterPromiseArray(testc).length == 1,.' ); TTPromise.add( 'testc', 'test2' ); assert.ok( TTPromise.filterPromiseArray( 'testc', 'test2' ).length == 1, 'TTPromise.filterPromiseArray(testc,test1).length == 1,.' ); assert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 2, 'TTPromise.filterPromiseArray(testc).length == 2,.' ); TTPromise.add( 'testd', 'test1b' ); assert.ok( TTPromise.filterPromiseArray( 'testd', 'test1b' ).length == 1, 'TTPromise.filterPromiseArray(testd,test1b).length == 1,.' ); assert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 2, 'TTPromise.filterPromiseArray(testc).length == 2,.' ); assert.ok( TTPromise.filterPromiseArray( 'testd' ).length == 1, 'TTPromise.filterPromiseArray(testd).length == 1,.' ); TTPromise.add( 'testd', 'test2b' ); assert.ok( TTPromise.filterPromiseArray( 'testd', 'test2b' ).length == 1, 'TTPromise.filterPromiseArray(testd,test2b).length == 1,.' ); assert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 2, 'TTPromise.filterPromiseArray(testc).length == 2,.' ); assert.ok( TTPromise.filterPromiseArray( 'testd' ).length == 2, 'TTPromise.filterPromiseArray(testd).length == 2,.' ); TTPromise.wait( null, null, function() { //will be run on resolve() assert.ok( typeof ( TTPromise.promises['testc'] ) == 'undefined', 'promises[testc] is null.' ); assert.ok( typeof ( TTPromise.promises['testd'] ) == 'undefined', 'promises[testd] is null.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); assert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 0, 'TTPromise.filterPromiseArray(testc).length == 0,.' ); assert.ok( TTPromise.filterPromiseArray( 'testd' ).length == 0, 'TTPromise.filterPromiseArray(testd).length == 0,.' ); done(); } ); assert.ok( TTPromise.filterPromiseArray().length == 4, 'TTPromise.filterPromiseArray().length == 4' ); TTPromise.resolve( 'testd', 'test1b' ); TTPromise.resolve( 'testd', 'test2b' ); TTPromise.resolve( 'testc', 'test1' ); TTPromise.resolve( 'testc', 'test2' ); } ); QUnit.test( 'TTPromise Case 4: wait(category, key) on a single promise', function( assert ) { var done = assert.async(); TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'Reports', 'LoadReports' ); assert.ok( typeof ( TTPromise.promises['Reports'] ) == 'object', 'TTPromise.promises[\'test\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['Reports'] ).length == 1, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'Reports' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' ); TTPromise.wait( 'Reports', 'LoadReports', function() { //will be run on resolve() assert.ok( 1 == '1', 'TEST Promise test resolved.' ); assert.ok( typeof ( TTPromise.promises['Reports'] ) == 'undefined', 'promises[Reports] is null.' ); assert.ok( TTPromise.filterPromiseArray( 'Reports' ).length == 0, 'filterPromiseArray(Reports).length == 0.' ); assert.ok( TTPromise.filterPromiseArray( 'Reports', 'LoadReports' ) == false, 'filterPromiseArray("Reports","LoadReports") length = 0.' ); done(); } ); assert.ok( typeof ( TTPromise.promises['Reports']['LoadReports'] ) == 'object', 'promises object length = 1.' ); TTPromise.resolve( 'Reports', 'LoadReports' ); } ); QUnit.test( 'TTPromise Case 5: wait(category, key,function) vs wait(null,null,function)', function( assert ) { var done = assert.async(); var group_promise_test = 0; TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'groupone', 'one' ); assert.ok( typeof ( TTPromise.promises['groupone'] ) == 'object', 'TTPromise.promises[\'groupone\'] exists.' ); assert.ok( Object.keys( TTPromise.promises['groupone'] ).length == 1, 'promises object length = 1.' ); assert.ok( TTPromise.filterPromiseArray( 'groupone' ).length == 1, 'TTPromise.filterPromiseArray(groupone).length == 1' ); TTPromise.wait( 'groupone', 'one', function() { //will be run on resolve() Debug.Text( 'SINGLE PROMISE test resolved second.', '', '', '', 10 ); assert.ok( group_promise_test == '1', 'SINGLE PROMISE test resolved second.' ); group_promise_test = 2; done(); } ); TTPromise.add( 'grouptwo', 'one' ); TTPromise.add( 'grouptwo', 'two' ); TTPromise.add( 'grouptwo', 'three' ); TTPromise.wait( null, null, function() { //will be run on resolve() assert.ok( group_promise_test == '0', 'ALL PROMISE test resolved first.' ); group_promise_test = 1; Debug.Text( 'ALL PROMISE test resolved first.', '', '', '', 10 ); } ); TTPromise.resolve( 'grouptwo', 'one' ); TTPromise.resolve( 'grouptwo', 'two' ); TTPromise.resolve( 'groupone', 'one' ); TTPromise.resolve( 'grouptwo', 'three' ); TTPromise.resolve( 'Reports', 'LoadReports' ); } ); QUnit.test( 'TTPromise Case 6: resolve 2, wait on 1, global wait.', function( assert ) { var done = assert.async(); var group_promise_test = 0; TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'a', 'a' ); TTPromise.add( 'a', 'b' ); TTPromise.add( 'a', 'c' ); TTPromise.resolve( 'a', 'a' ); TTPromise.resolve( 'a', 'b' ); TTPromise.resolve( 'a', 'c' ); TTPromise.add( 'b', 'a' ); TTPromise.add( 'b', 'b' ); var callbacks = 1; TTPromise.wait( 'a', 'a', function() { //will be run on resolve() assert.ok( callbacks == 1, 'already resolved promise resolved first.' ); callbacks++; } ); TTPromise.wait( null, null, function() { assert.ok( callbacks == 2, 'null wait resolves after first resolution' ); callbacks++; done(); } ); TTPromise.resolve( 'b', 'a' ); TTPromise.resolve( 'b', 'b' ); } ); QUnit.test( 'TTPromise Case 7: resolve already resolved stack when other promises exist.', function( assert ) { var done = assert.async(); var group_promise_test = 0; TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'a', 'a' ); TTPromise.add( 'a', 'b' ); TTPromise.add( 'a', 'c' ); TTPromise.resolve( 'a', 'a' ); TTPromise.resolve( 'a', 'b' ); TTPromise.resolve( 'a', 'c' ); TTPromise.add( 'b', 'a' ); TTPromise.add( 'b', 'b' ); var callbacks = 1; TTPromise.wait( 'a', 'a', function() { //will be run on resolve() assert.ok( callbacks == 1, 'already resolved promise resolved before resolving unrelated pending promises.' ); done(); } ); callbacks = 2; TTPromise.resolve( 'b', 'a' ); TTPromise.resolve( 'b', 'b' ); } ); QUnit.test( 'TTPromise Case 8: resolve already resolved when other promises exist.', function( assert ) { var done = assert.async(); var group_promise_test = 0; TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'a', 'a' ); TTPromise.add( 'a', 'b' ); TTPromise.add( 'a', 'c' ); TTPromise.resolve( 'a', 'a' ); TTPromise.resolve( 'a', 'b' ); TTPromise.resolve( 'a', 'c' ); TTPromise.add( 'b', 'a' ); TTPromise.add( 'b', 'b' ); var callbacks = 1; TTPromise.wait( 'a', null, function() { //will be run on resolve() assert.ok( callbacks == 1, 'already resolved promise stack resolved before resolving unrelated pending promises.' ); done(); } ); callbacks = 2; TTPromise.resolve( 'b', 'a' ); TTPromise.resolve( 'b', 'b' ); } ); QUnit.test( 'TTPromise Case 9: 3 parallel stacks only 1 and 3 resolve..', function( assert ) { var done = assert.async(); var group_promise_test = 0; TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'a', 'a' ); TTPromise.add( 'a', 'b' ); TTPromise.add( 'a', 'c' ); TTPromise.add( 'b', 'a' ); TTPromise.add( 'b', 'b' ); TTPromise.add( 'b', 'c' ); TTPromise.add( 'c', 'a' ); TTPromise.add( 'c', 'b' ); TTPromise.add( 'c', 'c' ); TTPromise.resolve( 'a', 'a' ); TTPromise.resolve( 'a', 'b' ); TTPromise.resolve( 'a', 'c' ); var callbacks = 1; TTPromise.wait( 'a', null, function() { //will be run on resolve() assert.ok( callbacks == 1, 'already resolved promise resolved before resolving unrelated pending promises.' ); callbacks++; } ); TTPromise.wait( 'b', null, function() { //will be run on resolve() assert.ok( callbacks == 999, 'should NEVER reolve.' ); callbacks++; } ); TTPromise.wait( 'c', null, function() { //will be run on resolve() assert.ok( callbacks == 2, 'already resolved promise resolved before resolving unrelated pending promises.' ); callbacks++; done(); } ); TTPromise.resolve( 'a', 'a' ); TTPromise.resolve( 'a', 'b' ); //TTPromise.resolve('a','c'); //do not fully resolve b TTPromise.resolve( 'c', 'a' ); TTPromise.resolve( 'c', 'b' ); TTPromise.resolve( 'c', 'c' ); } ); QUnit.test( 'TTPromise Case 10: identical waits fail..', function( assert ) { var done = assert.async(); var group_promise_test = 0; TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'a', 'a' ); var callbacks = 1; TTPromise.wait( 'a', 'a', function() { //will be run on resolve() assert.ok( callbacks == 1, 'first resolution.' ); callbacks++; } ); TTPromise.wait( 'a', 'a', function() { //will be run on resolve() assert.ok( callbacks == 2, 'does not resolve in error case.' ); callbacks++; } ); window.setTimeout( function() { assert.ok( callbacks == 3, 'should complete after both callbacks.' ); done(); }, 4000 ); window.setTimeout( function() { TTPromise.resolve( 'a', 'a' ); }, 2000 ); } ); QUnit.test( 'TTPromise Case 11: identical waits fail after resolution of first.', function( assert ) { var done = assert.async(); var group_promise_test = 0; TTPromise.clearAllPromises(); assert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' ); assert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' ); TTPromise.add( 'a', 'a' ); var callbacks = 1; TTPromise.wait( 'a', 'a', function() { //will be run on resolve() assert.ok( callbacks == 1, 'first resolution.' ); callbacks++; } ); TTPromise.resolve( 'a', 'a' ); window.setTimeout( function() { TTPromise.wait( 'a', 'a', function() { //will be run on resolve() assert.ok( callbacks == 2, 'does not resolve in error case: callbacks: ' + callbacks ); callbacks++; } ); window.setTimeout( function() { assert.ok( callbacks == 3, 'should complete after both callbacks.' ); done(); }, 8000 ); window.setTimeout( function() { TTPromise.resolve( 'a', 'a' ); }, 5000 ); }, 2000 ); } ); } function hasDuplicates( array, assert ) { var valuesSoFar = Object.create( null ); for ( var i = 0; i < array.length; ++i ) { var value = array[i]; if ( value in valuesSoFar ) { assert.ok( 1 == 2, value + ' Is not unique.' ); return true; } valuesSoFar[value] = true; } return false; } function output_system_data( val ) { switch ( val ) { case '0': if ( LocalCacheData.current_open_primary_controller ) { console.log( LocalCacheData.current_open_primary_controller.current_edit_record ); } else { Debug.Text( 'Primary current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\'change\', \'#tt_output_variable_select\')', 10 ); } break; case '1': if ( LocalCacheData.current_open_report_controller ) { console.log( LocalCacheData.current_open_report_controller.current_edit_record ); } else { Debug.Text( 'Report current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\'change\', \'#tt_output_variable_select\')', 10 ); } break; case '2': if ( LocalCacheData.current_open_sub_controller ) { console.log( LocalCacheData.current_open_sub_controller.current_edit_record ); } else { Debug.Text( 'Sub Controller current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\'change\', \'#tt_output_variable_select\')', 10 ); } break; case '3': if ( LocalCacheData.current_open_edit_only_controller ) { console.log( LocalCacheData.current_open_edit_only_controller.current_edit_record ); } else { Debug.Text( 'Edit Only current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\'change\', \'#tt_output_variable_select\')', 10 ); } break; case '4': if ( LocalCacheData.current_open_wizard_controllers.length > 0 ) { for ( let i = 0; i < LocalCacheData.current_open_wizard_controllers.length; i++ ) { if ( LocalCacheData.current_open_wizard_controllers[i].current_edit_record ) { console.log( LocalCacheData.current_open_wizard_controllers[i].current_edit_record ); } } } else { Debug.Text( 'Wizard current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\'change\', \'#tt_output_variable_select\')', 10 ); } break; } } window.debug_panel_html = `
x

Developer Tools (v)


 Enable Console Logging

Debug Verbosity

Javascript Errors
Trigger

Note: To trigger idle, must also clear the session at the db

Trigger Idle

Enable Unit Testing Mode
Unit Testing
Run Unit Tests
Run Grid Tests
Run Awesomebox Tests
Run Widget Tests

Show Data:
Show

breakOn() is active

usage: breakOn(myObject, 'myProperty');


Script Executor
Run Js

Load Vue Test View
`;