@@ -19,8 +19,8 @@ function getCommonLastItems (arr1, arr2, butFirsts) {
1919}
2020
2121function 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