| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | #!/usr/bin/env node
 | 
					
						
							|  |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							| 
									
										
										
										
											2020-10-06 01:32:33 +03:00
										 |  |  | **********************************************/  /* c8 ignore next 2 */ | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | ((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define) | 
					
						
							|  |  |  | (function(require){ var module={} // make module AMD/node compatible...
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var colors = require('colors') | 
					
						
							|  |  |  | var test = require('ig-test') | 
					
						
							| 
									
										
										
										
											2020-10-06 03:09:44 +03:00
										 |  |  | var object = require('ig-object') | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | var types = require('./main') | 
					
						
							| 
									
										
										
										
											2020-11-05 16:40:41 +03:00
										 |  |  | var promise = require('./Promise') | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | var containers = require('./containers') | 
					
						
							|  |  |  | 	var generator = require('./generator') | 
					
						
							|  |  |  | var events = require('./event') | 
					
						
							| 
									
										
										
										
											2020-11-15 03:14:28 +03:00
										 |  |  | var runner = require('./runner') | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //---------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-07 03:03:41 +03:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | var setups = test.Setups({ | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var modifiers = test.Modifiers({ | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var tests = test.Tests({ | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2020-10-07 03:03:41 +03:00
										 |  |  | //*/
 | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var cases = test.Cases({ | 
					
						
							| 
									
										
										
										
											2020-10-06 03:09:44 +03:00
										 |  |  | 	// Object.js
 | 
					
						
							| 
									
										
										
										
											2020-10-08 15:09:21 +03:00
										 |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2020-10-06 03:09:44 +03:00
										 |  |  | 	Object: function(assert){ | 
					
						
							|  |  |  | 		var o = Object.assign( | 
					
						
							|  |  |  | 			Object.create({ | 
					
						
							|  |  |  | 				x: 111, | 
					
						
							|  |  |  | 				y: 222, | 
					
						
							|  |  |  | 			}), { | 
					
						
							|  |  |  | 				y: 333, | 
					
						
							|  |  |  | 				z: 444, | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2020-10-07 16:46:59 +03:00
										 |  |  | 		var oo = assert(Object.flatCopy(o), 'Object.flatCopy(..)') | 
					
						
							| 
									
										
										
										
											2020-10-06 03:09:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-07 16:46:59 +03:00
										 |  |  | 		assert(Object.match(oo, {x: 111, y: 333, z: 444}), 'Object.match(..)') | 
					
						
							| 
									
										
										
										
											2020-10-08 15:09:21 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var k = ['z', 'x', 'y'] | 
					
						
							|  |  |  | 		assert(Object.keys(Object.sort(oo, k)).cmp(k), 'Object.sort(,,)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(Object.keys(Object.sort(oo)).cmp(k.slice().sort()), 'Object.sort(,,)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var cmp = function(a, b){ | 
					
						
							|  |  |  | 			return a == 'y' ? | 
					
						
							|  |  |  | 					1 | 
					
						
							|  |  |  | 				: a == 'z' ? | 
					
						
							|  |  |  | 					-1 | 
					
						
							|  |  |  | 				: 0 } | 
					
						
							|  |  |  | 		assert(Object.keys(Object.sort(oo, cmp)).cmp(k.slice().sort(cmp)), 'Object.sort(,,)') | 
					
						
							| 
									
										
										
										
											2020-10-06 03:09:44 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2020-10-06 03:36:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 02:43:16 +03:00
										 |  |  | 	// Array.js
 | 
					
						
							| 
									
										
										
										
											2020-10-09 05:55:53 +03:00
										 |  |  | 	// 	- flat (???)
 | 
					
						
							|  |  |  | 	// 	- includes (???)
 | 
					
						
							| 
									
										
										
										
											2020-10-06 02:43:16 +03:00
										 |  |  | 	// 	- first
 | 
					
						
							|  |  |  | 	// 	- last
 | 
					
						
							|  |  |  | 	// 	- compact
 | 
					
						
							|  |  |  | 	// 	- len
 | 
					
						
							|  |  |  | 	// 	- unique
 | 
					
						
							|  |  |  | 	// 	- tailUnique
 | 
					
						
							|  |  |  | 	// 	- cmp
 | 
					
						
							|  |  |  | 	// 	- setCmp
 | 
					
						
							|  |  |  | 	// 	- sortAs
 | 
					
						
							|  |  |  | 	// 	- mapChunks
 | 
					
						
							|  |  |  | 	// 	- filterChunks
 | 
					
						
							|  |  |  | 	// 	- reduceChunks
 | 
					
						
							| 
									
										
										
										
											2020-10-09 05:55:53 +03:00
										 |  |  | 	// 	- toKeys
 | 
					
						
							|  |  |  | 	// 	- toMap
 | 
					
						
							| 
									
										
										
										
											2020-10-06 02:43:16 +03:00
										 |  |  | 	Array: function(assert){ | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2020-10-07 03:53:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Set.js
 | 
					
						
							|  |  |  | 	// 	- unite
 | 
					
						
							|  |  |  | 	// 	- intersect
 | 
					
						
							|  |  |  | 	// 	- subtract
 | 
					
						
							| 
									
										
										
										
											2020-10-08 15:09:21 +03:00
										 |  |  | 	// 	- sort
 | 
					
						
							|  |  |  | 	Set: function(assert){ | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// Map.js
 | 
					
						
							|  |  |  | 	// 	- sort
 | 
					
						
							|  |  |  | 	Map: function(assert){ | 
					
						
							| 
									
										
										
										
											2020-11-22 23:50:05 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Generator: function(assert){ | 
					
						
							| 
									
										
										
										
											2020-10-07 03:53:10 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2020-10-06 02:43:16 +03:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2020-10-07 03:53:10 +03:00
										 |  |  | 	String: function(assert){ | 
					
						
							|  |  |  | 		assert(''.capitalize() == '') | 
					
						
							|  |  |  | 		assert('a'.capitalize() == 'A') | 
					
						
							|  |  |  | 		assert('abc'.capitalize() == 'Abc') | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RegExp: function(assert){ | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 	IterablePromise: test.TestSet(function(){ | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 		var create = function(assert, value, expected){ | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 			return { | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 				input: expected ?? value,  | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 				output: assert(Promise.iter(value), 'Promise.iter(', value, ')'), | 
					
						
							|  |  |  | 			} } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		this.Setup({ | 
					
						
							|  |  |  | 			empty: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, []) }, | 
					
						
							|  |  |  | 			value: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, 123) }, | 
					
						
							|  |  |  | 			array: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, [1, 2, 3]) }, | 
					
						
							|  |  |  | 			nested_array: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, [1, 2, [3]]) }, | 
					
						
							|  |  |  | 			promise_value: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, Promise.resolve(123)) }, | 
					
						
							|  |  |  | 			promise_array: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, Promise.resolve([1, 2, 3])) }, | 
					
						
							|  |  |  | 			promise_nested_array: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, Promise.resolve([1, 2, [3]])) }, | 
					
						
							|  |  |  | 			array_mixed: function(assert){ | 
					
						
							|  |  |  | 				return create(assert, [1, Promise.resolve(2), 3]) }, | 
					
						
							|  |  |  | 			nested_array_mixed: function(assert){ | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 				return create(assert,  | 
					
						
							|  |  |  | 					[1, Promise.resolve(2), [3], Promise.resolve([4])], | 
					
						
							|  |  |  | 					[1, 2, [3], [4]]) }, | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 			promise_array_mixed: function(assert){ | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 				return create(assert,  | 
					
						
							|  |  |  | 					Promise.resolve([1, Promise.resolve(2), 3]),  | 
					
						
							|  |  |  | 					[1, 2, 3]) }, | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 			promise_nested_array_mixed: function(assert){ | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 				return create(assert,  | 
					
						
							|  |  |  | 					Promise.resolve([1, Promise.resolve(2), [3], Promise.resolve([4])]), | 
					
						
							|  |  |  | 					[1, 2, [3], [4]]) }, | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		this.Modifier({ | 
					
						
							|  |  |  | 			nest: function(assert, setup){ | 
					
						
							|  |  |  | 				setup.output = Promise.iter(setup.output) | 
					
						
							|  |  |  | 				return setup }, | 
					
						
							|  |  |  | 			iter: function(assert, setup){ | 
					
						
							|  |  |  | 				setup.output = setup.output.iter() | 
					
						
							|  |  |  | 				return setup }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			map_asis: function(assert, setup){ | 
					
						
							|  |  |  | 				setup.output = setup.output | 
					
						
							|  |  |  | 					.map(function(e){  | 
					
						
							|  |  |  | 						return e })  | 
					
						
							|  |  |  | 				return setup }, | 
					
						
							|  |  |  | 			map_promise: function(assert, setup){ | 
					
						
							|  |  |  | 				setup.output = setup.output | 
					
						
							|  |  |  | 					.map(function(e){  | 
					
						
							|  |  |  | 						return Promise.resolve(e) })  | 
					
						
							|  |  |  | 				return setup }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			filter_all: function(assert, setup){ | 
					
						
							|  |  |  | 				setup.output = setup.output | 
					
						
							|  |  |  | 					.filter(function(e){ return true })  | 
					
						
							|  |  |  | 				return setup }, | 
					
						
							|  |  |  | 			// XXX either the test is worng or something is broken...
 | 
					
						
							|  |  |  | 			filter_none: function(assert, setup){ | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					input: [], | 
					
						
							|  |  |  | 					output: setup.output | 
					
						
							|  |  |  | 						.filter(function(e){ return false }), | 
					
						
							|  |  |  | 				} }, | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 			filter_promise_all: function(assert, setup){ | 
					
						
							|  |  |  | 				setup.output = setup.output | 
					
						
							|  |  |  | 					.filter(function(e){  | 
					
						
							|  |  |  | 						return Promise.resolve(true) })  | 
					
						
							|  |  |  | 				return setup }, | 
					
						
							|  |  |  | 			filter_promise_none: function(assert, setup){ | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					input: [], | 
					
						
							|  |  |  | 					output: setup.output | 
					
						
							|  |  |  | 						.filter(function(e){  | 
					
						
							|  |  |  | 							return Promise.resolve(false) }), | 
					
						
							|  |  |  | 				} }, | 
					
						
							|  |  |  | 			//*/
 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-08 03:12:37 +03:00
										 |  |  | 			/* XXX need tuning... | 
					
						
							| 
									
										
										
										
											2022-06-08 03:10:36 +03:00
										 |  |  | 			concat_basic: function(assert, {input, output}){ | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					input: [input].flat() | 
					
						
							|  |  |  | 						.concat(['a', 'b', 'c']), | 
					
						
							|  |  |  | 					output: output | 
					
						
							|  |  |  | 						.concat(['a', 'b', 'c']), | 
					
						
							|  |  |  | 				} }, | 
					
						
							|  |  |  | 			concat_nested_array: function(assert, {input, output}){ | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					input: [input].flat() | 
					
						
							|  |  |  | 						.concat(['a', ['b'], 'c']), | 
					
						
							|  |  |  | 					output: output | 
					
						
							|  |  |  | 						.concat(['a', ['b'], 'c']), | 
					
						
							|  |  |  | 				} }, | 
					
						
							| 
									
										
										
										
											2022-06-08 03:12:37 +03:00
										 |  |  | 			//*/
 | 
					
						
							| 
									
										
										
										
											2022-06-08 03:10:36 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		this.Test({ | 
					
						
							|  |  |  | 			value: async function(assert, {input, output}){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				var res = await output | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert(res instanceof Array, 'result is array') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				input instanceof Array ? | 
					
						
							| 
									
										
										
										
											2022-06-06 12:38:22 +03:00
										 |  |  | 					// XXX this does not catch some errors -- map_promise specifically...
 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 					assert.array(res,  | 
					
						
							|  |  |  | 						await Promise.all(input),  | 
					
						
							|  |  |  | 							'array -> array') | 
					
						
							|  |  |  | 				: (input instanceof Promise && await input instanceof Array) ? | 
					
						
							|  |  |  | 					assert.array(res,  | 
					
						
							|  |  |  | 						await input,  | 
					
						
							|  |  |  | 							'promise array -> array') | 
					
						
							|  |  |  | 				: input instanceof Promise ? | 
					
						
							|  |  |  | 					assert.array(res,  | 
					
						
							|  |  |  | 						[await input],  | 
					
						
							|  |  |  | 							'promise value -> array') | 
					
						
							|  |  |  | 				: assert.array(res,  | 
					
						
							|  |  |  | 					[input],  | 
					
						
							|  |  |  | 					'value -> array') }, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	}), | 
					
						
							|  |  |  | 	Promise: async function(assert){ | 
					
						
							| 
									
										
										
										
											2020-11-05 16:40:41 +03:00
										 |  |  | 		var p = assert(Promise.cooperative(), '.cooperative()') | 
					
						
							| 
									
										
										
										
											2020-11-16 02:38:19 +03:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 		assert(!p.isSet, 'promise unset') | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2020-11-03 16:58:59 +03:00
										 |  |  | 		var RESOLVE = 123 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 		var then = false | 
					
						
							|  |  |  | 		var done = false | 
					
						
							| 
									
										
										
										
											2020-11-03 16:58:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		p.then(function(v){ | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 			then = assert(v == RESOLVE, '.then(..) handled') }) | 
					
						
							| 
									
										
										
										
											2020-11-03 16:58:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		p.finally(function(){ | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 			done = assert(true, '.finally(..) handled') }) | 
					
						
							| 
									
										
										
										
											2020-11-03 16:58:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 		assert(!p.isSet, 'promise unset') | 
					
						
							| 
									
										
										
										
											2020-11-03 17:04:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 16:40:41 +03:00
										 |  |  | 		p.set(RESOLVE) | 
					
						
							| 
									
										
										
										
											2020-11-03 16:58:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:29:13 +03:00
										 |  |  | 		assert(p.isSet, 'promise set') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// allow the promise to finalize...
 | 
					
						
							|  |  |  | 		await p | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(then, '.then(..): confirmed') | 
					
						
							|  |  |  | 		assert(done, '.done(..): confirmed') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// XXX
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(await Promise.iter([1, Promise.resolve(2), [3]]), '.iter(..)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert.array( | 
					
						
							|  |  |  | 			await Promise.iter([1, 2, 3]),  | 
					
						
							|  |  |  | 			[1, 2, 3],  | 
					
						
							|  |  |  | 				'basic array') | 
					
						
							|  |  |  | 		assert.array( | 
					
						
							|  |  |  | 			await Promise.iter([1, Promise.resolve(2), 3]),  | 
					
						
							|  |  |  | 			[1, 2, 3],  | 
					
						
							|  |  |  | 				'promises as elements') | 
					
						
							| 
									
										
										
										
											2022-12-29 15:53:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-04 06:39:55 +03:00
										 |  |  | 		// XXX split this into separate cases...
 | 
					
						
							|  |  |  | 		for(var meth of ['iter', 'seqiter']){ | 
					
						
							|  |  |  | 			// XXX need a recursive assert...
 | 
					
						
							|  |  |  | 			var should_be = [ [1], [2], [3], [4], [5], [6] ] | 
					
						
							|  |  |  | 			var got = await Promise[meth]([ | 
					
						
							|  |  |  | 					[1,1,1],  | 
					
						
							|  |  |  | 					Promise.sync.resolve([2,2,2]),  | 
					
						
							|  |  |  | 					Promise.resolve([3,3,3]),  | 
					
						
							|  |  |  | 					Promise.iter([4,4,4]),  | 
					
						
							|  |  |  | 					Promise.iter.resolve([5,5,5]),  | 
					
						
							|  |  |  | 					Promise.all([6,6,6]), | 
					
						
							|  |  |  | 				],  | 
					
						
							|  |  |  | 				function(e){ | 
					
						
							|  |  |  | 					return e instanceof Array ?  | 
					
						
							|  |  |  | 						[[ e[0] ]]  | 
					
						
							|  |  |  | 						// XXX
 | 
					
						
							|  |  |  | 						: e }) | 
					
						
							|  |  |  | 			assert( | 
					
						
							|  |  |  | 				should_be | 
					
						
							|  |  |  | 					.reduce(function(res, e, i){ | 
					
						
							|  |  |  | 						//console.log('---', e, got[i])
 | 
					
						
							|  |  |  | 						if(res === false){ | 
					
						
							|  |  |  | 							return false } | 
					
						
							|  |  |  | 						return e instanceof Array  | 
					
						
							|  |  |  | 							&& got[i] instanceof Array | 
					
						
							|  |  |  | 							&& e.length == got[i].length | 
					
						
							|  |  |  | 							&& e[0] == got[i][0] }, true),  | 
					
						
							|  |  |  | 				'pack/unpack', meth, got) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			assert.array( | 
					
						
							|  |  |  | 				await Promise[meth]([1, Promise.resolve(2), Promise.resolve(3)]), | 
					
						
							|  |  |  | 				[1,2,3], | 
					
						
							|  |  |  | 					'flat unpack', meth) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var order = [] | 
					
						
							|  |  |  | 		await Promise.seqiter([ | 
					
						
							|  |  |  | 				1, | 
					
						
							|  |  |  | 				Promise.resolve(2), | 
					
						
							|  |  |  | 				Promise.all([3,4]), | 
					
						
							|  |  |  | 				Promise.seqiter([5]), | 
					
						
							|  |  |  | 				6, | 
					
						
							|  |  |  | 			]) | 
					
						
							|  |  |  | 			.flat() | 
					
						
							|  |  |  | 			.map(function(e){ | 
					
						
							|  |  |  | 				order.push(e) | 
					
						
							|  |  |  | 				return e }) | 
					
						
							|  |  |  | 		assert.array( | 
					
						
							|  |  |  | 			order, | 
					
						
							|  |  |  | 			[1,2,3,4,5,6], | 
					
						
							|  |  |  | 				'Promise.seqiter(..) handle order') | 
					
						
							| 
									
										
										
										
											2023-01-07 13:07:43 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-08 22:45:20 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var test_async_handler = async function(input, output, handler, msg){ | 
					
						
							|  |  |  | 			// sanity check...
 | 
					
						
							| 
									
										
										
										
											2023-01-07 13:34:19 +03:00
										 |  |  | 			assert.array( | 
					
						
							|  |  |  | 				await Promise.iter(input, handler), | 
					
						
							|  |  |  | 				output, | 
					
						
							| 
									
										
										
										
											2023-01-08 22:45:20 +03:00
										 |  |  | 				msg+' (sanity check)') | 
					
						
							| 
									
										
										
										
											2023-01-07 13:34:19 +03:00
										 |  |  | 			assert.array( | 
					
						
							|  |  |  | 				await Promise.iter(input, | 
					
						
							|  |  |  | 					function(e){  | 
					
						
							| 
									
										
										
										
											2023-01-08 22:45:20 +03:00
										 |  |  | 						return Promise.resolve(handler(e)) }), | 
					
						
							| 
									
										
										
										
											2023-01-07 13:34:19 +03:00
										 |  |  | 				await Promise.iter(input, handler), | 
					
						
							| 
									
										
										
										
											2023-01-08 22:45:20 +03:00
										 |  |  | 				msg) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		await test_async_handler( | 
					
						
							| 
									
										
										
										
											2023-01-07 13:34:19 +03:00
										 |  |  | 			[ | 
					
						
							|  |  |  | 				1,  | 
					
						
							|  |  |  | 				[2],  | 
					
						
							|  |  |  | 				Promise.resolve(3),  | 
					
						
							|  |  |  | 				Promise.resolve([4]), | 
					
						
							|  |  |  | 			],  | 
					
						
							|  |  |  | 			[], | 
					
						
							| 
									
										
										
										
											2023-01-08 22:45:20 +03:00
										 |  |  | 			function(e){  | 
					
						
							|  |  |  | 				return [] }, | 
					
						
							|  |  |  | 			'handler returns promise (empty)') | 
					
						
							|  |  |  | 		await test_async_handler( | 
					
						
							| 
									
										
										
										
											2023-01-07 13:34:19 +03:00
										 |  |  | 			[ | 
					
						
							|  |  |  | 				1,  | 
					
						
							|  |  |  | 				[2],  | 
					
						
							|  |  |  | 				Promise.resolve(3),  | 
					
						
							|  |  |  | 				Promise.resolve([4]), | 
					
						
							|  |  |  | 			],  | 
					
						
							|  |  |  | 			[ 'moo', 'moo', 'moo', 'moo' ], | 
					
						
							| 
									
										
										
										
											2023-01-08 22:45:20 +03:00
										 |  |  | 			function(e){  | 
					
						
							|  |  |  | 				return ['moo'] }, | 
					
						
							|  |  |  | 			'handler returns promise (array)') | 
					
						
							| 
									
										
										
										
											2020-11-03 16:58:59 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 02:43:16 +03:00
										 |  |  | 	// Date.js
 | 
					
						
							| 
									
										
										
										
											2020-10-06 03:36:40 +03:00
										 |  |  | 	Date: function(assert){ | 
					
						
							|  |  |  | 		var d = new Date() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var ts = assert(d.getTimeStamp(), '.getTimeStamp()') | 
					
						
							|  |  |  | 		var tsm = assert(d.getTimeStamp(true), '.getTimeStamp(true)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var dd = assert(Date.fromTimeStamp(tsm), '.fromTimeStamp(..)') | 
					
						
							|  |  |  | 		var dds = assert(Date.fromTimeStamp(ts), '.fromTimeStamp(..)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(d.toString() == dd.toString(), 'timestamp reversable') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(d.toShortDate() == dd.toShortDate(), '.toShortDate()') | 
					
						
							|  |  |  | 		assert(d.toShortDate() == dds.toShortDate(), '.toShortDate()') | 
					
						
							|  |  |  | 		assert(d.toShortDate(true) == dd.toShortDate(true), '.toShortDate(true)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var a = Date.timeStamp() | 
					
						
							|  |  |  | 		var b = Date.timeStamp(true) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(a == Date.fromTimeStamp(a).getTimeStamp()) | 
					
						
							|  |  |  | 		assert(a + '000' == Date.fromTimeStamp(a).getTimeStamp(true)) | 
					
						
							|  |  |  | 		assert(b == Date.fromTimeStamp(b).getTimeStamp(true)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-07 03:03:41 +03:00
										 |  |  | 		assert(Date.str2ms('1') == 1, 'Date.str2ms("1")') | 
					
						
							|  |  |  | 		assert(Date.str2ms(1) == 1, 'Date.str2ms(1)') | 
					
						
							|  |  |  | 		assert(Date.str2ms('1ms') == 1, 'Date.str2ms("1ms")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('1s') == 1000, 'Date.str2ms("1s")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('1m') == 60*1000, 'Date.str2ms("1m")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('1h') == 60*60*1000, 'Date.str2ms("1h")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('1d') == 24*60*60*1000, 'Date.str2ms("1d")') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(Date.str2ms('5 sec') == 5000, 'Date.str2ms("1 sec")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('5 second') == 5000, 'Date.str2ms("1 second")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('5 seconds') == 5000, 'Date.str2ms("1 seconds")') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(Date.str2ms('2hour') == 2*60*60*1000, 'Date.str2ms("1hour")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('2 Hour') == 2*60*60*1000, 'Date.str2ms("1 Hour")') | 
					
						
							|  |  |  | 		assert(Date.str2ms('2 hours') == 2*60*60*1000, 'Date.str2ms("1 hours")') | 
					
						
							| 
									
										
										
										
											2020-10-07 03:53:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		assert(Number.isNaN(Date.str2ms('moo')), 'Date.str2ms("moo")') | 
					
						
							|  |  |  | 		assert(Number.isNaN(Date.str2ms('123 moo')), 'Date.str2ms("moo")') | 
					
						
							| 
									
										
										
										
											2020-10-06 03:36:40 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2020-10-06 02:43:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// containers.js
 | 
					
						
							| 
									
										
										
										
											2020-10-17 02:25:17 +03:00
										 |  |  | 	// XXX move this out to a separate test set...
 | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | 	UniqueKeyMap: function(assert){ | 
					
						
							|  |  |  | 		var a = assert(containers.UniqueKeyMap(), '') | 
					
						
							|  |  |  | 		var b = assert(containers.UniqueKeyMap([]), '') | 
					
						
							|  |  |  | 		var c = assert(containers.UniqueKeyMap([ | 
					
						
							|  |  |  | 			['a', 111], | 
					
						
							|  |  |  | 			['b', 222], | 
					
						
							|  |  |  | 			['a', 333], | 
					
						
							|  |  |  | 		]), '') | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		assert(a.size == 0) | 
					
						
							|  |  |  | 		assert(b.size == 0) | 
					
						
							|  |  |  | 		assert(c.size == 3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(c.get('a') == 111) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(c.has('a (1)')) | 
					
						
							|  |  |  | 		assert(c.get('a (1)') == 333) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var n | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert((n = c.set('a', 444, true)) == 'a (2)') | 
					
						
							|  |  |  | 		assert(c.get(n) == 444) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(c.reset(n, 555)) | 
					
						
							|  |  |  | 		assert(c.get(n) == 555) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(c.delete('a (1)')) | 
					
						
							|  |  |  | 		assert(!c.has('a (1)')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert((n = c.set('a', 222, true)) == 'a (1)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(c.keysOf(222).sort().cmp(['b', 'a'].sort())) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-07 07:33:58 +03:00
										 |  |  | 		var k = [...c.keys()] | 
					
						
							| 
									
										
										
										
											2020-10-08 15:09:21 +03:00
										 |  |  | 		k[k.indexOf('a')] = 'b (1)' | 
					
						
							| 
									
										
										
										
											2020-10-07 07:33:58 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | 		assert((n = c.rename('a', 'b', true)) == 'b (1)') | 
					
						
							| 
									
										
										
										
											2020-10-07 07:33:58 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 15:09:21 +03:00
										 |  |  | 		// check order...
 | 
					
						
							|  |  |  | 		// XXX since we are using Array's .cmp(..) would be nice to be 
 | 
					
						
							|  |  |  | 		// 		able to fail this test if that fails to test correctly...
 | 
					
						
							|  |  |  | 		// 		...not sure how to do this though...
 | 
					
						
							|  |  |  | 		assert(k.cmp([...c.keys()]), '.rename(..) order') | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-17 02:25:17 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 16:40:41 +03:00
										 |  |  | //---------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var PromiseTests = test.TestSet() | 
					
						
							|  |  |  | test.Case('PromiseTests', PromiseTests) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PromiseTests.setups({ | 
					
						
							|  |  |  | 	cooperative: function(assert){ | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			a: assert(Promise.cooperative(), '.cooperative()') | 
					
						
							|  |  |  | 		} }, | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PromiseTests.modifiers({ | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PromiseTests.tests({ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-17 02:25:17 +03:00
										 |  |  | //---------------------------------------------------------------------
 | 
					
						
							|  |  |  | // UniqueKeyMap testing...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-17 03:11:59 +03:00
										 |  |  | var UniqueKeyMap = test.TestSet() | 
					
						
							|  |  |  | test.Case('UniqueKeyMap-new', UniqueKeyMap) | 
					
						
							| 
									
										
										
										
											2020-10-17 02:25:17 +03:00
										 |  |  | 	 | 
					
						
							|  |  |  | // XXX
 | 
					
						
							| 
									
										
										
										
											2020-10-17 03:11:59 +03:00
										 |  |  | UniqueKeyMap.setups({ | 
					
						
							|  |  |  | 	empty: function(assert){ | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			value: assert(containers.UniqueKeyMap()), | 
					
						
							|  |  |  | 			// metadata...
 | 
					
						
							|  |  |  | 			size: 0, | 
					
						
							|  |  |  | 		}}, | 
					
						
							|  |  |  | 	'empty-input': function(assert){ | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			value: assert(containers.UniqueKeyMap([])),  | 
					
						
							|  |  |  | 			// metadata...
 | 
					
						
							|  |  |  | 			size: 0, | 
					
						
							|  |  |  | 		}}, | 
					
						
							|  |  |  | 	// XXX non-empty input...
 | 
					
						
							|  |  |  | 	// XXX intersecting unput...
 | 
					
						
							| 
									
										
										
										
											2020-10-17 02:25:17 +03:00
										 |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX
 | 
					
						
							| 
									
										
										
										
											2020-10-17 03:11:59 +03:00
										 |  |  | UniqueKeyMap.modifiers({ | 
					
						
							|  |  |  | 	set: function(assert, e, k='a', o){ | 
					
						
							|  |  |  | 		o = o || {} | 
					
						
							|  |  |  | 		var n | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var exists = e.value.has(k) | 
					
						
							|  |  |  | 		var expected = e.value.uniqieKey(k) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(n = e.value.set(k, o, true), '.set(..)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// key update...
 | 
					
						
							|  |  |  | 		assert(n.startsWith(k), 'key prefix') | 
					
						
							|  |  |  | 		assert(n == expected, 'unexpected key') | 
					
						
							|  |  |  | 		exists | 
					
						
							|  |  |  | 			|| assert(n == k, 'key unexpectedly changed') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// size...
 | 
					
						
							|  |  |  | 		e.size += 1 | 
					
						
							|  |  |  | 		assert(e.value.size == e.size, 'inc size') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return e }, | 
					
						
							|  |  |  | 	reset: function(assert, e, k='a', o){ | 
					
						
							|  |  |  | 		o = o || {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var exists = e.value.has(k) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(e.value.reset(k, o)) | 
					
						
							|  |  |  | 		assert(e.value.get(k) === o) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// size...
 | 
					
						
							|  |  |  | 		exists | 
					
						
							|  |  |  | 			|| (e.size += 1) | 
					
						
							|  |  |  | 		assert(e.value.size == e.size) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return e }, | 
					
						
							|  |  |  | 	delete: function(assert, e, k='a'){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var exists = e.value.has(k) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(e.value.delete(k) == exists, '.delete(..)') | 
					
						
							|  |  |  | 		assert(!e.value.has(k), 'delete successful') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// size...
 | 
					
						
							|  |  |  | 		exists | 
					
						
							|  |  |  | 			&& (e.size -= 1) | 
					
						
							|  |  |  | 		assert(e.value.size == e.size) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return e }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	'set-set': function(assert, e){ | 
					
						
							|  |  |  | 		this.set(assert, e, 'x') | 
					
						
							|  |  |  | 		this.set(assert, e, 'y') | 
					
						
							|  |  |  | 		this.set(assert, e, 'x') | 
					
						
							|  |  |  | 		return e }, | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX
 | 
					
						
							|  |  |  | UniqueKeyMap.tests({ | 
					
						
							|  |  |  | 	consistent: function(assert, e){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(e.value.size == e.size, '.size') | 
					
						
							|  |  |  | 		assert([...e.value.keys()].length == e.value.size, '.keys() same size as .size') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return e } | 
					
						
							| 
									
										
										
										
											2020-10-17 02:25:17 +03:00
										 |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | //---------------------------------------------------------------------
 | 
					
						
							|  |  |  | // events...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var Events = test.TestSet() | 
					
						
							|  |  |  | test.Case('Events', Events) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 02:27:20 +03:00
										 |  |  | // XXX test aborting handlers...
 | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | Events.cases({ | 
					
						
							|  |  |  | 	base: function(assert){ | 
					
						
							|  |  |  | 		var called = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// object with events...
 | 
					
						
							|  |  |  | 		var ObjWithEvents =  | 
					
						
							|  |  |  | 			assert( | 
					
						
							| 
									
										
										
										
											2020-11-19 02:24:09 +03:00
										 |  |  | 				events.EventMixin('flat', { | 
					
						
							| 
									
										
										
										
											2020-11-15 02:27:20 +03:00
										 |  |  | 					// NOTE: we will also use virtual events later -- 'moo' 
 | 
					
						
							|  |  |  | 					// 		and 'foo', these do not have to be defined to 
 | 
					
						
							|  |  |  | 					// 		be usable...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// blank events...
 | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 					bareEventBlank: assert( | 
					
						
							| 
									
										
										
										
											2022-05-25 17:42:40 +03:00
										 |  |  | 						events.Eventful('bareEventBlank'),  | 
					
						
							|  |  |  | 						'.Eventful(..): blank'), | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 					eventBlank: assert( | 
					
						
							| 
									
										
										
										
											2020-11-15 03:12:33 +03:00
										 |  |  | 						events.Event('eventBlank'),  | 
					
						
							|  |  |  | 						'.Event(..): blank'), | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 02:27:20 +03:00
										 |  |  | 					// normal events...
 | 
					
						
							| 
									
										
										
										
											2022-05-25 17:42:40 +03:00
										 |  |  | 					bareEvent: assert(events.Eventful('bareEvent',  | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 						function(handle, ...args){ | 
					
						
							|  |  |  | 							called['bareEvent-call'] = true | 
					
						
							| 
									
										
										
										
											2022-05-25 17:42:40 +03:00
										 |  |  | 							assert(handle(), '.Eventful(..) -> handle(..)') | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 							return 'bareEvent' | 
					
						
							| 
									
										
										
										
											2022-05-25 17:42:40 +03:00
										 |  |  | 						}), '.Eventful(..)'), | 
					
						
							| 
									
										
										
										
											2020-11-15 03:12:33 +03:00
										 |  |  | 					event: assert(events.Event('event',  | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 						function(handle, ...args){ | 
					
						
							|  |  |  | 							called['event-call'] = true | 
					
						
							| 
									
										
										
										
											2020-11-15 03:12:33 +03:00
										 |  |  | 							assert(handle(), '.Event(..) -> handle(..)') | 
					
						
							|  |  |  | 						}), '.Event(..)'), | 
					
						
							| 
									
										
										
										
											2020-11-19 02:24:09 +03:00
										 |  |  | 				}),  | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 				'object with event mixin created.') | 
					
						
							| 
									
										
										
										
											2020-11-15 02:27:20 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// create an "instance"...
 | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 		var obj = Object.create(ObjWithEvents) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// test event list...
 | 
					
						
							| 
									
										
										
										
											2023-01-06 12:30:24 +03:00
										 |  |  | 		assert.array(obj.events, ['eventBlank', 'event'], '.events') | 
					
						
							|  |  |  | 		assert.array(obj.eventful, ['bareEventBlank', 'bareEvent'], '.eventful') | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// bind...
 | 
					
						
							|  |  |  | 		var bind = function(evt){ | 
					
						
							|  |  |  | 			assert(obj.on(evt, function(evt, ...args){ | 
					
						
							|  |  |  | 				called[evt +'-handle'] = true | 
					
						
							|  |  |  | 			}) === obj, 'bind: <obj-w-events>.on("'+ evt +'", ..)') } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		;['moo',  | 
					
						
							|  |  |  | 				...obj.events, | 
					
						
							| 
									
										
										
										
											2022-05-25 17:42:40 +03:00
										 |  |  | 				...obj.eventful] | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 			.forEach(bind) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(obj.event(function(evt, ...args){ | 
					
						
							|  |  |  | 			called['event-handle-2'] = true | 
					
						
							|  |  |  | 		}) === obj, 'bind: <obj-w-events>.event(<func>)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// trigger 
 | 
					
						
							|  |  |  | 		var trigger = function(evt, triggerd=true, handled=true){ | 
					
						
							|  |  |  | 			var res = assert(obj.trigger(evt), 'trigger: <obj-w-events>.trigger("'+ evt +'")') | 
					
						
							|  |  |  | 			triggerd | 
					
						
							|  |  |  | 				&& !evt.endsWith('Blank') | 
					
						
							|  |  |  | 				&& assert(called[evt +'-call'], 'trigger: "'+ evt +'" event triggered') | 
					
						
							|  |  |  | 			handled | 
					
						
							|  |  |  | 				&& assert(called[evt +'-handle'], 'trigger: "'+ evt +'" event handled')  | 
					
						
							|  |  |  | 			delete called[evt +'-call'] | 
					
						
							|  |  |  | 			delete called[evt +'-handle']  | 
					
						
							|  |  |  | 			return res } | 
					
						
							|  |  |  | 		var call = function(evt, triggered=true, handled=true){ | 
					
						
							|  |  |  | 			var res = assert(obj[evt](), 'trigger: <obj-w-events>.'+ evt +'(..)') | 
					
						
							|  |  |  | 			triggered | 
					
						
							|  |  |  | 				&& !evt.endsWith('Blank') | 
					
						
							|  |  |  | 				&& assert(called[evt +'-call'], 'trigger: "'+ evt +'" event triggered') | 
					
						
							|  |  |  | 			handled | 
					
						
							|  |  |  | 				&& assert(called[evt +'-handle'], 'trigger: "'+ evt +'" event handled') | 
					
						
							|  |  |  | 			delete called[evt +'-call'] | 
					
						
							|  |  |  | 			delete called[evt +'-handle']  | 
					
						
							|  |  |  | 			return res } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		trigger('foo', false, false) | 
					
						
							|  |  |  | 		trigger('moo', false) | 
					
						
							| 
									
										
										
										
											2020-12-01 19:54:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 		obj.events | 
					
						
							|  |  |  | 			.forEach(function(e){  | 
					
						
							|  |  |  | 				trigger(e)  | 
					
						
							|  |  |  | 				call(e) }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(called['event-handle-2'], 'trigger: "event" event handled') | 
					
						
							|  |  |  | 		delete called['event-handle-2'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(call('event') === obj, '<obj-w-events>.event(..) return value.') | 
					
						
							|  |  |  | 		assert(call('bareEvent') == 'bareEvent', '<obj-w-events>.bareEvent(..) return value.') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 03:12:33 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 05:13:35 +03:00
										 |  |  | 		// unbind: .one(..) / .off(..) 
 | 
					
						
							| 
									
										
										
										
											2020-12-01 19:54:47 +03:00
										 |  |  | 		// XXX this is triggered twice for some reason...
 | 
					
						
							| 
									
										
										
										
											2020-11-15 05:13:35 +03:00
										 |  |  | 		obj.one('event', function(){  | 
					
						
							|  |  |  | 			called['event-one-time-handler'] =  | 
					
						
							| 
									
										
										
										
											2020-12-01 20:37:08 +03:00
										 |  |  | 				(called['event-one-time-handler'] || 0) + 1 }) | 
					
						
							| 
									
										
										
										
											2020-11-15 05:13:35 +03:00
										 |  |  | 		obj | 
					
						
							|  |  |  | 			.event() | 
					
						
							| 
									
										
										
										
											2020-12-01 19:54:47 +03:00
										 |  |  | 			//.event()
 | 
					
						
							|  |  |  | 			//.event()
 | 
					
						
							| 
									
										
										
										
											2020-11-15 05:13:35 +03:00
										 |  |  | 		assert(called['event-one-time-handler'] == 1, '.one("event", ..) handler cleared.') | 
					
						
							| 
									
										
										
										
											2020-11-15 05:59:19 +03:00
										 |  |  | 		delete called['event-one-time-handler'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// special case...
 | 
					
						
							|  |  |  | 		obj.trigger('event', function(){ called['trigger-function-called'] = true }) | 
					
						
							|  |  |  | 		assert(called['trigger-function-called'] === undefined, '.trigger(..) should not call it\'s args') | 
					
						
							| 
									
										
										
										
											2020-11-15 05:13:35 +03:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2020-11-15 03:12:33 +03:00
										 |  |  | 		// XXX test passing args...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 05:13:35 +03:00
										 |  |  | 		// XXX test different mode events...
 | 
					
						
							| 
									
										
										
										
											2020-11-15 00:24:22 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// re-bind...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 05:59:19 +03:00
										 |  |  | //---------------------------------------------------------------------
 | 
					
						
							|  |  |  | // events...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var Runner = test.TestSet() | 
					
						
							|  |  |  | test.Case('Runner', Runner) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX test aborting handlers...
 | 
					
						
							|  |  |  | Runner.cases({ | 
					
						
							|  |  |  | 	base: function(assert){ | 
					
						
							|  |  |  | 		//var q = assert(runner.Queue({auto_stop: true}), 'Queue()')
 | 
					
						
							|  |  |  | 		var q = assert(runner.Queue(), 'Queue()') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// empty states...
 | 
					
						
							|  |  |  | 		assert(q.state == 'stopped', '.state: stopped') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		q.start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(q.state == 'running', '.state: running') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		q.start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(q.state == 'running', '.state: running') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		q.stop() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert(q.state == 'stopped', '.state: stopped') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var tasks_run = [] | 
					
						
							|  |  |  | 		var a = function(){ tasks_run.push('a') } | 
					
						
							|  |  |  | 		var b = function(){ tasks_run.push('b') } | 
					
						
							|  |  |  | 		var c = function(){ tasks_run.push('c') } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		q.push(a) | 
					
						
							|  |  |  | 		q.push(b) | 
					
						
							|  |  |  | 		q.push(c) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		assert(q.length == 3, '.length is 3') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 06:00:51 +03:00
										 |  |  | 		q.runTask() | 
					
						
							|  |  |  | 		q.runTask() | 
					
						
							|  |  |  | 		q.runTask() | 
					
						
							| 
									
										
										
										
											2020-11-15 05:59:19 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		assert.array(tasks_run, ['a', 'b', 'c'], 'all tasks run') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 06:00:51 +03:00
										 |  |  | 		// XXX need to figure out how to test async...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		tasks_run = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var q = assert(runner.Queue({sync_start: true}), 'Queue({sync_start: true})') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		q.push(a) | 
					
						
							|  |  |  | 		q.push(b) | 
					
						
							|  |  |  | 		q.push(c) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		q.start() | 
					
						
							| 
									
										
										
										
											2020-11-15 05:59:19 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 06:00:51 +03:00
										 |  |  | 		assert.array(tasks_run, ['a', 'b', 'c'], 'all tasks run') | 
					
						
							| 
									
										
										
										
											2020-11-15 05:59:19 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//console.log('\n>>>', q.state)
 | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 00:52:05 +03:00
										 |  |  | //---------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typeof(__filename) != 'undefined' | 
					
						
							|  |  |  | 	&& __filename == (require.main || {}).filename | 
					
						
							|  |  |  | 	&& test.run() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 :                               */ return module }) |