hamcrest4qunit 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,123 @@
1
+ h4q.startsWith = (s) ->
2
+ unless s? then throw new Error message: "startsWith must receive an argument"
3
+
4
+ new Matcher
5
+ start: s
6
+ _matches: (v,msg) ->
7
+ msg.appendText("was").appendValue(v)
8
+
9
+ unless v? and typeof v is "string"
10
+ false
11
+ else
12
+ v.indexOf(@start) is 0
13
+
14
+ _describeTo: (msg) ->
15
+ msg.appendText("a String starting with").appendValue(@start)
16
+
17
+ h4q.endsWith = (s) ->
18
+ unless s?
19
+ throw new Error message: "endsWith must receive an argument"
20
+
21
+ new Matcher
22
+ end: s
23
+ _matches: (v,msg) ->
24
+ msg.appendText("was").appendValue(v)
25
+ unless v? and typeof v is "string"
26
+ false
27
+ else
28
+ v.indexOf(@end) is v.length - @end.length
29
+
30
+ _describeTo: (msg) ->
31
+ msg.appendText("a String ending with").appendValue(@end)
32
+
33
+ h4q.contains = (s) ->
34
+ unless s?
35
+ throw new Error message: "endsWith must receive an argument"
36
+
37
+ new Matcher
38
+ search: s
39
+ _matches: (v,msg) ->
40
+ msg.appendText("was").appendValue(v)
41
+ unless v? and typeof v is "string"
42
+ false
43
+ else
44
+ v.indexOf(@search) isnt -1
45
+
46
+ _describeTo: (msg) ->
47
+ msg.appendText("a String containing").appendValue(@search)
48
+
49
+ h4q.stringWithLength = (l) ->
50
+
51
+ if isNaN l
52
+ throw new Error message: "length argument must be a valid number"
53
+ if l < 0
54
+ throw new Error message: "length argument must be greater than
55
+ or equal to 0"
56
+
57
+ return h4q.emptyString() if l is 0
58
+
59
+ new Matcher
60
+ length: l
61
+ _matches: (v,msg) ->
62
+ unless v?
63
+ msg.appendText("was").appendValue(v)
64
+ false
65
+ else if typeof v isnt "string"
66
+ msg.appendText("was").appendValue(v)
67
+ false
68
+ else
69
+ if v.length is @length
70
+ msg.appendText("was").appendValue(v)
71
+ true
72
+ else
73
+ msg.appendValue(v)
74
+ .appendText("is a String of length")
75
+ .appendValue(v.length)
76
+ false
77
+
78
+ _describeTo: (msg) ->
79
+ msg.appendText("a String with a length of").appendValue(@length)
80
+
81
+ h4q.emptyString = ->
82
+ new Matcher
83
+ _matches: (v,msg) ->
84
+
85
+ unless v?
86
+ msg.appendText("was").appendValue(v)
87
+ false
88
+ else if typeof v isnt "string"
89
+ msg.appendText("was").appendValue(v)
90
+ false
91
+ else
92
+ if v.length is 0
93
+ msg.appendText("was").appendValue(v)
94
+ true
95
+ else
96
+ msg.appendValue(v)
97
+ .appendText("is a String of length")
98
+ .appendValue(v.length)
99
+ false
100
+
101
+ _describeTo: (msg) ->
102
+ msg.appendText("an empty String")
103
+
104
+ h4q.matchRe = (re) ->
105
+ unless re?
106
+ throw new Error message: "The 're' argument can't be null"
107
+ unless re instanceof RegExp or typeof re is "string"
108
+ throw new Error message: "the re argument must be a regexp or a string"
109
+ if typeof re is "string"
110
+ re = new RegExp re, "gi"
111
+
112
+ new Matcher
113
+ re: re
114
+ _matches: (v,msg) ->
115
+ msg.appendText("was").appendValue(v)
116
+ unless v? and typeof v is "string"
117
+ false
118
+ else
119
+ @re.exec v
120
+
121
+ _describeTo: (msg) ->
122
+ msg.appendText("a String which match").appendRawValue(String @re)
123
+
@@ -0,0 +1,920 @@
1
+ QUnit.jsDump.parsers["node"] = function(v){
2
+ return nodeToString( v );
3
+ }
4
+
5
+ module("hamcrest core");
6
+
7
+ test( "assertThat polymorphism", function(){
8
+ raises ( function(){ assertThat(); }, "assertThat should throw an error for empty assertions" );
9
+ assertThat( true );
10
+ assertThat( "foo", "foo" );
11
+ assertThat( true, true, "assertThat with a custom message" );
12
+ });
13
+
14
+ test( "Matcher object", function(){
15
+ raises( function(){
16
+ new Matcher();
17
+ }, "new Matcher without options in constructor" );
18
+ raises( function(){
19
+ new Matcher({'_matches':function(){} });
20
+ }, "new Matcher with a missing handler");
21
+ raises( function(){
22
+ new Matcher({'_matches':"foo", '_describeTo':function(){} });
23
+ }, "new Matcher with an invalid handler");
24
+ raises( function(){
25
+ new Matcher({'_matches':function(){}, '_describeTo':15 });
26
+ }, "new Matcher with an invalid handler");
27
+
28
+ notEqual( new Matcher({
29
+ '_matches':function(){},
30
+ '_describeTo':function(){}
31
+ }),
32
+ null );
33
+ });
34
+
35
+ test( "Description object", function(){
36
+ var d = new Description()
37
+
38
+ notEqual( d, null );
39
+ notEqual( d.message, null );
40
+ equals( d.diff, null );
41
+ equals( d.hasDiff(), false );
42
+
43
+ d.diff = "foo";
44
+ equals( d.diff, "foo" );
45
+ equals( d.hasDiff(), true );
46
+
47
+ d.appendText("foo");
48
+ equals( d.message, "foo" );
49
+ d.appendText("foo");
50
+ equals( d.message, "foo foo" );
51
+
52
+ d.clearMessage();
53
+ equals( d.message, "" );
54
+
55
+ d.appendValue( "foo" );
56
+ equals( d.message, "<span class='value'>\"foo\"</span>" );
57
+
58
+ d.clearMessage();
59
+ d.appendRawValue( "foo" );
60
+ equals( d.message, "<span class='value'>foo</span>" );
61
+
62
+ var m = new Matcher({'_matches':function(){}, '_describeTo':function(msg){
63
+ msg.appendText( "foo" );
64
+ }})
65
+ d.clearMessage();
66
+ d.appendDescriptionOf( m );
67
+
68
+ equals( d.message, "foo" );
69
+ });
70
+
71
+ module( "hamcrest utilities");
72
+
73
+ test( "nodeToString function", function(){
74
+
75
+ raises ( function(){
76
+ nodeToString();
77
+ }, "nodeToString fail when no argument");
78
+
79
+ raises ( function(){
80
+ nodeToString( "foo" );
81
+ }, "nodeToString fail argument is not a node");
82
+
83
+ var n;
84
+
85
+ n = document.createElement( "div" );
86
+ assertThat( nodeToString, returns( escapeHtml("<div></div>") ).withArgs( n ) );
87
+
88
+ n = document.createElement( "div" );
89
+ n.setAttribute( "class", "foo" )
90
+ assertThat( nodeToString, returns( escapeHtml("<div class=\"foo\"></div>") ).withArgs( n ) );
91
+
92
+ n = document.createElement( "div" );
93
+ n.textContent = "abc"
94
+ assertThat( nodeToString, returns( escapeHtml("<div>abc</div>") ).withArgs( n ) );
95
+
96
+ n = document.createElement( "div" );
97
+ n.innerHTML = "<h1>abc</h1>def";
98
+ assertThat( nodeToString, returns( escapeHtml("<div>\n <h1>abc</h1>\n def\n</div>") ).withArgs( n ) );
99
+
100
+ n = document.createElement( "div" );
101
+ n.innerHTML = "<h1>abc</h1><h2>def</h2><h3><span>ghi</span>jkl<span>mno</span></h3>";
102
+ assertThat( nodeToString, returns( escapeHtml("<div>\n <h1>abc</h1>\n <h2>def</h2>\n <h3>\n <span>ghi</span>\n jkl\n <span>mno</span>\n </h3>\n</div>") ).withArgs( n ) );
103
+
104
+ n = document.createElement( "div" );
105
+ n.innerHTML = "<h1 class=\"foo\">abc</h1><h2 id=\"foo\" class=\"foo\">def</h2><h3><span>ghi</span>jkl<span class=\"foo\">mno</span></h3>";
106
+ assertThat( nodeToString, returns( escapeHtml("<div>\n <h1 class=\"foo\">abc</h1>\n <h2 class=\"foo\" id=\"foo\">def</h2>\n <h3>\n <span>ghi</span>\n jkl\n <span class=\"foo\">mno</span>\n </h3>\n</div>") ).withArgs( n ) );
107
+
108
+ });
109
+
110
+ module("hamcrest core matchers");
111
+ test("not matcher", function(){
112
+
113
+ assertThat( true, not(false) );
114
+ assertThat( 5, not(10) );
115
+ assertThat( 5, not( equalTo( 10 ) ) );
116
+
117
+ // forced fail
118
+ // assertThat( 10, not( equalTo( 10 ) ) );
119
+ // assertThat( "A sample text", equalTo( "A SamPLE TeXT" ) );
120
+ });
121
+
122
+ test("equalTo matcher", function(){
123
+ assertThat( 10, equalTo( 10 ) );
124
+ assertThat( "10", equalTo( 10 ) );
125
+ assertThat( 5, not( equalTo( 10 ) ) );
126
+ assertThat( [1,"foo",false], equalTo( [1,"foo",false] ) );
127
+
128
+ // forced fail
129
+ // assertThat( 5, equalTo( 10 ) );
130
+ // assertThat( [1,"foo",true], equalTo( [14,"foo",false] ) );
131
+ });
132
+
133
+ test("nullValue matcher", function(){
134
+
135
+ assertThat( null, nullValue() );
136
+ assertThat( {}, not(nullValue()) );
137
+
138
+ // forced fail
139
+ // assertThat( {}, nullValue() );
140
+ });
141
+
142
+ test("notNullValue matcher", function(){
143
+
144
+ assertThat( null, not(notNullValue()) );
145
+ assertThat( {}, notNullValue() );
146
+
147
+ // forced fail
148
+ // assertThat( null, notNullValue() );
149
+ });
150
+
151
+ test("anything matcher", function(){
152
+
153
+ assertThat( 10, anything() );
154
+ assertThat( true, anything() );
155
+ assertThat( null, anything() );
156
+ assertThat( {}, anything() );
157
+ });
158
+ test("isA matcher", function(){
159
+
160
+ assertThat( 10, isA( "number" ) );
161
+ assertThat( "foo", isA( "string" ) );
162
+ assertThat( false, isA( "boolean" ) );
163
+ assertThat( null, not( isA( "number" ) ) );
164
+ });
165
+
166
+ test( "describedAs matcher", function(){
167
+
168
+ raises( function(){
169
+ describedAs();
170
+ }, "describedAs expect two arguments" );
171
+
172
+ raises( function(){
173
+ describedAs( "foo", "foo" );
174
+ }, "describedAs first argument must be a valid matcher" );
175
+
176
+ raises( function(){
177
+ describedAs( new Matcher({'_matches':function(){},'_describeTo':function(){} }) );
178
+ }, "describedAs second argument must be a valid string" );
179
+
180
+ var desc = new Description();
181
+ var m = describedAs(anything(), "a message");
182
+ assertThat( m, hasMethod( "matches" ).returns(true).withArgs("foo",new Description()) );
183
+ m.describeTo( desc );
184
+ assertThat( desc, hasProperty("message", equalTo("a message") ) );
185
+
186
+ desc = new Description();
187
+ m = describedAs(equalTo(5), "a message");
188
+ assertThat( m, hasMethod( "matches" ).returns(false).withArgs(10,new Description()) );
189
+ m.describeTo( desc );
190
+ assertThat( desc, hasProperty("message", equalTo("a message") ) );
191
+
192
+ desc = new Description();
193
+ m = describedAs(anything(), "a message $0", "foo");
194
+ m.describeTo( desc );
195
+ assertThat( desc, hasProperty("message", equalTo("a message foo") ) );
196
+
197
+ desc = new Description();
198
+ m = describedAs(anything(), "a message ${foo}, $0", {'foo':"bar"}, "foo" );
199
+ m.describeTo( desc );
200
+ assertThat( desc, hasProperty("message", equalTo("a message bar, foo") ) );
201
+
202
+ });
203
+
204
+ module( "hamcrest compound matchers");
205
+
206
+ test( "allOf matcher", function(){
207
+ assertThat( 10, allOf( notNullValue(), equalTo(10) ) );
208
+ assertThat( 10, allOf( notNullValue(), 10 ) );
209
+ assertThat( 10, not( allOf( nullValue(), equalTo(10) ) ) );
210
+ assertThat( 5, allOf( notNullValue(), not( equalTo(10) ) ) );
211
+
212
+ // forced fail
213
+ // assertThat( 5, allOf( notNullValue(), not( equalTo(5) ) ) );
214
+ } );
215
+
216
+ test( "anyOf matcher", function(){
217
+ assertThat( 10, anyOf( equalTo(10), not( equalTo(5) ) ) );
218
+ assertThat( 10, anyOf( 1, 2, 3, 4, allOf(notNullValue(), 10 ) ) );
219
+ assertThat( 10, not( anyOf( 1,2,3,4 ) ) );
220
+
221
+ // forced fail
222
+ // assertThat( 5, anyOf( 1, 2, 3, 4 ) );
223
+ });
224
+
225
+ test("both...and matcher",function(){
226
+
227
+ raises( function(){ assertThat( 16, both(16) ); }, "calling both without the and fail" );
228
+
229
+ assertThat( 16, both( notNullValue() ).and( equalTo(16) ) );
230
+ assertThat( 16, both( notNullValue() ).and( 16 ) );
231
+
232
+ assertThat( 16, not( both( notNullValue() ).and( closeTo( 12,1 ) ) ) );
233
+ assertThat( null, not( both( notNullValue() ).and( 12 ) ) );
234
+
235
+ });
236
+
237
+ test("either...or matcher",function(){
238
+
239
+ raises( function(){ assertThat( 16, either(16) ); }, "calling either without the or fail" );
240
+
241
+ assertThat( 16, either( notNullValue() ).or( equalTo(16) ) );
242
+ assertThat( 16, either( true ).or( 16 ) );
243
+ });
244
+
245
+ module( "hamcrest number matchers" );
246
+
247
+ test( "nanValue matcher", function(){
248
+ assertThat( NaN, nanValue() );
249
+ assertThat( 12, not( nanValue() ) );
250
+ assertThat( "foo", nanValue() );
251
+ });
252
+ test( "notNanValue matcher", function(){
253
+ assertThat( 12, notNanValue() );
254
+ assertThat( NaN, not( notNanValue() ) );
255
+ });
256
+
257
+ test( "between matcher", function(){
258
+ raises( function(){
259
+ assertThat( 12, between( 16, 4 ) );
260
+ }, "first argument is lower than the second" );
261
+ raises( function(){
262
+ assertThat( 12, between( NaN, 4 ) );
263
+ }, "first argument is NaN" );
264
+ raises( function(){
265
+ assertThat( 12, between( 4, NaN ) );
266
+ }, "second argument is NaN" );
267
+
268
+
269
+ assertThat( 16, between( 12, 18 ) );
270
+ assertThat( 12, not( between( 12, 18 ) ) );
271
+ assertThat( 12, between( 12, 18 ).inclusive() );
272
+ assertThat( 18, between( 12, 18 ).inclusive() );
273
+ } )
274
+
275
+ test( "closeTo matcher", function(){
276
+ raises( function(){
277
+ assertThat( 12, closeTo( NaN, 4 ) );
278
+ }, "first argument is NaN" );
279
+ raises( function(){
280
+ assertThat( 12, closeTo( 4, NaN ) );
281
+ }, "second argument is NaN" );
282
+
283
+ assertThat( 4, closeTo( 5, 1 ) );
284
+ assertThat( 3, not( closeTo( 5, 1 ) ) );
285
+ assertThat( 1.9, closeTo( 2, 0.1 ) );
286
+ })
287
+
288
+ test( "greaterThan matcher", function(){
289
+ raises( function(){
290
+ assertThat( 12, greaterThan( NaN ) );
291
+ }, "comparison value is NaN" );
292
+
293
+ assertThat( 12, greaterThan( 8 ) );
294
+ assertThat( 12, greaterThan( 12 ).inclusive() );
295
+ assertThat( 12, not(greaterThan( 18 )) );
296
+ })
297
+ test( "greaterThanOrEqualTo matcher", function(){
298
+ raises( function(){
299
+ assertThat( 12, greaterThanOrEqualTo( NaN ) );
300
+ }, "comparison value is NaN" );
301
+
302
+ assertThat( 12, greaterThanOrEqualTo( 12 ) );
303
+ assertThat( 12, not( greaterThanOrEqualTo( 19 ) ) );
304
+ })
305
+ test( "atLeast matcher", function(){
306
+ raises( function(){
307
+ assertThat( 12, atLeast( NaN ) );
308
+ }, "comparison value is NaN" );
309
+
310
+ assertThat( 12, atLeast( 12 ) );
311
+ assertThat( 12, not( atLeast( 19 ) ) );
312
+ })
313
+
314
+ test( "lowerThan matcher", function(){
315
+ raises( function(){
316
+ assertThat( 12, lowerThan( NaN ) );
317
+ }, "comparison value is NaN" );
318
+
319
+ assertThat( 12, lowerThan( 18 ) );
320
+ assertThat( 12, lowerThan( 12 ).inclusive() );
321
+ assertThat( 12, not(lowerThan( 11 )) );
322
+ })
323
+ test( "lowerThanOrEqualTo matcher", function(){
324
+ raises( function(){
325
+ assertThat( 12, lowerThanOrEqualTo( NaN ) );
326
+ }, "comparison value is NaN" );
327
+
328
+ assertThat( 12, lowerThanOrEqualTo( 12 ) );
329
+ assertThat( 12, not( lowerThanOrEqualTo( 11 ) ) );
330
+ })
331
+ test( "atMost matcher", function(){
332
+ raises( function(){
333
+ assertThat( 12, atMost( NaN ) );
334
+ }, "comparison value is NaN" );
335
+
336
+ assertThat( 12, atMost( 12 ) );
337
+ assertThat( 12, not( atMost( 11 ) ) );
338
+ })
339
+
340
+ module("hamcrest array matchers");
341
+
342
+ test( "emptyArray matcher", function(){
343
+ assertThat( [], emptyArray() );
344
+ assertThat( [5], not( emptyArray() ) );
345
+ assertThat( null, not( emptyArray() ) );
346
+ assertThat( "", not( emptyArray() ) );
347
+ assertThat( "foo", not( emptyArray() ) );
348
+ })
349
+ test( "arrayWithLength matcher", function(){
350
+ raises( function(){
351
+ assertThat( [], arrayWithLength() );
352
+ }, "length argument must be a valid number");
353
+ raises( function(){
354
+ assertThat( [], arrayWithLength(-10) );
355
+ }, "length argument must be greater than or equal to 0");
356
+
357
+ assertThat( [], arrayWithLength(0) );
358
+ assertThat( [5], not( arrayWithLength(0) ) );
359
+ assertThat( [], not( arrayWithLength(4) ) );
360
+ assertThat( [1,2,3,4], arrayWithLength(4) );
361
+ })
362
+
363
+ test( "array matcher", function(){
364
+ assertThat( [], array() );
365
+ assertThat( [1, 1.9, 4], array( equalTo(1), closeTo(2, 0.1), equalTo(4) ) );
366
+ assertThat( [1,2,3], array(1,2,3) );
367
+ assertThat( [], not( array(1,2,3) ) );
368
+ assertThat( [1,2], not( array(4,6) ) );
369
+ assertThat( null, not( array(4,6) ) );
370
+ assertThat( "46", not( array(4,6) ) );
371
+ })
372
+
373
+ test( "everyItem matcher", function(){
374
+ raises( function(){
375
+ assertThat([1,2,3], everyItem() );
376
+ }, "everyItem must have an argument" );
377
+
378
+ assertThat( [1,2,3], everyItem(isA("number")) );
379
+ assertThat( [1,2,"foo"], not( everyItem(isA("number"))) );
380
+ assertThat( [1,1,1,1], everyItem(1) );
381
+ assertThat( null, not(everyItem(isA("number"))) );
382
+ assertThat( "foo", not(everyItem(isA("number"))) );
383
+ })
384
+
385
+ test( "hasItem matcher", function(){
386
+ raises( function(){
387
+ assertThat([1,2,3], hasItem() );
388
+ }, "hasItem must have an argument" );
389
+
390
+ assertThat( [1,"foo",false], hasItem(isA("number")) );
391
+ assertThat( ["foo","bar"], not( hasItem(isA("number"))) );
392
+ assertThat( [1,2,3,4], hasItem(1) );
393
+ assertThat( null, not(hasItem(isA("number"))) );
394
+ assertThat( "foo", not(hasItem(isA("number"))) );
395
+ })
396
+
397
+ test( "hasItems matcher", function(){
398
+ raises( function(){
399
+ assertThat([1,2,3], hasItems() );
400
+ }, "hasItems must have at least one argument" );
401
+
402
+ assertThat( [ 1, "foo", false], hasItems( isA("number"), "foo" ) );
403
+ assertThat( [ 1, "foo", false], not( hasItems( isA("number"), isA("object") ) ) );
404
+ assertThat( [ "bla", "foo", false], not( hasItems( isA("number"), isA("object") ) ) );
405
+ assertThat( null, not( hasItems( isA("number"), isA("object") ) ) );
406
+ assertThat( false, not( hasItems( isA("number"), isA("object") ) ) );
407
+ })
408
+
409
+ module("hamcrest string matchers")
410
+
411
+ test( "startsWith matcher", function(){
412
+ raises( function(){
413
+ assertThat( "foo", startsWith() );
414
+ }, "startsWith must have an argument");
415
+
416
+ assertThat( "hello world", startsWith("hello") );
417
+ assertThat( "Hello World", not( startsWith("hello") ) );
418
+ assertThat( null, not( startsWith("hello") ) );
419
+ assertThat( [1,2,3], not( startsWith("hello") ) );
420
+ })
421
+
422
+ test( "endsWith matcher", function(){
423
+ raises( function(){
424
+ assertThat( "foo", endsWith() );
425
+ }, "endsWith must have an argument");
426
+
427
+ assertThat( "hello world", endsWith("world") );
428
+ assertThat( "Hello World", not( endsWith("world") ) );
429
+ assertThat( null, not( endsWith("world") ) );
430
+ assertThat( [1,2,3], not( endsWith("world") ) );
431
+ })
432
+
433
+ test( "contains matcher", function(){
434
+ raises( function(){
435
+ assertThat( "foo", contains() );
436
+ }, "contains must have an argument");
437
+
438
+ assertThat( "hello world", contains( "o w" ) );
439
+ assertThat( "Hello World", not( contains( "o w" ) ) );
440
+ assertThat( null, not( contains( "ull" ) ) );
441
+ assertThat( [1,2,3], not( contains( "1,2" ) ) );
442
+ })
443
+
444
+ test( "emptyString matcher", function(){
445
+
446
+ assertThat( "", emptyString() );
447
+ assertThat( "foo", not( emptyString() ) );
448
+ assertThat( null, not( emptyString() ) );
449
+ assertThat( [], not( emptyString() ) );
450
+ })
451
+
452
+ test( "stringWithLength matcher", function(){
453
+ raises( function(){
454
+ assertThat( 'foo', stringWithLength() );
455
+ }, "length argument must be a valid number");
456
+ raises( function(){
457
+ assertThat( 'foo', stringWithLength(-10) );
458
+ }, "length argument must be a valid number");
459
+
460
+ assertThat( "", stringWithLength(0) );
461
+ assertThat( "foo", stringWithLength( 3 ) );
462
+ assertThat( "foo", not( stringWithLength( 2 ) ) );
463
+ })
464
+
465
+ test( "matchRe matcher", function(){
466
+ raises( function(){
467
+ assertThat( "foo", matchRe() );
468
+ }, "matchRe must receive an argument");
469
+ raises( function(){
470
+ assertThat( "foo", matchRe(15) );
471
+ }, "matchRe must receive either a string or a regexp");
472
+
473
+ assertThat( "foo", matchRe( "^foo$" ) )
474
+ assertThat( "foo", matchRe( new RegExp( "^foo$" ) ) );
475
+ assertThat( null, not( matchRe( new RegExp( "ull$" ) ) ) );
476
+ assertThat( [1,2,3], not( matchRe( new RegExp( "1,2" ) ) ) );
477
+ })
478
+
479
+ module( "hamcrest object matchers" )
480
+ test( "strictlyEqualTo matcher", function(){
481
+ assertThat( 10, strictlyEqualTo( 10 ) );
482
+ assertThat( "foo", strictlyEqualTo( "foo" ) );
483
+
484
+ var o1 = {'foo':"bar",id:0};
485
+ var o2 = {'foo':"bar",id:0};
486
+ var a1 = ["foo",15,false];
487
+ var a2 = ["foo",15,false];
488
+
489
+ assertThat( o1, strictlyEqualTo(o1) );
490
+ assertThat( o1, not(strictlyEqualTo(o2)) );
491
+ assertThat( a1, strictlyEqualTo(a1) );
492
+ assertThat( a1, not(strictlyEqualTo(a2)) );
493
+ })
494
+
495
+ test( "hasProperty matcher", function(){
496
+ var o = {
497
+ 'foo':"bar",
498
+ 'id':1
499
+ };
500
+
501
+ raises( function(){
502
+ assertThat( o, hasProperty() )
503
+ }, "hasProperty must receive at least the property name" );
504
+
505
+
506
+ assertThat( o, hasProperty("foo") );
507
+ assertThat( o, hasProperty("foo","bar") );
508
+ assertThat( o, hasProperty("id",isA("number") ) );
509
+ assertThat( o, not( hasProperty( "foo", "foo" ) ) );
510
+ assertThat( o, not( hasProperty( "bar" ) ) );
511
+ assertThat( o, not( hasProperty( "id", closeTo(10,2) ) ) );
512
+ assertThat( null, not( hasProperty( "bar" ) ) );
513
+ assertThat( "foo", not( hasProperty( "bar" ) ) );
514
+ })
515
+
516
+ test( "hasProperties matcher", function(){
517
+ var o = {
518
+ 'foo':"bar",
519
+ 'id':1,
520
+ 'name':"John Doe",
521
+ 'age':35
522
+ };
523
+
524
+ raises( function(){
525
+ assertThat( o, hasProperties() );
526
+ }, "hasProperties expect a list of matchers");
527
+
528
+ assertThat( o, hasProperties( { "foo":"bar", "id":1 } ) );
529
+ assertThat( o, hasProperties( { "name":startsWith("Joh"), "age":greaterThan(30) } ) );
530
+ assertThat( o, not( hasProperties( { "name":contains("Bill"), "age":closeTo(30,3) } ) ) );
531
+ assertThat( o, not( hasProperties( { "bar":65, "age":isA("string") } ) ) );
532
+ assertThat( null, not( hasProperties( { "name":contains("Bill"), "age":closeTo(30,3) } ) ) );
533
+ assertThat( 'foo', not( hasProperties( { "name":contains("Bill"), "age":closeTo(30,3) } ) ) );
534
+
535
+ })
536
+
537
+ test( "hasMethod matcher", function(){
538
+
539
+ var objectWithFunction = {
540
+ 'foo':function(a,b,c){
541
+ return a == 1 && b == 2 && c == 3;
542
+ }
543
+ };
544
+ var objectWithFunctionThatThrowAnError = {
545
+ 'foo':function(a,b,c){
546
+ if( a == 1 && b == 2 && c == 3 )
547
+ return true;
548
+ else
549
+ throw "foo";
550
+ }
551
+ };
552
+ var objectWithDynamicallySetFunction = {};
553
+ objectWithDynamicallySetFunction["foo"] = function(){ return "foo"; };
554
+
555
+ var objectWithProperty = {
556
+ 'foo':"bar"
557
+ };
558
+ var objectWithoutFunction = {};
559
+
560
+ function TestObject (){
561
+
562
+ }
563
+ TestObject.prototype = {
564
+ 'foo':function(){ return "foo"; }
565
+ }
566
+
567
+ raises( function(){
568
+ assertThat( o, hasMethod() );
569
+ }, "hasMethod expect a function name");
570
+
571
+ assertThat( objectWithFunction, hasMethod( "foo" ) );
572
+ assertThat( objectWithFunction, hasMethod( "foo" ).returns( false ) );
573
+ assertThat( objectWithFunction, hasMethod( "foo" ).returns( false ).withoutArgs() );
574
+
575
+ assertThat( objectWithFunction, hasMethod( "foo" ).returns( false ).withArgs(1,2,3).withoutArgs() );
576
+ assertThat( objectWithFunction, hasMethod( "foo" ).returns( false ).withoutArgs().withArgs(1,2,3) );
577
+ assertThat( objectWithFunction, hasMethod( "foo" ).returns( equalTo(false) ) );
578
+ assertThat( objectWithFunction, hasMethod( "foo" ).returns( true ).withArgs( 1,2,3 ) );
579
+
580
+ assertThat( objectWithDynamicallySetFunction, hasMethod( "foo" ) );
581
+ assertThat( objectWithDynamicallySetFunction, hasMethod( "foo" ).returns("foo") );
582
+
583
+ assertThat( new TestObject(), hasMethod( "foo" ) );
584
+ assertThat( new TestObject(), hasMethod( "foo" ).returns("foo") );
585
+
586
+
587
+ assertThat( objectWithFunctionThatThrowAnError, hasMethod( "foo" ).throwsError() );
588
+ assertThat( objectWithFunctionThatThrowAnError, hasMethod( "foo" ).throwsError().withoutArgs() );
589
+ assertThat( objectWithFunctionThatThrowAnError, hasMethod( "foo" ).throwsError( "foo" ).withArgs(4,5,6) );
590
+ assertThat( objectWithFunctionThatThrowAnError, not( hasMethod( "foo" ).throwsError( "foo" ).withArgs(1,2,3) ) );
591
+ assertThat( objectWithFunctionThatThrowAnError, not( hasMethod( "foo" ).throwsError( isA( "object" ) ) ) );
592
+
593
+ assertThat( objectWithProperty, not( hasMethod("foo") ) )
594
+ assertThat( objectWithoutFunction, not( hasMethod( "foo" ) ) );
595
+ assertThat( null, not( hasMethod( "foo" ) ) );
596
+ assertThat( "foo", not( hasMethod( "foo" ) ) );
597
+
598
+ })
599
+
600
+ test( "propertiesCount matcher", function(){
601
+ var o = {
602
+ 'foo':"bar",
603
+ 'id':1,
604
+ 'name':"John Doe",
605
+ 'age':35
606
+ };
607
+
608
+ raises( function(){
609
+ assertThat( o, propertiesCount() );
610
+ }, "length argument is mandatory");
611
+ raises( function(){
612
+ assertThat( o, propertiesCount(-10) );
613
+ }, "length argument must be greater than or equal to 0");
614
+
615
+ assertThat( o, propertiesCount(4) );
616
+ assertThat( o, not( propertiesCount( 2 ) ) );
617
+ assertThat( {}, propertiesCount(0) );
618
+ assertThat( null, not( propertiesCount(2) ) );
619
+ assertThat( [1,2], not( propertiesCount(2) ) );
620
+ })
621
+
622
+ test( "instanceOf matcher", function(){
623
+ raises( function(){
624
+ assertThat( "foo", instanceOf() );
625
+ }, "type argument is mandatory" );
626
+
627
+ assertThat( new String("foo"), instanceOf( String ) );
628
+ assertThat( new Number(10), instanceOf( Number ) );
629
+ assertThat( new RegExp("foo"), instanceOf( RegExp ) );
630
+ assertThat( new Description(), instanceOf( Description ) );
631
+
632
+ assertThat( "foo", instanceOf( String ) );
633
+ assertThat( 10, instanceOf( Number ) );
634
+ assertThat( true, instanceOf( Boolean ) );
635
+
636
+ assertThat( true, not( instanceOf( String ) ) );
637
+ })
638
+
639
+ module("hamcrest date matchers")
640
+
641
+ test( "dateAfter matcher", function(){
642
+ raises( function(){
643
+ assertThat( new Date(), dateAfter() );
644
+ }, "dateAfter must have a valid comparison date" );
645
+ raises( function(){
646
+ assertThat( new Date(), dateAfter( 15 ) );
647
+ }, "dateAfter must have a valid comparison date" );
648
+
649
+ assertThat( new Date( 2000, 0, 1 ), dateAfter( new Date( 1999, 11, 31 ) ) );
650
+ assertThat( new Date( 2000, 0, 1 ), dateAfter( new Date( 2000, 0, 1 ) ).inclusive() );
651
+ assertThat( new Date( 2000, 0, 1 ), not( dateAfter( new Date( 2001, 11, 31 ) ) ) );
652
+ assertThat( new Date( 2000, 0, 1 ), not( dateAfter( new Date( 2001, 11, 31 ) ).inclusive() ) );
653
+ assertThat( null, not( dateAfter( new Date( 2001, 11, 31 ) ).inclusive() ) );
654
+ assertThat( "foo", not( dateAfter( new Date( 2001, 11, 31 ) ).inclusive() ) );
655
+ })
656
+ test( "dateAfterOrEqualTo matcher", function(){
657
+ raises( function(){
658
+ assertThat( new Date(), dateAfterOrEqualTo() );
659
+ }, "dateAfterOrEqualTo must have a valid comparison date" );
660
+ raises( function(){
661
+ assertThat( new Date(), dateAfterOrEqualTo( 15 ) );
662
+ }, "dateAfterOrEqualTo must have a valid comparison date" );
663
+
664
+ assertThat( new Date( 2000, 0, 1 ), dateAfterOrEqualTo( new Date( 2000, 0, 1 ) ) );
665
+ assertThat( new Date( 2000, 0, 1 ), not( dateAfterOrEqualTo( new Date( 2001, 11, 31 ) ) ) );
666
+ assertThat( null, not( dateAfterOrEqualTo( new Date( 2001, 11, 31 ) ) ) );
667
+ assertThat( "foo", not( dateAfterOrEqualTo( new Date( 2001, 11, 31 ) ) ) );
668
+ })
669
+
670
+ test( "dateBefore matcher", function(){
671
+ raises( function(){
672
+ assertThat( new Date(), dateBefore() );
673
+ }, "dateBefore must have a valid comparison date" );
674
+ raises( function(){
675
+ assertThat( new Date(), dateBefore(15) );
676
+ }, "dateBefore must have a valid comparison date" );
677
+
678
+ assertThat( new Date( 2000, 0, 1 ), dateBefore( new Date( 2001, 11, 31 ) ) );
679
+ assertThat( new Date( 2000, 0, 1 ), dateBefore( new Date( 2000, 0, 1 ) ).inclusive() );
680
+ assertThat( new Date( 2000, 0, 1 ), not( dateBefore( new Date( 1999, 11, 31 ) ) ) );
681
+ assertThat( new Date( 2000, 0, 1 ), not( dateBefore( new Date( 1999, 11, 31 ) ).inclusive() ) );
682
+ assertThat( null, not( dateBefore( new Date( 1999, 11, 31 ) ).inclusive() ) );
683
+ assertThat( "foo", not( dateBefore( new Date( 1999, 11, 31 ) ).inclusive() ) );
684
+ })
685
+ test( "dateBeforeOrEqualTo matcher", function(){
686
+ raises( function(){
687
+ assertThat( new Date(), dateBeforeOrEqualTo() );
688
+ }, "dateBeforeOrEqualTo must have a valid comparison date" );
689
+ raises( function(){
690
+ assertThat( new Date(), dateBeforeOrEqualTo(15) );
691
+ }, "dateBeforeOrEqualTo must have a valid comparison date" );
692
+
693
+ assertThat( new Date( 2000, 0, 1 ), dateBeforeOrEqualTo( new Date( 2000, 0, 1 ) ) );
694
+ assertThat( new Date( 2000, 0, 1 ), not( dateBeforeOrEqualTo( new Date( 1999, 11, 31 ) ) ) );
695
+ assertThat( null, not( dateBeforeOrEqualTo( new Date( 1999, 11, 31 ) ) ) );
696
+ assertThat( "foo", not( dateBeforeOrEqualTo( new Date( 1999, 11, 31 ) ) ) );
697
+ })
698
+
699
+ test( "dateBetween matcher", function(){
700
+ raises( function(){
701
+ assertThat( new Date(), dateBetween() );
702
+ }, "dateBetween must have a valid first date" );
703
+ raises( function(){
704
+ assertThat( new Date(), dateBetween(new Date()) );
705
+ }, "dateBetween must have a valid second date" );
706
+ raises( function(){
707
+ assertThat( new Date(), dateBetween(new Date(), new Date(2000,0,1)) );
708
+ }, "dateBetween first date must be before the second date");
709
+ raises( function(){
710
+ assertThat( new Date(), dateBetween( 15, new Date() ) );
711
+ }, "dateBetween must have a valid first date" );
712
+ raises( function(){
713
+ assertThat( new Date(), dateBetween( new Date(), 15 ) );
714
+ }, "dateBetween must have a valid second date" );
715
+
716
+ assertThat( new Date(2000, 0, 1), dateBetween( new Date(1999,0,1), new Date(2001,0,1) ) );
717
+ assertThat( new Date(2000, 0, 1), dateBetween( new Date(1999,0,1), new Date(2000,0,1) ).inclusive() );
718
+
719
+ assertThat( new Date(2000, 0, 1), not( dateBetween( new Date(1999,0,1), new Date(2000,0,1) ) ) );
720
+ assertThat( new Date(2001, 0, 1), not( dateBetween( new Date(1999,0,1), new Date(2000,0,1) ) ) );
721
+
722
+ assertThat( new Date(1998, 0, 1), not( dateBetween( new Date(1999,0,1), new Date(2000,0,1) ).inclusive() ) );
723
+ assertThat( new Date(2000, 0, 2), not( dateBetween( new Date(1999,0,1), new Date(2000,0,1) ).inclusive() ) );
724
+
725
+ assertThat( null, not( dateBetween( new Date(1999,0,1), new Date(2000,0,1) ).inclusive() ) );
726
+ assertThat( "foo", not( dateBetween( new Date(1999,0,1), new Date(2000,0,1) ).inclusive() ) );
727
+ })
728
+
729
+ test( "dateEquals matcher", function(){
730
+
731
+ raises( function(){
732
+ assertThat( new Date(), dateEquals() );
733
+ }, "dateEquals must have a valid comparison date" );
734
+ raises( function(){
735
+ assertThat( new Date(), dateEquals( 15 ) );
736
+ }, "dateEquals must have a valid comparison date" );
737
+
738
+ assertThat( new Date(2000,0,1), dateEquals( new Date(2000,0,1) ) );
739
+
740
+ assertThat( new Date(2000,0,1), not( dateEquals( new Date(2001,0,1) ) ) );
741
+ assertThat( null, not( dateEquals( new Date(2001,0,1) ) ) );
742
+ assertThat( "foo", not( dateEquals( new Date(2001,0,1) ) ) );
743
+
744
+ })
745
+
746
+ module ( "hamcrest function matchers" )
747
+
748
+ test( "throwsError matcher", function(){
749
+ var errorMsg = "This is an error";
750
+ var scopeObject = {"foo":"bla"};
751
+ var errorScopeObject = {};
752
+
753
+ var arguments0 = "foo";
754
+ var arguments1 = 25;
755
+ var arguments2 = true;
756
+
757
+ function functionThatNotThrowAnError(){}
758
+ function functionThatThrowAnErrorMessage(){
759
+ throw errorMsg;
760
+ }
761
+ function functionThatThrowAnErrorObject(){
762
+ throw new Error(errorMsg);
763
+ }
764
+ function functionThatThrowAnErrorIfInvalidScope(){
765
+ if( this.hasOwnProperty( "foo") )
766
+ return;
767
+ else
768
+ throw errorMsg;
769
+ }
770
+ function functionThatThrowAnErrorIfInvalidArguments(){
771
+ if( arguments[0] != arguments0 )
772
+ throw errorMsg;
773
+ else if( arguments[1] != arguments1 )
774
+ throw errorMsg;
775
+ else if( arguments[2] != arguments2 )
776
+ throw errorMsg;
777
+ }
778
+
779
+ assertThat( functionThatThrowAnErrorMessage, throwsError() );
780
+ assertThat( functionThatThrowAnErrorMessage, throwsError().withoutArgs() );
781
+ assertThat( functionThatThrowAnErrorMessage, throwsError( errorMsg ) );
782
+
783
+ assertThat( functionThatThrowAnErrorObject, throwsError() );
784
+ assertThat( functionThatThrowAnErrorObject, throwsError().withoutArgs() );
785
+ assertThat( functionThatThrowAnErrorObject, throwsError( isA( "object" ) ) );
786
+
787
+ assertThat( functionThatThrowAnErrorIfInvalidScope, throwsError().withScope( errorScopeObject ) );
788
+ assertThat( functionThatThrowAnErrorIfInvalidScope, throwsError().withScope( errorScopeObject ).withoutArgs() );
789
+ assertThat( functionThatThrowAnErrorIfInvalidScope, not( throwsError().withScope( scopeObject ) ) );
790
+
791
+ assertThat( functionThatThrowAnErrorIfInvalidArguments, throwsError() );
792
+ assertThat( functionThatThrowAnErrorIfInvalidArguments, throwsError().withArgs() );
793
+ assertThat( functionThatThrowAnErrorIfInvalidArguments, throwsError().withoutArgs() );
794
+ assertThat( functionThatThrowAnErrorIfInvalidArguments, not( throwsError().withArgs( arguments0, arguments1, arguments2 ) ) );
795
+ assertThat( functionThatThrowAnErrorIfInvalidArguments, throwsError().withoutArgs().withArgs( arguments0, arguments1, arguments2 ) );
796
+ assertThat( functionThatThrowAnErrorIfInvalidArguments, throwsError().withArgs( arguments0, arguments1, arguments2 ).withoutArgs() );
797
+
798
+ assertThat( functionThatNotThrowAnError, not( throwsError() ) );
799
+ assertThat( functionThatNotThrowAnError, not( throwsError().withoutArgs() ) );
800
+
801
+ assertThat( null, not( throwsError() ) );
802
+ assertThat( "foo", not( throwsError() ) );
803
+ })
804
+
805
+ test( "returns matcher", function(){
806
+
807
+ var scopeObject = {'foo':"bar"};
808
+ var errorScope = {};
809
+
810
+ function functionWithScope()
811
+ {
812
+ return this.foo;
813
+ }
814
+ function functionWithScopeAndArgs( a, b )
815
+ {
816
+ return this.foo + a + b;
817
+ }
818
+ function functionWithReturn(a,b,c)
819
+ {
820
+ return a == 1 && b == 2 && c == 3;
821
+ }
822
+ function functionWithoutReturn(){}
823
+
824
+ assertThat( functionWithReturn, returns() );
825
+ assertThat( functionWithoutReturn, not( returns() ) );
826
+
827
+ assertThat( functionWithReturn, returns( false ) );
828
+ assertThat( functionWithReturn, returns( false ).withoutArgs() );
829
+
830
+ assertThat( functionWithReturn, returns( false ).withoutArgs().withArgs( 1,2,3 ) );
831
+ assertThat( functionWithReturn, returns( false ).withArgs( 1,2,3 ).withoutArgs() );
832
+
833
+ assertThat( functionWithReturn, returns( true ).withArgs( 1,2,3 ) );
834
+ assertThat( functionWithReturn, returns( false ).withArgs( 4,5,6 ) );
835
+
836
+ assertThat( functionWithScope, returns( "bar" ).withScope( scopeObject ) );
837
+ assertThat( functionWithScope, returns( "bar" ).withScope( scopeObject ).withoutArgs() );
838
+ assertThat( functionWithScope, not( returns( "bar" ).withScope( errorScope ) ) );
839
+
840
+ assertThat( functionWithScopeAndArgs, returns( both( isA("string") ).and("barabar") ).withScope( scopeObject ).withArgs("ab","ar") );
841
+
842
+ assertThat( functionWithScopeAndArgs, not( returns( "barabar" ).withScope( scopeObject ).withArgs("ob","ar") ) );
843
+
844
+ assertThat( null, not( returns() ) );
845
+ assertThat( "foo", not( returns() ) );
846
+
847
+ })
848
+
849
+ module( "hamcrest DOM matchers" );
850
+ test( "equalToNode matcher", function(){
851
+
852
+ raises( function(){
853
+ equalToNode();
854
+ }, "equalToNode expect an argument" );
855
+
856
+ raises( function(){
857
+ equalToNode( "foo" );
858
+ }, "equalToNode expect a Node object as argument" );
859
+
860
+ var nodeA = document.createElement("div");
861
+ nodeA.innerHTML = "<h1>A sample node</h1>";
862
+
863
+ var nodeB = document.createElement("div");
864
+ nodeB.innerHTML = "<h1>A sample node</h1>";
865
+
866
+ assertThat( nodeA, equalToNode( nodeB ) );
867
+
868
+ nodeA = document.createElement("div");
869
+ nodeA.setAttribute( "class", "foo" );
870
+ nodeA.innerHTML = "<h1>A sample node</h1>";
871
+
872
+ nodeB = document.createElement("div");
873
+ nodeB.setAttribute( "class", "foo" );
874
+ nodeB.innerHTML = "<h1>A sample node</h1>";
875
+
876
+ assertThat( nodeA, equalToNode( nodeB ) );
877
+
878
+ nodeA = document.createElement("div");
879
+ nodeA.setAttribute( "class", "foo" );
880
+ nodeA.innerHTML = "<h1>A sample node</h1>";
881
+
882
+ nodeB = document.createElement("div");
883
+ nodeB.innerHTML = "<h1>A sample node</h1>";
884
+ assertThat( nodeA, not( equalToNode( nodeB ) ) );
885
+
886
+ nodeA = document.createElement("a");
887
+ nodeB = document.createElement("b");
888
+ assertThat( nodeA, not( equalToNode( nodeB ) ) );
889
+
890
+ assertThat( "foo", not( equalToNode( nodeB ) ) );
891
+ assertThat( null, not( equalToNode( nodeB ) ) );
892
+ });
893
+
894
+ test("hasAttribute matcher", function(){
895
+ raises( function(){
896
+ hasAttribute();
897
+ }, "hasAttribute expect at least an attribute name");
898
+
899
+ var node = document.createElement( "div" );
900
+ node.setAttribute("class", "foo");
901
+ node.setAttribute("id", "foo");
902
+ node.setAttribute("name", "bla");
903
+ node.setAttribute("style", "border:1px solid yellow;");
904
+
905
+ assertThat( node, hasAttribute( "class" ) )
906
+ assertThat( node, hasAttribute( "id", "foo" ) )
907
+ assertThat( node, hasAttribute( "name", "bla" ) )
908
+ assertThat( node, hasAttribute( "style", contains( "border" ) ) );
909
+
910
+ assertThat( node, not( hasAttribute( "href" ) ))
911
+ assertThat( node, not( hasAttribute( "style", contains( "color" ) ) ))
912
+
913
+ assertThat( "foo", not( hasAttribute( "foo" ) ))
914
+ assertThat( null, not( hasAttribute( "foo" ) ))
915
+ })
916
+
917
+
918
+
919
+
920
+