1 | ;(function(globals){
|
2 |
|
3 | var isNode = false
|
4 |
|
5 |
|
6 | if (typeof define !== 'undefined' && define.amd) {
|
7 | define([], function() {
|
8 | return terst
|
9 | })
|
10 | } else if (typeof module !== 'undefined' && module.exports) {
|
11 | module.exports = terst
|
12 | isNode = process && typeof process.pid === 'number'
|
13 | if (isNode) {
|
14 | globals = global
|
15 | var assert = require('assert')
|
16 | } else {
|
17 | globals = window
|
18 | }
|
19 | } else {
|
20 | globals.terst = terst
|
21 | }
|
22 |
|
23 | var terst = {autoMsg: false}
|
24 |
|
25 | terst.T = function T (value, msg) {
|
26 | if (value) return
|
27 | msg = getTrueMsg(msg)
|
28 |
|
29 | if (isNode)
|
30 | assert(value, msg)
|
31 | else
|
32 | throw new Error(msg + ' should be true')
|
33 | }
|
34 |
|
35 | terst.F = function F (value, msg) {
|
36 | if (!value) return
|
37 | msg = getFalseMsg(msg)
|
38 |
|
39 | if (isNode)
|
40 | assert(!value, msg)
|
41 | else
|
42 | throw new Error(msg + ' should be false')
|
43 | }
|
44 |
|
45 | terst.EQ = function EQ (val1, val2, msg) {
|
46 | if (val1 === val2) return
|
47 |
|
48 | msg = msg || val1 + ' should strictly equal ' + val2
|
49 | if (isNode)
|
50 | assert.strictEqual(val1, val2, msg)
|
51 | else
|
52 | throw new Error(msg)
|
53 | }
|
54 |
|
55 | terst.NEQ = function NEQ (val1, val2, msg) {
|
56 | if (val1 !== val2) return
|
57 |
|
58 | msg = msg || val1 + ' should not strictly equal ' + val2
|
59 | if (isNode)
|
60 | assert.notStrictEqual(val1, val2, msg)
|
61 | else
|
62 | throw new Error(msg)
|
63 | }
|
64 |
|
65 | terst.APPROX = function APPROX (value, expected, delta, msg) {
|
66 | var dlt = Math.abs(value - expected)
|
67 | if (dlt <= delta) return
|
68 |
|
69 | msg = msg || value + ' should be ' + expected + ' +/- ' + delta
|
70 | throw new Error(msg)
|
71 | }
|
72 |
|
73 | terst.THROWS = function THROWS (fn) {
|
74 | try {
|
75 | fn()
|
76 | } catch (err) {
|
77 | return
|
78 | }
|
79 |
|
80 | throw new Error('Did not throw.')
|
81 | }
|
82 |
|
83 |
|
84 |
|
85 | var skip = ['autoMsg']
|
86 | Object.keys(terst).forEach(function(key) {
|
87 | if (skip.indexOf(key) >= 0) return
|
88 | globals[key] = terst[key]
|
89 | })
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 | function getTrueMsg (msg) {
|
96 | if (msg) return msg
|
97 | msg = msg || ''
|
98 | if (terst.autoMsg === true) {
|
99 | var params = getParams(T)
|
100 | for (var i = 0 ; i < params.length; ++i) {
|
101 | try {
|
102 | var e = eval(params[i].param)
|
103 | } catch (err) {
|
104 | console.error(err)
|
105 | }
|
106 | if (typeof e === 'boolean' && e === false) {
|
107 | msg = params[i].param
|
108 | return msg
|
109 | }
|
110 | }
|
111 | }
|
112 | }
|
113 |
|
114 | function getFalseMsg (msg) {
|
115 | if (msg) return msg
|
116 | msg = msg || ''
|
117 | if (terst.autoMsg === true) {
|
118 | if (value) {
|
119 | var params = getParams(F)
|
120 | for (var i = 0 ; i < params.length; ++i) {
|
121 | try {
|
122 | var e = eval(params[i].param)
|
123 | } catch (err) {
|
124 | console.error(err)
|
125 | }
|
126 | if (typeof e === 'boolean' && e === true) {
|
127 | msg = params[i].param
|
128 | return msg
|
129 | }
|
130 | }
|
131 | }
|
132 | }
|
133 | }
|
134 |
|
135 | function getFnName (fn) {
|
136 | return /\W*function\s+([\w\$]+)\(/.exec(fn.toString())[1]
|
137 | }
|
138 |
|
139 | function getParam (fn, lastPos) {
|
140 | lastPos = lastPos || 0
|
141 | var name = getFnName(fn)
|
142 | var calledCode = fn.caller.toString()
|
143 | var pos1 = calledCode.indexOf(name + '(', lastPos)
|
144 | if (pos1 < 0)
|
145 | pos1 = calledCode.indexOf(name + ' (', lastPos)
|
146 | if (pos1 < 0 || pos1 < lastPos)
|
147 | return {param: null, pos: -1}
|
148 |
|
149 | var lb = calledCode.indexOf('(', pos1)
|
150 | var rb = calledCode.indexOf(')', lb)
|
151 |
|
152 | return {param: calledCode.substring(lb + 1 , rb), pos: rb+1}
|
153 | }
|
154 |
|
155 | function getParams (fn) {
|
156 | var params = []
|
157 | var paramData = {pos: 0}
|
158 | do {
|
159 | paramData = getParam(fn, paramData.pos)
|
160 | params.push(paramData)
|
161 | } while (paramData.pos > 0)
|
162 |
|
163 |
|
164 | params.pop()
|
165 |
|
166 | return params
|
167 | }
|
168 |
|
169 | })(this); |
\ | No newline at end of file |