-
Notifications
You must be signed in to change notification settings - Fork 22
/
util.spec.coffee
130 lines (101 loc) · 4.04 KB
/
util.spec.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#==============================================================================
# test/mock/util.js module
#==============================================================================
describe 'mock-util', ->
util = require '../lib/util'
#============================================================================
# util.predictableNextTick()
#============================================================================
describe 'predictableNextTick', ->
nextTick = util.predictableNextTick
it 'should be async', ->
spy = jasmine.createSpy 'nextTick callback'
nextTick spy
expect(spy).not.toHaveBeenCalled()
waitsFor (-> spy.callCount), 'nextTick', 100
it 'should behave predictable based on given pattern', ->
nextTick.pattern = [1, 0]
stressIt = ->
log = ''
runs ->
nextTick -> log += 1
nextTick -> log += 2
nextTick -> log += 3
nextTick -> log += 4
waitsFor (-> log.length is 4), 'all nextTicks', 100
runs ->
expect(log).toBe '2143'
# execute this test five times
stressIt() for i in [1..5]
it 'should do 021 pattern k*n fns', ->
nextTick.pattern = [0, 2, 1]
log = ''
nextTick -> log += 0
nextTick -> log += 1
nextTick -> log += 2
nextTick -> log += 3
nextTick -> log += 4
nextTick -> log += 5
waitsFor (-> log.length is 6), 'all nextTicks', 100
runs ->
expect(log).toBe '021354'
it 'should do 3021 pattern with n+1 fns', ->
nextTick.pattern = [3, 0, 2, 1]
log = ''
nextTick -> log += 0
nextTick -> log += 1
nextTick -> log += 2
nextTick -> log += 3
nextTick -> log += 4
waitsFor (-> log.length is 5), 'all nextTicks', 100
runs ->
expect(log).toBe '30214'
# regression
it 'should survive exception inside callback', ->
exceptionHandled = false
beforeExceptionSpy = jasmine.createSpy 'before exception'
afterExceptionSpy = jasmine.createSpy 'after exception'
nextTick beforeExceptionSpy
nextTick -> throw 'CALLBACK EXCEPTION'
nextTick afterExceptionSpy
uncaughtExceptionHandler = (err) ->
process.removeListener 'uncaughtException', uncaughtExceptionHandler
exceptionHandled = true
process.on 'uncaughtException', uncaughtExceptionHandler
waitsFor (-> afterExceptionSpy.callCount), 'after exception callback', 100
runs ->
expect(beforeExceptionSpy.callCount).toBe 1
expect(afterExceptionSpy.callCount).toBe 1
expect(exceptionHandled).toBe true
# regression
it 'should not ignore fn that was added into already skipped space during execution', ->
nextTick.pattern = [1, 0]
anotherCallback = jasmine.createSpy 'another later added fn'
callback = jasmine.createSpy 'later added fn'
nextTick ->
nextTick ->
callback()
nextTick anotherCallback
waitsFor (-> callback.callCount), 'later added fn to be called', 100
waitsFor (-> anotherCallback.callCount), 'another later added fn to be called', 100
#============================================================================
# util.loadFile()
#============================================================================
describe 'loadFile', ->
loadFile = util.loadFile
fixturePath = __dirname + '/fixtures/some.js'
it 'should load file with access to private state', ->
module = loadFile fixturePath
expect(module.privateNumber).toBe 100
it 'should inject mocks', ->
fsMock = {}
module = loadFile fixturePath, {fs: fsMock}
expect(module.privateFs).toBe fsMock
it 'should load local modules', ->
module = loadFile fixturePath
expect(module.privateLocalModule).toBeDefined()
expect(module.privateLocalModule.id).toBe 'LOCAL_MODULE'
it 'should inject globals', ->
fakeConsole = {}
module = loadFile fixturePath, {}, {console: fakeConsole}
expect(module.privateConsole).toBe fakeConsole