UNPKG

3.62 kBJavaScriptView Raw
1;(function(globals){
2
3var isNode = false
4
5//UMD
6if (typeof define !== 'undefined' && define.amd) { //require.js / AMD
7 define([], function() {
8 return terst
9 })
10} else if (typeof module !== 'undefined' && module.exports) { //CommonJS
11 module.exports = terst
12 isNode = process && typeof process.pid === 'number'
13 if (isNode) {
14 globals = global
15 var assert = require('assert')
16 } else { //maybe Browserify?
17 globals = window
18 }
19} else {
20 globals.terst = terst //<script>
21}
22
23var terst = {autoMsg: false}
24
25terst.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
35terst.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
45terst.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
55terst.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
65terst.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
73terst.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//hook up to global
84
85var skip = ['autoMsg']
86Object.keys(terst).forEach(function(key) {
87 if (skip.indexOf(key) >= 0) return
88 globals[key] = terst[key]
89})
90
91/// PRIVATE
92
93//these methods are very experimental
94
95function getTrueMsg (msg) {
96 if (msg) return msg
97 msg = msg || ''
98 if (terst.autoMsg === true) { //experimental
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
114function getFalseMsg (msg) {
115 if (msg) return msg
116 msg = msg || ''
117 if (terst.autoMsg === true) { //experimental
118 if (value) { //not truthy
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
135function getFnName (fn) {
136 return /\W*function\s+([\w\$]+)\(/.exec(fn.toString())[1]
137}
138
139function 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) //reg = new RegExp('T*[\\s]?\\(')
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
155function 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 //last one is always bad
164 params.pop()
165
166 return params
167}
168
169})(this);
\No newline at end of file