2009-11-21 03:33:06 +01:00
|
|
|
|
|
|
|
describe 'Matchers'
|
|
|
|
|
|
|
|
describe 'eql'
|
|
|
|
it 'should work with strings'
|
|
|
|
'test'.should.eql 'test'
|
|
|
|
'test'.should.not.eql 'foo'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should work with numbers'
|
|
|
|
11.should.eql 11
|
|
|
|
10.should.not.eql 11
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should loosely compare numbers as strings'
|
|
|
|
'11'.should.eql 11
|
|
|
|
'10'.should.not.eql 11
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should hash compare arrays'
|
|
|
|
[1, 2].should.eql [1, 2]
|
|
|
|
[1, 2].should.not.eql [1, 3]
|
|
|
|
[1, 2, [3], { foo : 'bar' }].should.eql [1, 2, [3], { foo : 'bar' }]
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should hash compare objects'
|
|
|
|
{ foo : 'bar' }.should.eql { foo : 'bar' }
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should hash compare objects with different orders'
|
|
|
|
a = { one : 'two', three : 'four' }
|
|
|
|
b = { three : 'four', one : 'two' }
|
|
|
|
a.should.eql b
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should hash compare arbitrary objects'
|
|
|
|
Foo = function(){}, Bar = function(){}
|
|
|
|
Bar.prototype = { doSomething : function(){ }}
|
|
|
|
foo = new Foo, foo2 = new Foo, bar = new Bar
|
|
|
|
foo.should.eql foo2
|
|
|
|
foo.should.not.eql bar
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should work with constructors'
|
|
|
|
Array.should.eql Array
|
|
|
|
Array.should.not.eql Object
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'equal'
|
|
|
|
it 'should perform strict comparisons'
|
|
|
|
'test'.should.equal 'test'
|
|
|
|
'1'.should.not.equal 1
|
|
|
|
true.should.be true
|
|
|
|
'1'.should.not.be true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'match'
|
|
|
|
it 'should match regular expressions'
|
|
|
|
'foobar'.should.match(/foo/)
|
|
|
|
'foobar'.should.not.match(/barfoo/)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_empty'
|
|
|
|
it 'should consider any object with zero length to be empty'
|
|
|
|
''.should.be_empty
|
|
|
|
' '.should.not.be_empty
|
|
|
|
[].should.be_empty
|
|
|
|
{ length : 0 }.should.be_empty
|
|
|
|
{}.should.be_empty
|
|
|
|
'cookies'.should.not.be_empty
|
|
|
|
[0].should.not.be_empty
|
|
|
|
{ length : 1 }.should.not.be_empty
|
|
|
|
{ foo : 'bar' }.should.not.be_empty
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_null'
|
|
|
|
it 'should check if a value is null'
|
|
|
|
a = 0
|
|
|
|
b = null
|
|
|
|
null.should.be_null
|
|
|
|
0.should.not.be_null
|
|
|
|
a.should.not.be_null
|
|
|
|
b.should.be_null
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_undefined'
|
|
|
|
it 'should check if a var is defined'
|
|
|
|
var foo
|
|
|
|
foo.should.be_undefined
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'have_length'
|
|
|
|
it 'should compare the length of an object'
|
|
|
|
'foo'.should.have_length 3
|
|
|
|
[1, 2].should.have_length 2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'have_length_within'
|
|
|
|
it 'should check if an object has a length within the specified range'
|
|
|
|
'foo'.should.have_length_within 2..4
|
|
|
|
'f'.should.not.have_length_within 2..4
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'have_prop'
|
|
|
|
it 'should check if a property exists'
|
|
|
|
'foo'.should.have_prop 'length'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check that a property has a specific value'
|
|
|
|
'foo'.should.have_prop 'length', 3
|
|
|
|
{ length : '3' }.should.have_prop 'length', 3
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check object hashes'
|
|
|
|
{ foo : 1..3 }.should.have_prop 'foo', 1..3
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when the property does not exist'
|
|
|
|
'foo'.should.not.have_prop 'foo'
|
|
|
|
'foo'.should.not.have_prop 'foo', 'bar'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when it is a function'
|
|
|
|
'foo'.should.not.have_prop 'toString'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'have_property'
|
|
|
|
it 'should check if a property exists'
|
|
|
|
'foo'.should.have_property 'length'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check that a property has a specific value'
|
|
|
|
'foo'.should.have_property 'length', 3
|
|
|
|
{ length : '3' }.should.not.have_property 'length', 3
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when the property does not exist'
|
|
|
|
'foo'.should.not.have_property 'foo'
|
|
|
|
'foo'.should.not.have_property 'foo', 'bar'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when it is a function'
|
|
|
|
'foo'.should.not.have_property 'toString'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'respond_to'
|
|
|
|
it 'should check if an object contains a method'
|
|
|
|
'test'.should.respond_to('toString')
|
|
|
|
'test'.should.not.respond_to('rawr')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'include'
|
|
|
|
it 'should check if an object includes a property'
|
|
|
|
{ hey : 'there' }.should.include 'hey'
|
|
|
|
{ hey : 'there' }.should.not.include 'foo'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check if a regular expression includes a string'
|
|
|
|
(/(foo)?bar/).should.include '(foo)'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check if a function body includes a string'
|
|
|
|
-{ return [foo, bar] }.should.include 'foo', 'bar'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check if an array contains element(s)'
|
|
|
|
[1,2,3].should.include 1
|
|
|
|
[1,2,3].should.include 1, 2, 3
|
|
|
|
[1].should.not.include 0
|
|
|
|
['foo', 'bar'].should.include 'foo', 'bar'
|
|
|
|
['foo', 'bar'].should.include 'bar', 'foo'
|
|
|
|
['foo', 'bar'].should.not.include 'foo', 'rawr'
|
|
|
|
['foo', 'bar'].should.not.include 'rawr', 'foo'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check hashes of array elements'
|
|
|
|
[1, [2]].should.include [2]
|
|
|
|
[1, [2]].should.include [2], 1
|
|
|
|
[1, { two : 'three' }].should.include { two : 'three' }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_a'
|
|
|
|
it 'should compare the constructor of an object'
|
|
|
|
'test'.should.be_a String
|
|
|
|
[].should.be_an Array
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'throw_error'
|
|
|
|
it 'should check if an error is thrown'
|
|
|
|
-{ throw 'error' }.should.throw_error
|
|
|
|
-{ return 'test' }.should.not.throw_error
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check if an error with a specific message is thrown'
|
|
|
|
-{ throw 'some foo bar' }.should.throw_error('some foo bar')
|
|
|
|
-{ throw 'some foo bar' }.should.throw_error(/foo bar/)
|
|
|
|
-{ throw 'some foo bar' }.should.not.throw_error(/rawr/)
|
|
|
|
-{ throw 'some foo bar' }.should.not.throw_error('rawr')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check if an error of a specific constructor is thrown'
|
|
|
|
-{ throw new Error('foo') }.should.throw_error(Error)
|
|
|
|
-{ throw new TypeError('foo') }.should.throw_error(TypeError)
|
|
|
|
-{ throw 'foo' }.should.throw_error Error
|
|
|
|
-{ throw 'foo' }.should.not.throw_error TypeError
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should check if an error with a specific constructor and message is thrown'
|
|
|
|
-{ throw new TypeError('oh no!') }.should.throw_error(TypeError, 'oh no!')
|
|
|
|
-{ throw new TypeError('oh no!') }.should.not.throw_error(TypeError, 'foo bar')
|
|
|
|
-{ throw new TypeError('oh no!') }.should.throw_error(TypeError, /oh no/)
|
|
|
|
-{ throw new TypeError('oh no!') }.should.not.throw_error(TypeError, /foo bar/)
|
|
|
|
-{ throw new TypeError('oh no!') }.should.not.throw_error(Error, 'oh no!')
|
|
|
|
-{ throw new TypeError('oh no!') }.should.not.throw_error(Error, 'foo bar')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_an_instance_of'
|
|
|
|
it 'should check that an object is an instance of another'
|
|
|
|
MyObject = function(){}
|
|
|
|
myInstance = new MyObject()
|
|
|
|
{}.should.be_an_instance_of Object
|
|
|
|
[].should.be_an_instance_of Array
|
|
|
|
MyObject.should.be_an_instance_of Function
|
|
|
|
myInstance.should.be_an_instance_of MyObject
|
|
|
|
myInstance.should.be_an_instance_of Object
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_type'
|
|
|
|
it 'should compare the type of an object via typeof'
|
|
|
|
'hey'.should.be_type 'string'
|
|
|
|
{}.should.be_type 'object'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_within'
|
|
|
|
it 'should check if a number is within a range'
|
|
|
|
5.should.be_within 1..10
|
|
|
|
15.should.not.be_within 10..5
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'have'
|
|
|
|
it 'should check the length of a property'
|
|
|
|
person = { pets : ['izzy', 'niko'] }
|
|
|
|
person.should.have 2, 'pets'
|
|
|
|
person.should.not.have 3, 'pets'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'have_at_least'
|
|
|
|
it 'should check if a object has at least n of a property'
|
|
|
|
person = { pets : ['izzy', 'niko'] }
|
|
|
|
person.should.have_at_least 1, 'pets'
|
|
|
|
person.should.have_at_least 2, 'pets'
|
|
|
|
person.should.not.have_at_least 3, 'pets'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'have_at_most'
|
|
|
|
it 'should check if an object has at most n of a property'
|
|
|
|
person = { pets : ['izzy', 'niko'] }
|
|
|
|
person.should.have_at_most 2, 'pets'
|
|
|
|
person.should.have_at_most 3, 'pets'
|
|
|
|
person.should.not.have_at_most 1, 'pets'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'be_within'
|
|
|
|
it 'should check that an object has within n..n of a property'
|
|
|
|
person = { pets : ['izzy', 'niko'] }
|
|
|
|
person.should.have_within 1..2, 'pets'
|
|
|
|
person.should.have_within 2..5, 'pets'
|
|
|
|
person.should.not.have_within 5..10, 'pets'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'receive'
|
|
|
|
before_each
|
|
|
|
person = { toString : function(){ return 'person' }}
|
|
|
|
personWithPets = {
|
|
|
|
toString : function(){ return 'personWithPets' },
|
|
|
|
getPets : function() { return ['izzy'] },
|
|
|
|
addPet : function(name) { return ['izzy', name] },
|
|
|
|
addPets : function(a, b) { return ['izzy', a, b] }
|
|
|
|
}
|
|
|
|
end
|
2009-11-21 03:33:26 +01:00
|
|
|
|
2009-11-21 03:33:06 +01:00
|
|
|
it 'should pass when the method is invoked'
|
|
|
|
personWithPets.should.receive('getPets')
|
|
|
|
personWithPets.getPets()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass and original method should still return its result'
|
|
|
|
personWithPets.should.receive('getPets')
|
|
|
|
personWithPets.getPets().should.eql ['izzy']
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass when the proper value is returned'
|
|
|
|
personWithPets.should.receive('getPets').and_return(['izzy'])
|
|
|
|
personWithPets.getPets()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass when invoked the expected number of times'
|
|
|
|
personWithPets.should.receive('getPets', 'twice').and_return(['izzy'])
|
|
|
|
personWithPets.getPets()
|
|
|
|
personWithPets.getPets()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass when a method is invoked with specific arguments'
|
|
|
|
personWithPets.should.receive('addPet', 'once').with_args('suki')
|
|
|
|
personWithPets.addPet('suki')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with multiple arguments'
|
|
|
|
personWithPets.should.receive('addPets').with_args('suki', 'max')
|
|
|
|
personWithPets.addPets('suki', 'max')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with arguments and return value'
|
|
|
|
personWithPets.should.receive('addPet').with_args('suki').and_return(['izzy', 'suki'])
|
|
|
|
personWithPets.addPet('suki')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass when argument is the correct type'
|
|
|
|
personWithPets.should.receive('addPet').with_args(an_instance_of(String))
|
|
|
|
personWithPets.addPet('suki')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass when return type is correct'
|
|
|
|
personWithPets.should.receive('addPet').and_return(an_instance_of(Array))
|
|
|
|
personWithPets.addPet('suki')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass when checking the type of multiple args and return types'
|
|
|
|
personWithPets.should.receive('addPets').with_args(an_instance_of(String), an_instance_of(String)).and_return(an_instance_of(Array))
|
|
|
|
personWithPets.addPets('suki', 'max')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with negation when a method is not called'
|
|
|
|
personWithPets.should.not.receive('addPets')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with negation with args'
|
|
|
|
personWithPets.should.not.receive('addPets').with_args('izzy')
|
|
|
|
personWithPets.addPets('max')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with negation with return values'
|
|
|
|
personWithPets.should.not.receive('addPets').with_args('izzy').and_return('test')
|
|
|
|
personWithPets.addPets('izzy')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with negation with times'
|
|
|
|
personWithPets.should.not.receive('addPets', 'twice')
|
|
|
|
personWithPets.addPets('izzy')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with boolean args'
|
|
|
|
foo = { bar : function(arg){ return arg }}
|
|
|
|
foo.should.receive('bar', 'twice').with_args(true)
|
|
|
|
foo.bar(true)
|
|
|
|
foo.bar(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with null args'
|
|
|
|
foo = { bar : function(arg){ return arg }}
|
|
|
|
foo.should.receive('bar').with_args(null)
|
|
|
|
foo.bar(null)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with boolean return value true'
|
|
|
|
foo = { bar : function(){ return true }}
|
|
|
|
foo.should.receive('bar').and_return(true)
|
|
|
|
foo.bar()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with boolean return value false'
|
|
|
|
foo = { bar : function(){ return false }}
|
|
|
|
foo.should.receive('bar').and_return(false)
|
|
|
|
foo.bar()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should pass with null return value'
|
|
|
|
foo = { bar : function(){ return null }}
|
|
|
|
foo.should.receive('bar').and_return(null)
|
|
|
|
foo.bar()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when the method does not exist'
|
|
|
|
person.should.receive('getPets')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when the method is never invoked'
|
|
|
|
personWithPets.should.receive('getPets')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when improper value is returned'
|
|
|
|
personWithPets.should.receive('getPets').and_return(['niko'])
|
|
|
|
personWithPets.getPets()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when checking the type of multiple args and return types'
|
|
|
|
personWithPets.should.receive('addPets').with_args(an_instance_of(String), an_instance_of(Array)).and_return(an_instance_of(Array))
|
|
|
|
personWithPets.addPets('suki', 'max')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when not invoked the expected number of times'
|
|
|
|
personWithPets.should.receive('getPets', 'twice').and_return(['izzy'])
|
|
|
|
personWithPets.getPets()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when not invoked many times'
|
|
|
|
personWithPets.should.receive('getPets', 3).and_return(['izzy'])
|
|
|
|
personWithPets.getPets()
|
|
|
|
personWithPets.getPets()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when not invoked with specific arguments'
|
|
|
|
personWithPets.should.receive('addPet', 'once').with_args('suki')
|
|
|
|
personWithPets.addPet('niko')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when expecting multiple arguments'
|
|
|
|
personWithPets.should.receive('addPets').with_args('suki', 'max')
|
|
|
|
personWithPets.addPets('suki')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when argument is of the wrong type'
|
|
|
|
personWithPets.should.receive('addPet').with_args(an_instance_of(String))
|
|
|
|
personWithPets.addPet(['suki'])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail when return type is incorrect'
|
|
|
|
personWithPets.should.receive('addPet').and_return(an_instance_of(String))
|
|
|
|
personWithPets.addPet('suki')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail with negation when a method is called'
|
|
|
|
personWithPets.should.not.receive('addPets')
|
|
|
|
personWithPets.addPets('izzy')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail with negation with args'
|
|
|
|
personWithPets.should.not.receive('addPets').with_args('izzy')
|
|
|
|
personWithPets.addPets('izzy')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail with negation with return values'
|
|
|
|
personWithPets.should.not.receive('addPets').with_args('izzy').and_return(an_instance_of(Array))
|
|
|
|
personWithPets.addPets('izzy')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail with negation with times'
|
|
|
|
personWithPets.should.not.receive('addPets', 'twice')
|
|
|
|
personWithPets.addPets('izzy')
|
|
|
|
personWithPets.addPets('max')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail with boolean args'
|
|
|
|
foo = { bar : function(arg){ return arg }}
|
|
|
|
foo.should.receive('bar').with_args(true)
|
|
|
|
foo.bar(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail with boolean return value true'
|
|
|
|
foo = { bar : function(){ return true }}
|
|
|
|
foo.should.receive('bar').and_return(false)
|
|
|
|
foo.bar()
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail with boolean return value false'
|
|
|
|
foo = { bar : function(){ return false }}
|
|
|
|
foo.should.receive('bar').and_return(true)
|
|
|
|
foo.bar()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|