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.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +38 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/hamcrest4qunit/description.js.coffee +23 -0
- data/app/assets/javascripts/hamcrest4qunit/h4q.js.coffee +158 -0
- data/app/assets/javascripts/hamcrest4qunit/index.js.coffee +7 -0
- data/app/assets/javascripts/hamcrest4qunit/matcher.js.coffee +31 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/arrays.js.coffee +221 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/compounds.js.coffee +134 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/core.js.coffee +126 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/dates.js.coffee +166 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/dom.js.coffee +73 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/functions.js.coffee +142 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/index.js.coffee +1 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/numbers.js.coffee +177 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/objects.js.coffee +249 -0
- data/app/assets/javascripts/hamcrest4qunit/matchers/strings.js.coffee +123 -0
- data/app/assets/javascripts/hamcrest4qunit/test/index.js +920 -0
- data/hamcrest4qunit.gemspec +20 -0
- data/lib/hamcrest4qunit.rb +11 -0
- data/lib/hamcrest4qunit/engine.rb +9 -0
- data/lib/hamcrest4qunit/version.rb +3 -0
- metadata +122 -0
@@ -0,0 +1,142 @@
|
|
1
|
+
h4q.throwsError = (m, scope, args) ->
|
2
|
+
|
3
|
+
m = equalTo m if m? and not (m instanceof Matcher)
|
4
|
+
|
5
|
+
new Matcher
|
6
|
+
errorMatcher: m
|
7
|
+
scope: scope
|
8
|
+
arguments: args
|
9
|
+
noArgs: false
|
10
|
+
withoutArgs: ->
|
11
|
+
@noArgs = true
|
12
|
+
this
|
13
|
+
withArgs: ->
|
14
|
+
@arguments = h4q.argumentsToArray arguments
|
15
|
+
this
|
16
|
+
withScope: (scope) ->
|
17
|
+
@scope = scope
|
18
|
+
this
|
19
|
+
_matches: (v, msg) ->
|
20
|
+
unless v? and typeof v is "function"
|
21
|
+
msg.appendValue(v).appendText("is not a function")
|
22
|
+
false
|
23
|
+
|
24
|
+
else
|
25
|
+
res = null
|
26
|
+
try
|
27
|
+
v.apply @scope, if @noArgs then [] else @arguments
|
28
|
+
catch e
|
29
|
+
if @errorMatcher
|
30
|
+
errorMsg = new Description()
|
31
|
+
res = @errorMatcher.matches e, errorMsg
|
32
|
+
|
33
|
+
if res?
|
34
|
+
msg.appendText("an exception was thrown and").appendText errorMsg
|
35
|
+
else
|
36
|
+
msg.appendText("an exception was thrown but").appendText errorMsg
|
37
|
+
msg.diff = errorMsg.diff
|
38
|
+
else
|
39
|
+
msg.appendValue(e).appendText "was thrown"
|
40
|
+
res = true
|
41
|
+
|
42
|
+
unless res?
|
43
|
+
res = false
|
44
|
+
msg.appendValue(v).appendText "doesnt thrown"
|
45
|
+
if @errorMatcher
|
46
|
+
msg.appendDescriptionOf @errorMatcher
|
47
|
+
else
|
48
|
+
msg.appendText "any exception"
|
49
|
+
res
|
50
|
+
|
51
|
+
_describeTo: (msg) ->
|
52
|
+
msg.appendText "a Function which throws"
|
53
|
+
|
54
|
+
if @errorMatcher?
|
55
|
+
msg.appendDescriptionOf @errorMatcher
|
56
|
+
else
|
57
|
+
msg.appendText "an exception"
|
58
|
+
|
59
|
+
if @scope? or @arguments? or @noArgs
|
60
|
+
msg.appendText "when called"
|
61
|
+
|
62
|
+
if @scope?
|
63
|
+
msg.appendText("with scope").appendValue @scope
|
64
|
+
|
65
|
+
if @scope? and (@arguments? or @noArgs)
|
66
|
+
msg.appendText "and"
|
67
|
+
|
68
|
+
if not @noArgs and @arguments? and @arguments.length > 0
|
69
|
+
msg.appendText("with arguments").appendValue @arguments
|
70
|
+
else if @noArgs
|
71
|
+
msg.appendText "without arguments"
|
72
|
+
|
73
|
+
h4q.returns = (m, s, a) ->
|
74
|
+
|
75
|
+
m = equalTo m if m? and not (m instanceof Matcher)
|
76
|
+
|
77
|
+
return new Matcher
|
78
|
+
returnsMatcher: m
|
79
|
+
arguments: a
|
80
|
+
noArgs: false
|
81
|
+
scope: s
|
82
|
+
withoutArgs: ->
|
83
|
+
@noArgs = true
|
84
|
+
this
|
85
|
+
withArgs: ->
|
86
|
+
@arguments = h4q.argumentsToArray arguments
|
87
|
+
this
|
88
|
+
withScope: (scope) ->
|
89
|
+
@scope = scope
|
90
|
+
this
|
91
|
+
_matches: (v, msg) ->
|
92
|
+
unless v? and typeof v is "function"
|
93
|
+
msg.appendValue(v).appendText "is not a Function"
|
94
|
+
return false
|
95
|
+
else
|
96
|
+
res = v.apply @scope, if @noArgs then [] else @arguments
|
97
|
+
|
98
|
+
if @returnsMatcher
|
99
|
+
mmsg = new Description()
|
100
|
+
mres = @returnsMatcher.matches res, mmsg
|
101
|
+
|
102
|
+
msg.appendText("was")
|
103
|
+
.appendValue(v)
|
104
|
+
.appendText("of which returns")
|
105
|
+
.appendText(mmsg)
|
106
|
+
msg.diff = mmsg.diff
|
107
|
+
return mres
|
108
|
+
else
|
109
|
+
if res?
|
110
|
+
msg.appendText("was")
|
111
|
+
.appendValue(v)
|
112
|
+
.appendText("of which returns was")
|
113
|
+
.appendValue(res)
|
114
|
+
return true
|
115
|
+
else
|
116
|
+
msg.appendText("was")
|
117
|
+
.appendValue(v)
|
118
|
+
.appendText("which returned nothing")
|
119
|
+
return false
|
120
|
+
|
121
|
+
_describeTo: (msg) ->
|
122
|
+
msg.appendText "a Function that returns"
|
123
|
+
|
124
|
+
if @returnsMatcher?
|
125
|
+
msg.appendDescriptionOf @returnsMatcher
|
126
|
+
else
|
127
|
+
msg.appendText "anything"
|
128
|
+
|
129
|
+
if @scope? or @arguments? or @noArgs
|
130
|
+
msg.appendText "when called"
|
131
|
+
|
132
|
+
if @scope?
|
133
|
+
msg.appendText("with scope").appendValue @scope
|
134
|
+
|
135
|
+
if @scope and (@arguments? or @noArgs)
|
136
|
+
msg.appendText "and"
|
137
|
+
|
138
|
+
if not @noArgs and @arguments? and @arguments.length > 0
|
139
|
+
msg.appendText("with arguments").appendValue @arguments
|
140
|
+
else if @noArgs
|
141
|
+
msg.appendText "without arguments"
|
142
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
#= require_tree .
|
@@ -0,0 +1,177 @@
|
|
1
|
+
h4q.nanValue = ->
|
2
|
+
new Matcher
|
3
|
+
_matches: (v, msg) ->
|
4
|
+
msg.appendText("was").appendValue v
|
5
|
+
isNaN v
|
6
|
+
_describeTo: (msg) ->
|
7
|
+
msg.appendValue NaN
|
8
|
+
|
9
|
+
h4q.notNanValue = ->
|
10
|
+
new Matcher
|
11
|
+
_matches: (v,msg) ->
|
12
|
+
msg.appendText("was").appendValue v
|
13
|
+
not isNaN v
|
14
|
+
_describeTo: (msg) ->
|
15
|
+
msg.appendText("not").appendValue NaN
|
16
|
+
|
17
|
+
h4q.between = (a, b) ->
|
18
|
+
if isNaN a then throw new Error message: "a must be a valid number"
|
19
|
+
if isNaN b then throw new Error message: "b must be a valid number"
|
20
|
+
if a >= b then throw new Error message: "b must be a greater number than a"
|
21
|
+
|
22
|
+
new Matcher
|
23
|
+
a: a
|
24
|
+
b: b
|
25
|
+
included: false
|
26
|
+
inclusive: ->
|
27
|
+
@included = true
|
28
|
+
this
|
29
|
+
|
30
|
+
_matches: (v, msg) ->
|
31
|
+
if @included
|
32
|
+
if v >= @a and v <= @b
|
33
|
+
msg.appendText("was").appendValue(v)
|
34
|
+
true
|
35
|
+
else
|
36
|
+
if v < @a
|
37
|
+
msg.appendValue(v)
|
38
|
+
.appendText("was lower than the min value")
|
39
|
+
.appendValue(@a)
|
40
|
+
else
|
41
|
+
msg.appendValue(v)
|
42
|
+
.appendText("was greater than the max value")
|
43
|
+
.appendValue(@b)
|
44
|
+
false
|
45
|
+
else
|
46
|
+
if v > @a and v < @b
|
47
|
+
msg.appendText("was").appendValue(v)
|
48
|
+
true
|
49
|
+
else
|
50
|
+
if v <= @a
|
51
|
+
msg.appendValue(v)
|
52
|
+
.appendText("was lower or equal to the min value")
|
53
|
+
.appendValue(@a)
|
54
|
+
else
|
55
|
+
msg.appendValue(v)
|
56
|
+
.appendText("was greater or equal to the max value")
|
57
|
+
.appendValue(@b)
|
58
|
+
false
|
59
|
+
|
60
|
+
_describeTo: (msg) ->
|
61
|
+
msg.appendText("a Number between")
|
62
|
+
.appendValue(@a)
|
63
|
+
.appendText("and")
|
64
|
+
.appendValue(@b)
|
65
|
+
|
66
|
+
if @included
|
67
|
+
msg.appendText "inclusive"
|
68
|
+
else
|
69
|
+
msg.appendText "exclusive"
|
70
|
+
|
71
|
+
h4q.closeTo = (a, b) ->
|
72
|
+
if isNaN a then throw new Error message: "a must be a valid number"
|
73
|
+
if isNaN b then throw new Error message: "b must be a valid number"
|
74
|
+
new Matcher
|
75
|
+
a: a
|
76
|
+
b: b
|
77
|
+
_matches: (v, msg) ->
|
78
|
+
# required to solve the 2 - 1.9 = 0.1000000000000009 issue
|
79
|
+
decimal11 = (n) -> Math.floor(n * 10000000000) / 10000000000
|
80
|
+
delta = decimal11 Math.abs @a - v
|
81
|
+
|
82
|
+
if delta <= @b
|
83
|
+
msg.appendText("was").appendValue(v)
|
84
|
+
true
|
85
|
+
else
|
86
|
+
msg.appendValue(v)
|
87
|
+
.appendText("differed by")
|
88
|
+
.appendValue(delta - @b)
|
89
|
+
false
|
90
|
+
|
91
|
+
_describeTo: (msg) ->
|
92
|
+
msg.appendText("a Number within")
|
93
|
+
.appendValue(@b)
|
94
|
+
.appendText("of")
|
95
|
+
.appendValue(@a)
|
96
|
+
|
97
|
+
h4q.atLeast = (n) -> h4q.greaterThanOrEqualTo n
|
98
|
+
h4q.greaterThanOrEqualTo = (n) -> h4q.greaterThan n, true
|
99
|
+
h4q.greaterThan = (n, b) ->
|
100
|
+
if isNaN n
|
101
|
+
throw new Error message: "The comparison value must be a valid number"
|
102
|
+
|
103
|
+
new Matcher
|
104
|
+
n: n
|
105
|
+
included: b
|
106
|
+
inclusive: ->
|
107
|
+
@included = true
|
108
|
+
this
|
109
|
+
|
110
|
+
_matches: (v, msg) ->
|
111
|
+
if @included
|
112
|
+
|
113
|
+
if v >= @n
|
114
|
+
msg.appendText("was").appendValue(v)
|
115
|
+
true
|
116
|
+
else
|
117
|
+
msg.appendValue(v)
|
118
|
+
.appendText("was not greater than")
|
119
|
+
.appendText("or equal to")
|
120
|
+
.appendValue(@n)
|
121
|
+
false
|
122
|
+
else
|
123
|
+
|
124
|
+
if v > @n
|
125
|
+
msg.appendText("was").appendValue(v)
|
126
|
+
true
|
127
|
+
else
|
128
|
+
msg.appendValue(v)
|
129
|
+
.appendText("was not greater than")
|
130
|
+
.appendValue(@n)
|
131
|
+
false
|
132
|
+
|
133
|
+
_describeTo: (msg) ->
|
134
|
+
msg.appendText "a Number greater than"
|
135
|
+
msg.appendText "or equal to" if @included
|
136
|
+
msg.appendValue @n
|
137
|
+
|
138
|
+
h4q.atMost = (n) -> h4q.lowerThanOrEqualTo n
|
139
|
+
h4q.lowerThanOrEqualTo = (n) -> h4q.lowerThan n, true
|
140
|
+
h4q.lowerThan = (n,b) ->
|
141
|
+
if isNaN n
|
142
|
+
throw new Error message: "The comparison value must be a valid number"
|
143
|
+
|
144
|
+
new Matcher
|
145
|
+
n: n
|
146
|
+
included: b
|
147
|
+
inclusive: ->
|
148
|
+
@included = true
|
149
|
+
this
|
150
|
+
|
151
|
+
_matches: (v, msg)->
|
152
|
+
if @included
|
153
|
+
if v <= @n
|
154
|
+
msg.appendText("was").appendValue(v)
|
155
|
+
true
|
156
|
+
else
|
157
|
+
msg.appendValue(v)
|
158
|
+
.appendText("was not lower than")
|
159
|
+
.appendText("or equal to")
|
160
|
+
.appendValue(@n)
|
161
|
+
false
|
162
|
+
else
|
163
|
+
if v < @n
|
164
|
+
msg.appendText("was").appendValue(v)
|
165
|
+
true
|
166
|
+
|
167
|
+
else
|
168
|
+
msg.appendValue(v)
|
169
|
+
.appendText("was not lower than")
|
170
|
+
.appendValue(@n)
|
171
|
+
false
|
172
|
+
|
173
|
+
_describeTo: (msg) ->
|
174
|
+
msg.appendText "a Number lower than"
|
175
|
+
msg.appendText "or equal to" if @included
|
176
|
+
msg.appendValue @n
|
177
|
+
|
@@ -0,0 +1,249 @@
|
|
1
|
+
h4q.hasProperty = (p, v) ->
|
2
|
+
unless p?
|
3
|
+
throw new Error message: "hasProperty must have at least a property name"
|
4
|
+
|
5
|
+
v = equalTo v if v? and not (v instanceof Matcher)
|
6
|
+
|
7
|
+
return new Matcher
|
8
|
+
property: p
|
9
|
+
value: v
|
10
|
+
_matches: (v,msg) ->
|
11
|
+
unless v? and typeof v is "object"
|
12
|
+
msg.appendText("was").appendValue(v)
|
13
|
+
false
|
14
|
+
else unless v.hasOwnProperty @property
|
15
|
+
msg.appendValue(v)
|
16
|
+
.appendText( "don't have a property named" )
|
17
|
+
.appendRawValue(@property)
|
18
|
+
false
|
19
|
+
else if @value?
|
20
|
+
msgtmp = new Description()
|
21
|
+
res = @value.matches v[@property], msgtmp
|
22
|
+
|
23
|
+
if res then msg.appendText("was").appendValue(v)
|
24
|
+
else
|
25
|
+
msg.appendText msgtmp
|
26
|
+
msg.diff = msgtmp.diff
|
27
|
+
res
|
28
|
+
else
|
29
|
+
msg.appendText("was").appendValue(v)
|
30
|
+
true
|
31
|
+
|
32
|
+
_describeTo: (msg) ->
|
33
|
+
msg.appendText("an Object with a property").appendRawValue(@property)
|
34
|
+
if @value?
|
35
|
+
msg.appendText("of which value is").appendDescriptionOf(@value)
|
36
|
+
|
37
|
+
h4q.hasProperties = ( kwargs ) ->
|
38
|
+
unless kwargs?
|
39
|
+
throw new Error message: "the hasProperties kwargs arguments is mandatory"
|
40
|
+
|
41
|
+
for k, kwarg of kwargs
|
42
|
+
kwargs[k] = equalTo kwarg unless kwarg instanceof Matcher
|
43
|
+
|
44
|
+
new Matcher
|
45
|
+
kwargs: kwargs
|
46
|
+
_matches: (v,msg) ->
|
47
|
+
unless v? and typeof v is "object"
|
48
|
+
msg.appendText("was").appendValue(v)
|
49
|
+
return false
|
50
|
+
else
|
51
|
+
hasError = false
|
52
|
+
for p,m of @kwargs
|
53
|
+
unless v.hasOwnProperty p
|
54
|
+
if hasError
|
55
|
+
msg.appendText ","
|
56
|
+
|
57
|
+
msg.appendRawValue(p).appendText("was not defined")
|
58
|
+
hasError = true
|
59
|
+
else
|
60
|
+
val = v[p]
|
61
|
+
msgtmp = new Description()
|
62
|
+
unless m.matches val, msgtmp
|
63
|
+
msg.appendText(",") if hasError
|
64
|
+
msg.appendRawValue(p).appendText(": ").appendText msgtmp
|
65
|
+
hasError = true
|
66
|
+
|
67
|
+
msg.appendText("was").appendValue(v) unless hasError
|
68
|
+
return not hasError
|
69
|
+
|
70
|
+
_describeTo: (msg) ->
|
71
|
+
props = h4q.sortProperties @kwargs
|
72
|
+
l = props.length
|
73
|
+
msg.appendText("an Object which has properties")
|
74
|
+
for p,i in props
|
75
|
+
m = @kwargs[p]
|
76
|
+
if i is l - 1 then msg.appendText("and")
|
77
|
+
else if i > 0 then msg.appendText(",")
|
78
|
+
|
79
|
+
msg.appendRawValue(p).appendText(":").appendDescriptionOf(m)
|
80
|
+
|
81
|
+
h4q.hasMethod = (f, r, a, t) ->
|
82
|
+
unless f? and typeof f is "string"
|
83
|
+
throw new Error message: "hasMethod expect a function name"
|
84
|
+
|
85
|
+
r = equalTo r if r? and not (r instanceof Matcher)
|
86
|
+
|
87
|
+
new Matcher
|
88
|
+
method: f
|
89
|
+
returnsMatcher: r
|
90
|
+
throwsMatcher: t
|
91
|
+
checkThrows: false
|
92
|
+
noArgs: false
|
93
|
+
arguments: a
|
94
|
+
returns: (m) ->
|
95
|
+
m = equalTo m unless m instanceof Matcher
|
96
|
+
@returnsMatcher = m
|
97
|
+
this
|
98
|
+
withoutArgs: ->
|
99
|
+
@noArgs = true
|
100
|
+
this
|
101
|
+
withArgs: ->
|
102
|
+
@arguments = h4q.argumentsToArray arguments
|
103
|
+
this
|
104
|
+
throwsError: (m) ->
|
105
|
+
m = h4q.notNullValue() unless m?
|
106
|
+
m = h4q.equalTo m unless m instanceof Matcher
|
107
|
+
@throwsMatcher = m
|
108
|
+
@checkThrows = true
|
109
|
+
this
|
110
|
+
_matches: (v,msg) ->
|
111
|
+
unless v? and typeof v is "object"
|
112
|
+
msg.appendValue(v).appendText("is not an Object")
|
113
|
+
false
|
114
|
+
else
|
115
|
+
if typeof v[@method] is "function"
|
116
|
+
if @checkThrows
|
117
|
+
res = null
|
118
|
+
try
|
119
|
+
v[ @method ].apply v, if @noArgs then [] else @arguments
|
120
|
+
catch e
|
121
|
+
if @throwsMatcher
|
122
|
+
errorMsg = new Description()
|
123
|
+
res = @throwsMatcher.matches e, errorMsg
|
124
|
+
unless res
|
125
|
+
msg.appendText("an exception was thrown but")
|
126
|
+
.appendText(errorMsg)
|
127
|
+
msg.diff = errorMsg.diff
|
128
|
+
else
|
129
|
+
msg.appendText("an exception was thrown and")
|
130
|
+
.appendText( errorMsg)
|
131
|
+
else
|
132
|
+
msg.appendValue(e).appendText( "was thrown" )
|
133
|
+
res = true
|
134
|
+
|
135
|
+
unless res?
|
136
|
+
msg.appendText("no exception was thrown")
|
137
|
+
res = false
|
138
|
+
|
139
|
+
res
|
140
|
+
|
141
|
+
else if @returnsMatcher
|
142
|
+
res = v[@method].apply v, if @noArgs then [] else @arguments
|
143
|
+
rmsg = new Description()
|
144
|
+
mres = @returnsMatcher.matches res, rmsg
|
145
|
+
|
146
|
+
msg.diff = rmsg.diff
|
147
|
+
msg.appendText("was")
|
148
|
+
.appendValue( v )
|
149
|
+
.appendText("of which method")
|
150
|
+
.appendRawValue(@method)
|
151
|
+
.appendText("returns")
|
152
|
+
.appendText( rmsg )
|
153
|
+
mres
|
154
|
+
else
|
155
|
+
msg.appendText("was").appendValue(v)
|
156
|
+
true
|
157
|
+
else
|
158
|
+
unless v[@method]?
|
159
|
+
msg.appendValue(v)
|
160
|
+
.appendText("do not have a")
|
161
|
+
.appendRawValue(@method)
|
162
|
+
.appendText("method")
|
163
|
+
false
|
164
|
+
else
|
165
|
+
msg.appendValue(v)
|
166
|
+
.appendText("have a")
|
167
|
+
.appendRawValue(@method)
|
168
|
+
.appendText("property, but it is not a ")
|
169
|
+
false
|
170
|
+
|
171
|
+
_describeTo: (msg) ->
|
172
|
+
msg.appendText("an Object with a method").appendRawValue(@method)
|
173
|
+
|
174
|
+
if @checkThrows
|
175
|
+
if @throwsMatcher
|
176
|
+
msg.appendText("which throw")
|
177
|
+
.appendDescriptionOf(@throwsMatcher)
|
178
|
+
.appendText("when called")
|
179
|
+
else
|
180
|
+
msg.appendText("which throw an exception when called")
|
181
|
+
|
182
|
+
if not @noArgs and @arguments? and @arguments.length > 0
|
183
|
+
msg.appendText("with")
|
184
|
+
.appendValue(@arguments)
|
185
|
+
.appendText("as arguments")
|
186
|
+
else
|
187
|
+
msg.appendText("without arguments")
|
188
|
+
|
189
|
+
else if @returnsMatcher?
|
190
|
+
msg.appendText("which returns")
|
191
|
+
.appendDescriptionOf(@returnsMatcher)
|
192
|
+
.appendText("when called")
|
193
|
+
if not @noArgs and @arguments? and @arguments.length > 0
|
194
|
+
msg.appendText("with")
|
195
|
+
.appendValue(@arguments)
|
196
|
+
.appendText("as arguments")
|
197
|
+
else
|
198
|
+
msg.appendText("without arguments")
|
199
|
+
|
200
|
+
h4q.propertiesCount = (l) ->
|
201
|
+
if isNaN l
|
202
|
+
throw new Error message: "length argument must be a valid number"
|
203
|
+
if l < 0
|
204
|
+
throw new Error message: "length argument must greater than or equal to 0"
|
205
|
+
|
206
|
+
new Matcher
|
207
|
+
length: l
|
208
|
+
_matches: (v,msg) ->
|
209
|
+
unless v? and typeof v is "object" and not (v instanceof Array)
|
210
|
+
msg.appendText("was").appendValue(v)
|
211
|
+
false
|
212
|
+
else
|
213
|
+
l = h4q.sortProperties(v).length
|
214
|
+
if @length is l
|
215
|
+
msg.appendText("was").appendValue(v)
|
216
|
+
true
|
217
|
+
else
|
218
|
+
msg.appendText("was an Object with")
|
219
|
+
.appendValue(l)
|
220
|
+
.appendText(if l > 1 then "properties" else "property")
|
221
|
+
false
|
222
|
+
|
223
|
+
_describeTo: (msg) ->
|
224
|
+
msg.appendText("an Object with")
|
225
|
+
.appendValue(@length)
|
226
|
+
.appendText(if @length > 1 then "properties" else "property")
|
227
|
+
|
228
|
+
h4q.instanceOf = (t) ->
|
229
|
+
unless t?
|
230
|
+
throw new Error message: "type argument is mandatory"
|
231
|
+
|
232
|
+
new Matcher
|
233
|
+
type: t
|
234
|
+
_matches: (v,msg) ->
|
235
|
+
vtype = h4q.getType v
|
236
|
+
t = h4q.getTypeName @type
|
237
|
+
if t is vtype
|
238
|
+
msg.appendText("was #{aPrefix vtype}").appendRawValue(vtype)
|
239
|
+
true
|
240
|
+
else if v instanceof @type
|
241
|
+
msg.appendText("was #{aPrefix t}").appendRawValue(t)
|
242
|
+
true
|
243
|
+
else
|
244
|
+
msg.appendText("was #{aPrefix vtype}").appendRawValue(vtype)
|
245
|
+
false
|
246
|
+
|
247
|
+
_describeTo: (msg) ->
|
248
|
+
msg.appendText(aPrefix getTypeName @type)
|
249
|
+
.appendRawValue(getTypeName @type)
|