1 | fs = require 'fs'
|
2 | should = require 'should'
|
3 | esprima = require 'esprima'
|
4 | wrench = require 'wrench'
|
5 | _ = require 'underscore'
|
6 | jscov = require('./coverage').require 'jscov'
|
7 |
|
8 | output = "spec/.output"
|
9 |
|
10 | describe "rewriteSource", ->
|
11 |
|
12 | [
|
13 | { folder: 'scaffold' }
|
14 | { folder: 'oss' }
|
15 | { folder: 'js-v1.8', jsversion: '1.8' }
|
16 | ].forEach ({ folder }) ->
|
17 | return if process.env.NOOSS? && folder == 'oss'
|
18 |
|
19 | wrench.readdirSyncRecursive('spec/scaffolding/' + folder).forEach (filename) ->
|
20 |
|
21 | return if fs.lstatSync('spec/scaffolding/' + folder + '/' + filename).isDirectory() || !filename.match(/\.js$/)
|
22 |
|
23 | it "should parse #{filename} the same way as jscoverage", ->
|
24 | code = fs.readFileSync('spec/scaffolding/' + folder + '/' + filename, 'utf8')
|
25 | newCode = jscov.rewriteSource(code, filename)
|
26 | actualParse = esprima.parse(newCode)
|
27 |
|
28 | expect = fs.readFileSync(output + '/' + 'expect/' + folder + '/' + filename, 'utf8')
|
29 | expectedParse = esprima.parse(expect)
|
30 |
|
31 |
|
32 | code3 = newCode.split('\n').slice(0, 3).map (x) -> x.replace(/generated by jscov /, 'generated by JSCoverage ')
|
33 | exp3 = expect.split('\n').slice(0, 3)
|
34 | code3.should.eql exp3
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | _.isEqual(actualParse, expectedParse).should.be.true
|
44 |
|
45 |
|
46 |
|
47 | it "should throw an exception if the source is not valid", ->
|
48 | f = ->
|
49 | jscov.rewriteSource("console.log 'test'")
|
50 | f.should.throw()
|
51 |
|
52 |
|
53 |
|
54 | describe "rewriteFolder", ->
|
55 |
|
56 | it "should rewrite entire folders recursively", (done) ->
|
57 |
|
58 | wrench.rmdirSyncRecursive(output + '/scaffold-out', true)
|
59 |
|
60 | jscov.rewriteFolder 'spec/scaffolding/scaffold', (output + '/scaffold-out'), (err) ->
|
61 | should.not.exist err
|
62 | fileCounter = 0
|
63 |
|
64 | wrench.readdirSyncRecursive(output + '/scaffold-out').forEach (filename) ->
|
65 | fullpath = output + '/scaffold-out/' + filename
|
66 | return if fs.lstatSync(fullpath).isDirectory()
|
67 | fileCounter++
|
68 | fs.readFileSync(fullpath, 'utf8').split('\n')[0].should.eql '/* automatically generated by jscov - do not edit */'
|
69 |
|
70 | fileCounter.should.eql 12
|
71 | done()
|
72 |
|
73 |
|
74 | it "should rewrite both javascript and coffee-script, but nothing else", (done) ->
|
75 |
|
76 | wrench.rmdirSyncRecursive(output + '/coffee-out', true)
|
77 |
|
78 | jscov.rewriteFolder 'spec/scaffolding/coffee', (output + '/coffee-out'), (err) ->
|
79 | should.not.exist err
|
80 | fileCounter = 0
|
81 |
|
82 | wrench.readdirSyncRecursive(output + '/coffee-out').forEach (filename) ->
|
83 | fileCounter++
|
84 | fs.readFileSync(output + '/coffee-out/' + filename, 'utf8').split('\n')[0].should.eql '/* automatically generated by jscov - do not edit */'
|
85 | filename.should.match /\.js$/
|
86 |
|
87 | fileCounter.should.eql 2
|
88 | done()
|
89 |
|
90 |
|
91 | it "should not create a directory if it encounters an error when processing coffee-script", (done) ->
|
92 |
|
93 | jscov.rewriteFolder 'spec/scaffolding/invalids/cs', output + '/invalids-out', (err) ->
|
94 | should.exist err
|
95 | fs.lstat (output + '/invalids-out'), (err) ->
|
96 | err.code.should.eql 'ENOENT'
|
97 | done()
|
98 |
|
99 |
|
100 | it "should not create a directory if it encounters an error when processing javascript", (done) ->
|
101 |
|
102 | jscov.rewriteFolder 'spec/scaffolding/invalids/js', (output + '/invalids-out'), (err) ->
|
103 | should.exist err
|
104 | fs.lstat (output + '/invalids-out'), (err) ->
|
105 | err.code.should.eql 'ENOENT'
|
106 | done()
|
107 |
|
108 |
|
109 | it "should report on invalid files, skip them, and process the remaining", (done) ->
|
110 | outdir = output + '/fail-out'
|
111 | wrench.mkdirSyncRecursive(outdir)
|
112 | jscov.rewriteFolder 'spec/scaffolding/fail', outdir, (err) ->
|
113 | fs.exists "#{outdir}/valid.js", (exists) ->
|
114 | exists.should.be.true
|
115 | err.should.be.a 'object'
|
116 | err.message.should.include 'fail.js: Line 2: Unexpected end of input'
|
117 | done()
|
118 |
|
119 |
|
120 | it "should overwrite the target directory and remove/replace all files in it", (done) ->
|
121 |
|
122 | wrench.mkdirSyncRecursive(output + '/existing/subdir')
|
123 | fs.writeFileSync(output + '/existing/foo.js', 'content', 'utf8')
|
124 | fs.writeFileSync(output + '/existing/for.js', 'content', 'utf8')
|
125 | fs.writeFileSync(output + '/existing/subdir/bar.js', 'content', 'utf8')
|
126 |
|
127 | jscov.rewriteFolder 'spec/scaffolding/scaffold', (output + '/existing'), (err) ->
|
128 | should.not.exist err
|
129 | fileCounter = 0
|
130 |
|
131 | wrench.readdirSyncRecursive(output + '/existing').forEach (filename) ->
|
132 | fullpath = output + '/existing/' + filename
|
133 | return if fs.lstatSync(fullpath).isDirectory()
|
134 | fileCounter++
|
135 | fs.readFileSync(fullpath, 'utf8').split('\n')[0].should.eql '/* automatically generated by jscov - do not edit */'
|
136 |
|
137 | fileCounter.should.eql 12
|
138 | done()
|
139 |
|
140 |
|
141 | it "should not include hidden files", (done) ->
|
142 | jscov.rewriteFolder 'spec/scaffolding/hidden', output + '/hidden-default', {}, (err) ->
|
143 | should.not.exist err
|
144 | wrench.readdirSyncRecursive(output + '/hidden-default').sort().should.eql ['subfolder', 'subfolder/vis.js', 'visible.js']
|
145 | done()
|
146 |
|
147 |
|
148 | it "should accept a flag for including hidden files", (done) ->
|
149 | jscov.rewriteFolder 'spec/scaffolding/hidden', output + '/hidden-included', { hidden: true }, (err) ->
|
150 | should.not.exist err
|
151 | wrench.readdirSyncRecursive(output + '/hidden-included').sort().should.eql ['.hidden.js', '.hiddensub', '.hiddensub/.h.js', '.hiddensub/v.js', 'subfolder', 'subfolder/.hid.js', 'subfolder/vis.js', 'visible.js']
|
152 | done()
|
153 |
|
154 |
|
155 | it "should accept a flag for explicitly excluding hidden files", (done) ->
|
156 | jscov.rewriteFolder 'spec/scaffolding/hidden', output + '/hidden-included', { hidden: false }, (err) ->
|
157 | should.not.exist err
|
158 | wrench.readdirSyncRecursive(output + '/hidden-included').sort().should.eql ['subfolder', 'subfolder/vis.js', 'visible.js']
|
159 | done()
|