Skip to content

Commit 05291da

Browse files
committed
chore(tests): major refactoring
Test all possibilities of inheritance.
1 parent 2862f97 commit 05291da

File tree

1 file changed

+94
-131
lines changed

1 file changed

+94
-131
lines changed

index.spec.js

Lines changed: 94 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ function getCommonLastItems (arr1, arr2, butFirsts) {
1919
}
2020

2121
function compareStacks (actual, expected) {
22-
actual = splitLines(actual)
23-
expected = splitLines(expected)
22+
actual = actual.split(/\r?\n/)
23+
expected = expected.split(/\r?\n/)
2424

2525
// We want to compare only the beginning (bottom) of the stack and
2626
// we don't want to compare the first (from head) two items.
@@ -31,158 +31,121 @@ function compareStacks (actual, expected) {
3131
expect(actual).toEqual(expected)
3232
}
3333

34-
var NL_RE = /\r?\n/
35-
function splitLines (str) {
36-
return String(str).split(NL_RE)
34+
function randomString () {
35+
return Math.random().toString(36).slice(2)
3736
}
3837

3938
// ===================================================================
4039

41-
describe('makeError()', function () {
42-
it('throws on invalid arguments', function () {
43-
expect(function () {
44-
makeError(42)
45-
}).toThrow(TypeError)
46-
expect(function () {
47-
makeError('MyError', 42)
48-
}).toThrow(TypeError)
49-
})
50-
51-
it('creates a new error class', function () {
52-
var constructorCalled
53-
40+
var factories = {
41+
'makeError(name)': makeError,
42+
'makeError(constructor)': function (name, super_) {
5443
function MyError (message) {
55-
expect(MyError.super).toBe(BaseError)
56-
expect(MyError.super_).toBe(BaseError)
57-
5844
MyError.super.call(this, message)
59-
constructorCalled = true
60-
}
61-
makeError(MyError)
62-
63-
var e = new MyError('my error message'); var stack = new Error().stack
64-
65-
expect(constructorCalled).toBe(true)
66-
67-
expect(e).toBeInstanceOf(Error)
68-
expect(e).toBeInstanceOf(BaseError)
69-
expect(e).toBeInstanceOf(MyError)
70-
71-
expect(e.name).toBe('MyError')
72-
expect(e.message).toBe('my error message')
73-
expect(typeof e.stack).toBe('string')
74-
compareStacks(e.stack, stack)
75-
})
76-
77-
it('derives an existing error class', function () {
78-
function MyBaseError (message) {
79-
MyBaseError.super.call(this, message)
80-
}
81-
makeError(MyBaseError)
82-
83-
function MyDerivedError (message) {
84-
expect(MyDerivedError.super).toBe(MyBaseError)
85-
expect(MyDerivedError.super_).toBe(MyBaseError)
86-
87-
MyBaseError.super.call(this, message)
8845
}
89-
makeError(MyDerivedError, MyBaseError)
90-
91-
var e = new MyDerivedError('my error message'); var stack = new Error().stack
92-
93-
expect(e).toBeInstanceOf(Error)
94-
expect(e).toBeInstanceOf(BaseError)
95-
expect(e).toBeInstanceOf(MyBaseError)
96-
expect(e).toBeInstanceOf(MyDerivedError)
97-
98-
expect(e.name).toBe('MyDerivedError')
99-
expect(e.message).toBe('my error message')
100-
expect(typeof e.stack).toBe('string')
101-
compareStacks(e.stack, stack)
102-
})
103-
104-
it('creates a new error class from a name', function () {
105-
var MyError = makeError('MyError')
106-
107-
var e = new MyError('my error message'); var stack = new Error().stack
108-
109-
expect(e).toBeInstanceOf(Error)
110-
expect(e).toBeInstanceOf(BaseError)
111-
expect(e).toBeInstanceOf(MyError)
112-
113-
expect(e.name).toBe('MyError')
114-
expect(e.message).toBe('my error message')
115-
expect(typeof e.stack).toBe('string')
116-
compareStacks(e.stack, stack)
117-
})
118-
})
119-
120-
describe('BaseError', function () {
121-
it('can be inherited directly', function () {
122-
var constructorCalled
46+
Object.defineProperty(MyError, 'name', { value: name })
12347

48+
expect(makeError(MyError, super_)).toBe(MyError)
49+
return MyError
50+
},
51+
'ES3 inheritance': function (name, super_) {
12452
function MyError (message) {
12553
BaseError.call(this, message)
126-
constructorCalled = true
12754
}
128-
129-
// Manually inherits from BaseError.
130-
MyError.prototype = Object.create(BaseError.prototype, {
131-
constructor: {
132-
value: MyError
133-
}
55+
Object.defineProperty(MyError, 'name', {
56+
value: name
13457
})
13558

136-
var e = new MyError('my error message'); var stack = new Error().stack
137-
138-
expect(constructorCalled).toBe(true)
139-
140-
expect(e).toBeInstanceOf(Error)
141-
expect(e).toBeInstanceOf(BaseError)
142-
expect(e).toBeInstanceOf(MyError)
143-
144-
expect(e.name).toBe('MyError')
145-
expect(e.message).toBe('my error message')
146-
expect(typeof e.stack).toBe('string')
147-
compareStacks(e.stack, stack)
148-
})
149-
150-
it('supports ES3 inheritance', function () {
151-
function MyError (message) {
152-
BaseError.call(this, message)
153-
}
154-
15559
function Tmp () {
15660
this.constructor = MyError
15761
}
158-
Tmp.prototype = BaseError.prototype
62+
Tmp.prototype = super_.prototype
15963
MyError.prototype = new Tmp()
16064

161-
var e = new MyError('my error message'); var stack = new Error().stack
65+
return MyError
66+
},
67+
'ES5 inheritance': function (name, super_) {
68+
function MyError (message) {
69+
super_.call(this, message)
70+
}
71+
Object.defineProperty(MyError, 'name', {
72+
value: name
73+
})
16274

163-
expect(e).toBeInstanceOf(Error)
164-
expect(e).toBeInstanceOf(BaseError)
165-
expect(e).toBeInstanceOf(MyError)
75+
// Manually inherits from BaseError.
76+
MyError.prototype = Object.create(super_.prototype, {
77+
constructor: {
78+
configurable: true,
79+
value: MyError,
80+
writable: true
81+
}
82+
})
16683

167-
expect(e.name).toBe('MyError')
168-
expect(e.message).toBe('my error message')
169-
expect(typeof e.stack).toBe('string')
170-
compareStacks(e.stack, stack)
171-
})
84+
return MyError
85+
},
86+
'ES6 inheritance': typeof Reflect !== 'undefined' && function (name, super_) {
87+
return Object.defineProperty(class extends super_ {}, 'name', {
88+
value: name
89+
})
90+
}
91+
}
17292

173-
;(typeof Reflect !== 'undefined' ? it : it.skip)('can be reused as base error', function () {
174-
class MyBaseError extends BaseError {}
175-
var MyError = makeError('MyError', MyBaseError)
93+
var keys = Object.keys(factories)
17694

177-
var e = new MyError('my error message'); var stack = new Error().stack
95+
it('makeError throws on invalid arguments', function () {
96+
expect(function () {
97+
makeError(42)
98+
}).toThrow(TypeError)
99+
expect(function () {
100+
makeError('MyError', 42)
101+
}).toThrow(TypeError)
102+
})
178103

179-
expect(e).toBeInstanceOf(Error)
180-
expect(e).toBeInstanceOf(BaseError)
181-
expect(e).toBeInstanceOf(MyError)
104+
keys.forEach(function (title) {
105+
var factory = factories[title]
106+
;(factory ? describe : describe.skip)(title, function () {
107+
it('creates a new error class', function () {
108+
var name = randomString()
109+
var MyError = factory(name, BaseError)
110+
111+
var message = randomString()
112+
var e = new MyError(message)
113+
var stack = new Error().stack
114+
115+
expect(e).toBeInstanceOf(Error)
116+
expect(e).toBeInstanceOf(BaseError)
117+
expect(e).toBeInstanceOf(MyError)
118+
119+
expect(e.name).toBe(name)
120+
expect(e.message).toBe(message)
121+
expect(typeof e.stack).toBe('string')
122+
compareStacks(e.stack, stack)
123+
})
182124

183-
expect(e.name).toBe('MyError')
184-
expect(e.message).toBe('my error message')
185-
expect(typeof e.stack).toBe('string')
186-
compareStacks(e.stack, stack)
125+
describe('derivable with', function () {
126+
keys.forEach(function (title2) {
127+
var factory2 = factories[title2]
128+
;(factory2 ? it : it.skip)(title2, function () {
129+
var baseName = randomString()
130+
var MyBaseError = factory(baseName, BaseError)
131+
var derivedName = randomString()
132+
var MyDerivedError = factory2(derivedName, MyBaseError)
133+
134+
var message = randomString()
135+
var e = new MyDerivedError(message)
136+
var stack = new Error().stack
137+
138+
expect(e).toBeInstanceOf(Error)
139+
expect(e).toBeInstanceOf(BaseError)
140+
expect(e).toBeInstanceOf(MyBaseError)
141+
expect(e).toBeInstanceOf(MyDerivedError)
142+
143+
expect(e.name).toBe(derivedName)
144+
expect(e.message).toBe(message)
145+
expect(typeof e.stack).toBe('string')
146+
compareStacks(e.stack, stack)
147+
})
148+
})
149+
})
187150
})
188151
})

0 commit comments

Comments
 (0)