Compare commits

...

28 Commits

Author SHA1 Message Date
ragaskar
c216047711 Version bump 2011-09-10 12:37:39 -04:00
Sean Durham
b087609733 Add stylesheets for TrivialReporter 2011-09-09 21:08:24 -04:00
Sean Durham
ac50cf4c14 include stylesheets for TrivialReporter and HTMLReporter, scoped so they don't interfere with each other. 2011-09-09 21:08:13 -04:00
Davis W. Frank
de341a8fe1 Bump version, recompile libraries 2011-09-09 21:04:24 -04:00
Davis W. Frank
fa317e4dda Deprecate TrivialReporter, Use HTMLReporter 2011-09-09 21:04:20 -04:00
Davis W. Frank
05b7730db1 Add New HTMLReporter 2011-09-09 21:04:15 -04:00
Davis W. Frank
9423dfee07 Add semi. 2011-09-09 21:03:57 -04:00
Rajan Agaskar
98d32bb4a4 Merge pull request #111 from qfox/patch-1
Add missing semi.
2011-07-21 04:07:52 -07:00
qfox
c4f27ae377 ASI trolling 2011-07-21 00:58:53 -07:00
ragaskar
a075c75bce Version bump to 1.1.0.rc3 2011-07-13 07:23:29 -04:00
ragaskar
a617b59e6a Bump to rc2 2011-06-24 21:34:29 -04:00
ragaskar
917b37481e Update rake 2011-06-24 21:25:06 -04:00
ragaskar
67bbc98faa Bump version 2011-06-24 21:22:19 -04:00
Davis W. Frank
620f7b6e4c Updates to Pages; Updates to docs; 2011-06-23 19:02:17 -07:00
ragaskar
b722f416c7 Write out version.rb on dist build 2011-06-23 07:55:04 -04:00
ragaskar
634a7dc402 Rollback pages submodule bump 2011-06-23 07:32:05 -04:00
Davis W. Frank
a4522e4dce Updated Release readme 2011-06-21 20:19:28 -07:00
Davis W. Frank
e113c338d0 Merge branch 'master' of github.com:pivotal/jasmine 2011-06-21 20:11:10 -07:00
ragaskar
b81f690a25 Require JSON in time for the gemspec 2011-06-21 08:05:41 -04:00
ragaskar
c06e189699 Ignore tags 2011-06-21 08:05:20 -04:00
Davis W. Frank
67b6cfb828 Improve the rake standalone task 2011-06-20 18:27:57 -07:00
Davis W. Frank
57e622fb2a Fix to version structure for "release_candidate" 2011-06-20 18:17:24 -07:00
Davis W. Frank
c0664dd6aa merge 2011-06-20 08:46:37 -07:00
Davis W. Frank
b640ce6fc0 wip on readme for release 2011-06-20 07:32:40 -07:00
ragaskar
e9af7834f5 Better argument handling in Jasmine::Core#spec_files 2011-06-18 09:43:14 -04:00
ragaskar
0d43ae9c38 Give Jasmine::Core access to jasmine specs
[#13128217]
2011-06-18 09:39:23 -04:00
Davis W. Frank
3775919c92 remove old, commented-out tasks 2011-06-17 08:23:17 -07:00
Davis W. Frank
a692ff8c95 Need HAML in the Gemfile; continued fixes to the Rake tasks 2011-06-17 08:20:22 -07:00
40 changed files with 2404 additions and 16277 deletions

1
.gitignore vendored
View File

@@ -7,5 +7,6 @@ site/
.rvmrc
*.gem
.bundle
tags
Gemfile.lock
pkg/*

View File

@@ -1,13 +1,18 @@
# Developing for Jasmine Core
# Developing for Jasmine Core
This repo is for the core code of Jasmine - `jasmine.js`. This implements the basic spec-defining, -executing, and -results-reporting logic.
## How to Contribute
## How to write new Jasmine code
We welcome your contributions - Thanks for helping make Jasmine a better project for everyone. Please review the backlog and discussion lists (the main group - [http://groups.google.com/group/jasmine-js](http://groups.google.com/group/jasmine-js) and the developer's list - [http://groups.google.com/group/jasmine-js-dev](http://groups.google.com/group/jasmine-js-dev)) before starting work - what you're looking for may already have been done. If it hasn't, the community can help make your contribution better.
## How to write new Jasmine code
Or, How to make a successful pull request
* _Do not change the public interface_. Lots of projects depend on Jasmine and if you aren't careful you'll break them
* _Be environment agnostic_ - server-side developers are just as important as browser developers
* _Be browser agnostic_ - if you must rely on browser-specific functionality, please write it in a way that degrades gracefully
* _Write specs_ - Jasmine's a testing framework; don't add functionality without test-driving it
* _Ensure the *entire* test suite is green_ in all the big browsers, Node, and JSHint - your contribution shouldn't break Jasmine for other users
Follow these tips and your pull request, patch, or suggestion is much more likely to be integrated.

View File

@@ -1,3 +1,4 @@
source :rubygems
gem "term-ansicolor", :require => "term/ansicolor"
gem "rake"
gemspec

View File

@@ -6,6 +6,13 @@ Jasmine is a Behavior Driven Development testing framework for JavaScript. It do
Documentation & guides live here: [http://pivotal.github.com/jasmine/](http://pivotal.github.com/jasmine/)
## What's Here?
*
## Support
* Search past discussions: [http://groups.google.com/group/jasmine-js](http://groups.google.com/group/jasmine-js)
@@ -14,32 +21,6 @@ Documentation & guides live here: [http://pivotal.github.com/jasmine/](http://pi
* View the project backlog at Pivotal Tracker: [http://www.pivotaltracker.com/projects/10606](http://www.pivotaltracker.com/projects/10606)
* Follow us on Twitter: [@JasmineBDD](http://twitter.com/JasmineBDD)
## How to Contribute
We welcome your contributions - Thanks for helping make Jasmine a better project for everyone. Please review the backlog and discussion lists (the main group - [http://groups.google.com/group/jasmine-js](http://groups.google.com/group/jasmine-js) and the developer's list - [http://groups.google.com/group/jasmine-js-dev](http://groups.google.com/group/jasmine-js-dev)) before starting work - what you're looking for may already have been done. If it hasn't, the community can help make your contribution better.
### Development Environment
Jasmine Core relies on Ruby for executing the test suite and building the project for release. The spec suite runs in any major, modern browser (Firefox, Safari, Chrome, and yes various IE's) and in [Node.js](http://nodejs.org). While you probably have browsers installed, you want to make sure that Ruby and Node are present.
### How to Develop for Jasmine Core
* Write specs
* Make them pass in a browser (or three):
* open `spec/runner.html` in your browsers
* `rake spec:browser` will run in the default browser on MacOS
* Make them pass in Node: `rake spec:node`
* Fix any warnings or errors from JSHint: `rake jasmine:lint`
Running `rake spec` will run the browser tests, then run specs in Node, then run JSHint. But this will only run in the default browser and only on MacOS (for now).
### Making a Successful Pull Request
* __Include specs for your work__ - it helps us understand your intent and makes sure that future development doesn't break your work
* __Ensure the full test suite is green__ in all the big browsers, Node, and JSHint - your contribution shouldn't break Jasmine for other users
Do these things and we'll take a look.
## Maintainers

View File

@@ -11,13 +11,17 @@ end
task :default => :spec
task :require_pages_submodule do
raise "Submodule for Github Pages isn't present. Run git submodule update --init" unless File.exist?('pages/download.html')
raise "Submodule for Github Pages isn't present. Run git submodule update --init" unless pages_submodule_present
end
task :require_node do
raise "\nNode.js is required to develop code for Jasmine. Please visit http://nodejs.org to install.\n\n" unless node_installed?
end
def pages_submodule_present
File.exist?('pages/download.html')
end
def node_installed?
`which node` =~ /node/
end

View File

@@ -1,12 +1,40 @@
## Release
__Jasmine Core Maintainers Only__
# How to work on a Jasmine Release
The current version lives in the file `src/version.json`. We attempt to stick to Semantic Versioning
## Development
___Jasmine Core Maintainers Only___
## The Github Pages
Follow the instructions in `Contribute.markdown` during development.
### Git Commits
### Version
We attempt to stick to [Semantic Versioning](). Most of the time, development should be against a new minor version - fixing bugs and adding new features that are backwards compatible.
The current version lives in the file `src/version.json`. This file should be set to the version that is _currently_ under development. That is, if version 1.0.0 is the current release then version should be incremented say, to 1.1.0.
This version is used by both `jasmine.js` and the `jasmine-core` Ruby gem.
### Update the Github Pages (as needed)
Github pages have to exist in a branch called gh-pages in order for their app to serve them. This repo adds that branch as a submodule under the `pages` directory. This is a bit of a hack, but it allows us to work with the pages and the source at the same time and with one set of rake tasks.
If you want to submit changes to this repo and aren't a Pivotal Labs employee, you can fork and work in the gh-pages branch. You won't be able to edit the pages in the submodule off of master.
If you want to submit changes to this repo and aren't a Pivotal Labs employee, you can fork and work in the `gh-pages` branch. You won't be able to edit the pages in the submodule off of master.
The pages are built with [Frank](https://github.com/blahed/frank). All the source for these pages live in the pages_source directory.
The pages are built with [Frank](https://github.com/blahed/frank). All the source for these pages live in the `pages/pages_source` directory.
## Release
When ready to release - specs are all green and the stories are done:
1. Update the version in `version.json` to a release candidate - add an `rc` property with a value of 1
1. Update any comments on the public interfaces
1. `rake doc` - builds the `jsdoc` pages
1. Update any links or top-level landing page for the Github Pages
1. `rake standalone` - builds the standalone distribution ZIP file
1. `rake build_pages` - builds the Github Pages
1. `rake release` - tags the repo with the version, builds the `jasmine-core` gem, pushes the gem to Rubygems.org
There should be a post to Pivotal Labs blog and a tweet to that link.

View File

@@ -13,8 +13,7 @@ Gem::Specification.new do |s|
s.homepage = "http://pivotal.github.com/jasmine"
s.rubyforge_project = "jasmine-core"
s.files = Dir.glob("./lib/**/*")
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.files = Dir.glob("./lib/**/*") + Dir.glob("./lib/jasmine-core/spec/**/*.js")
s.require_paths = ["lib"]
s.add_development_dependency "term-ansicolor"
s.add_development_dependency "json_pure", ">= 1.4.3"

View File

@@ -9,6 +9,25 @@ module Jasmine
(["jasmine.js"] + Dir.glob(File.join(path, "*.js"))).map { |f| File.basename(f) }.uniq
end
SPEC_TYPES = ["core", "html", "node"]
def core_spec_files
spec_files("core")
end
def html_spec_files
spec_files("html")
end
def node_spec_files
spec_files("node")
end
def spec_files(type)
raise ArgumentError.new("Unrecognized spec type") unless SPEC_TYPES.include?(type)
(Dir.glob(File.join(path, "spec", type, "*.js"))).map { |f| File.join("spec", type, File.basename(f)) }.uniq
end
def css_files
Dir.glob(File.join(path, "*.css")).map { |f| File.basename(f) }
end

View File

@@ -1,7 +1,478 @@
jasmine.HtmlReporterHelpers = {};
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
var el = document.createElement(type);
for (var i = 2; i < arguments.length; i++) {
var child = arguments[i];
if (typeof child === 'string') {
el.appendChild(document.createTextNode(child));
} else {
if (child) {
el.appendChild(child);
}
}
}
for (var attr in attrs) {
if (attr == "className") {
el[attr] = attrs[attr];
} else {
el.setAttribute(attr, attrs[attr]);
}
}
return el;
};
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
var results = child.results();
var status = results.passed() ? 'passed' : 'failed';
if (results.skipped) {
status = 'skipped';
}
return status;
};
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
var parentDiv = this.dom.summary;
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
var parent = child[parentSuite];
if (parent) {
if (typeof this.views.suites[parent.id] == 'undefined') {
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
}
parentDiv = this.views.suites[parent.id].element;
}
parentDiv.appendChild(childElement);
};
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
for(var fn in jasmine.HtmlReporterHelpers) {
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
}
};
jasmine.HtmlReporter = function(_doc) {
var self = this;
var doc = _doc || window.document;
var reporterView;
var dom = {};
// Jasmine Reporter Public Interface
self.logRunningSpecs = false;
self.reportRunnerStarting = function(runner) {
var specs = runner.specs() || [];
if (specs.length == 0) {
return;
}
createReporterDom(runner.env.versionString());
doc.body.appendChild(dom.reporter);
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
reporterView.addSpecs(specs, self.specFilter);
};
self.reportRunnerResults = function(runner) {
reporterView.complete();
};
self.reportSuiteResults = function(suite) {
reporterView.suiteComplete(suite);
};
self.reportSpecStarting = function(spec) {
if (self.logRunningSpecs) {
self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
}
};
self.reportSpecResults = function(spec) {
reporterView.specComplete(spec);
};
self.log = function() {
var console = jasmine.getGlobal().console;
if (console && console.log) {
if (console.log.apply) {
console.log.apply(console, arguments);
} else {
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
}
}
};
self.specFilter = function(spec) {
if (!focusedSpecName()) {
return true;
}
return spec.getFullName().indexOf(focusedSpecName()) === 0;
};
return self;
function focusedSpecName() {
var specName;
(function memoizeFocusedSpec() {
if (specName) {
return;
}
var paramMap = [];
var params = doc.location.search.substring(1).split('&');
for (var i = 0; i < params.length; i++) {
var p = params[i].split('=');
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
}
specName = paramMap.spec;
})();
return specName;
}
function createReporterDom(version) {
dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
dom.banner = self.createDom('div', { className: 'banner' },
self.createDom('span', { className: 'title' }, "Jasmine "),
self.createDom('span', { className: 'version' }, version)),
dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
dom.alert = self.createDom('div', {className: 'alert'}),
dom.results = self.createDom('div', {className: 'results'},
dom.summary = self.createDom('div', { className: 'summary' }),
dom.details = self.createDom('div', { id: 'details' }))
);
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporterHelpers = {};
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
var el = document.createElement(type);
for (var i = 2; i < arguments.length; i++) {
var child = arguments[i];
if (typeof child === 'string') {
el.appendChild(document.createTextNode(child));
} else {
if (child) {
el.appendChild(child);
}
}
}
for (var attr in attrs) {
if (attr == "className") {
el[attr] = attrs[attr];
} else {
el.setAttribute(attr, attrs[attr]);
}
}
return el;
};
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
var results = child.results();
var status = results.passed() ? 'passed' : 'failed';
if (results.skipped) {
status = 'skipped';
}
return status;
};
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
var parentDiv = this.dom.summary;
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
var parent = child[parentSuite];
if (parent) {
if (typeof this.views.suites[parent.id] == 'undefined') {
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
}
parentDiv = this.views.suites[parent.id].element;
}
parentDiv.appendChild(childElement);
};
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
for(var fn in jasmine.HtmlReporterHelpers) {
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
}
};
jasmine.HtmlReporter.ReporterView = function(dom) {
this.startedAt = new Date();
this.runningSpecCount = 0;
this.completeSpecCount = 0;
this.passedCount = 0;
this.failedCount = 0;
this.skippedCount = 0;
this.createResultsMenu = function() {
this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
' | ',
this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
this.summaryMenuItem.onclick = function() {
dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
};
this.detailsMenuItem.onclick = function() {
showDetails();
};
};
this.specComplete = function(spec) {
this.completeSpecCount++;
var specView = this.views.specs[spec.id];
switch (specView.status()) {
case 'passed':
this.passedCount++;
break;
case 'failed':
this.failedCount++;
break;
case 'skipped':
this.skippedCount++;
break;
}
specView.refresh();
this.refresh();
};
this.suiteComplete = function(suite) {
var suiteView = this.views.suites[suite.id];
if (isUndefined(suiteView)) {
return;
}
suiteView.refresh();
};
this.refresh = function() {
if (isUndefined(this.resultsMenu)) {
this.createResultsMenu();
}
// currently running UI
if (isUndefined(this.runningAlert)) {
this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"});
dom.alert.appendChild(this.runningAlert);
}
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + this.totalSpecCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" );
// skipped specs UI
if (isUndefined(this.skippedAlert)) {
this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"});
}
this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + this.totalSpecCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" ) + " - run all";
if (this.skippedCount === 1 && isDefined(dom.alert)) {
dom.alert.appendChild(this.skippedAlert);
}
// passing specs UI
if (isUndefined(this.passedAlert)) {
this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"});
}
this.passedAlert.innerHTML = "Passing " + this.passedCount + " spec" + (this.passedCount == 1 ? "" : "s" );
// failing specs UI
if (isUndefined(this.failedAlert)) {
this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
}
this.failedAlert.innerHTML = "Failing " + this.failedCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" );
if (this.failedCount === 1 && isDefined(dom.alert)) {
dom.alert.appendChild(this.failedAlert);
dom.alert.appendChild(this.resultsMenu);
}
// summary info
this.summaryMenuItem.innerHTML = "" + this.runningSpecCount + " spec" + (this.runningSpecCount == 1 ? "" : "s" );
this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
};
this.complete = function() {
dom.alert.removeChild(this.runningAlert);
this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + this.totalSpecCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" ) + " - run all";
if (this.failedCount === 0) {
dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + this.passedCount + " spec" + (this.passedCount == 1 ? "" : "s" )));
} else {
showDetails();
}
dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
};
this.addSpecs = function(specs, specFilter) {
this.totalSpecCount = specs.length;
this.views = {
specs: {},
suites: {}
};
for (var i = 0; i < specs.length; i++) {
var spec = specs[i];
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
if (specFilter(spec)) {
this.runningSpecCount++;
}
}
};
return this;
function showDetails() {
if (dom.reporter.className.search(/showDetails/) === -1) {
dom.reporter.className += " showDetails";
}
}
function isUndefined(obj) {
return typeof obj === 'undefined';
}
function isDefined(obj) {
return !isUndefined(obj);
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
this.spec = spec;
this.dom = dom;
this.views = views;
this.symbol = this.createDom('li', { className: 'pending' });
this.dom.symbolSummary.appendChild(this.symbol);
this.summary = this.createDom('div', { className: 'specSummary' },
this.createDom('a', {
className: 'description',
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
title: this.spec.getFullName()
}, this.spec.description)
);
this.detail = this.createDom('div', { className: 'specDetail' },
this.createDom('a', {
className: 'description',
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
title: this.spec.getFullName()
}, this.spec.getFullName())
);
};
jasmine.HtmlReporter.SpecView.prototype.status = function() {
return this.getSpecStatus(this.spec);
};
jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
this.symbol.className = this.status();
switch (this.status()) {
case 'skipped':
break;
case 'passed':
this.appendSummaryToSuiteDiv();
break;
case 'failed':
this.appendSummaryToSuiteDiv();
this.appendFailureDetail();
break;
}
};
jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
this.summary.className += ' ' + this.status();
this.appendToSummary(this.spec, this.summary);
};
jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
this.detail.className += ' ' + this.status();
var resultItems = this.spec.results().getItems();
var messagesDiv = this.createDom('div', { className: 'messages' });
for (var i = 0; i < resultItems.length; i++) {
var result = resultItems[i];
if (result.type == 'log') {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
} else if (result.type == 'expect' && result.passed && !result.passed()) {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
if (result.trace.stack) {
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
}
}
}
if (messagesDiv.childNodes.length > 0) {
this.detail.appendChild(messagesDiv);
this.dom.details.appendChild(this.detail);
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
this.suite = suite;
this.dom = dom;
this.views = views;
this.element = this.createDom('div', { className: 'suite' },
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description)
);
this.appendToSummary(this.suite, this.element);
};
jasmine.HtmlReporter.SuiteView.prototype.status = function() {
return this.getSpecStatus(this.suite);
};
jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
this.element.className += " " + this.status();
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
jasmine.TrivialReporter = function(doc) {
this.document = doc || document;
this.suiteDivs = {};
this.logRunningSpecs = false;
this.log("DEPRECATION WARNING: jasmine.TrivialReporter is deprecated as of v1.2 and will be removed in version 2.0. Please use (the vastly nicer) jasmine.HtmlReporter.")
};
jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
@@ -31,7 +502,7 @@ jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarA
jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
var showPassed, showSkipped;
this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
this.createDom('div', { className: 'banner' },
this.createDom('div', { className: 'logo' },
this.createDom('span', { className: 'title' }, "Jasmine"),

View File

@@ -1,137 +1,386 @@
/* line 25, _HTMLReporter.scss */
body {
background-color: #eeeeee;
padding: 0;
margin: 5px;
overflow-y: scroll;
}
/* line 32, _HTMLReporter.scss */
#HTMLReporter {
font-size: 11px;
font-family: Monaco, "Lucida Console", monospace;
line-height: 14px;
color: #333333;
}
/* line 39, _HTMLReporter.scss */
#HTMLReporter a {
text-decoration: none;
}
/* line 42, _HTMLReporter.scss */
#HTMLReporter a:hover {
text-decoration: underline;
}
/* line 47, _HTMLReporter.scss */
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 {
margin: 0;
line-height: 14px;
}
/* line 58, _HTMLReporter.scss */
#HTMLReporter .banner,
#HTMLReporter .symbolSummary,
#HTMLReporter .summary,
#HTMLReporter .resultMessage,
#HTMLReporter .specDetail .description,
#HTMLReporter .alert .bar,
#HTMLReporter .stackTrace {
padding-left: 9px;
padding-right: 9px;
}
/* line 65, _HTMLReporter.scss */
#HTMLReporter #jasmine_content {
position: fixed;
right: 100%;
}
/* line 70, _HTMLReporter.scss */
#HTMLReporter .version {
color: #aaaaaa;
}
/* line 77, _HTMLReporter.scss */
#HTMLReporter .banner {
margin-top: 14px;
}
/* line 81, _HTMLReporter.scss */
#HTMLReporter .duration {
color: #aaaaaa;
float: right;
}
/* line 90, _HTMLReporter.scss */
#HTMLReporter .symbolSummary {
overflow: hidden;
*zoom: 1;
margin: 14px 0;
}
/* line 94, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li {
display: block;
float: left;
height: 7px;
width: 14px;
margin-bottom: 7px;
font-size: 16px;
}
/* line 105, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.passed {
font-size: 14px;
}
/* line 108, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.passed:before {
color: #5e7d00;
content: "\02022";
}
/* line 114, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.failed {
line-height: 9px;
}
/* line 117, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.failed:before {
color: #b03911;
content: "x";
font-weight: bold;
margin-left: -1px;
}
/* line 125, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.skipped {
font-size: 14px;
}
/* line 128, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.skipped:before {
color: #bababa;
content: "\02022";
}
/* line 134, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.pending {
line-height: 11px;
}
/* line 137, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.pending:before {
color: #aaaaaa;
content: "-";
}
/* line 149, _HTMLReporter.scss */
#HTMLReporter .bar {
line-height: 28px;
font-size: 14px;
display: block;
color: #eee;
}
/* line 158, _HTMLReporter.scss */
#HTMLReporter .runningAlert {
background-color: #666666;
}
/* line 162, _HTMLReporter.scss */
#HTMLReporter .skippedAlert {
background-color: #aaaaaa;
}
/* line 165, _HTMLReporter.scss */
#HTMLReporter .skippedAlert:first-child {
background-color: #333333;
}
/* line 169, _HTMLReporter.scss */
#HTMLReporter .skippedAlert:hover {
text-decoration: none;
color: white;
text-decoration: underline;
}
/* line 176, _HTMLReporter.scss */
#HTMLReporter .passingAlert {
background-color: #a6b779;
}
/* line 179, _HTMLReporter.scss */
#HTMLReporter .passingAlert:first-child {
background-color: #5e7d00;
}
/* line 184, _HTMLReporter.scss */
#HTMLReporter .failingAlert {
background-color: #cf867e;
}
/* line 187, _HTMLReporter.scss */
#HTMLReporter .failingAlert:first-child {
background-color: #b03911;
}
/* line 200, _HTMLReporter.scss */
#HTMLReporter .results {
margin-top: 14px;
}
/* line 208, _HTMLReporter.scss */
#HTMLReporter #details {
display: none;
}
/* line 213, _HTMLReporter.scss */
#HTMLReporter .resultsMenu,
#HTMLReporter .resultsMenu a {
background-color: #fff;
color: #333333;
}
/* line 220, _HTMLReporter.scss */
#HTMLReporter.showDetails .summaryMenuItem {
font-weight: normal;
text-decoration: inherit;
}
/* line 224, _HTMLReporter.scss */
#HTMLReporter.showDetails .summaryMenuItem:hover {
text-decoration: underline;
}
/* line 229, _HTMLReporter.scss */
#HTMLReporter.showDetails .detailsMenuItem {
font-weight: bold;
text-decoration: underline;
}
/* line 234, _HTMLReporter.scss */
#HTMLReporter.showDetails .summary {
display: none;
}
/* line 238, _HTMLReporter.scss */
#HTMLReporter.showDetails #details {
display: block;
}
/* line 243, _HTMLReporter.scss */
#HTMLReporter .summaryMenuItem {
font-weight: bold;
text-decoration: underline;
}
/* line 253, _HTMLReporter.scss */
#HTMLReporter .summary {
margin-top: 14px;
}
/* line 256, _HTMLReporter.scss */
#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary {
margin-left: 14px;
}
/* line 261, _HTMLReporter.scss */
#HTMLReporter .summary .specSummary.passed a {
color: #5e7d00;
}
/* line 264, _HTMLReporter.scss */
#HTMLReporter .summary .specSummary.failed a {
color: #b03911;
}
/* line 270, _HTMLReporter.scss */
#HTMLReporter .description + .suite {
margin-top: 0;
}
/* line 274, _HTMLReporter.scss */
#HTMLReporter .suite {
margin-top: 14px;
}
/* line 277, _HTMLReporter.scss */
#HTMLReporter .suite a {
color: #333333;
}
/* line 288, _HTMLReporter.scss */
#HTMLReporter #details .specDetail {
margin-bottom: 28px;
}
/* line 291, _HTMLReporter.scss */
#HTMLReporter #details .specDetail .description {
display: block;
color: white;
background-color: #b03911;
}
/* line 303, _HTMLReporter.scss */
#HTMLReporter .resultMessage {
padding-top: 14px;
color: #333333;
}
/* line 309, _HTMLReporter.scss */
#HTMLReporter .resultMessage span.result {
display: block;
}
/* line 313, _HTMLReporter.scss */
#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;
}
/* line 2, _TrivialReporter.scss */
#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;*/
/*}*/
}
.jasmine_reporter a:visited, .jasmine_reporter a {
color: #303;
/* line 14, _TrivialReporter.scss */
#TrivialReporter a:visited, #TrivialReporter a {
color: #303;
}
.jasmine_reporter a:hover, .jasmine_reporter a:active {
color: blue;
/* line 18, _TrivialReporter.scss */
#TrivialReporter a:hover, #TrivialReporter a:active {
color: blue;
}
.run_spec {
float:right;
/* line 22, _TrivialReporter.scss */
#TrivialReporter .run_spec {
float: right;
padding-right: 5px;
font-size: .8em;
text-decoration: none;
}
.jasmine_reporter {
margin: 0 5px;
}
.banner {
/* line 29, _TrivialReporter.scss */
#TrivialReporter .banner {
color: #303;
background-color: #fef;
padding: 5px;
}
.logo {
/* line 35, _TrivialReporter.scss */
#TrivialReporter .logo {
float: left;
font-size: 1.1em;
padding-left: 5px;
}
.logo .version {
/* line 41, _TrivialReporter.scss */
#TrivialReporter .logo .version {
font-size: .6em;
padding-left: 1em;
}
.runner.running {
/* line 46, _TrivialReporter.scss */
#TrivialReporter .runner.running {
background-color: yellow;
}
.options {
/* line 51, _TrivialReporter.scss */
#TrivialReporter .options {
text-align: right;
font-size: .8em;
}
.suite {
/* line 59, _TrivialReporter.scss */
#TrivialReporter .suite {
border: 1px outset gray;
margin: 5px 0;
padding-left: 1em;
}
.suite .suite {
margin: 5px;
/* line 65, _TrivialReporter.scss */
#TrivialReporter .suite .suite {
margin: 5px;
}
.suite.passed {
/* line 69, _TrivialReporter.scss */
#TrivialReporter .suite.passed {
background-color: #dfd;
}
.suite.failed {
/* line 73, _TrivialReporter.scss */
#TrivialReporter .suite.failed {
background-color: #fdd;
}
.spec {
/* line 77, _TrivialReporter.scss */
#TrivialReporter .spec {
margin: 5px;
padding-left: 1em;
clear: both;
}
.spec.failed, .spec.passed, .spec.skipped {
/* line 83, _TrivialReporter.scss */
#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped {
padding-bottom: 5px;
border: 1px solid gray;
}
.spec.failed {
/* line 88, _TrivialReporter.scss */
#TrivialReporter .spec.failed {
background-color: #fbb;
border-color: red;
}
.spec.passed {
/* line 93, _TrivialReporter.scss */
#TrivialReporter .spec.passed {
background-color: #bfb;
border-color: green;
}
.spec.skipped {
/* line 98, _TrivialReporter.scss */
#TrivialReporter .spec.skipped {
background-color: #bbb;
}
.messages {
/* line 102, _TrivialReporter.scss */
#TrivialReporter .messages {
border-left: 1px dashed gray;
padding-left: 1em;
padding-right: 1em;
}
.passed {
/* line 108, _TrivialReporter.scss */
#TrivialReporter .passed {
background-color: #cfc;
display: none;
}
.failed {
/* line 113, _TrivialReporter.scss */
#TrivialReporter .failed {
background-color: #fbb;
}
.skipped {
/* line 117, _TrivialReporter.scss */
#TrivialReporter .skipped {
color: #777;
background-color: #eee;
display: none;
}
/*.resultMessage {*/
/*white-space: pre;*/
/*}*/
.resultMessage span.result {
/* line 128, _TrivialReporter.scss */
#TrivialReporter .resultMessage span.result {
display: block;
line-height: 2em;
color: black;
}
.resultMessage .mismatch {
/* line 134, _TrivialReporter.scss */
#TrivialReporter .resultMessage .mismatch {
color: black;
}
.stackTrace {
/* line 138, _TrivialReporter.scss */
#TrivialReporter .stackTrace {
white-space: pre;
font-size: .8em;
margin-left: 10px;
@@ -141,24 +390,22 @@ body {
padding: 1em;
background: #eef;
}
.finished-at {
/* line 149, _TrivialReporter.scss */
#TrivialReporter .finished-at {
padding-left: 1em;
font-size: .6em;
}
.show-passed .passed,
.show-skipped .skipped {
/* line 155, _TrivialReporter.scss */
#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped {
display: block;
}
#jasmine_content {
position:fixed;
/* line 160, _TrivialReporter.scss */
#TrivialReporter #jasmine_content {
position: fixed;
right: 100%;
}
.runner {
/* line 165, _TrivialReporter.scss */
#TrivialReporter .runner {
border: 1px solid gray;
display: block;
margin: 5px 0;

View File

@@ -735,17 +735,17 @@ jasmine.Env.prototype.version = function () {
* @returns string containing jasmine version build info, if set.
*/
jasmine.Env.prototype.versionString = function() {
if (jasmine.version_) {
var version = this.version();
var versionString = version.major + "." + version.minor + "." + version.build;
if (version.release_candidate) {
versionString += ".rc" + version.release_candidate
}
versionString += " revision " + version.revision
return versionString;
} else {
if (!jasmine.version_) {
return "version unknown";
}
var version = this.version();
var versionString = version.major + "." + version.minor + "." + version.build;
if (version.release_candidate) {
versionString += ".rc" + version.release_candidate;
}
versionString += " revision " + version.revision;
return versionString;
};
/**
@@ -2470,7 +2470,8 @@ jasmine.getGlobal().clearInterval = function(timeoutKey) {
jasmine.version_= {
"major": 1,
"minor": 1,
"minor": 2,
"build": 0,
"revision": 1308358300
"revision": 1315672648,
"release_candidate": 1
};

1
lib/jasmine-core/spec Symbolic link
View File

@@ -0,0 +1 @@
../../spec

View File

@@ -1,8 +1,6 @@
module Jasmine
module Core
require 'json'
VERSION_HASH = JSON.parse(File.new(File.join(File.dirname(__FILE__), "..", "..", "src", "version.json")).read);
VERSION = "#{VERSION_HASH['major']}.#{VERSION_HASH['minor']}.#{VERSION_HASH['build']}"
VERSION << ".rc#{VERSION_HASH['release_candidate']}" if VERSION_HASH['release_candidate']
VERSION = "1.2.0.rc1"
end
end

2
pages

Submodule pages updated: d08ce2de24...a9d577eb45

View File

@@ -0,0 +1,194 @@
describe("HtmlReporter", function() {
var env;
var htmlReporter;
var body;
var fakeDocument;
beforeEach(function() {
env = new jasmine.Env();
env.updateInterval = 0;
body = document.createElement("body");
fakeDocument = { body: body, location: { search: "" } };
htmlReporter = new jasmine.HtmlReporter(fakeDocument);
});
function fakeSpec(name) {
return {
getFullName: function() {
return name;
}
};
}
function findElements(divs, withClass) {
var els = [];
for (var i = 0; i < divs.length; i++) {
if (divs[i].className == withClass) els.push(divs[i]);
}
return els;
}
function findElement(divs, withClass) {
var els = findElements(divs, withClass);
if (els.length > 0) {
return els[0];
}
throw new Error("couldn't find div with class " + withClass);
}
it("should run only specs beginning with spec parameter", function() {
fakeDocument.location.search = "?spec=run%20this";
expect(htmlReporter.specFilter(fakeSpec("run this"))).toBeTruthy();
expect(htmlReporter.specFilter(fakeSpec("not the right spec"))).toBeFalsy();
expect(htmlReporter.specFilter(fakeSpec("not run this"))).toBeFalsy();
});
describe('Matcher reporting', function () {
var getResultMessageDiv = function (body) {
var divs = body.getElementsByTagName("div");
for (var i = 0; i < divs.length; i++) {
if (divs[i].className.match(/resultMessage/)) {
return divs[i];
}
}
};
var runner, spec, fakeTimer;
beforeEach(function () {
fakeTimer = new jasmine.FakeTimer();
env.setTimeout = fakeTimer.setTimeout;
env.clearTimeout = fakeTimer.clearTimeout;
env.setInterval = fakeTimer.setInterval;
env.clearInterval = fakeTimer.clearInterval;
runner = env.currentRunner();
var suite = new jasmine.Suite(env, 'some suite');
runner.add(suite);
spec = new jasmine.Spec(env, suite, 'some spec');
suite.add(spec);
fakeDocument.location.search = "?";
env.addReporter(htmlReporter);
});
describe('toContain', function () {
it('should show actual and expected', function () {
spec.runs(function () {
this.expect('foo').toContain('bar');
});
runner.execute();
fakeTimer.tick(0);
var resultEl = getResultMessageDiv(body);
expect(resultEl.innerHTML).toMatch(/foo/);
expect(resultEl.innerHTML).toMatch(/bar/);
});
});
});
describe("failure messages (integration)", function () {
var spec, results, expectationResult;
it("should add the failure message to the DOM (non-toEquals matchers)", function() {
env.describe("suite", function() {
env.it("will have log messages", function() {
this.expect('a').toBeNull();
});
});
env.addReporter(htmlReporter);
env.execute();
var divs = body.getElementsByTagName("div");
var errorDiv = findElement(divs, 'resultMessage fail');
expect(errorDiv.innerHTML).toMatch(/Expected 'a' to be null/);
});
it("should add the failure message to the DOM (non-toEquals matchers) html escaping", function() {
env.describe("suite", function() {
env.it("will have log messages", function() {
this.expect('1 < 2').toBeNull();
});
});
env.addReporter(htmlReporter);
env.execute();
var divs = body.getElementsByTagName("div");
var errorDiv = findElement(divs, 'resultMessage fail');
expect(errorDiv.innerHTML).toMatch(/Expected '1 &lt; 2' to be null/);
});
});
describe("log messages", function() {
it("should appear in the report of a failed spec", function() {
env.describe("suite", function() {
env.it("will have log messages", function() {
this.log("this is a", "multipart log message");
this.expect(true).toBeFalsy();
});
});
env.addReporter(htmlReporter);
env.execute();
var divs = body.getElementsByTagName("div");
var errorDiv = findElement(divs, 'specDetail failed');
expect(errorDiv.innerHTML).toMatch("this is a multipart log message");
});
xit("should work on IE without console.log.apply", function() {
});
});
describe("duplicate example names", function() {
it("should report failures correctly", function() {
var suite1 = env.describe("suite", function() {
env.it("will have log messages", function() {
this.log("this one fails!");
this.expect(true).toBeFalsy();
});
});
var suite2 = env.describe("suite", function() {
env.it("will have log messages", function() {
this.log("this one passes!");
this.expect(true).toBeTruthy();
});
});
env.addReporter(htmlReporter);
env.execute();
var divs = body.getElementsByTagName("div");
var failedSpecDiv = findElement(divs, 'specDetail failed');
expect(failedSpecDiv.className).toEqual('specDetail failed');
expect(failedSpecDiv.innerHTML).toContain("this one fails!");
expect(failedSpecDiv.innerHTML).not.toContain("this one passes!");
});
});
describe('#reportSpecStarting', function() {
beforeEach(function () {
env.describe("suite 1", function() {
env.it("spec 1", function() {
});
});
spyOn(htmlReporter, 'log').andCallThrough();
});
it('DOES NOT log running specs by default', function() {
env.addReporter(htmlReporter);
env.execute();
expect(htmlReporter.log).not.toHaveBeenCalled();
});
it('logs running specs when log_running_specs is true', function() {
htmlReporter.logRunningSpecs = true;
env.addReporter(htmlReporter);
env.execute();
expect(htmlReporter.log).toHaveBeenCalledWith('>> Jasmine Running suite 1 spec 1...');
});
});
});

View File

@@ -15,6 +15,12 @@
<!-- include source files here... -->
<script type="text/javascript" src=".././src/html/HtmlReporterHelpers.js"></script>
<script type="text/javascript" src=".././src/html/HtmlReporter.js"></script>
<script type="text/javascript" src=".././src/html/HtmlReporterHelpers.js"></script>
<script type="text/javascript" src=".././src/html/ReporterView.js"></script>
<script type="text/javascript" src=".././src/html/SpecView.js"></script>
<script type="text/javascript" src=".././src/html/SuiteView.js"></script>
<script type="text/javascript" src=".././src/html/TrivialReporter.js"></script>
<script type="text/javascript" src=".././src/console/ConsoleReporter.js"></script>
@@ -38,6 +44,7 @@
<script type="text/javascript" src=".././spec/core/SuiteSpec.js"></script>
<script type="text/javascript" src=".././spec/core/UtilSpec.js"></script>
<script type="text/javascript" src=".././spec/core/WaitsForBlockSpec.js"></script>
<script type="text/javascript" src=".././spec/html/HTMLReporterSpec.js"></script>
<script type="text/javascript" src=".././spec/html/MatchersHtmlSpec.js"></script>
<script type="text/javascript" src=".././spec/html/PrettyPrintHtmlSpec.js"></script>
<script type="text/javascript" src=".././spec/html/TrivialReporterSpec.js"></script>
@@ -48,12 +55,12 @@
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var trivialReporter = new jasmine.TrivialReporter();
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(trivialReporter);
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return trivialReporter.specFilter(spec);
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;

View File

@@ -18,12 +18,12 @@
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var trivialReporter = new jasmine.TrivialReporter();
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(trivialReporter);
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return trivialReporter.specFilter(spec);
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;

View File

@@ -51,17 +51,17 @@ jasmine.Env.prototype.version = function () {
* @returns string containing jasmine version build info, if set.
*/
jasmine.Env.prototype.versionString = function() {
if (jasmine.version_) {
var version = this.version();
var versionString = version.major + "." + version.minor + "." + version.build;
if (version.release_candidate) {
versionString += ".rc" + version.release_candidate
}
versionString += " revision " + version.revision
return versionString;
} else {
if (!jasmine.version_) {
return "version unknown";
}
var version = this.version();
var versionString = version.major + "." + version.minor + "." + version.build;
if (version.release_candidate) {
versionString += ".rc" + version.release_candidate;
}
versionString += " revision " + version.revision;
return versionString;
};
/**

101
src/html/HtmlReporter.js Normal file
View File

@@ -0,0 +1,101 @@
jasmine.HtmlReporter = function(_doc) {
var self = this;
var doc = _doc || window.document;
var reporterView;
var dom = {};
// Jasmine Reporter Public Interface
self.logRunningSpecs = false;
self.reportRunnerStarting = function(runner) {
var specs = runner.specs() || [];
if (specs.length == 0) {
return;
}
createReporterDom(runner.env.versionString());
doc.body.appendChild(dom.reporter);
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
reporterView.addSpecs(specs, self.specFilter);
};
self.reportRunnerResults = function(runner) {
reporterView.complete();
};
self.reportSuiteResults = function(suite) {
reporterView.suiteComplete(suite);
};
self.reportSpecStarting = function(spec) {
if (self.logRunningSpecs) {
self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
}
};
self.reportSpecResults = function(spec) {
reporterView.specComplete(spec);
};
self.log = function() {
var console = jasmine.getGlobal().console;
if (console && console.log) {
if (console.log.apply) {
console.log.apply(console, arguments);
} else {
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
}
}
};
self.specFilter = function(spec) {
if (!focusedSpecName()) {
return true;
}
return spec.getFullName().indexOf(focusedSpecName()) === 0;
};
return self;
function focusedSpecName() {
var specName;
(function memoizeFocusedSpec() {
if (specName) {
return;
}
var paramMap = [];
var params = doc.location.search.substring(1).split('&');
for (var i = 0; i < params.length; i++) {
var p = params[i].split('=');
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
}
specName = paramMap.spec;
})();
return specName;
}
function createReporterDom(version) {
dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
dom.banner = self.createDom('div', { className: 'banner' },
self.createDom('span', { className: 'title' }, "Jasmine "),
self.createDom('span', { className: 'version' }, version)),
dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
dom.alert = self.createDom('div', {className: 'alert'}),
dom.results = self.createDom('div', {className: 'results'},
dom.summary = self.createDom('div', { className: 'summary' }),
dom.details = self.createDom('div', { id: 'details' }))
);
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);

View File

@@ -0,0 +1,60 @@
jasmine.HtmlReporterHelpers = {};
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
var el = document.createElement(type);
for (var i = 2; i < arguments.length; i++) {
var child = arguments[i];
if (typeof child === 'string') {
el.appendChild(document.createTextNode(child));
} else {
if (child) {
el.appendChild(child);
}
}
}
for (var attr in attrs) {
if (attr == "className") {
el[attr] = attrs[attr];
} else {
el.setAttribute(attr, attrs[attr]);
}
}
return el;
};
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
var results = child.results();
var status = results.passed() ? 'passed' : 'failed';
if (results.skipped) {
status = 'skipped';
}
return status;
};
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
var parentDiv = this.dom.summary;
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
var parent = child[parentSuite];
if (parent) {
if (typeof this.views.suites[parent.id] == 'undefined') {
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
}
parentDiv = this.views.suites[parent.id].element;
}
parentDiv.appendChild(childElement);
};
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
for(var fn in jasmine.HtmlReporterHelpers) {
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
}
};

150
src/html/ReporterView.js Normal file
View File

@@ -0,0 +1,150 @@
jasmine.HtmlReporter.ReporterView = function(dom) {
this.startedAt = new Date();
this.runningSpecCount = 0;
this.completeSpecCount = 0;
this.passedCount = 0;
this.failedCount = 0;
this.skippedCount = 0;
this.createResultsMenu = function() {
this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
' | ',
this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
this.summaryMenuItem.onclick = function() {
dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
};
this.detailsMenuItem.onclick = function() {
showDetails();
};
};
this.specComplete = function(spec) {
this.completeSpecCount++;
var specView = this.views.specs[spec.id];
switch (specView.status()) {
case 'passed':
this.passedCount++;
break;
case 'failed':
this.failedCount++;
break;
case 'skipped':
this.skippedCount++;
break;
}
specView.refresh();
this.refresh();
};
this.suiteComplete = function(suite) {
var suiteView = this.views.suites[suite.id];
if (isUndefined(suiteView)) {
return;
}
suiteView.refresh();
};
this.refresh = function() {
if (isUndefined(this.resultsMenu)) {
this.createResultsMenu();
}
// currently running UI
if (isUndefined(this.runningAlert)) {
this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"});
dom.alert.appendChild(this.runningAlert);
}
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + this.totalSpecCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" );
// skipped specs UI
if (isUndefined(this.skippedAlert)) {
this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"});
}
this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + this.totalSpecCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" ) + " - run all";
if (this.skippedCount === 1 && isDefined(dom.alert)) {
dom.alert.appendChild(this.skippedAlert);
}
// passing specs UI
if (isUndefined(this.passedAlert)) {
this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"});
}
this.passedAlert.innerHTML = "Passing " + this.passedCount + " spec" + (this.passedCount == 1 ? "" : "s" );
// failing specs UI
if (isUndefined(this.failedAlert)) {
this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
}
this.failedAlert.innerHTML = "Failing " + this.failedCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" );
if (this.failedCount === 1 && isDefined(dom.alert)) {
dom.alert.appendChild(this.failedAlert);
dom.alert.appendChild(this.resultsMenu);
}
// summary info
this.summaryMenuItem.innerHTML = "" + this.runningSpecCount + " spec" + (this.runningSpecCount == 1 ? "" : "s" );
this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
};
this.complete = function() {
dom.alert.removeChild(this.runningAlert);
this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + this.totalSpecCount + " spec" + (this.totalSpecCount == 1 ? "" : "s" ) + " - run all";
if (this.failedCount === 0) {
dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + this.passedCount + " spec" + (this.passedCount == 1 ? "" : "s" )));
} else {
showDetails();
}
dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
};
this.addSpecs = function(specs, specFilter) {
this.totalSpecCount = specs.length;
this.views = {
specs: {},
suites: {}
};
for (var i = 0; i < specs.length; i++) {
var spec = specs[i];
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
if (specFilter(spec)) {
this.runningSpecCount++;
}
}
};
return this;
function showDetails() {
if (dom.reporter.className.search(/showDetails/) === -1) {
dom.reporter.className += " showDetails";
}
}
function isUndefined(obj) {
return typeof obj === 'undefined';
}
function isDefined(obj) {
return !isUndefined(obj);
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);

79
src/html/SpecView.js Normal file
View File

@@ -0,0 +1,79 @@
jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
this.spec = spec;
this.dom = dom;
this.views = views;
this.symbol = this.createDom('li', { className: 'pending' });
this.dom.symbolSummary.appendChild(this.symbol);
this.summary = this.createDom('div', { className: 'specSummary' },
this.createDom('a', {
className: 'description',
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
title: this.spec.getFullName()
}, this.spec.description)
);
this.detail = this.createDom('div', { className: 'specDetail' },
this.createDom('a', {
className: 'description',
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
title: this.spec.getFullName()
}, this.spec.getFullName())
);
};
jasmine.HtmlReporter.SpecView.prototype.status = function() {
return this.getSpecStatus(this.spec);
};
jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
this.symbol.className = this.status();
switch (this.status()) {
case 'skipped':
break;
case 'passed':
this.appendSummaryToSuiteDiv();
break;
case 'failed':
this.appendSummaryToSuiteDiv();
this.appendFailureDetail();
break;
}
};
jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
this.summary.className += ' ' + this.status();
this.appendToSummary(this.spec, this.summary);
};
jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
this.detail.className += ' ' + this.status();
var resultItems = this.spec.results().getItems();
var messagesDiv = this.createDom('div', { className: 'messages' });
for (var i = 0; i < resultItems.length; i++) {
var result = resultItems[i];
if (result.type == 'log') {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
} else if (result.type == 'expect' && result.passed && !result.passed()) {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
if (result.trace.stack) {
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
}
}
}
if (messagesDiv.childNodes.length > 0) {
this.detail.appendChild(messagesDiv);
this.dom.details.appendChild(this.detail);
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);

22
src/html/SuiteView.js Normal file
View File

@@ -0,0 +1,22 @@
jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
this.suite = suite;
this.dom = dom;
this.views = views;
this.element = this.createDom('div', { className: 'suite' },
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description)
);
this.appendToSummary(this.suite, this.element);
};
jasmine.HtmlReporter.SuiteView.prototype.status = function() {
return this.getSpecStatus(this.suite);
};
jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
this.element.className += " " + this.status();
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);

View File

@@ -2,6 +2,7 @@ jasmine.TrivialReporter = function(doc) {
this.document = doc || document;
this.suiteDivs = {};
this.logRunningSpecs = false;
this.log("DEPRECATION WARNING: jasmine.TrivialReporter is deprecated as of v1.2 and will be removed in version 2.0. Please use (the vastly nicer) jasmine.HtmlReporter.")
};
jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
@@ -31,7 +32,7 @@ jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarA
jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
var showPassed, showSkipped;
this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
this.createDom('div', { className: 'banner' },
this.createDom('div', { className: 'logo' },
this.createDom('span', { className: 'title' }, "Jasmine"),

325
src/html/_HTMLReporter.scss Normal file
View File

@@ -0,0 +1,325 @@
@import "compass";
$line-height: 14px;
$margin-unit: 14px;
$feint-text-color: #aaa;
$light-text-color: #666;
$text-color: #333;
$page-background-color: #eee;
$light-passing-color: #a6b779;
$passing-color: #5e7d00;
$light-failing-color: #cf867e;
$failing-color: #b03911;
$neutral-color: #bababa;
$font-size: 11px;
$large-font-size: 14px;
body {
background-color: $page-background-color;
padding: 0;
margin: 5px;
overflow-y: scroll;
}
#HTMLReporter {
font-size: $font-size;
font-family: Monaco, "Lucida Console", monospace;
line-height: $line-height;
color: $text-color;
a {
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
p, h1, h2, h3, h4, h5, h6 {
margin: 0;
line-height: $line-height;
}
.banner,
.symbolSummary,
.summary,
.resultMessage,
.specDetail .description,
.alert .bar,
.stackTrace {
padding-left: $margin-unit - 5px;
padding-right: $margin-unit - 5px;
}
// This div is available for testing elements that must be added to the DOM.
// We position it out of view, so it doesn't obstruct the runner.
#jasmine_content {
position: fixed;
right: 100%;
}
.version {
color: $feint-text-color;
}
//--- Banner ---//
.banner {
margin-top: $line-height;
}
.duration {
color: $feint-text-color;
float: right;
}
//--- Symbol summary ---//
.symbolSummary {
@include clearfix;
margin: $line-height 0;
li {
display: block;
float: left;
height: $line-height / 2;
width: $line-height;
margin-bottom: $line-height / 2;
//opacity: .9;
font-size: 16px;
&.passed {
font-size: 14px;
&:before{
color: $passing-color;
content: "\02022";
}
}
&.failed {
line-height: ($line-height / 2) + 2;
&:before{
color: $failing-color;
content: "x";
font-weight: bold;
margin-left: -1px;
}
}
&.skipped {
font-size: 14px;
&:before{
color: $neutral-color;
content: "\02022";
}
}
&.pending{
line-height: ($line-height / 2) + 4;
&:before {
color: $feint-text-color;
content: "-";
}
}
}
}
//--- Alert ---//
.bar {
line-height: $line-height * 2;
font-size: $large-font-size;
display: block;
color: #eee;
}
.runningAlert {
background-color: $light-text-color;
}
.skippedAlert {
background-color: $feint-text-color;
&:first-child {
background-color: $text-color;
}
&:hover {
text-decoration: none;
color: white;
text-decoration: underline;
}
}
.passingAlert {
background-color: $light-passing-color;
&:first-child {
background-color: $passing-color;
}
}
.failingAlert {
background-color: $light-failing-color;
&:first-child {
background-color: $failing-color
}
}
//--- Results ---//
.results {
margin-top: $line-height;
}
//--- Results menu ---//
#details {
display: none;
}
.resultsMenu,
.resultsMenu a {
background-color: #fff;
color: $text-color;
}
&.showDetails {
.summaryMenuItem {
font-weight: normal;
text-decoration: inherit;
&:hover {
text-decoration: underline;
}
}
.detailsMenuItem {
font-weight: bold;
text-decoration: underline;
}
.summary {
display: none;
}
#details {
display: block;
}
}
.summaryMenuItem {
font-weight: bold;
text-decoration: underline;
}
//--- Results summary ---//
.summary {
margin-top: $margin-unit;
.suite .suite, .specSummary {
margin-left: $margin-unit;
}
.specSummary {
&.passed a {
color: $passing-color;
}
&.failed a {
color: $failing-color;
}
}
}
.description+.suite {
margin-top: 0;
}
.suite {
margin-top: $margin-unit;
a {
color: $text-color;
}
}
//--- Results details ---//
#details {
.specDetail {
margin-bottom: $line-height * 2;
.description {
//line-height: $line-height * 2;
display: block;
color: white;
background-color: $failing-color;
//font-size: $large-font-size;
}
}
}
.resultMessage {
padding-top: $line-height;
color: $text-color;
}
.resultMessage span.result {
display: block;
}
.stackTrace {
margin: 5px 0 0 0;
max-height: $line-height * 16;
overflow: auto;
line-height: 18px;
color: $light-text-color;
border: 1px solid #ddd;
background: white;
white-space: pre;
}
}

View File

@@ -0,0 +1,171 @@
#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;
a:visited, a {
color: #303;
}
a:hover, a:active {
color: blue;
}
.run_spec {
float:right;
padding-right: 5px;
font-size: .8em;
text-decoration: none;
}
.banner {
color: #303;
background-color: #fef;
padding: 5px;
}
.logo {
float: left;
font-size: 1.1em;
padding-left: 5px;
}
.logo .version {
font-size: .6em;
padding-left: 1em;
}
.runner.running {
background-color: yellow;
}
.options {
text-align: right;
font-size: .8em;
}
.suite {
border: 1px outset gray;
margin: 5px 0;
padding-left: 1em;
}
.suite .suite {
margin: 5px;
}
.suite.passed {
background-color: #dfd;
}
.suite.failed {
background-color: #fdd;
}
.spec {
margin: 5px;
padding-left: 1em;
clear: both;
}
.spec.failed, .spec.passed, .spec.skipped {
padding-bottom: 5px;
border: 1px solid gray;
}
.spec.failed {
background-color: #fbb;
border-color: red;
}
.spec.passed {
background-color: #bfb;
border-color: green;
}
.spec.skipped {
background-color: #bbb;
}
.messages {
border-left: 1px dashed gray;
padding-left: 1em;
padding-right: 1em;
}
.passed {
background-color: #cfc;
display: none;
}
.failed {
background-color: #fbb;
}
.skipped {
color: #777;
background-color: #eee;
display: none;
}
/*.resultMessage {*/
/*white-space: pre;*/
/*}*/
.resultMessage span.result {
display: block;
line-height: 2em;
color: black;
}
.resultMessage .mismatch {
color: black;
}
.stackTrace {
white-space: pre;
font-size: .8em;
margin-left: 10px;
max-height: 5em;
overflow: auto;
border: 1px inset red;
padding: 1em;
background: #eef;
}
.finished-at {
padding-left: 1em;
font-size: .6em;
}
&.show-passed .passed,
&.show-skipped .skipped {
display: block;
}
#jasmine_content {
position:fixed;
right: 100%;
}
.runner {
border: 1px solid gray;
display: block;
margin: 5px 0;
padding: 2px 0 2px 10px;
}
}

View File

@@ -1,137 +1,386 @@
/* line 25, _HTMLReporter.scss */
body {
background-color: #eeeeee;
padding: 0;
margin: 5px;
overflow-y: scroll;
}
/* line 32, _HTMLReporter.scss */
#HTMLReporter {
font-size: 11px;
font-family: Monaco, "Lucida Console", monospace;
line-height: 14px;
color: #333333;
}
/* line 39, _HTMLReporter.scss */
#HTMLReporter a {
text-decoration: none;
}
/* line 42, _HTMLReporter.scss */
#HTMLReporter a:hover {
text-decoration: underline;
}
/* line 47, _HTMLReporter.scss */
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 {
margin: 0;
line-height: 14px;
}
/* line 58, _HTMLReporter.scss */
#HTMLReporter .banner,
#HTMLReporter .symbolSummary,
#HTMLReporter .summary,
#HTMLReporter .resultMessage,
#HTMLReporter .specDetail .description,
#HTMLReporter .alert .bar,
#HTMLReporter .stackTrace {
padding-left: 9px;
padding-right: 9px;
}
/* line 65, _HTMLReporter.scss */
#HTMLReporter #jasmine_content {
position: fixed;
right: 100%;
}
/* line 70, _HTMLReporter.scss */
#HTMLReporter .version {
color: #aaaaaa;
}
/* line 77, _HTMLReporter.scss */
#HTMLReporter .banner {
margin-top: 14px;
}
/* line 81, _HTMLReporter.scss */
#HTMLReporter .duration {
color: #aaaaaa;
float: right;
}
/* line 90, _HTMLReporter.scss */
#HTMLReporter .symbolSummary {
overflow: hidden;
*zoom: 1;
margin: 14px 0;
}
/* line 94, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li {
display: block;
float: left;
height: 7px;
width: 14px;
margin-bottom: 7px;
font-size: 16px;
}
/* line 105, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.passed {
font-size: 14px;
}
/* line 108, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.passed:before {
color: #5e7d00;
content: "\02022";
}
/* line 114, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.failed {
line-height: 9px;
}
/* line 117, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.failed:before {
color: #b03911;
content: "x";
font-weight: bold;
margin-left: -1px;
}
/* line 125, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.skipped {
font-size: 14px;
}
/* line 128, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.skipped:before {
color: #bababa;
content: "\02022";
}
/* line 134, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.pending {
line-height: 11px;
}
/* line 137, _HTMLReporter.scss */
#HTMLReporter .symbolSummary li.pending:before {
color: #aaaaaa;
content: "-";
}
/* line 149, _HTMLReporter.scss */
#HTMLReporter .bar {
line-height: 28px;
font-size: 14px;
display: block;
color: #eee;
}
/* line 158, _HTMLReporter.scss */
#HTMLReporter .runningAlert {
background-color: #666666;
}
/* line 162, _HTMLReporter.scss */
#HTMLReporter .skippedAlert {
background-color: #aaaaaa;
}
/* line 165, _HTMLReporter.scss */
#HTMLReporter .skippedAlert:first-child {
background-color: #333333;
}
/* line 169, _HTMLReporter.scss */
#HTMLReporter .skippedAlert:hover {
text-decoration: none;
color: white;
text-decoration: underline;
}
/* line 176, _HTMLReporter.scss */
#HTMLReporter .passingAlert {
background-color: #a6b779;
}
/* line 179, _HTMLReporter.scss */
#HTMLReporter .passingAlert:first-child {
background-color: #5e7d00;
}
/* line 184, _HTMLReporter.scss */
#HTMLReporter .failingAlert {
background-color: #cf867e;
}
/* line 187, _HTMLReporter.scss */
#HTMLReporter .failingAlert:first-child {
background-color: #b03911;
}
/* line 200, _HTMLReporter.scss */
#HTMLReporter .results {
margin-top: 14px;
}
/* line 208, _HTMLReporter.scss */
#HTMLReporter #details {
display: none;
}
/* line 213, _HTMLReporter.scss */
#HTMLReporter .resultsMenu,
#HTMLReporter .resultsMenu a {
background-color: #fff;
color: #333333;
}
/* line 220, _HTMLReporter.scss */
#HTMLReporter.showDetails .summaryMenuItem {
font-weight: normal;
text-decoration: inherit;
}
/* line 224, _HTMLReporter.scss */
#HTMLReporter.showDetails .summaryMenuItem:hover {
text-decoration: underline;
}
/* line 229, _HTMLReporter.scss */
#HTMLReporter.showDetails .detailsMenuItem {
font-weight: bold;
text-decoration: underline;
}
/* line 234, _HTMLReporter.scss */
#HTMLReporter.showDetails .summary {
display: none;
}
/* line 238, _HTMLReporter.scss */
#HTMLReporter.showDetails #details {
display: block;
}
/* line 243, _HTMLReporter.scss */
#HTMLReporter .summaryMenuItem {
font-weight: bold;
text-decoration: underline;
}
/* line 253, _HTMLReporter.scss */
#HTMLReporter .summary {
margin-top: 14px;
}
/* line 256, _HTMLReporter.scss */
#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary {
margin-left: 14px;
}
/* line 261, _HTMLReporter.scss */
#HTMLReporter .summary .specSummary.passed a {
color: #5e7d00;
}
/* line 264, _HTMLReporter.scss */
#HTMLReporter .summary .specSummary.failed a {
color: #b03911;
}
/* line 270, _HTMLReporter.scss */
#HTMLReporter .description + .suite {
margin-top: 0;
}
/* line 274, _HTMLReporter.scss */
#HTMLReporter .suite {
margin-top: 14px;
}
/* line 277, _HTMLReporter.scss */
#HTMLReporter .suite a {
color: #333333;
}
/* line 288, _HTMLReporter.scss */
#HTMLReporter #details .specDetail {
margin-bottom: 28px;
}
/* line 291, _HTMLReporter.scss */
#HTMLReporter #details .specDetail .description {
display: block;
color: white;
background-color: #b03911;
}
/* line 303, _HTMLReporter.scss */
#HTMLReporter .resultMessage {
padding-top: 14px;
color: #333333;
}
/* line 309, _HTMLReporter.scss */
#HTMLReporter .resultMessage span.result {
display: block;
}
/* line 313, _HTMLReporter.scss */
#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;
}
/* line 2, _TrivialReporter.scss */
#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;*/
/*}*/
}
.jasmine_reporter a:visited, .jasmine_reporter a {
color: #303;
/* line 14, _TrivialReporter.scss */
#TrivialReporter a:visited, #TrivialReporter a {
color: #303;
}
.jasmine_reporter a:hover, .jasmine_reporter a:active {
color: blue;
/* line 18, _TrivialReporter.scss */
#TrivialReporter a:hover, #TrivialReporter a:active {
color: blue;
}
.run_spec {
float:right;
/* line 22, _TrivialReporter.scss */
#TrivialReporter .run_spec {
float: right;
padding-right: 5px;
font-size: .8em;
text-decoration: none;
}
.jasmine_reporter {
margin: 0 5px;
}
.banner {
/* line 29, _TrivialReporter.scss */
#TrivialReporter .banner {
color: #303;
background-color: #fef;
padding: 5px;
}
.logo {
/* line 35, _TrivialReporter.scss */
#TrivialReporter .logo {
float: left;
font-size: 1.1em;
padding-left: 5px;
}
.logo .version {
/* line 41, _TrivialReporter.scss */
#TrivialReporter .logo .version {
font-size: .6em;
padding-left: 1em;
}
.runner.running {
/* line 46, _TrivialReporter.scss */
#TrivialReporter .runner.running {
background-color: yellow;
}
.options {
/* line 51, _TrivialReporter.scss */
#TrivialReporter .options {
text-align: right;
font-size: .8em;
}
.suite {
/* line 59, _TrivialReporter.scss */
#TrivialReporter .suite {
border: 1px outset gray;
margin: 5px 0;
padding-left: 1em;
}
.suite .suite {
margin: 5px;
/* line 65, _TrivialReporter.scss */
#TrivialReporter .suite .suite {
margin: 5px;
}
.suite.passed {
/* line 69, _TrivialReporter.scss */
#TrivialReporter .suite.passed {
background-color: #dfd;
}
.suite.failed {
/* line 73, _TrivialReporter.scss */
#TrivialReporter .suite.failed {
background-color: #fdd;
}
.spec {
/* line 77, _TrivialReporter.scss */
#TrivialReporter .spec {
margin: 5px;
padding-left: 1em;
clear: both;
}
.spec.failed, .spec.passed, .spec.skipped {
/* line 83, _TrivialReporter.scss */
#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped {
padding-bottom: 5px;
border: 1px solid gray;
}
.spec.failed {
/* line 88, _TrivialReporter.scss */
#TrivialReporter .spec.failed {
background-color: #fbb;
border-color: red;
}
.spec.passed {
/* line 93, _TrivialReporter.scss */
#TrivialReporter .spec.passed {
background-color: #bfb;
border-color: green;
}
.spec.skipped {
/* line 98, _TrivialReporter.scss */
#TrivialReporter .spec.skipped {
background-color: #bbb;
}
.messages {
/* line 102, _TrivialReporter.scss */
#TrivialReporter .messages {
border-left: 1px dashed gray;
padding-left: 1em;
padding-right: 1em;
}
.passed {
/* line 108, _TrivialReporter.scss */
#TrivialReporter .passed {
background-color: #cfc;
display: none;
}
.failed {
/* line 113, _TrivialReporter.scss */
#TrivialReporter .failed {
background-color: #fbb;
}
.skipped {
/* line 117, _TrivialReporter.scss */
#TrivialReporter .skipped {
color: #777;
background-color: #eee;
display: none;
}
/*.resultMessage {*/
/*white-space: pre;*/
/*}*/
.resultMessage span.result {
/* line 128, _TrivialReporter.scss */
#TrivialReporter .resultMessage span.result {
display: block;
line-height: 2em;
color: black;
}
.resultMessage .mismatch {
/* line 134, _TrivialReporter.scss */
#TrivialReporter .resultMessage .mismatch {
color: black;
}
.stackTrace {
/* line 138, _TrivialReporter.scss */
#TrivialReporter .stackTrace {
white-space: pre;
font-size: .8em;
margin-left: 10px;
@@ -141,24 +390,22 @@ body {
padding: 1em;
background: #eef;
}
.finished-at {
/* line 149, _TrivialReporter.scss */
#TrivialReporter .finished-at {
padding-left: 1em;
font-size: .6em;
}
.show-passed .passed,
.show-skipped .skipped {
/* line 155, _TrivialReporter.scss */
#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped {
display: block;
}
#jasmine_content {
position:fixed;
/* line 160, _TrivialReporter.scss */
#TrivialReporter #jasmine_content {
position: fixed;
right: 100%;
}
.runner {
/* line 165, _TrivialReporter.scss */
#TrivialReporter .runner {
border: 1px solid gray;
display: block;
margin: 5px 0;

2
src/html/jasmine.scss Normal file
View File

@@ -0,0 +1,2 @@
@import "HTMLReporter";
@import "TrivialReporter";

View File

@@ -1,6 +0,0 @@
jasmine.version_= {
"major": <%= major %>,
"minor": <%= minor %>,
"build": <%= build %>,
"revision": <%= revision %><%= %Q{,\n "rc": #{rc}} if rc %>
};

View File

@@ -0,0 +1,6 @@
jasmine.version_= {
"major": <%= major %>,
"minor": <%= minor %>,
"build": <%= build %>,
"revision": <%= revision %><%= %Q{,\n "release_candidate": #{release_candidate}} if release_candidate %>
};

View File

@@ -0,0 +1,6 @@
module Jasmine
module Core
VERSION = "<%= "#{major}.#{minor}.#{build}" %><%= ".rc#{release_candidate}" if release_candidate %>"
end
end

View File

@@ -1,6 +1,7 @@
jasmine.version_= {
"major": 1,
"minor": 1,
"minor": 2,
"build": 0,
"revision": 1308358300
"revision": 1315672648,
"release_candidate": 1
};

View File

@@ -1,6 +1,6 @@
{
"major": 1,
"minor": 1,
"minor": 2,
"build": 0,
"release_candidate": 1
}

16027
tags

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,11 @@
desc "Build core jasmine.js"
task :build_dist => [:lint, :write_version_file] do
task :build_dist => [:lint, :write_version_files] do
puts 'Building Jasmine distribution from source'.cyan
concat_into('lib/jasmine-core/jasmine.js') { core_sources + version_source_file }
concat_into('lib/jasmine-core/jasmine-html.js') { html_sources }
concat_into('./lib/jasmine-core/jasmine.js') { core_sources + version_source_file }
concat_into('./lib/jasmine-core/jasmine-html.js') { html_sources }
FileUtils.cp('src/html/jasmine.css', 'lib/jasmine-core/jasmine.css')
FileUtils.cp('./src/html/jasmine.css', './lib/jasmine-core/jasmine.css')
end
def concat_into(output_file, &block)
@@ -25,18 +25,22 @@ end
task :hint => :lint
task :write_version_file do
template = Tilt.new('src/templates/version.erb')
task :write_version_files do
scope = OpenStruct.new(:major => version_hash["major"],
:minor => version_hash["minor"],
:build => version_hash["build"],
:release_candidate => version_hash["release_candidate"],
:revision => Time.now.to_i)
File.open('src/version.js', 'w+') do |f|
f << template.render(scope)
js_template = Tilt.new('./src/templates/version.js.erb')
File.open('./src/version.js', 'w+') do |f|
f << js_template.render(scope)
end
rb_template = Tilt.new('./src/templates/version.rb.erb')
File.open('./lib/jasmine-core/version.rb', 'w+') do |f|
f << rb_template.render(scope)
end
end
def version_source_file

View File

@@ -0,0 +1,17 @@
desc "Build jasmine documentation"
task :doc => :require_pages_submodule do
puts 'Creating Jasmine Documentation'
require 'rubygems'
require 'jsdoc_helper'
FileUtils.rm_r "pages/jsdoc", :force => true
JsdocHelper::Rake::Task.new(:lambda_jsdoc) do |t|
t[:files] = core_sources + html_sources + console_sources
t[:options] = "-a"
t[:out] = "pages/jsdoc"
# JsdocHelper bug: template must be relative to the JsdocHelper gem, ick
t[:template] = File.join("../".*(100), Dir::getwd, "jsdoc-template")
end
Rake::Task[:lambda_jsdoc].invoke
end

View File

@@ -1,7 +1,7 @@
require 'json'
def core_sources
first_sources = JSON.parse(File.read('src/SourcesList.json')).collect { |f| "./src/core/#{f}" }
first_sources = JSON.parse(File.read('./src/SourcesList.json')).collect { |f| "./src/core/#{f}" }
remaining_sources = Dir.glob('./src/core/*.js').reject { |f| first_sources.include?(f) }.sort
@@ -9,7 +9,7 @@ def core_sources
end
def html_sources
Dir.glob('./src/html/*.js')
['./src/html/HtmlReporterHelpers.js'] + Dir.glob('./src/html/*.js')
end
def console_sources

View File

@@ -6,7 +6,7 @@ task :build_pages => :require_pages_submodule do
system("frank export ../pages_output")
end
puts "\n"
puts "Copying built website to the root of the gh-pages branch"
puts "Copying built website to the root of the gh-pages branch".cyan
puts "\n\n"
system("cp -r pages_output/* .")
end

View File

@@ -1,10 +1,7 @@
require 'ostruct'
desc "Build standalone distribution, block if zip of current version"
task :standalone_safe => [:require_pages_submodule, :protect_current_dist_zip, :build_spec_runner_html]
desc "Build standalone distribution"
task :standalone => [:require_pages_submodule, :build_spec_runner_html] do
task :standalone => [:require_pages_submodule, :protect_current_dist_zip, :build_spec_runner_html] do
require 'tmpdir'
zip_root = File.join(Dir.tmpdir, "zip_root")
@@ -81,5 +78,14 @@ task :protect_current_dist_zip do
dist_dir = File.join(root, 'pages/downloads')
zip_file_name = File.join(dist_dir, "jasmine-standalone-#{version_string}.zip")
raise "STOPPED: #{zip_file_name} already exists" if File.exist?(zip_file_name)
zip_present_message = "\n\n"
zip_present_message << "==> STOPPED <==".red
zip_present_message << "\n\n"
zip_present_message << "The file ".red + "#{zip_file_name}" + " already exists.".red + "\n"
zip_present_message << "If you should be building the next version, update src/version.json"
zip_present_message << "\n"
zip_present_message << "If the version is correct, you must be trying to re-build the standalone ZIP. Delete the ZIP and rebuild."
zip_present_message << "\n"
raise zip_present_message if File.exist?(zip_file_name)
end

5
tasks/version.rb Normal file
View File

@@ -0,0 +1,5 @@
task :version do
require 'pp'
pp version_hash
pp version_string
end