qedproject 0.3.0 → 0.3.1
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/bin/qedproject +4 -0
- data/lib/qedproject/project.rb +10 -3
- data/lib/qedproject/version.rb +1 -1
- data/templates/Gemfile +3 -0
- data/templates/Guardfile +4 -1
- data/templates/suite.html +6 -4
- data/vendor/jasmine/lib/jasmine-1.1.0/jasmine-html.js +487 -1
- data/vendor/jasmine/lib/jasmine-1.1.0/jasmine.css +81 -166
- data/vendor/jasmine/lib/jasmine-1.1.0/jasmine.js +61 -9
- data/vendor/jasmine/lib/jasmine-1.1.0/jasmine_favicon.png +0 -0
- data/vendor/jasmine-jquery/jasmine-jquery.js +306 -0
- metadata +6 -4
data/bin/qedproject
CHANGED
@@ -38,6 +38,10 @@ OptionParser.new do |opts|
|
|
38
38
|
options[:libs] = libs.split(",").collect{ |f| f.to_sym }
|
39
39
|
end
|
40
40
|
|
41
|
+
opts.on('-r', '--livereload', "Use LiveReload") do
|
42
|
+
options[:livereload] = true
|
43
|
+
end
|
44
|
+
|
41
45
|
opts.on('-o', '--overwrite', "Overwrite existing files with same names") do
|
42
46
|
options[:no_overwrite] = false
|
43
47
|
end
|
data/lib/qedproject/project.rb
CHANGED
@@ -7,7 +7,7 @@ module QEDProject
|
|
7
7
|
include QEDProject::Helpers
|
8
8
|
|
9
9
|
attr_accessor :path, :libs, :coffeescript, :sass, :jammit, :public_dir, :no_overwrite,
|
10
|
-
:js_path, :css_path, :images_path, :verbose, :testing, :skip_index,
|
10
|
+
:js_path, :css_path, :images_path, :verbose, :testing, :skip_index, :livereload,
|
11
11
|
:sorted_libs,
|
12
12
|
:css_assets, :js_assets
|
13
13
|
# convenience method to create a new project.
|
@@ -24,6 +24,10 @@ module QEDProject
|
|
24
24
|
File.expand_path("../../../vendor", __FILE__)
|
25
25
|
end
|
26
26
|
|
27
|
+
def uses_jquery?
|
28
|
+
self.libs.include?(:jquery)
|
29
|
+
end
|
30
|
+
|
27
31
|
# Creates a new Project instance.
|
28
32
|
# Options:
|
29
33
|
# :libs : A list of js libraries to include, Can be :backbone, :jquery, :knockout
|
@@ -81,6 +85,7 @@ module QEDProject
|
|
81
85
|
self.verbose = options[:verbose]
|
82
86
|
self.testing = options[:testing]
|
83
87
|
self.skip_index = options[:skip_index]
|
88
|
+
self.livereload = options[:livereload]
|
84
89
|
self.no_overwrite = options[:no_overwrite] ? true : false
|
85
90
|
end
|
86
91
|
|
@@ -93,7 +98,7 @@ module QEDProject
|
|
93
98
|
|
94
99
|
# We need a guardfile if the user is using jammit, sass, or coffeescript.
|
95
100
|
def needs_guardfile?
|
96
|
-
self.jammit || self.sass || self.coffeescript
|
101
|
+
self.jammit || self.sass || self.coffeescript || self.livereload
|
97
102
|
end
|
98
103
|
|
99
104
|
# Only jammit needs a config folder for now.
|
@@ -123,7 +128,9 @@ module QEDProject
|
|
123
128
|
mkdir_p File.join(self.path, "spec"), :verbose => self.verbose
|
124
129
|
cp_r File.join(self.vendor_root, "jasmine", "lib"),
|
125
130
|
File.join(self.path, "spec", "lib"), :verbose => self.verbose
|
126
|
-
|
131
|
+
if self.uses_jquery?
|
132
|
+
cp_r File.join(self.vendor_root, "jasmine-jquery", "jasmine-jquery.js"), File.join(self.path, "spec", "lib"), :verbose => self.verbose
|
133
|
+
end
|
127
134
|
|
128
135
|
render_template_to_file "suite.html", File.join(self.path, "spec", "suite.html"), binding
|
129
136
|
if self.coffeescript
|
data/lib/qedproject/version.rb
CHANGED
data/templates/Gemfile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
|
+
gem 'qedproject'
|
2
3
|
gem 'guard'
|
3
4
|
<% if self.sass -%>
|
4
5
|
gem 'guard-sass'
|
@@ -9,4 +10,6 @@ gem 'guard-coffeescript'
|
|
9
10
|
<% if self.jammit -%>
|
10
11
|
gem 'guard-jammit'
|
11
12
|
<% end -%>
|
13
|
+
<% if self.livereload -%>
|
12
14
|
gem 'guard-livereload'
|
15
|
+
<% end -%>
|
data/templates/Guardfile
CHANGED
@@ -32,8 +32,11 @@ guard 'livereload' do
|
|
32
32
|
watch(%r{public/.+\.(css|js|html)})
|
33
33
|
<% if self.jammit -%>
|
34
34
|
watch(%r{public/assets/.+\.(css|js|html)})
|
35
|
-
<% else
|
35
|
+
<% else -%>
|
36
36
|
watch(%r{public/javascripts/.+\.js})
|
37
37
|
watch(%r{public/stylesheets/.+\.css})
|
38
38
|
<% end -%>
|
39
|
+
<% if self.testing -%>
|
40
|
+
watch(%r{spec/.+\.(|js|html)})
|
41
|
+
<% end -%>
|
39
42
|
end
|
data/templates/suite.html
CHANGED
@@ -2,10 +2,12 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>Jasmine Test Runner</title>
|
5
|
-
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.0
|
6
|
-
<script type="text/javascript" src="lib/jasmine-1.0
|
7
|
-
<script type="text/javascript" src="lib/jasmine-1.0
|
8
|
-
|
5
|
+
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.1.0/jasmine.css">
|
6
|
+
<script type="text/javascript" src="lib/jasmine-1.1.0/jasmine.js"></script>
|
7
|
+
<script type="text/javascript" src="lib/jasmine-1.1.0/jasmine-html.js"></script>
|
8
|
+
<% if @project.uses_jquery? -%>
|
9
|
+
<script type="text/javascript" src="lib/jquery-jasmine.js"></script>
|
10
|
+
<% end -%>
|
9
11
|
<!-- include source files here... -->
|
10
12
|
<% if @project.jammit -%>
|
11
13
|
<script src="../public/assets/app.js"></script>
|
@@ -1,3 +1,489 @@
|
|
1
|
+
jasmine.HtmlReporterHelpers = {};
|
2
|
+
|
3
|
+
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
|
4
|
+
var el = document.createElement(type);
|
5
|
+
|
6
|
+
for (var i = 2; i < arguments.length; i++) {
|
7
|
+
var child = arguments[i];
|
8
|
+
|
9
|
+
if (typeof child === 'string') {
|
10
|
+
el.appendChild(document.createTextNode(child));
|
11
|
+
} else {
|
12
|
+
if (child) {
|
13
|
+
el.appendChild(child);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
for (var attr in attrs) {
|
19
|
+
if (attr == "className") {
|
20
|
+
el[attr] = attrs[attr];
|
21
|
+
} else {
|
22
|
+
el.setAttribute(attr, attrs[attr]);
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
return el;
|
27
|
+
};
|
28
|
+
|
29
|
+
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
|
30
|
+
var results = child.results();
|
31
|
+
var status = results.passed() ? 'passed' : 'failed';
|
32
|
+
if (results.skipped) {
|
33
|
+
status = 'skipped';
|
34
|
+
}
|
35
|
+
|
36
|
+
return status;
|
37
|
+
};
|
38
|
+
|
39
|
+
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
|
40
|
+
var parentDiv = this.dom.summary;
|
41
|
+
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
|
42
|
+
var parent = child[parentSuite];
|
43
|
+
|
44
|
+
if (parent) {
|
45
|
+
if (typeof this.views.suites[parent.id] == 'undefined') {
|
46
|
+
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
|
47
|
+
}
|
48
|
+
parentDiv = this.views.suites[parent.id].element;
|
49
|
+
}
|
50
|
+
|
51
|
+
parentDiv.appendChild(childElement);
|
52
|
+
};
|
53
|
+
|
54
|
+
|
55
|
+
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
|
56
|
+
for(var fn in jasmine.HtmlReporterHelpers) {
|
57
|
+
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
|
58
|
+
}
|
59
|
+
};
|
60
|
+
|
61
|
+
jasmine.HtmlReporter = function(_doc) {
|
62
|
+
var self = this;
|
63
|
+
var doc = _doc || window.document;
|
64
|
+
|
65
|
+
var reporterView;
|
66
|
+
|
67
|
+
var dom = {};
|
68
|
+
|
69
|
+
// Jasmine Reporter Public Interface
|
70
|
+
self.logRunningSpecs = false;
|
71
|
+
|
72
|
+
self.reportRunnerStarting = function(runner) {
|
73
|
+
var specs = runner.specs() || [];
|
74
|
+
|
75
|
+
if (specs.length == 0) {
|
76
|
+
return;
|
77
|
+
}
|
78
|
+
|
79
|
+
createReporterDom(runner.env.versionString());
|
80
|
+
doc.body.appendChild(dom.reporter);
|
81
|
+
|
82
|
+
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
|
83
|
+
reporterView.addSpecs(specs, self.specFilter);
|
84
|
+
};
|
85
|
+
|
86
|
+
self.reportRunnerResults = function(runner) {
|
87
|
+
reporterView && reporterView.complete();
|
88
|
+
};
|
89
|
+
|
90
|
+
self.reportSuiteResults = function(suite) {
|
91
|
+
reporterView.suiteComplete(suite);
|
92
|
+
};
|
93
|
+
|
94
|
+
self.reportSpecStarting = function(spec) {
|
95
|
+
if (self.logRunningSpecs) {
|
96
|
+
self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
|
97
|
+
}
|
98
|
+
};
|
99
|
+
|
100
|
+
self.reportSpecResults = function(spec) {
|
101
|
+
reporterView.specComplete(spec);
|
102
|
+
};
|
103
|
+
|
104
|
+
self.log = function() {
|
105
|
+
var console = jasmine.getGlobal().console;
|
106
|
+
if (console && console.log) {
|
107
|
+
if (console.log.apply) {
|
108
|
+
console.log.apply(console, arguments);
|
109
|
+
} else {
|
110
|
+
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
|
111
|
+
}
|
112
|
+
}
|
113
|
+
};
|
114
|
+
|
115
|
+
self.specFilter = function(spec) {
|
116
|
+
if (!focusedSpecName()) {
|
117
|
+
return true;
|
118
|
+
}
|
119
|
+
|
120
|
+
return spec.getFullName().indexOf(focusedSpecName()) === 0;
|
121
|
+
};
|
122
|
+
|
123
|
+
return self;
|
124
|
+
|
125
|
+
function focusedSpecName() {
|
126
|
+
var specName;
|
127
|
+
|
128
|
+
(function memoizeFocusedSpec() {
|
129
|
+
if (specName) {
|
130
|
+
return;
|
131
|
+
}
|
132
|
+
|
133
|
+
var paramMap = [];
|
134
|
+
var params = doc.location.search.substring(1).split('&');
|
135
|
+
|
136
|
+
for (var i = 0; i < params.length; i++) {
|
137
|
+
var p = params[i].split('=');
|
138
|
+
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
139
|
+
}
|
140
|
+
|
141
|
+
specName = paramMap.spec;
|
142
|
+
})();
|
143
|
+
|
144
|
+
return specName;
|
145
|
+
}
|
146
|
+
|
147
|
+
function createReporterDom(version) {
|
148
|
+
dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
|
149
|
+
dom.banner = self.createDom('div', { className: 'banner' },
|
150
|
+
self.createDom('span', { className: 'title' }, "Jasmine "),
|
151
|
+
self.createDom('span', { className: 'version' }, version)),
|
152
|
+
|
153
|
+
dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
|
154
|
+
dom.alert = self.createDom('div', {className: 'alert'}),
|
155
|
+
dom.results = self.createDom('div', {className: 'results'},
|
156
|
+
dom.summary = self.createDom('div', { className: 'summary' }),
|
157
|
+
dom.details = self.createDom('div', { id: 'details' }))
|
158
|
+
);
|
159
|
+
}
|
160
|
+
};
|
161
|
+
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporterHelpers = {};
|
162
|
+
|
163
|
+
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
|
164
|
+
var el = document.createElement(type);
|
165
|
+
|
166
|
+
for (var i = 2; i < arguments.length; i++) {
|
167
|
+
var child = arguments[i];
|
168
|
+
|
169
|
+
if (typeof child === 'string') {
|
170
|
+
el.appendChild(document.createTextNode(child));
|
171
|
+
} else {
|
172
|
+
if (child) {
|
173
|
+
el.appendChild(child);
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
for (var attr in attrs) {
|
179
|
+
if (attr == "className") {
|
180
|
+
el[attr] = attrs[attr];
|
181
|
+
} else {
|
182
|
+
el.setAttribute(attr, attrs[attr]);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
return el;
|
187
|
+
};
|
188
|
+
|
189
|
+
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
|
190
|
+
var results = child.results();
|
191
|
+
var status = results.passed() ? 'passed' : 'failed';
|
192
|
+
if (results.skipped) {
|
193
|
+
status = 'skipped';
|
194
|
+
}
|
195
|
+
|
196
|
+
return status;
|
197
|
+
};
|
198
|
+
|
199
|
+
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
|
200
|
+
var parentDiv = this.dom.summary;
|
201
|
+
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
|
202
|
+
var parent = child[parentSuite];
|
203
|
+
|
204
|
+
if (parent) {
|
205
|
+
if (typeof this.views.suites[parent.id] == 'undefined') {
|
206
|
+
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
|
207
|
+
}
|
208
|
+
parentDiv = this.views.suites[parent.id].element;
|
209
|
+
}
|
210
|
+
|
211
|
+
parentDiv.appendChild(childElement);
|
212
|
+
};
|
213
|
+
|
214
|
+
|
215
|
+
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
|
216
|
+
for(var fn in jasmine.HtmlReporterHelpers) {
|
217
|
+
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
|
218
|
+
}
|
219
|
+
};
|
220
|
+
|
221
|
+
jasmine.HtmlReporter.ReporterView = function(dom) {
|
222
|
+
this.startedAt = new Date();
|
223
|
+
this.runningSpecCount = 0;
|
224
|
+
this.completeSpecCount = 0;
|
225
|
+
this.passedCount = 0;
|
226
|
+
this.failedCount = 0;
|
227
|
+
this.skippedCount = 0;
|
228
|
+
|
229
|
+
this.createResultsMenu = function() {
|
230
|
+
this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
|
231
|
+
this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
|
232
|
+
' | ',
|
233
|
+
this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
|
234
|
+
|
235
|
+
this.summaryMenuItem.onclick = function() {
|
236
|
+
dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
|
237
|
+
};
|
238
|
+
|
239
|
+
this.detailsMenuItem.onclick = function() {
|
240
|
+
showDetails();
|
241
|
+
};
|
242
|
+
};
|
243
|
+
|
244
|
+
this.addSpecs = function(specs, specFilter) {
|
245
|
+
this.totalSpecCount = specs.length;
|
246
|
+
|
247
|
+
this.views = {
|
248
|
+
specs: {},
|
249
|
+
suites: {}
|
250
|
+
};
|
251
|
+
|
252
|
+
for (var i = 0; i < specs.length; i++) {
|
253
|
+
var spec = specs[i];
|
254
|
+
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
|
255
|
+
if (specFilter(spec)) {
|
256
|
+
this.runningSpecCount++;
|
257
|
+
}
|
258
|
+
}
|
259
|
+
};
|
260
|
+
|
261
|
+
this.specComplete = function(spec) {
|
262
|
+
this.completeSpecCount++;
|
263
|
+
|
264
|
+
if (isUndefined(this.views.specs[spec.id])) {
|
265
|
+
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);
|
266
|
+
}
|
267
|
+
|
268
|
+
var specView = this.views.specs[spec.id];
|
269
|
+
|
270
|
+
switch (specView.status()) {
|
271
|
+
case 'passed':
|
272
|
+
this.passedCount++;
|
273
|
+
break;
|
274
|
+
|
275
|
+
case 'failed':
|
276
|
+
this.failedCount++;
|
277
|
+
break;
|
278
|
+
|
279
|
+
case 'skipped':
|
280
|
+
this.skippedCount++;
|
281
|
+
break;
|
282
|
+
}
|
283
|
+
|
284
|
+
specView.refresh();
|
285
|
+
this.refresh();
|
286
|
+
};
|
287
|
+
|
288
|
+
this.suiteComplete = function(suite) {
|
289
|
+
var suiteView = this.views.suites[suite.id];
|
290
|
+
if (isUndefined(suiteView)) {
|
291
|
+
return;
|
292
|
+
}
|
293
|
+
suiteView.refresh();
|
294
|
+
};
|
295
|
+
|
296
|
+
this.refresh = function() {
|
297
|
+
|
298
|
+
if (isUndefined(this.resultsMenu)) {
|
299
|
+
this.createResultsMenu();
|
300
|
+
}
|
301
|
+
|
302
|
+
// currently running UI
|
303
|
+
if (isUndefined(this.runningAlert)) {
|
304
|
+
this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"});
|
305
|
+
dom.alert.appendChild(this.runningAlert);
|
306
|
+
}
|
307
|
+
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
|
308
|
+
|
309
|
+
// skipped specs UI
|
310
|
+
if (isUndefined(this.skippedAlert)) {
|
311
|
+
this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"});
|
312
|
+
}
|
313
|
+
|
314
|
+
this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
315
|
+
|
316
|
+
if (this.skippedCount === 1 && isDefined(dom.alert)) {
|
317
|
+
dom.alert.appendChild(this.skippedAlert);
|
318
|
+
}
|
319
|
+
|
320
|
+
// passing specs UI
|
321
|
+
if (isUndefined(this.passedAlert)) {
|
322
|
+
this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"});
|
323
|
+
}
|
324
|
+
this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
|
325
|
+
|
326
|
+
// failing specs UI
|
327
|
+
if (isUndefined(this.failedAlert)) {
|
328
|
+
this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
|
329
|
+
}
|
330
|
+
this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount);
|
331
|
+
|
332
|
+
if (this.failedCount === 1 && isDefined(dom.alert)) {
|
333
|
+
dom.alert.appendChild(this.failedAlert);
|
334
|
+
dom.alert.appendChild(this.resultsMenu);
|
335
|
+
}
|
336
|
+
|
337
|
+
// summary info
|
338
|
+
this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount);
|
339
|
+
this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
|
340
|
+
};
|
341
|
+
|
342
|
+
this.complete = function() {
|
343
|
+
dom.alert.removeChild(this.runningAlert);
|
344
|
+
|
345
|
+
this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
346
|
+
|
347
|
+
if (this.failedCount === 0) {
|
348
|
+
dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount)));
|
349
|
+
} else {
|
350
|
+
showDetails();
|
351
|
+
}
|
352
|
+
|
353
|
+
dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
|
354
|
+
};
|
355
|
+
|
356
|
+
return this;
|
357
|
+
|
358
|
+
function showDetails() {
|
359
|
+
if (dom.reporter.className.search(/showDetails/) === -1) {
|
360
|
+
dom.reporter.className += " showDetails";
|
361
|
+
}
|
362
|
+
}
|
363
|
+
|
364
|
+
function isUndefined(obj) {
|
365
|
+
return typeof obj === 'undefined';
|
366
|
+
}
|
367
|
+
|
368
|
+
function isDefined(obj) {
|
369
|
+
return !isUndefined(obj);
|
370
|
+
}
|
371
|
+
|
372
|
+
function specPluralizedFor(count) {
|
373
|
+
var str = count + " spec";
|
374
|
+
if (count > 1) {
|
375
|
+
str += "s"
|
376
|
+
}
|
377
|
+
return str;
|
378
|
+
}
|
379
|
+
|
380
|
+
};
|
381
|
+
|
382
|
+
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
|
383
|
+
|
384
|
+
|
385
|
+
jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
|
386
|
+
this.spec = spec;
|
387
|
+
this.dom = dom;
|
388
|
+
this.views = views;
|
389
|
+
|
390
|
+
this.symbol = this.createDom('li', { className: 'pending' });
|
391
|
+
this.dom.symbolSummary.appendChild(this.symbol);
|
392
|
+
|
393
|
+
this.summary = this.createDom('div', { className: 'specSummary' },
|
394
|
+
this.createDom('a', {
|
395
|
+
className: 'description',
|
396
|
+
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
|
397
|
+
title: this.spec.getFullName()
|
398
|
+
}, this.spec.description)
|
399
|
+
);
|
400
|
+
|
401
|
+
this.detail = this.createDom('div', { className: 'specDetail' },
|
402
|
+
this.createDom('a', {
|
403
|
+
className: 'description',
|
404
|
+
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
|
405
|
+
title: this.spec.getFullName()
|
406
|
+
}, this.spec.getFullName())
|
407
|
+
);
|
408
|
+
};
|
409
|
+
|
410
|
+
jasmine.HtmlReporter.SpecView.prototype.status = function() {
|
411
|
+
return this.getSpecStatus(this.spec);
|
412
|
+
};
|
413
|
+
|
414
|
+
jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
|
415
|
+
this.symbol.className = this.status();
|
416
|
+
|
417
|
+
switch (this.status()) {
|
418
|
+
case 'skipped':
|
419
|
+
break;
|
420
|
+
|
421
|
+
case 'passed':
|
422
|
+
this.appendSummaryToSuiteDiv();
|
423
|
+
break;
|
424
|
+
|
425
|
+
case 'failed':
|
426
|
+
this.appendSummaryToSuiteDiv();
|
427
|
+
this.appendFailureDetail();
|
428
|
+
break;
|
429
|
+
}
|
430
|
+
};
|
431
|
+
|
432
|
+
jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
|
433
|
+
this.summary.className += ' ' + this.status();
|
434
|
+
this.appendToSummary(this.spec, this.summary);
|
435
|
+
};
|
436
|
+
|
437
|
+
jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
|
438
|
+
this.detail.className += ' ' + this.status();
|
439
|
+
|
440
|
+
var resultItems = this.spec.results().getItems();
|
441
|
+
var messagesDiv = this.createDom('div', { className: 'messages' });
|
442
|
+
|
443
|
+
for (var i = 0; i < resultItems.length; i++) {
|
444
|
+
var result = resultItems[i];
|
445
|
+
|
446
|
+
if (result.type == 'log') {
|
447
|
+
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
|
448
|
+
} else if (result.type == 'expect' && result.passed && !result.passed()) {
|
449
|
+
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
|
450
|
+
|
451
|
+
if (result.trace.stack) {
|
452
|
+
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
|
453
|
+
}
|
454
|
+
}
|
455
|
+
}
|
456
|
+
|
457
|
+
if (messagesDiv.childNodes.length > 0) {
|
458
|
+
this.detail.appendChild(messagesDiv);
|
459
|
+
this.dom.details.appendChild(this.detail);
|
460
|
+
}
|
461
|
+
};
|
462
|
+
|
463
|
+
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
|
464
|
+
this.suite = suite;
|
465
|
+
this.dom = dom;
|
466
|
+
this.views = views;
|
467
|
+
|
468
|
+
this.element = this.createDom('div', { className: 'suite' },
|
469
|
+
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description)
|
470
|
+
);
|
471
|
+
|
472
|
+
this.appendToSummary(this.suite, this.element);
|
473
|
+
};
|
474
|
+
|
475
|
+
jasmine.HtmlReporter.SuiteView.prototype.status = function() {
|
476
|
+
return this.getSpecStatus(this.suite);
|
477
|
+
};
|
478
|
+
|
479
|
+
jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
|
480
|
+
this.element.className += " " + this.status();
|
481
|
+
};
|
482
|
+
|
483
|
+
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
|
484
|
+
|
485
|
+
/* @deprecated Use jasmine.HtmlReporter instead
|
486
|
+
*/
|
1
487
|
jasmine.TrivialReporter = function(doc) {
|
2
488
|
this.document = doc || document;
|
3
489
|
this.suiteDivs = {};
|
@@ -31,7 +517,7 @@ jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarA
|
|
31
517
|
jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
|
32
518
|
var showPassed, showSkipped;
|
33
519
|
|
34
|
-
this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
|
520
|
+
this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
|
35
521
|
this.createDom('div', { className: 'banner' },
|
36
522
|
this.createDom('div', { className: 'logo' },
|
37
523
|
this.createDom('span', { className: 'title' }, "Jasmine"),
|
@@ -1,166 +1,81 @@
|
|
1
|
-
body {
|
2
|
-
|
3
|
-
}
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
}
|
9
|
-
|
10
|
-
.
|
11
|
-
|
12
|
-
}
|
13
|
-
|
14
|
-
.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
}
|
20
|
-
|
21
|
-
.
|
22
|
-
|
23
|
-
}
|
24
|
-
|
25
|
-
.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
30
|
-
|
31
|
-
.
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
}
|
36
|
-
|
37
|
-
.
|
38
|
-
|
39
|
-
|
40
|
-
}
|
41
|
-
|
42
|
-
.
|
43
|
-
|
44
|
-
}
|
45
|
-
|
46
|
-
|
47
|
-
.
|
48
|
-
|
49
|
-
|
50
|
-
}
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
}
|
60
|
-
|
61
|
-
.
|
62
|
-
|
63
|
-
}
|
64
|
-
|
65
|
-
.suite.
|
66
|
-
|
67
|
-
}
|
68
|
-
|
69
|
-
.
|
70
|
-
|
71
|
-
}
|
72
|
-
|
73
|
-
.
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
}
|
78
|
-
|
79
|
-
.
|
80
|
-
|
81
|
-
|
82
|
-
}
|
83
|
-
|
84
|
-
.spec.failed {
|
85
|
-
background-color: #fbb;
|
86
|
-
border-color: red;
|
87
|
-
}
|
88
|
-
|
89
|
-
.spec.passed {
|
90
|
-
background-color: #bfb;
|
91
|
-
border-color: green;
|
92
|
-
}
|
93
|
-
|
94
|
-
.spec.skipped {
|
95
|
-
background-color: #bbb;
|
96
|
-
}
|
97
|
-
|
98
|
-
.messages {
|
99
|
-
border-left: 1px dashed gray;
|
100
|
-
padding-left: 1em;
|
101
|
-
padding-right: 1em;
|
102
|
-
}
|
103
|
-
|
104
|
-
.passed {
|
105
|
-
background-color: #cfc;
|
106
|
-
display: none;
|
107
|
-
}
|
108
|
-
|
109
|
-
.failed {
|
110
|
-
background-color: #fbb;
|
111
|
-
}
|
112
|
-
|
113
|
-
.skipped {
|
114
|
-
color: #777;
|
115
|
-
background-color: #eee;
|
116
|
-
display: none;
|
117
|
-
}
|
118
|
-
|
119
|
-
|
120
|
-
/*.resultMessage {*/
|
121
|
-
/*white-space: pre;*/
|
122
|
-
/*}*/
|
123
|
-
|
124
|
-
.resultMessage span.result {
|
125
|
-
display: block;
|
126
|
-
line-height: 2em;
|
127
|
-
color: black;
|
128
|
-
}
|
129
|
-
|
130
|
-
.resultMessage .mismatch {
|
131
|
-
color: black;
|
132
|
-
}
|
133
|
-
|
134
|
-
.stackTrace {
|
135
|
-
white-space: pre;
|
136
|
-
font-size: .8em;
|
137
|
-
margin-left: 10px;
|
138
|
-
max-height: 5em;
|
139
|
-
overflow: auto;
|
140
|
-
border: 1px inset red;
|
141
|
-
padding: 1em;
|
142
|
-
background: #eef;
|
143
|
-
}
|
144
|
-
|
145
|
-
.finished-at {
|
146
|
-
padding-left: 1em;
|
147
|
-
font-size: .6em;
|
148
|
-
}
|
149
|
-
|
150
|
-
.show-passed .passed,
|
151
|
-
.show-skipped .skipped {
|
152
|
-
display: block;
|
153
|
-
}
|
154
|
-
|
155
|
-
|
156
|
-
#jasmine_content {
|
157
|
-
position:fixed;
|
158
|
-
right: 100%;
|
159
|
-
}
|
160
|
-
|
161
|
-
.runner {
|
162
|
-
border: 1px solid gray;
|
163
|
-
display: block;
|
164
|
-
margin: 5px 0;
|
165
|
-
padding: 2px 0 2px 10px;
|
166
|
-
}
|
1
|
+
body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
|
2
|
+
|
3
|
+
#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
|
4
|
+
#HTMLReporter a { text-decoration: none; }
|
5
|
+
#HTMLReporter a:hover { text-decoration: underline; }
|
6
|
+
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }
|
7
|
+
#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }
|
8
|
+
#HTMLReporter #jasmine_content { position: fixed; right: 100%; }
|
9
|
+
#HTMLReporter .version { color: #aaaaaa; }
|
10
|
+
#HTMLReporter .banner { margin-top: 14px; }
|
11
|
+
#HTMLReporter .duration { color: #aaaaaa; float: right; }
|
12
|
+
#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }
|
13
|
+
#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }
|
14
|
+
#HTMLReporter .symbolSummary li.passed { font-size: 14px; }
|
15
|
+
#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; }
|
16
|
+
#HTMLReporter .symbolSummary li.failed { line-height: 9px; }
|
17
|
+
#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; }
|
18
|
+
#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }
|
19
|
+
#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
|
20
|
+
#HTMLReporter .symbolSummary li.pending { line-height: 11px; }
|
21
|
+
#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
|
22
|
+
#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
|
23
|
+
#HTMLReporter .runningAlert { background-color: #666666; }
|
24
|
+
#HTMLReporter .skippedAlert { background-color: #aaaaaa; }
|
25
|
+
#HTMLReporter .skippedAlert:first-child { background-color: #333333; }
|
26
|
+
#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; }
|
27
|
+
#HTMLReporter .passingAlert { background-color: #a6b779; }
|
28
|
+
#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; }
|
29
|
+
#HTMLReporter .failingAlert { background-color: #cf867e; }
|
30
|
+
#HTMLReporter .failingAlert:first-child { background-color: #b03911; }
|
31
|
+
#HTMLReporter .results { margin-top: 14px; }
|
32
|
+
#HTMLReporter #details { display: none; }
|
33
|
+
#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; }
|
34
|
+
#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
|
35
|
+
#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
|
36
|
+
#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }
|
37
|
+
#HTMLReporter.showDetails .summary { display: none; }
|
38
|
+
#HTMLReporter.showDetails #details { display: block; }
|
39
|
+
#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }
|
40
|
+
#HTMLReporter .summary { margin-top: 14px; }
|
41
|
+
#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; }
|
42
|
+
#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; }
|
43
|
+
#HTMLReporter .summary .specSummary.failed a { color: #b03911; }
|
44
|
+
#HTMLReporter .description + .suite { margin-top: 0; }
|
45
|
+
#HTMLReporter .suite { margin-top: 14px; }
|
46
|
+
#HTMLReporter .suite a { color: #333333; }
|
47
|
+
#HTMLReporter #details .specDetail { margin-bottom: 28px; }
|
48
|
+
#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; }
|
49
|
+
#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; }
|
50
|
+
#HTMLReporter .resultMessage span.result { display: block; }
|
51
|
+
#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
|
52
|
+
|
53
|
+
#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ }
|
54
|
+
#TrivialReporter a:visited, #TrivialReporter a { color: #303; }
|
55
|
+
#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; }
|
56
|
+
#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; }
|
57
|
+
#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; }
|
58
|
+
#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; }
|
59
|
+
#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; }
|
60
|
+
#TrivialReporter .runner.running { background-color: yellow; }
|
61
|
+
#TrivialReporter .options { text-align: right; font-size: .8em; }
|
62
|
+
#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; }
|
63
|
+
#TrivialReporter .suite .suite { margin: 5px; }
|
64
|
+
#TrivialReporter .suite.passed { background-color: #dfd; }
|
65
|
+
#TrivialReporter .suite.failed { background-color: #fdd; }
|
66
|
+
#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; }
|
67
|
+
#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; }
|
68
|
+
#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; }
|
69
|
+
#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; }
|
70
|
+
#TrivialReporter .spec.skipped { background-color: #bbb; }
|
71
|
+
#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; }
|
72
|
+
#TrivialReporter .passed { background-color: #cfc; display: none; }
|
73
|
+
#TrivialReporter .failed { background-color: #fbb; }
|
74
|
+
#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; }
|
75
|
+
#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; }
|
76
|
+
#TrivialReporter .resultMessage .mismatch { color: black; }
|
77
|
+
#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; }
|
78
|
+
#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; }
|
79
|
+
#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; }
|
80
|
+
#TrivialReporter #jasmine_content { position: fixed; right: 100%; }
|
81
|
+
#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; }
|
@@ -196,6 +196,21 @@ jasmine.any = function(clazz) {
|
|
196
196
|
return new jasmine.Matchers.Any(clazz);
|
197
197
|
};
|
198
198
|
|
199
|
+
/**
|
200
|
+
* Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the
|
201
|
+
* attributes on the object.
|
202
|
+
*
|
203
|
+
* @example
|
204
|
+
* // don't care about any other attributes than foo.
|
205
|
+
* expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"});
|
206
|
+
*
|
207
|
+
* @param sample {Object} sample
|
208
|
+
* @returns matchable object for the sample
|
209
|
+
*/
|
210
|
+
jasmine.objectContaining = function (sample) {
|
211
|
+
return new jasmine.Matchers.ObjectContaining(sample);
|
212
|
+
};
|
213
|
+
|
199
214
|
/**
|
200
215
|
* Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
|
201
216
|
*
|
@@ -914,11 +929,19 @@ jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
|
|
914
929
|
return a.getTime() == b.getTime();
|
915
930
|
}
|
916
931
|
|
917
|
-
if (a
|
932
|
+
if (a.jasmineMatches) {
|
933
|
+
return a.jasmineMatches(b);
|
934
|
+
}
|
935
|
+
|
936
|
+
if (b.jasmineMatches) {
|
937
|
+
return b.jasmineMatches(a);
|
938
|
+
}
|
939
|
+
|
940
|
+
if (a instanceof jasmine.Matchers.ObjectContaining) {
|
918
941
|
return a.matches(b);
|
919
942
|
}
|
920
943
|
|
921
|
-
if (b instanceof jasmine.Matchers.
|
944
|
+
if (b instanceof jasmine.Matchers.ObjectContaining) {
|
922
945
|
return b.matches(a);
|
923
946
|
}
|
924
947
|
|
@@ -1212,7 +1235,7 @@ jasmine.Matchers.prototype.toEqual = function(expected) {
|
|
1212
1235
|
/**
|
1213
1236
|
* toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
|
1214
1237
|
* @param expected
|
1215
|
-
* @deprecated as of 1.0. Use not.
|
1238
|
+
* @deprecated as of 1.0. Use not.toEqual() instead.
|
1216
1239
|
*/
|
1217
1240
|
jasmine.Matchers.prototype.toNotEqual = function(expected) {
|
1218
1241
|
return !this.env.equals_(this.actual, expected);
|
@@ -1385,7 +1408,7 @@ jasmine.Matchers.prototype.toContain = function(expected) {
|
|
1385
1408
|
* Matcher that checks that the expected item is NOT an element in the actual Array.
|
1386
1409
|
*
|
1387
1410
|
* @param {Object} expected
|
1388
|
-
* @deprecated as of 1.0. Use not.
|
1411
|
+
* @deprecated as of 1.0. Use not.toContain() instead.
|
1389
1412
|
*/
|
1390
1413
|
jasmine.Matchers.prototype.toNotContain = function(expected) {
|
1391
1414
|
return !this.env.contains_(this.actual, expected);
|
@@ -1453,7 +1476,7 @@ jasmine.Matchers.Any = function(expectedClass) {
|
|
1453
1476
|
this.expectedClass = expectedClass;
|
1454
1477
|
};
|
1455
1478
|
|
1456
|
-
jasmine.Matchers.Any.prototype.
|
1479
|
+
jasmine.Matchers.Any.prototype.jasmineMatches = function(other) {
|
1457
1480
|
if (this.expectedClass == String) {
|
1458
1481
|
return typeof other == 'string' || other instanceof String;
|
1459
1482
|
}
|
@@ -1473,10 +1496,39 @@ jasmine.Matchers.Any.prototype.matches = function(other) {
|
|
1473
1496
|
return other instanceof this.expectedClass;
|
1474
1497
|
};
|
1475
1498
|
|
1476
|
-
jasmine.Matchers.Any.prototype.
|
1499
|
+
jasmine.Matchers.Any.prototype.jasmineToString = function() {
|
1477
1500
|
return '<jasmine.any(' + this.expectedClass + ')>';
|
1478
1501
|
};
|
1479
1502
|
|
1503
|
+
jasmine.Matchers.ObjectContaining = function (sample) {
|
1504
|
+
this.sample = sample;
|
1505
|
+
};
|
1506
|
+
|
1507
|
+
jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) {
|
1508
|
+
mismatchKeys = mismatchKeys || [];
|
1509
|
+
mismatchValues = mismatchValues || [];
|
1510
|
+
|
1511
|
+
var env = jasmine.getEnv();
|
1512
|
+
|
1513
|
+
var hasKey = function(obj, keyName) {
|
1514
|
+
return obj != null && obj[keyName] !== jasmine.undefined;
|
1515
|
+
};
|
1516
|
+
|
1517
|
+
for (var property in this.sample) {
|
1518
|
+
if (!hasKey(other, property) && hasKey(this.sample, property)) {
|
1519
|
+
mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
|
1520
|
+
}
|
1521
|
+
else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) {
|
1522
|
+
mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual.");
|
1523
|
+
}
|
1524
|
+
}
|
1525
|
+
|
1526
|
+
return (mismatchKeys.length === 0 && mismatchValues.length === 0);
|
1527
|
+
};
|
1528
|
+
|
1529
|
+
jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () {
|
1530
|
+
return "<jasmine.objectContaining(" + jasmine.pp(this.sample) + ")>";
|
1531
|
+
};
|
1480
1532
|
/**
|
1481
1533
|
* @constructor
|
1482
1534
|
*/
|
@@ -1617,8 +1669,8 @@ jasmine.PrettyPrinter.prototype.format = function(value) {
|
|
1617
1669
|
this.emitScalar('null');
|
1618
1670
|
} else if (value === jasmine.getGlobal()) {
|
1619
1671
|
this.emitScalar('<global>');
|
1620
|
-
} else if (value
|
1621
|
-
this.emitScalar(value.
|
1672
|
+
} else if (value.jasmineToString) {
|
1673
|
+
this.emitScalar(value.jasmineToString());
|
1622
1674
|
} else if (typeof value === 'string') {
|
1623
1675
|
this.emitString(value);
|
1624
1676
|
} else if (jasmine.isSpy(value)) {
|
@@ -2472,5 +2524,5 @@ jasmine.version_= {
|
|
2472
2524
|
"major": 1,
|
2473
2525
|
"minor": 1,
|
2474
2526
|
"build": 0,
|
2475
|
-
"revision":
|
2527
|
+
"revision": 1330200206
|
2476
2528
|
};
|
Binary file
|
@@ -0,0 +1,306 @@
|
|
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.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + 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.proxyCallTo_ = function(methodName, passedArguments) {
|
100
|
+
return this[methodName].apply(this, passedArguments);
|
101
|
+
};
|
102
|
+
|
103
|
+
|
104
|
+
jasmine.JQuery = function() {};
|
105
|
+
|
106
|
+
jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
|
107
|
+
return jQuery('<div/>').append(html).html();
|
108
|
+
};
|
109
|
+
|
110
|
+
jasmine.JQuery.elementToString = function(element) {
|
111
|
+
return jQuery('<div />').append($(element).clone()).html();
|
112
|
+
};
|
113
|
+
|
114
|
+
jasmine.JQuery.matchersClass = {};
|
115
|
+
|
116
|
+
(function(namespace) {
|
117
|
+
var data = {
|
118
|
+
spiedEvents: {},
|
119
|
+
handlers: []
|
120
|
+
};
|
121
|
+
|
122
|
+
namespace.events = {
|
123
|
+
spyOn: function(selector, eventName) {
|
124
|
+
var handler = function(e) {
|
125
|
+
data.spiedEvents[[selector, eventName]] = e;
|
126
|
+
};
|
127
|
+
jQuery(selector).bind(eventName, handler);
|
128
|
+
data.handlers.push(handler);
|
129
|
+
},
|
130
|
+
|
131
|
+
wasTriggered: function(selector, eventName) {
|
132
|
+
return !!(data.spiedEvents[[selector, eventName]]);
|
133
|
+
},
|
134
|
+
|
135
|
+
wasPrevented: function(selector, eventName) {
|
136
|
+
return data.spiedEvents[[selector, eventName]].isDefaultPrevented();
|
137
|
+
},
|
138
|
+
|
139
|
+
cleanUp: function() {
|
140
|
+
data.spiedEvents = {};
|
141
|
+
data.handlers = [];
|
142
|
+
}
|
143
|
+
}
|
144
|
+
})(jasmine.JQuery);
|
145
|
+
|
146
|
+
(function(){
|
147
|
+
var jQueryMatchers = {
|
148
|
+
toHaveClass: function(className) {
|
149
|
+
return this.actual.hasClass(className);
|
150
|
+
},
|
151
|
+
|
152
|
+
toBeVisible: function() {
|
153
|
+
return this.actual.is(':visible');
|
154
|
+
},
|
155
|
+
|
156
|
+
toBeHidden: function() {
|
157
|
+
return this.actual.is(':hidden');
|
158
|
+
},
|
159
|
+
|
160
|
+
toBeSelected: function() {
|
161
|
+
return this.actual.is(':selected');
|
162
|
+
},
|
163
|
+
|
164
|
+
toBeChecked: function() {
|
165
|
+
return this.actual.is(':checked');
|
166
|
+
},
|
167
|
+
|
168
|
+
toBeEmpty: function() {
|
169
|
+
return this.actual.is(':empty');
|
170
|
+
},
|
171
|
+
|
172
|
+
toExist: function() {
|
173
|
+
return this.actual.size() > 0;
|
174
|
+
},
|
175
|
+
|
176
|
+
toHaveAttr: function(attributeName, expectedAttributeValue) {
|
177
|
+
return hasProperty(this.actual.attr(attributeName), expectedAttributeValue);
|
178
|
+
},
|
179
|
+
|
180
|
+
toHaveProp: function(propertyName, expectedPropertyValue) {
|
181
|
+
return hasProperty(this.actual.prop(propertyName), expectedPropertyValue);
|
182
|
+
},
|
183
|
+
|
184
|
+
toHaveId: function(id) {
|
185
|
+
return this.actual.attr('id') == id;
|
186
|
+
},
|
187
|
+
|
188
|
+
toHaveHtml: function(html) {
|
189
|
+
return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html);
|
190
|
+
},
|
191
|
+
|
192
|
+
toHaveText: function(text) {
|
193
|
+
var trimmedText = $.trim(this.actual.text());
|
194
|
+
if (text && jQuery.isFunction(text.test)) {
|
195
|
+
return text.test(trimmedText);
|
196
|
+
} else {
|
197
|
+
return trimmedText == text;
|
198
|
+
}
|
199
|
+
},
|
200
|
+
|
201
|
+
toHaveValue: function(value) {
|
202
|
+
return this.actual.val() == value;
|
203
|
+
},
|
204
|
+
|
205
|
+
toHaveData: function(key, expectedValue) {
|
206
|
+
return hasProperty(this.actual.data(key), expectedValue);
|
207
|
+
},
|
208
|
+
|
209
|
+
toBe: function(selector) {
|
210
|
+
return this.actual.is(selector);
|
211
|
+
},
|
212
|
+
|
213
|
+
toContain: function(selector) {
|
214
|
+
return this.actual.find(selector).size() > 0;
|
215
|
+
},
|
216
|
+
|
217
|
+
toBeDisabled: function(selector){
|
218
|
+
return this.actual.is(':disabled');
|
219
|
+
},
|
220
|
+
|
221
|
+
toBeFocused: function(selector) {
|
222
|
+
return this.actual.is(':focus');
|
223
|
+
},
|
224
|
+
|
225
|
+
// tests the existence of a specific event binding
|
226
|
+
toHandle: function(eventName) {
|
227
|
+
var events = this.actual.data("events");
|
228
|
+
return events && events[eventName].length > 0;
|
229
|
+
},
|
230
|
+
|
231
|
+
// tests the existence of a specific event binding + handler
|
232
|
+
toHandleWith: function(eventName, eventHandler) {
|
233
|
+
var stack = this.actual.data("events")[eventName];
|
234
|
+
var i;
|
235
|
+
for (i = 0; i < stack.length; i++) {
|
236
|
+
if (stack[i].handler == eventHandler) {
|
237
|
+
return true;
|
238
|
+
}
|
239
|
+
}
|
240
|
+
return false;
|
241
|
+
}
|
242
|
+
};
|
243
|
+
|
244
|
+
var hasProperty = function(actualValue, expectedValue) {
|
245
|
+
if (expectedValue === undefined) {
|
246
|
+
return actualValue !== undefined;
|
247
|
+
}
|
248
|
+
return actualValue == expectedValue;
|
249
|
+
};
|
250
|
+
|
251
|
+
var bindMatcher = function(methodName) {
|
252
|
+
var builtInMatcher = jasmine.Matchers.prototype[methodName];
|
253
|
+
|
254
|
+
jasmine.JQuery.matchersClass[methodName] = function() {
|
255
|
+
if (this.actual
|
256
|
+
&& (this.actual instanceof jQuery
|
257
|
+
|| jasmine.isDomNode(this.actual))) {
|
258
|
+
this.actual = $(this.actual);
|
259
|
+
var result = jQueryMatchers[methodName].apply(this, arguments);
|
260
|
+
this.actual = jasmine.JQuery.elementToString(this.actual);
|
261
|
+
return result;
|
262
|
+
}
|
263
|
+
|
264
|
+
if (builtInMatcher) {
|
265
|
+
return builtInMatcher.apply(this, arguments);
|
266
|
+
}
|
267
|
+
|
268
|
+
return false;
|
269
|
+
};
|
270
|
+
};
|
271
|
+
|
272
|
+
for(var methodName in jQueryMatchers) {
|
273
|
+
bindMatcher(methodName);
|
274
|
+
}
|
275
|
+
})();
|
276
|
+
|
277
|
+
beforeEach(function() {
|
278
|
+
this.addMatchers(jasmine.JQuery.matchersClass);
|
279
|
+
this.addMatchers({
|
280
|
+
toHaveBeenTriggeredOn: function(selector) {
|
281
|
+
this.message = function() {
|
282
|
+
return [
|
283
|
+
"Expected event " + this.actual + " to have been triggered on " + selector,
|
284
|
+
"Expected event " + this.actual + " not to have been triggered on " + selector
|
285
|
+
];
|
286
|
+
};
|
287
|
+
return jasmine.JQuery.events.wasTriggered($(selector), this.actual);
|
288
|
+
}
|
289
|
+
});
|
290
|
+
this.addMatchers({
|
291
|
+
toHaveBeenPreventedOn: function(selector) {
|
292
|
+
this.message = function() {
|
293
|
+
return [
|
294
|
+
"Expected event " + this.actual + " to have been prevented on " + selector,
|
295
|
+
"Expected event " + this.actual + " not to have been prevented on " + selector
|
296
|
+
];
|
297
|
+
};
|
298
|
+
return jasmine.JQuery.events.wasPrevented(selector, this.actual);
|
299
|
+
}
|
300
|
+
});
|
301
|
+
});
|
302
|
+
|
303
|
+
afterEach(function() {
|
304
|
+
jasmine.getFixtures().cleanUp();
|
305
|
+
jasmine.JQuery.events.cleanUp();
|
306
|
+
});
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qedproject
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Brian P. Hogan
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-04-
|
18
|
+
date: 2012-04-26 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -230,6 +230,8 @@ files:
|
|
230
230
|
- vendor/skeleton/layout.css
|
231
231
|
- vendor/skeleton/favicon.ico
|
232
232
|
- vendor/skeleton/skeleton.css
|
233
|
+
- vendor/jasmine-jquery/jasmine-jquery.js
|
234
|
+
- vendor/jasmine/lib/jasmine-1.1.0/jasmine_favicon.png
|
233
235
|
- vendor/jasmine/lib/jasmine-1.1.0/jasmine-html.js
|
234
236
|
- vendor/jasmine/lib/jasmine-1.1.0/jasmine.css
|
235
237
|
- vendor/jasmine/lib/jasmine-1.1.0/jasmine.js
|