oojs 0.0.4 → 0.1.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/lib/assets/javascripts/oojspec_helpers.js.coffee +7 -0
- data/lib/assets/javascripts/oojspec_helpers/ajax_spec_helpers.js.coffee +26 -0
- data/lib/assets/javascripts/oojspec_helpers/oojspec-jquery.js.coffee +165 -0
- data/lib/oojs.rb +2 -2
- data/lib/oojs/version.rb +1 -1
- data/oojs.gemspec +1 -1
- metadata +9 -10
- data/lib/assets/javascripts/jasmine_helpers.js.coffee +0 -1
- data/lib/assets/javascripts/jasmine_helpers/ajax_spec_helpers.js.coffee +0 -28
- data/lib/assets/javascripts/jasmine_helpers/extra_matchers.js.coffee +0 -6
- data/vendor/assets/javascripts/jasmine-jquery.js +0 -315
@@ -0,0 +1,7 @@
|
|
1
|
+
# =require_tree ./oojspec_helpers
|
2
|
+
|
3
|
+
oojspec.assertions.add 'undefined', # simetric to 'toBeDefined'
|
4
|
+
assert: (@actual)-> @actual is undefined
|
5
|
+
assertMessage: 'Expected ${actual} to be undefined.'
|
6
|
+
refuteMessage: 'Expected ${actual} not to be undefined.'
|
7
|
+
expectation: 'toBeUndefined'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# =require modules
|
2
|
+
|
3
|
+
TIMEOUT = 500 # ms - Used to be 300, but FF was too slow
|
4
|
+
extendClass 'specs.oojspec.AjaxHelpers', ->
|
5
|
+
ajaxServer = null
|
6
|
+
initialize: (fakeAjaxServer, options = {})->
|
7
|
+
ajaxServer = fakeAjaxServer
|
8
|
+
ajaxSettings: -> ajaxServer.ajaxSettings()
|
9
|
+
waitsForAjaxRequest: (message = "An AJAX call was expected", \
|
10
|
+
timeout = @timeout or TIMEOUT, extraCondition)->
|
11
|
+
@waitsFor message, timeout, ->
|
12
|
+
ajaxServer.ajaxCallbacksQueue.length and (not extraCondition or extraCondition.call this)
|
13
|
+
waitsForAjaxRequestAnd: (condition, message, timeout)->
|
14
|
+
@waitsForAjaxRequest(message, timeout, condition)
|
15
|
+
nextRequest: (url, method, format)->
|
16
|
+
@checkRequestSettings(url, method, format)
|
17
|
+
ajaxServer.processNextRequest()
|
18
|
+
checkRequestSettings: (url, method, format)->
|
19
|
+
s = @ajaxSettings()
|
20
|
+
@expect(s.url).toBe url unless url is undefined
|
21
|
+
@expect(s.type).toBe method unless method is undefined
|
22
|
+
@expect(s.dataType).toBe format unless format is undefined
|
23
|
+
ignoreRequest: (url, method, format)->
|
24
|
+
@checkRequestSettings(url, method, format)
|
25
|
+
ajaxServer.ignoreNextRequest()
|
26
|
+
ignoreAllRequest: -> ajaxServer.ignoreAllRequest()
|
@@ -0,0 +1,165 @@
|
|
1
|
+
$ = jQuery # just to make sure
|
2
|
+
|
3
|
+
assertions = oojspec.assertions
|
4
|
+
|
5
|
+
addAssertion = (name, assertion)->
|
6
|
+
assert = assertion.assert
|
7
|
+
assertion.assert = ->
|
8
|
+
if arguments.length < assert.length
|
9
|
+
msg = "[#{name}] Expected to receive at least #{assert.length} argument"
|
10
|
+
msg += 's' if assert.length > 1
|
11
|
+
assertions.fail msg
|
12
|
+
return
|
13
|
+
result = assert.apply this, arguments
|
14
|
+
@actual = $toString(@actual) if @actual instanceof jQuery
|
15
|
+
result
|
16
|
+
assertions.add name, assertion
|
17
|
+
|
18
|
+
@oojs or= {}
|
19
|
+
|
20
|
+
$toString = ($element)->
|
21
|
+
return toHtml($element) if oojs.debugJQuery
|
22
|
+
$element.map((i, el)-> el.toString()).toArray().join '; '
|
23
|
+
|
24
|
+
toHtml = ($element)->
|
25
|
+
$element.map((i, el)-> $('<div/>').append($(el).clone()).html()).toArray().join ';\n\n'
|
26
|
+
|
27
|
+
browserTagCaseIndependentHtml = (html)-> $('<div/>').append(html).html()
|
28
|
+
|
29
|
+
addAssertion 'hasClass',
|
30
|
+
assert: (@actual, @className)-> $(actual).hasClass className
|
31
|
+
assertMessage: 'Expected ${actual} to have class ${className}.'
|
32
|
+
refuteMessage: 'Expected ${actual} not to have class ${className}.'
|
33
|
+
expectation: 'toHaveClass'
|
34
|
+
|
35
|
+
addAssertion 'isVisible',
|
36
|
+
assert: (@actual)-> $(actual).is(':visible')
|
37
|
+
assertMessage: 'Expected ${actual} to be visible.'
|
38
|
+
refuteMessage: 'Expected ${actual} not to be visible.'
|
39
|
+
expectation: 'toBeVisible'
|
40
|
+
|
41
|
+
addAssertion 'isHidden',
|
42
|
+
assert: (@actual)-> $(actual).is(':hidden')
|
43
|
+
assertMessage: 'Expected ${actual} to be hidden.'
|
44
|
+
refuteMessage: 'Expected ${actual} not to be hidden.'
|
45
|
+
expectation: 'toBeHidden'
|
46
|
+
|
47
|
+
addAssertion 'isSelected',
|
48
|
+
assert: (@actual)-> $(actual).is(':selected')
|
49
|
+
assertMessage: 'Expected ${actual} to be selected.'
|
50
|
+
refuteMessage: 'Expected ${actual} not to be selected.'
|
51
|
+
expectation: 'toBeSelected'
|
52
|
+
|
53
|
+
addAssertion 'isChecked',
|
54
|
+
assert: (@actual)-> $(actual).is(':checked')
|
55
|
+
assertMessage: 'Expected ${actual} to be checked.'
|
56
|
+
refuteMessage: 'Expected ${actual} not to be checked.'
|
57
|
+
expectation: 'toBeChecked'
|
58
|
+
|
59
|
+
addAssertion 'isEmpty',
|
60
|
+
assert: (@actual)-> $(actual).is(':empty')
|
61
|
+
assertMessage: 'Expected ${actual} to be empty.'
|
62
|
+
refuteMessage: 'Expected ${actual} not to be empty.'
|
63
|
+
expectation: 'toBeEmpty'
|
64
|
+
|
65
|
+
addAssertion 'exists',
|
66
|
+
assert: (@actual)-> $(actual).length
|
67
|
+
assertMessage: 'Expected ${actual} to exist.'
|
68
|
+
refuteMessage: 'Expected ${actual} not to exist.'
|
69
|
+
expectation: 'toExist'
|
70
|
+
|
71
|
+
addAssertion 'hasAttr',
|
72
|
+
assert: (@actual, @attribute, @expected)-> hasProperty actual.attr(attribute), expected
|
73
|
+
assertMessage: 'Expected attribute ${attribute} to be ${expected} for ${actual}.'
|
74
|
+
refuteMessage: 'Expected attribute ${attribute} not to be ${expected} for ${actual}.'
|
75
|
+
expectation: 'toHaveAttr'
|
76
|
+
|
77
|
+
addAssertion 'hasProp',
|
78
|
+
assert: (@actual, @property, @expected)-> hasProperty actual.prop(attribute), expected
|
79
|
+
assertMessage: 'Expected property ${property} to be ${expected} for ${actual}.'
|
80
|
+
refuteMessage: 'Expected property ${property} not to be ${expected} for ${actual}.'
|
81
|
+
expectation: 'toHaveProp'
|
82
|
+
|
83
|
+
addAssertion 'hasCss',
|
84
|
+
assert: (@actual, @css)->
|
85
|
+
return false for prop, value of css when @actual.css(prop) isnt value
|
86
|
+
true
|
87
|
+
assertMessage: 'Expected ${actual} to have css ${css}.'
|
88
|
+
refuteMessage: 'Expected ${actual} not to have css ${css}.'
|
89
|
+
expectation: 'toHaveCss'
|
90
|
+
|
91
|
+
addAssertion 'hasId',
|
92
|
+
assert: (@actual, @id)-> hasProperty actual.attr('id') is id
|
93
|
+
assertMessage: 'Expected ${actual} to have id ${id}.'
|
94
|
+
refuteMessage: 'Expected ${actual} not to have id ${id}.'
|
95
|
+
expectation: 'toHaveId'
|
96
|
+
|
97
|
+
addAssertion 'hasHtml',
|
98
|
+
assert: (@actual, @html)-> actual.html() is browserTagCaseIndependentHtml html
|
99
|
+
assertMessage: 'Expected ${actual} to have html ${html}.'
|
100
|
+
refuteMessage: 'Expected ${actual} not to have html ${html}.'
|
101
|
+
expectation: 'toHaveHtml'
|
102
|
+
|
103
|
+
addAssertion 'hasText',
|
104
|
+
assert: (@actual, @text)->
|
105
|
+
trimmedText = $.trim actual.text()
|
106
|
+
return text.test trimmedText if text?.test
|
107
|
+
trimmedText is text
|
108
|
+
assertMessage: 'Expected ${actual} to have text ${text}.'
|
109
|
+
refuteMessage: 'Expected ${actual} not to have text ${text}.'
|
110
|
+
expectation: 'toHaveText'
|
111
|
+
|
112
|
+
addAssertion 'hasValue',
|
113
|
+
assert: (@actual, @value)-> actual.val() is value
|
114
|
+
assertMessage: 'Expected ${actual} to have value ${value}.'
|
115
|
+
refuteMessage: 'Expected ${actual} not to have value ${value}.'
|
116
|
+
expectation: 'toHaveValue'
|
117
|
+
|
118
|
+
addAssertion 'hasData',
|
119
|
+
assert: (@actual, @key, @value)-> actual.data(key) is value
|
120
|
+
assertMessage: 'Expected ${key} data to be ${value} for ${actual}.'
|
121
|
+
refuteMessage: 'Expected ${key} data not to be ${value} for ${actual}.'
|
122
|
+
expectation: 'toHaveData'
|
123
|
+
|
124
|
+
addAssertion 'isSelector', # TODO: override toBe?
|
125
|
+
assert: (@actual, @selector)-> actual.is selector
|
126
|
+
assertMessage: 'Expected ${actual} to be ${selector}.'
|
127
|
+
refuteMessage: 'Expected ${actual} not to be ${selector}.'
|
128
|
+
expectation: 'toBeSelector'
|
129
|
+
|
130
|
+
addAssertion 'containsSelector', # TODO: override contains?
|
131
|
+
assert: (@actual, @selector)-> actual.find(selector).length
|
132
|
+
assertMessage: 'Expected ${actual} to contain ${selector}.'
|
133
|
+
refuteMessage: 'Expected ${actual} not to contain ${selector}.'
|
134
|
+
expectation: 'toContainSelector'
|
135
|
+
|
136
|
+
addAssertion 'isDisabled',
|
137
|
+
assert: (@actual)-> actual.is ':disabled'
|
138
|
+
assertMessage: 'Expected ${actual} to be disabled.'
|
139
|
+
refuteMessage: 'Expected ${actual} not to be disabled.'
|
140
|
+
expectation: 'toBeDisabled'
|
141
|
+
|
142
|
+
addAssertion 'isFocused',
|
143
|
+
assert: (@actual)-> actual.is ':focus'
|
144
|
+
assertMessage: 'Expected ${actual} to be focused.'
|
145
|
+
refuteMessage: 'Expected ${actual} not to be focused.'
|
146
|
+
expectation: 'toBeFocused'
|
147
|
+
|
148
|
+
addAssertion 'handle',
|
149
|
+
assert: (@actual, @event)-> actual.data('events')?[event].length
|
150
|
+
assertMessage: 'Expected ${actual} to handle ${event}.'
|
151
|
+
refuteMessage: 'Expected ${actual} not to handle ${event}.'
|
152
|
+
expectation: 'toHandle'
|
153
|
+
|
154
|
+
addAssertion 'handleWith',
|
155
|
+
assert: (@actual, @event, @handler)->
|
156
|
+
stack = actual.data('events')[event]
|
157
|
+
return true for ev in stack when ev.handler is handler
|
158
|
+
false
|
159
|
+
assertMessage: 'Expected ${actual} to handle ${event} with ${handler}.'
|
160
|
+
refuteMessage: 'Expected ${actual} not to handle ${event} with ${handler}.'
|
161
|
+
expectation: 'toHandle'
|
162
|
+
|
163
|
+
hasProperty = (actualValue, expectedValue)->
|
164
|
+
return actualValue isnt undefined if expectedValue is undefined
|
165
|
+
actualValue is expectedValue
|
data/lib/oojs.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require "oojs/version"
|
2
|
-
require '
|
2
|
+
require 'oojspec'
|
3
3
|
require 'fake-ajax-server'
|
4
4
|
require 'jquery-rails'
|
5
5
|
require 'sinon-rails'
|
6
6
|
|
7
7
|
module Oojs
|
8
8
|
class Engine < Rails::Engine
|
9
|
-
config.sandbox_assets.template ||= '
|
9
|
+
config.sandbox_assets.template ||= 'oojspec/runner'
|
10
10
|
end
|
11
11
|
end
|
data/lib/oojs/version.rb
CHANGED
data/oojs.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oojs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,10 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: oojspec
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
@@ -58,9 +58,9 @@ files:
|
|
58
58
|
- LICENSE
|
59
59
|
- README.md
|
60
60
|
- Rakefile
|
61
|
-
- lib/assets/javascripts/
|
62
|
-
- lib/assets/javascripts/
|
63
|
-
- lib/assets/javascripts/
|
61
|
+
- lib/assets/javascripts/oojspec_helpers.js.coffee
|
62
|
+
- lib/assets/javascripts/oojspec_helpers/ajax_spec_helpers.js.coffee
|
63
|
+
- lib/assets/javascripts/oojspec_helpers/oojspec-jquery.js.coffee
|
64
64
|
- lib/generators/oojs/spec/USAGE
|
65
65
|
- lib/generators/oojs/spec/spec_generator.rb
|
66
66
|
- lib/generators/oojs/spec/templates/fake_ajax_server.js.coffee.erb
|
@@ -71,7 +71,6 @@ files:
|
|
71
71
|
- lib/oojs.rb
|
72
72
|
- lib/oojs/version.rb
|
73
73
|
- oojs.gemspec
|
74
|
-
- vendor/assets/javascripts/jasmine-jquery.js
|
75
74
|
- vendor/assets/javascripts/jquery.ba-bbq.js
|
76
75
|
- vendor/assets/javascripts/modules.js.coffee
|
77
76
|
homepage: http://github.com/rosenfeld/oojs
|
@@ -88,7 +87,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
88
87
|
version: '0'
|
89
88
|
segments:
|
90
89
|
- 0
|
91
|
-
hash:
|
90
|
+
hash: -1256028454248046243
|
92
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
92
|
none: false
|
94
93
|
requirements:
|
@@ -97,10 +96,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
96
|
version: '0'
|
98
97
|
segments:
|
99
98
|
- 0
|
100
|
-
hash:
|
99
|
+
hash: -1256028454248046243
|
101
100
|
requirements: []
|
102
101
|
rubyforge_project:
|
103
|
-
rubygems_version: 1.8.
|
102
|
+
rubygems_version: 1.8.24
|
104
103
|
signing_key:
|
105
104
|
specification_version: 3
|
106
105
|
summary: Object-oriented JavaScript (or CoffeeScript) for Rails
|
@@ -1 +0,0 @@
|
|
1
|
-
# =require_tree ./jasmine_helpers
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# =require modules
|
2
|
-
|
3
|
-
TIMEOUT = 500 # ms - Used to be 300, but FF was too slow
|
4
|
-
extendClass 'specs.jasmine.AjaxHelpers', (self)->
|
5
|
-
ajaxServer = null
|
6
|
-
initialize: (fakeAjaxServer, options={})->
|
7
|
-
ajaxServer = fakeAjaxServer
|
8
|
-
TIMEOUT = options.timeout if options.timeout
|
9
|
-
ajaxSettings: -> ajaxServer.ajaxSettings()
|
10
|
-
waitsFor: (condition, message="waited event didn't happen", timeout=TIMEOUT)->
|
11
|
-
waitsFor (-> condition.call self), message, timeout
|
12
|
-
waitsForAjaxRequest: (message = "An AJAX call was expected", timeout=TIMEOUT, extraCondition)->
|
13
|
-
@waitsFor (-> ajaxServer.ajaxCallbacksQueue.length and
|
14
|
-
(not extraCondition or extraCondition.call self)), message, timeout
|
15
|
-
waitsForAjaxRequestAnd: (condition, message, timeout)->
|
16
|
-
@waitsForAjaxRequest(message, timeout, condition)
|
17
|
-
nextRequest: (url, method, format)->
|
18
|
-
@checkRequestSettings(url, method, format)
|
19
|
-
ajaxServer.processNextRequest()
|
20
|
-
checkRequestSettings: (url, method, format)->
|
21
|
-
s = @ajaxSettings()
|
22
|
-
expect(s.url).toBe url unless url is undefined
|
23
|
-
expect(s.type).toBe method unless method is undefined
|
24
|
-
expect(s.dataType).toBe format unless format is undefined
|
25
|
-
ignoreRequest: (url, method, format)->
|
26
|
-
@checkRequestSettings(url, method, format)
|
27
|
-
ajaxServer.ignoreNextRequest()
|
28
|
-
ignoreAllRequest: -> ajaxServer.ignoreAllRequest()
|
@@ -1,315 +0,0 @@
|
|
1
|
-
var readFixtures = function() {
|
2
|
-
return jasmine.getFixtures().proxyCallTo_('read', arguments);
|
3
|
-
};
|
4
|
-
|
5
|
-
var preloadFixtures = function() {
|
6
|
-
jasmine.getFixtures().proxyCallTo_('preload', arguments);
|
7
|
-
};
|
8
|
-
|
9
|
-
var loadFixtures = function() {
|
10
|
-
jasmine.getFixtures().proxyCallTo_('load', arguments);
|
11
|
-
};
|
12
|
-
|
13
|
-
var setFixtures = function(html) {
|
14
|
-
jasmine.getFixtures().set(html);
|
15
|
-
};
|
16
|
-
|
17
|
-
var sandbox = function(attributes) {
|
18
|
-
return jasmine.getFixtures().sandbox(attributes);
|
19
|
-
};
|
20
|
-
|
21
|
-
var spyOnEvent = function(selector, eventName) {
|
22
|
-
jasmine.JQuery.events.spyOn(selector, eventName);
|
23
|
-
};
|
24
|
-
|
25
|
-
jasmine.getFixtures = function() {
|
26
|
-
return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures();
|
27
|
-
};
|
28
|
-
|
29
|
-
jasmine.Fixtures = function() {
|
30
|
-
this.containerId = 'jasmine-fixtures';
|
31
|
-
this.fixturesCache_ = {};
|
32
|
-
this.fixturesPath = 'spec/javascripts/fixtures';
|
33
|
-
};
|
34
|
-
|
35
|
-
jasmine.Fixtures.prototype.set = function(html) {
|
36
|
-
this.cleanUp();
|
37
|
-
this.createContainer_(html);
|
38
|
-
};
|
39
|
-
|
40
|
-
jasmine.Fixtures.prototype.preload = function() {
|
41
|
-
this.read.apply(this, arguments);
|
42
|
-
};
|
43
|
-
|
44
|
-
jasmine.Fixtures.prototype.load = function() {
|
45
|
-
this.cleanUp();
|
46
|
-
this.createContainer_(this.read.apply(this, arguments));
|
47
|
-
};
|
48
|
-
|
49
|
-
jasmine.Fixtures.prototype.read = function() {
|
50
|
-
var htmlChunks = [];
|
51
|
-
|
52
|
-
var fixtureUrls = arguments;
|
53
|
-
for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
|
54
|
-
htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]));
|
55
|
-
}
|
56
|
-
|
57
|
-
return htmlChunks.join('');
|
58
|
-
};
|
59
|
-
|
60
|
-
jasmine.Fixtures.prototype.clearCache = function() {
|
61
|
-
this.fixturesCache_ = {};
|
62
|
-
};
|
63
|
-
|
64
|
-
jasmine.Fixtures.prototype.cleanUp = function() {
|
65
|
-
jQuery('#' + this.containerId).remove();
|
66
|
-
};
|
67
|
-
|
68
|
-
jasmine.Fixtures.prototype.sandbox = function(attributes) {
|
69
|
-
var attributesToSet = attributes || {};
|
70
|
-
return jQuery('<div id="sandbox" />').attr(attributesToSet);
|
71
|
-
};
|
72
|
-
|
73
|
-
jasmine.Fixtures.prototype.createContainer_ = function(html) {
|
74
|
-
var container;
|
75
|
-
if(html instanceof jQuery) {
|
76
|
-
container = jQuery('<div id="' + this.containerId + '" />');
|
77
|
-
container.html(html);
|
78
|
-
} else {
|
79
|
-
container = '<div id="' + this.containerId + '">' + html + '</div>'
|
80
|
-
}
|
81
|
-
jQuery('body').append(container);
|
82
|
-
};
|
83
|
-
|
84
|
-
jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
|
85
|
-
if (typeof this.fixturesCache_[url] == 'undefined') {
|
86
|
-
this.loadFixtureIntoCache_(url);
|
87
|
-
}
|
88
|
-
return this.fixturesCache_[url];
|
89
|
-
};
|
90
|
-
|
91
|
-
jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
|
92
|
-
var url = this.makeFixtureUrl_(relativeUrl);
|
93
|
-
var request = new XMLHttpRequest();
|
94
|
-
request.open("GET", url + "?" + new Date().getTime(), false);
|
95
|
-
request.send(null);
|
96
|
-
this.fixturesCache_[relativeUrl] = request.responseText;
|
97
|
-
};
|
98
|
-
|
99
|
-
jasmine.Fixtures.prototype.makeFixtureUrl_ = function(relativeUrl){
|
100
|
-
return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl;
|
101
|
-
};
|
102
|
-
|
103
|
-
jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
|
104
|
-
return this[methodName].apply(this, passedArguments);
|
105
|
-
};
|
106
|
-
|
107
|
-
|
108
|
-
jasmine.JQuery = function() {};
|
109
|
-
|
110
|
-
jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
|
111
|
-
return jQuery('<div/>').append(html).html();
|
112
|
-
};
|
113
|
-
|
114
|
-
jasmine.JQuery.elementToString = function(element) {
|
115
|
-
var domEl = $(element).get(0)
|
116
|
-
if (domEl == undefined || domEl.cloneNode)
|
117
|
-
return jQuery('<div />').append($(element).clone()).html();
|
118
|
-
else
|
119
|
-
return element.toString();
|
120
|
-
};
|
121
|
-
|
122
|
-
jasmine.JQuery.matchersClass = {};
|
123
|
-
|
124
|
-
(function(namespace) {
|
125
|
-
var data = {
|
126
|
-
spiedEvents: {},
|
127
|
-
handlers: []
|
128
|
-
};
|
129
|
-
|
130
|
-
namespace.events = {
|
131
|
-
spyOn: function(selector, eventName) {
|
132
|
-
var handler = function(e) {
|
133
|
-
data.spiedEvents[[selector, eventName]] = e;
|
134
|
-
};
|
135
|
-
jQuery(selector).bind(eventName, handler);
|
136
|
-
data.handlers.push(handler);
|
137
|
-
},
|
138
|
-
|
139
|
-
wasTriggered: function(selector, eventName) {
|
140
|
-
return !!(data.spiedEvents[[selector, eventName]]);
|
141
|
-
},
|
142
|
-
|
143
|
-
wasPrevented: function(selector, eventName) {
|
144
|
-
return data.spiedEvents[[selector, eventName]].isDefaultPrevented();
|
145
|
-
},
|
146
|
-
|
147
|
-
cleanUp: function() {
|
148
|
-
data.spiedEvents = {};
|
149
|
-
data.handlers = [];
|
150
|
-
}
|
151
|
-
}
|
152
|
-
})(jasmine.JQuery);
|
153
|
-
|
154
|
-
(function(){
|
155
|
-
var jQueryMatchers = {
|
156
|
-
toHaveClass: function(className) {
|
157
|
-
return this.actual.hasClass(className);
|
158
|
-
},
|
159
|
-
|
160
|
-
toBeVisible: function() {
|
161
|
-
return this.actual.is(':visible');
|
162
|
-
},
|
163
|
-
|
164
|
-
toBeHidden: function() {
|
165
|
-
return this.actual.is(':hidden');
|
166
|
-
},
|
167
|
-
|
168
|
-
toBeSelected: function() {
|
169
|
-
return this.actual.is(':selected');
|
170
|
-
},
|
171
|
-
|
172
|
-
toBeChecked: function() {
|
173
|
-
return this.actual.is(':checked');
|
174
|
-
},
|
175
|
-
|
176
|
-
toBeEmpty: function() {
|
177
|
-
return this.actual.is(':empty');
|
178
|
-
},
|
179
|
-
|
180
|
-
toExist: function() {
|
181
|
-
return $(document).find(this.actual).length;
|
182
|
-
},
|
183
|
-
|
184
|
-
toHaveAttr: function(attributeName, expectedAttributeValue) {
|
185
|
-
return hasProperty(this.actual.attr(attributeName), expectedAttributeValue);
|
186
|
-
},
|
187
|
-
|
188
|
-
toHaveProp: function(propertyName, expectedPropertyValue) {
|
189
|
-
return hasProperty(this.actual.prop(propertyName), expectedPropertyValue);
|
190
|
-
},
|
191
|
-
|
192
|
-
toHaveId: function(id) {
|
193
|
-
return this.actual.attr('id') == id;
|
194
|
-
},
|
195
|
-
|
196
|
-
toHaveHtml: function(html) {
|
197
|
-
return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html);
|
198
|
-
},
|
199
|
-
|
200
|
-
toHaveText: function(text) {
|
201
|
-
var trimmedText = $.trim(this.actual.text());
|
202
|
-
if (text && jQuery.isFunction(text.test)) {
|
203
|
-
return text.test(trimmedText);
|
204
|
-
} else {
|
205
|
-
return trimmedText == text;
|
206
|
-
}
|
207
|
-
},
|
208
|
-
|
209
|
-
toHaveValue: function(value) {
|
210
|
-
return this.actual.val() == value;
|
211
|
-
},
|
212
|
-
|
213
|
-
toHaveData: function(key, expectedValue) {
|
214
|
-
return hasProperty(this.actual.data(key), expectedValue);
|
215
|
-
},
|
216
|
-
|
217
|
-
toBe: function(selector) {
|
218
|
-
return this.actual.is(selector);
|
219
|
-
},
|
220
|
-
|
221
|
-
toContain: function(selector) {
|
222
|
-
return this.actual.find(selector).length;
|
223
|
-
},
|
224
|
-
|
225
|
-
toBeDisabled: function(selector){
|
226
|
-
return this.actual.is(':disabled');
|
227
|
-
},
|
228
|
-
|
229
|
-
toBeFocused: function(selector) {
|
230
|
-
return this.actual.is(':focus');
|
231
|
-
},
|
232
|
-
|
233
|
-
// tests the existence of a specific event binding
|
234
|
-
toHandle: function(eventName) {
|
235
|
-
var events = this.actual.data("events");
|
236
|
-
return events && events[eventName].length > 0;
|
237
|
-
},
|
238
|
-
|
239
|
-
// tests the existence of a specific event binding + handler
|
240
|
-
toHandleWith: function(eventName, eventHandler) {
|
241
|
-
var stack = this.actual.data("events")[eventName];
|
242
|
-
var i;
|
243
|
-
for (i = 0; i < stack.length; i++) {
|
244
|
-
if (stack[i].handler == eventHandler) {
|
245
|
-
return true;
|
246
|
-
}
|
247
|
-
}
|
248
|
-
return false;
|
249
|
-
}
|
250
|
-
};
|
251
|
-
|
252
|
-
var hasProperty = function(actualValue, expectedValue) {
|
253
|
-
if (expectedValue === undefined) {
|
254
|
-
return actualValue !== undefined;
|
255
|
-
}
|
256
|
-
return actualValue == expectedValue;
|
257
|
-
};
|
258
|
-
|
259
|
-
var bindMatcher = function(methodName) {
|
260
|
-
var builtInMatcher = jasmine.Matchers.prototype[methodName];
|
261
|
-
|
262
|
-
jasmine.JQuery.matchersClass[methodName] = function() {
|
263
|
-
if (this.actual
|
264
|
-
&& (this.actual instanceof jQuery
|
265
|
-
|| jasmine.isDomNode(this.actual))) {
|
266
|
-
this.actual = $(this.actual);
|
267
|
-
var result = jQueryMatchers[methodName].apply(this, arguments)
|
268
|
-
if (this.actual.get && !$.isWindow(this.actual.get()[0]))
|
269
|
-
this.actual = jasmine.JQuery.elementToString(this.actual)
|
270
|
-
return result;
|
271
|
-
}
|
272
|
-
|
273
|
-
if (builtInMatcher) {
|
274
|
-
return builtInMatcher.apply(this, arguments);
|
275
|
-
}
|
276
|
-
|
277
|
-
return false;
|
278
|
-
};
|
279
|
-
};
|
280
|
-
|
281
|
-
for(var methodName in jQueryMatchers) {
|
282
|
-
bindMatcher(methodName);
|
283
|
-
}
|
284
|
-
})();
|
285
|
-
|
286
|
-
beforeEach(function() {
|
287
|
-
this.addMatchers(jasmine.JQuery.matchersClass);
|
288
|
-
this.addMatchers({
|
289
|
-
toHaveBeenTriggeredOn: function(selector) {
|
290
|
-
this.message = function() {
|
291
|
-
return [
|
292
|
-
"Expected event " + this.actual + " to have been triggered on " + selector,
|
293
|
-
"Expected event " + this.actual + " not to have been triggered on " + selector
|
294
|
-
];
|
295
|
-
};
|
296
|
-
return jasmine.JQuery.events.wasTriggered($(selector), this.actual);
|
297
|
-
}
|
298
|
-
});
|
299
|
-
this.addMatchers({
|
300
|
-
toHaveBeenPreventedOn: function(selector) {
|
301
|
-
this.message = function() {
|
302
|
-
return [
|
303
|
-
"Expected event " + this.actual + " to have been prevented on " + selector,
|
304
|
-
"Expected event " + this.actual + " not to have been prevented on " + selector
|
305
|
-
];
|
306
|
-
};
|
307
|
-
return jasmine.JQuery.events.wasPrevented(selector, this.actual);
|
308
|
-
}
|
309
|
-
});
|
310
|
-
});
|
311
|
-
|
312
|
-
afterEach(function() {
|
313
|
-
jasmine.getFixtures().cleanUp();
|
314
|
-
jasmine.JQuery.events.cleanUp();
|
315
|
-
});
|