Completed
Push — master ( f44c17...6e593c )
by Vitaly
36s
created
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
143
    it ('exposes Array methods', () => {
144
145
        const stack = new StackTracey ([
146
            { file: 'foo' },
147
            { file: 'bar' }
148
        ])
149
150
        const mapped = stack.map ((x, i) => Object.assign (x, { i }))
151
152
        mapped.should.deep.equal ([ { file: 'foo', i: 0 }, { file: 'bar', i: 1 } ])
153
        mapped.should.be.an.instanceof (Array)
154
        mapped.should.be.an.instanceof (StackTracey)
155
156
        stack.reduce ((memo, x) => memo + x.file, '').should.equal ('foobar')
157
158
        const filtered = stack.filter (x => x.file === 'bar')
159
160
        filtered.length.should.equal (1)
161
        filtered[0].should.deep.equal ({ file: 'bar', i: 1 })
162
    })
163
164
    it ('computes relative path correctly', () => {
165
        
166
        StackTracey.relativePath  ('webpack:///~/jquery/dist/jquery.js')
167
                    .should.equal (            '~/jquery/dist/jquery.js')
168
169
        StackTracey.relativePath  ('webpack:/webpack/bootstrap')
170
                    .should.equal (          'webpack/bootstrap')
171
    })
172
173
    it ('computes short path correctly', () => {
174
175
        StackTracey.shortenPath   ('webpack/bootstrap/jquery/dist/jquery.js')
176
                    .should.equal ('jquery/dist/jquery.js')
177
178
        StackTracey.shortenPath   ('node_modules/jquery/dist/jquery.js')
179
                    .should.equal ('jquery/dist/jquery.js')
180
    })
181
182
    const nodeVersion = Number (process.version.match(/^v(\d+\.\d+)/)[1])
183
    if (nodeVersion >= 5) {
184
185
        it ('recognizes SyntaxErrors', () => {
186
187
            try { require ('./test_files/syntax_error.js') }
188
            catch (e) {
189
190
                const stack = new StackTracey (e).clean
191
192
                stack[0].syntaxError.should.equal (true)
193
                stack[0].column.should.equal (5)
194
                stack.pretty.split ('\n')[0].should.equal ('at (syntax error)                  test_files/syntax_error.js:2  foo->bar ()                                     ')
195
            }
196
        })
197
    }
198
199
    it ('implements StackTracey.isThirdParty', () => {
200
201
        StackTracey.isThirdParty.include (path => path === 'test.js')
202
203
        new StackTracey ()[0].thirdParty.should.equal (true)
204
205
        StackTracey.isThirdParty.except (path => path === 'test.js')
206
        
207
        new StackTracey ()[0].thirdParty.should.equal (false)
208
    })
209
210
    it ('.withSource', () => {
211
212
        const line = new StackTracey ().withSource (0).sourceLine.trim ()
213
        line.should.equal ('const line = new StackTracey ().withSource (0).sourceLine.trim ()')
214
    })
215
216
    it ('.at', () => {
217
        
218
        new StackTracey ().at (0).file.should.equal ('/Users/mac/stacktracey/test.js')
219
    })
220
})
221
222
223
224