mirror of
https://github.com/flynx/object.js.git
synced 2025-10-30 11:00:08 +00:00
reworked the assert mechanism...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
939ac1b13a
commit
da4eef8764
138
test.js
138
test.js
@ -114,23 +114,6 @@ var instances = function(obj){
|
|||||||
&& o.constructor }) }
|
&& o.constructor }) }
|
||||||
|
|
||||||
|
|
||||||
var makeAssert = function(pre, stats){
|
|
||||||
return Object.assign(
|
|
||||||
function(e, msg, ...args){
|
|
||||||
stats
|
|
||||||
&& (stats.assertions += 1)
|
|
||||||
&& !e
|
|
||||||
&& (stats.failures += 1)
|
|
||||||
module.VERBOSE
|
|
||||||
&& console.log(pre +': '+ msg.bold, ...args)
|
|
||||||
console.assert(e, pre.bold +': '+ msg.bold.yellow, ...args)
|
|
||||||
return e },
|
|
||||||
{
|
|
||||||
// XXX should have a real path...
|
|
||||||
path: pre
|
|
||||||
}) }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
@ -641,6 +624,8 @@ module.modifiers = {
|
|||||||
var attr = '__mixin_' + filter.name
|
var attr = '__mixin_' + filter.name
|
||||||
|
|
||||||
var mixin = setup[attr] = {
|
var mixin = setup[attr] = {
|
||||||
|
// NOTE: in the real world mixins should have no state, just
|
||||||
|
// methods...
|
||||||
__mixin: true,
|
__mixin: true,
|
||||||
[attr]: true,
|
[attr]: true,
|
||||||
__mixin_flat: !!flat,
|
__mixin_flat: !!flat,
|
||||||
@ -673,6 +658,7 @@ module.modifiers = {
|
|||||||
'mixin (flat)'
|
'mixin (flat)'
|
||||||
:'mixin', n)
|
:'mixin', n)
|
||||||
assert(object.hasMixin(o, mixin), 'mixin test', n)
|
assert(object.hasMixin(o, mixin), 'mixin test', n)
|
||||||
|
assert(o.mixinMethod() == 'mixin', 'mixin method call')
|
||||||
})
|
})
|
||||||
return setup },
|
return setup },
|
||||||
mixin_instance_flat: function(assert, setup){
|
mixin_instance_flat: function(assert, setup){
|
||||||
@ -790,6 +776,117 @@ module.cases = {
|
|||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Assert constructor...
|
||||||
|
//
|
||||||
|
// Create an assert callable...
|
||||||
|
// Assert()
|
||||||
|
// Assert(path[, stats[, verbose]])
|
||||||
|
// -> assert
|
||||||
|
//
|
||||||
|
// Create an assert with extended path...
|
||||||
|
// assert.push(path)
|
||||||
|
// -> assert
|
||||||
|
//
|
||||||
|
// Create an assert with shortened path...
|
||||||
|
// assert.pop(path)
|
||||||
|
// -> assert
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Assertions...
|
||||||
|
//
|
||||||
|
// value is truthy...
|
||||||
|
// assert(value, msg, ..)
|
||||||
|
// -> value
|
||||||
|
//
|
||||||
|
// Assert truth and catch exceptions...
|
||||||
|
// assert.assert(msg, test())
|
||||||
|
// -> value
|
||||||
|
//
|
||||||
|
// Assert if test does not throw...
|
||||||
|
// assert.error(msg, test())
|
||||||
|
// -> error
|
||||||
|
//
|
||||||
|
//
|
||||||
|
var Assert =
|
||||||
|
module.Assert =
|
||||||
|
object.Constructor('Assert', {
|
||||||
|
stats: null,
|
||||||
|
|
||||||
|
__verbose: null,
|
||||||
|
get verbose(){
|
||||||
|
return this.__verbose == null ?
|
||||||
|
module.VERBOSE
|
||||||
|
: this.__verbose },
|
||||||
|
set verbose(value){
|
||||||
|
value == null ?
|
||||||
|
(delete this.__verbose)
|
||||||
|
: (this.__verbose = value) },
|
||||||
|
|
||||||
|
// path API...
|
||||||
|
__str_path: null,
|
||||||
|
get strPath(){
|
||||||
|
return (this.__str_path =
|
||||||
|
this.__str_path
|
||||||
|
|| (this.path || []).join(':')) },
|
||||||
|
path: null,
|
||||||
|
push: function(path){
|
||||||
|
return this.constructor(
|
||||||
|
[
|
||||||
|
...(this.path || []),
|
||||||
|
...(path instanceof Array ?
|
||||||
|
path
|
||||||
|
: [path])
|
||||||
|
],
|
||||||
|
stats,
|
||||||
|
this.verbose) },
|
||||||
|
pop: function(){
|
||||||
|
return this.constructor(
|
||||||
|
(this.path || []).slice(0, -1),
|
||||||
|
this.stats,
|
||||||
|
this.verbose) },
|
||||||
|
|
||||||
|
// assertion API...
|
||||||
|
__call__: function(_, value, msg, ...args){
|
||||||
|
// stats...
|
||||||
|
var stats = this.stats
|
||||||
|
stats.assertions = (stats.assertions || 0) + 1
|
||||||
|
!value
|
||||||
|
&& (stats.failures = (stats.failures || 0) + 1)
|
||||||
|
|
||||||
|
// assertions...
|
||||||
|
this.verbose
|
||||||
|
&& console.log(this.strPath +': '+ msg.bold, ...args)
|
||||||
|
console.assert(value, this.strPath.bold +': '+ msg.bold.yellow, ...args)
|
||||||
|
|
||||||
|
return value },
|
||||||
|
assert: function(msg, test){
|
||||||
|
try {
|
||||||
|
return this(test.call(this), msg)
|
||||||
|
|
||||||
|
} catch(err){
|
||||||
|
this(false, msg)
|
||||||
|
return err } },
|
||||||
|
error: function(msg, test){
|
||||||
|
try {
|
||||||
|
test.call(this)
|
||||||
|
return this(false, msg)
|
||||||
|
|
||||||
|
} catch(err){
|
||||||
|
this(true, msg)
|
||||||
|
return err } },
|
||||||
|
|
||||||
|
__init__: function(path, stats, verbose){
|
||||||
|
this.path = path instanceof Array ?
|
||||||
|
path
|
||||||
|
: [path]
|
||||||
|
this.stats = stats || {}
|
||||||
|
this.verbose = verbose
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Test runner...
|
// Test runner...
|
||||||
//
|
//
|
||||||
// runner()
|
// runner()
|
||||||
@ -841,6 +938,7 @@ function(chain, stats){
|
|||||||
|
|
||||||
var started = Date.now()
|
var started = Date.now()
|
||||||
// tests...
|
// tests...
|
||||||
|
var assert = Assert('[TEST]', stats, module.VERBOSE)
|
||||||
chain_length != 1
|
chain_length != 1
|
||||||
&& Object.keys(tests)
|
&& Object.keys(tests)
|
||||||
.filter(function(t){
|
.filter(function(t){
|
||||||
@ -860,19 +958,19 @@ function(chain, stats){
|
|||||||
return }
|
return }
|
||||||
// run the test...
|
// run the test...
|
||||||
stats.tests += 1
|
stats.tests += 1
|
||||||
// XXX revise order...
|
var _assert = assert.push([s, m, t])
|
||||||
var _assert = makeAssert(`test: ${s}:${m}:${t}`, stats)
|
|
||||||
tests[t](_assert,
|
tests[t](_assert,
|
||||||
modifiers[m](_assert,
|
modifiers[m](_assert,
|
||||||
setups[s](_assert))) }) }) })
|
setups[s](_assert))) }) }) })
|
||||||
// cases...
|
// cases...
|
||||||
|
var assert = Assert('[CASE]', stats, module.VERBOSE)
|
||||||
chain_length <= 1
|
chain_length <= 1
|
||||||
&& Object.keys(cases)
|
&& Object.keys(cases)
|
||||||
.filter(function(s){
|
.filter(function(s){
|
||||||
return setup == '*' || setup == s })
|
return setup == '*' || setup == s })
|
||||||
.forEach(function(c){
|
.forEach(function(c){
|
||||||
stats.tests += 1
|
stats.tests += 1
|
||||||
cases[c]( makeAssert(`case: ${c}`, stats) ) })
|
cases[c]( assert.push(c) ) })
|
||||||
// runtime...
|
// runtime...
|
||||||
stats.time += Date.now() - started
|
stats.time += Date.now() - started
|
||||||
return stats }
|
return stats }
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user