Completed
Push — master ( da9a19...ff1544 )
by Vitaly
30s
created

test.js (6 issues)

1
"use strict";
2
3
/*  ------------------------------------------------------------------------ */
4
                    
5
require ('chai').should ()
6
7
/*  ------------------------------------------------------------------------ */
8
9
describe ('impl/partition', () => {
10
11
    const partition = require ('./impl/partition')
12
    const spans     = partition ([ 'a', 'b', 'c', undefined, undefined, 42], x => typeof x)
13
14
    spans.should.deep.equal ([ { label: 'string',    items: ['a', 'b', 'c'] },
15
                               { label: 'undefined', items: [undefined, undefined] },
16
                               { label: 'number',    items: [42] } ])
17
})
18
19
/*  ------------------------------------------------------------------------ */
20
21
describe ('StackTracey', () => {
22
23
    const path = require ('path')
24
    const StackTracey = require ('./stacktracey')
25
    
26
    StackTracey.resetCache ()
27
28
    const shouldBeVisibleInStackTrace = () => new StackTracey () // @hide
29
30
    it ('works', () => {
31
32
        const stack = shouldBeVisibleInStackTrace ()
33
34
        stack.should.be.an.instanceof (Array)
35
36
        stack[0].should.deep.equal ({
37
            beforeParse: 'at shouldBeVisibleInStackTrace (' + path.join (process.cwd (), 'test.js') + ':28:47)',
38
            callee: 'shouldBeVisibleInStackTrace',
39
            index: false,
40
            native: false,
41
            file: path.join (process.cwd (), 'test.js').replace (/\\/g, '/'),
42
            line: 28,
43
            column: 47,
44
            calleeShort: 'shouldBeVisibleInStackTrace',
45
            fileName: 'test.js',
46
            fileRelative: 'test.js',
47
            fileShort: 'test.js',
48
            thirdParty: false
49
        })
50
    })
51
52
    it ('allows to read sources', () => {
53
54
        const stack = shouldBeVisibleInStackTrace ().withSources // @hide
55
56
              stack.should.be.an.instanceof (StackTracey)
57
              stack[0].beforeParse.should.not.be.undefined // should preserve previous fields
0 ignored issues
show
The result of the property access to stack.0.beforeParse.should.not.be.undefined is not used.
Loading history...
58
              stack[0].sourceLine.should.equal ('    const shouldBeVisibleInStackTrace = () => new StackTracey () ')
59
              stack[0].hide.should.equal (true) // reads // @hide marker
60
              stack[1].hide.should.equal (true) // reads // @hide marker
61
62
        const cleanStack = stack.clean
63
64
        cleanStack.should.be.an.instanceof (StackTracey)
65
66
        StackTracey.locationsEqual (cleanStack[0], stack[0]).should.equal (true)  // should not clean top element
67
        StackTracey.locationsEqual (cleanStack[1], stack[1]).should.equal (false) // should clean second element (due to // @hide)
68
    })
69
        
70
    it ('allows creation from array + groups duplicate lines', () => {
71
72
        const stack = new StackTracey ([
73
            { file: 'yo.js',  line: 11, callee: 'a.funkktion',   calleeShort: 'a' },
74
            { file: 'yo.js',  line: 10, callee: 'foobar.boobar', calleeShort: 'foobar' },
75
            { file: 'yo.js',  line: 10, callee: 'foobar.boobar', calleeShort: 'foobar' },
76
            { file: 'lol.js', line: 10, callee: '',              calleeShort: '' },
77
        ])
78
79
        const clean = stack.clean.map (x => Object.assign ({
80
                                                    file: x.file,
81
                                                    line: x.line,
82
                                                    callee: x.callee,
83
                                                    calleeShort: x.calleeShort }))
84
85
        clean.should.be.an.instanceof (StackTracey)
86
87
        Array.from (clean).should.deep.equal ([ // .should does not recognize StackTracey as normal array...
88
89
            { file: 'yo.js',  line: 11, callee: 'a.funkktion',   calleeShort: 'a' },
90
            { file: 'yo.js',  line: 10, callee: 'foobar.boobar → foobar.boobar', calleeShort: 'foobar → foobar' },
91
            { file: 'lol.js', line: 10, callee: '',              calleeShort: '' },
92
        ])
93
    })
94
95
    it ('handles inaccessible files', () => {
96
97
        const stack = shouldBeVisibleInStackTrace ()
98
              stack[0].file = '^___^'
99
              stack.withSources[0].sourceLine.should.equal ('')
100
              stack.withSources[0].error.should.be.an.instanceof (Error)
101
    })
102
103
    it ('exposes some Array methods', () => {
104
105
        const stack = shouldBeVisibleInStackTrace ()
106
        const sliced = stack.slice (1)
107
        const deltaLength = (stack.length - sliced.length)
108
109
        deltaLength.should.equal (1)
110
        sliced.should.be.an.instanceof (StackTracey)
111
112
        sliced.filter (x => true).should.be.an.instanceof (StackTracey)
0 ignored issues
show
The parameter x is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
113
    })
114
115
    it ('works with sourcemaps', () => {
116
117
        const mkay = require ('./test_files/mkay.uglified')
118
119
        try {
120
            mkay ()
121
        }
122
        catch (e) {
123
124
            e.message.should.equal ('mkay')
125
126
            const top = new StackTracey (e).withSources[0]
127
128
            top.line        .should.equal (4)
129
            top.column      .should.equal (22)
130
            top.sourceLine  .should.equal ('\t\t\t\t\tthrow new Error (\'mkay\') }')
131
132
            top.file        .should.equal (path.resolve ('./test_files/mkay.js').replace (/\\/g, '/'))
133
            top.fileShort   .should.equal ('test_files/mkay.js')
134
            top.fileName    .should.equal ('mkay.js')
135
        }
136
    })
137
138
    it ('pretty printing works', function prettyTest () {
139
140
        const pretty = new StackTracey ().clean.pretty
141
142
        console.log ('')
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
143
        console.log (pretty, '\n')
144
145
        pretty.split ('\n')[0].should.equal ('at prettyTest                      test.js:140    const pretty = new StackTracey ().clean.pretty')
146
    })
147
148
    it ('trims too long columns in the pretty printed output', () => {
149
150
        const stack = new StackTracey ([
151
            { fileShort: 'dasdasdasdadadadasdasdasdadasdassdasdaddadasdas.js', line: 11, calleeShort: 'dadasdasdasdasdasdasdasdasdasdasdasdasd' },
152
        ])
153
154
        stack.pretty.split ('\n')[0].should.equal ('at dadasdasdasdasdasdasdasdasdas…  …adasdasdasdadasdassdasdaddadasdas.js:11  ')
155
    })
156
    
157
    it ('exposes Array methods', () => {
158
159
        const stack = new StackTracey ([
160
            { file: 'foo' },
161
            { file: 'bar' }
162
        ])
163
164
        const mapped = stack.map ((x, i) => Object.assign (x, { i }))
165
166
        mapped.should.deep.equal ([ { file: 'foo', i: 0 }, { file: 'bar', i: 1 } ])
167
        mapped.should.be.an.instanceof (Array)
168
        mapped.should.be.an.instanceof (StackTracey)
169
170
        stack.reduce ((memo, x) => memo + x.file, '').should.equal ('foobar')
171
172
        const filtered = stack.filter (x => x.file === 'bar')
173
174
        filtered.length.should.equal (1)
175
        filtered[0].should.deep.equal ({ file: 'bar', i: 1 })
176
    })
177
178
    it ('computes relative path correctly', () => {
179
        
180
        StackTracey.relativePath  ('webpack:///~/jquery/dist/jquery.js')
181
                    .should.equal (            '~/jquery/dist/jquery.js')
182
183
        StackTracey.relativePath  ('webpack:/webpack/bootstrap')
184
                    .should.equal (          'webpack/bootstrap')
185
    })
186
187
    it ('computes short path correctly', () => {
188
189
        StackTracey.shortenPath   ('webpack/bootstrap/jquery/dist/jquery.js')
190
                    .should.equal ('jquery/dist/jquery.js')
191
192
        StackTracey.shortenPath   ('node_modules/jquery/dist/jquery.js')
193
                    .should.equal ('jquery/dist/jquery.js')
194
    })
195
196
    const nodeVersion = Number (process.version.match(/^v(\d+\.\d+)/)[1])
197
    if (nodeVersion >= 5) {
198
199
        it.only ('recognizes SyntaxErrors', () => {
0 ignored issues
show
The variable it seems to be never declared. If this is a global, consider adding a /** global: it */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
200
201
            try { require ('./test_files/syntax_error.js') }
202
            catch (e) {
203
204
                console.log (require ('util').inspect (e), '\n')
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
205
206
                const stack = new StackTracey (e).clean
207
208
                console.log ('')
209
                console.log (stack.pretty, '\n')
210
211
                stack[0].syntaxError.should.equal (true)
212
                stack[0].column.should.equal (5)
213
                
214
                stack.pretty.split ('\n')[0].should.equal ('at (syntax error)                  test_files/syntax_error.js:2  foo->bar ()                                     ')
215
            }
216
        })
217
    }
218
219
    it ('implements StackTracey.isThirdParty', () => {
220
221
        StackTracey.isThirdParty.include (path => path === 'test.js')
222
223
        new StackTracey ()[0].thirdParty.should.equal (true)
224
225
        StackTracey.isThirdParty.except (path => path === 'test.js')
226
        
227
        new StackTracey ()[0].thirdParty.should.equal (false)
228
    })
229
230
    it ('.withSource', () => {
231
232
        const line = new StackTracey ().withSource (0).sourceLine.trim ()
233
        line.should.equal ('const line = new StackTracey ().withSource (0).sourceLine.trim ()')
234
    })
235
236
    it ('.at', () => {
237
        
238
        new StackTracey ().at (0).file.includes ('stacktracey/test.js').should.equal (true)
239
    })
240
241
    it ('detects Array methods as native', () => {
242
243
        const arr = [1,2,3]
244
        const stack = arr.reduce (() => new StackTracey ())
245
246
        stack[1].native.should.equal (true)
247
    })
248
249
    it ('works on Windows', () => {
250
251
        const dir = process.cwd ()
252
253
        const windowsStack =
254
                [
255
                'Error',
256
                '    at Context.it (' + dir + '\\test.js:34:22)',
257
                '    at callFn (' + dir + '\\node_modules\\mocha\\lib\\runnable.js:354:21)',
258
                '    at runCallback (timers.js:800:20)'
259
                ].join ('\n')
260
261
        const stack = new StackTracey (windowsStack)
262
        const pretty = stack.pretty
263
        const lines = pretty.split ('\n')
264
265
        console.log ('')
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
266
        console.log (pretty, '\n')
267
268
        lines[0].should.equal ('at it           test.js:34                 stack.should.be.an.instanceof (Array)')
269
        lines[1].indexOf      ('at callFn       mocha/lib/runnable.js:354').should.equal (0)
270
    })
271
272
})
273
274
275
276