Completed
Push — master ( f86829...a9054d )
by Vitaly
30s
created

test.js (2 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 StackTracey = require ('./stacktracey'); StackTracey.resetCache ()
24
25
    const shouldBeVisibleInStackTrace = () => new StackTracey () // @hide
26
27
    it ('works', () => {
28
29
        const stack = shouldBeVisibleInStackTrace ()
30
31
        stack.should.be.an.instanceof (Array)
32
33
        stack[0].should.deep.equal ({
34
            beforeParse: 'at shouldBeVisibleInStackTrace (' + process.cwd () + '/test.js:25:47)',
35
            callee: 'shouldBeVisibleInStackTrace',
36
            index: false,
37
            native: false,
38
            file: process.cwd () + '/test.js',
39
            line: 25,
40
            column: 47,
41
            calleeShort: 'shouldBeVisibleInStackTrace',
42
            fileName: 'test.js',
43
            fileRelative: 'test.js',
44
            fileShort: 'test.js',
45
            thirdParty: false
46
        })
47
    })
48
49
    it ('allows to read sources', () => {
50
51
        const stack = shouldBeVisibleInStackTrace ().withSources // @hide
52
53
              stack.should.be.an.instanceof (StackTracey)
54
              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...
55
              stack[0].sourceLine.should.equal ('    const shouldBeVisibleInStackTrace = () => new StackTracey () ')
56
              stack[0].hide.should.equal (true) // reads // @hide marker
57
              stack[1].hide.should.equal (true) // reads // @hide marker
58
59
        const cleanStack = stack.clean
60
61
        cleanStack.should.be.an.instanceof (StackTracey)
62
63
        StackTracey.locationsEqual (cleanStack[0], stack[0]).should.equal (true)  // should not clean top element
64
        StackTracey.locationsEqual (cleanStack[1], stack[1]).should.equal (false) // should clean second element (due to // @hide)
65
    })
66
67
    it ('allows creation from array + groups duplicate lines', () => {
68
69
        const stack = new StackTracey ([
70
            { file: 'yo.js',  line: 11, callee: 'a.funkktion',   calleeShort: 'a' },
71
            { file: 'yo.js',  line: 10, callee: 'foobar.boobar', calleeShort: 'foobar' },
72
            { file: 'yo.js',  line: 10, callee: 'foobar.boobar', calleeShort: 'foobar' },
73
            { file: 'lol.js', line: 10, callee: '',              calleeShort: '' },
74
        ])
75
76
        const clean = stack.clean.map (x => Object.assign ({
77
                                                    file: x.file,
78
                                                    line: x.line,
79
                                                    callee: x.callee,
80
                                                    calleeShort: x.calleeShort }))
81
82
        clean.should.be.an.instanceof (StackTracey)
83
84
        Array.from (clean).should.deep.equal ([ // .should does not recognize StackTracey as normal array...
85
86
            { file: process.cwd () + '/yo.js',  line: 11, callee: 'a.funkktion',   calleeShort: 'a' },
87
            { file: process.cwd () + '/yo.js',  line: 10, callee: 'foobar.boobar → foobar.boobar', calleeShort: 'foobar → foobar' },
88
            { file: process.cwd () + '/lol.js', line: 10, callee: '',              calleeShort: '' },
89
        ])
90
    })
91
92
    it ('handles inaccessible files', () => {
93
94
        const stack = shouldBeVisibleInStackTrace ()
95
              stack[0].file = '^___^'
96
              stack.withSources[0].sourceLine.should.equal ('')
97
              stack.withSources[0].error.should.be.an.instanceof (Error)
98
    })
99
100
    it ('exposes some Array methods', () => {
101
102
        const stack = shouldBeVisibleInStackTrace ()
103
        const sliced = stack.slice (1)
104
        const deltaLength = (stack.length - sliced.length)
105
106
        deltaLength.should.equal (1)
107
        sliced.should.be.an.instanceof (StackTracey)
108
109
        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...
110
    })
111
112
    it ('works with sourcemaps', () => {
113
114
        const path = require ('path'),
115
              mkay = require ('./test_files/mkay.uglified')
116
117
        try {
118
            mkay ()
119
        }
120
        catch (e) {
121
122
            e.message.should.equal ('mkay')
123
124
            const top = new StackTracey (e).withSources[0]
125
126
            top.line        .should.equal (4)
127
            top.column      .should.equal (22)
128
            top.sourceLine  .should.equal ('\t\t\t\t\tthrow new Error (\'mkay\') }')
129
130
            top.file        .should.equal (path.resolve ('./test_files/mkay.js'))
131
            top.fileShort   .should.equal ('test_files/mkay.js')
132
            top.fileName    .should.equal ('mkay.js')
133
        }
134
    })
135
136
    it ('pretty printing works', function prettyTest () {
137
138
        const pretty = new StackTracey ().clean.pretty
139
140
        pretty.split ('\n')[0].should.equal ('at prettyTest                      test.js:138    const pretty = new StackTracey ().clean.pretty')
141
142
        ;(new StackTracey ([
143
            { },
144
            { }
145
        ]).clean.pretty).should.equal ('at <anonymous> → <anonymous>')
146
    })
147
148
    it ('exposes Array methods', () => {
149
150
        const stack = new StackTracey ([
151
            { file: 'foo' },
152
            { file: 'bar' }
153
        ])
154
155
        const mapped = stack.map ((x, i) => Object.assign (x, { i }))
156
157
        mapped.should.deep.equal ([ { file: 'foo', i: 0 }, { file: 'bar', i: 1 } ])
158
        mapped.should.be.an.instanceof (Array)
159
        mapped.should.be.an.instanceof (StackTracey)
160
161
        stack.reduce ((memo, x) => memo + x.file, '').should.equal ('foobar')
162
163
        const filtered = stack.filter (x => x.file === 'bar')
164
165
        filtered.length.should.equal (1)
166
        filtered[0].should.deep.equal ({ file: 'bar', i: 1 })
167
    })
168
169
    it ('computes relative path correctly', () => {
170
        
171
        StackTracey.relativePath  ('webpack:///~/jquery/dist/jquery.js')
172
                    .should.equal (            '~/jquery/dist/jquery.js')
173
174
        StackTracey.relativePath  ('webpack:/webpack/bootstrap')
175
                    .should.equal (          'webpack/bootstrap')
176
    })
177
178
    it ('computes short path correctly', () => {
179
180
        StackTracey.shortenPath   ('webpack/bootstrap/jquery/dist/jquery.js')
181
                    .should.equal ('jquery/dist/jquery.js')
182
183
        StackTracey.shortenPath   ('node_modules/jquery/dist/jquery.js')
184
                    .should.equal ('jquery/dist/jquery.js')
185
    })
186
187
    const nodeVersion = Number (process.version.match(/^v(\d+\.\d+)/)[1])
188
    if (nodeVersion >= 5) {
189
190
        it ('recognizes SyntaxErrors', () => {
191
192
            try { require ('./test_files/syntax_error.js') }
193
            catch (e) {
194
195
                const stack = new StackTracey (e).clean
196
197
                stack[0].syntaxError.should.equal (true)
198
                stack[0].column.should.equal (5)
199
                stack.pretty.split ('\n')[0].should.equal ('at (syntax error)                  test_files/syntax_error.js:2  foo->bar ()                                     ')
200
            }
201
        })
202
    }
203
204
    it ('implements StackTracey.isThirdParty', () => {
205
206
        StackTracey.isThirdParty.include (path => path === 'test.js')
207
208
        new StackTracey ()[0].thirdParty.should.equal (true)
209
210
        StackTracey.isThirdParty.except (path => path === 'test.js')
211
        
212
        new StackTracey ()[0].thirdParty.should.equal (false)
213
    })
214
215
    it ('.withSource', () => {
216
217
        const line = new StackTracey ().withSource (0).sourceLine.trim ()
218
        line.should.equal ('const line = new StackTracey ().withSource (0).sourceLine.trim ()')
219
    })
220
221
    it ('.at', () => {
222
        
223
        new StackTracey ().at (0).file.includes ('stacktracey/test.js').should.equal (true)
224
    })
225
})
226
227
228
229