Compare commits
15 Commits
0.10.3-rel
...
0.10.4-rel
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c187adc096 | ||
|
|
5aa306cf66 | ||
|
|
462b50e84e | ||
|
|
46249bf515 | ||
|
|
03d7bfb7d4 | ||
|
|
11292ff83c | ||
|
|
ab7678e713 | ||
|
|
6431431dfc | ||
|
|
a2041e90a6 | ||
|
|
ed49104fad | ||
|
|
803a2fb2ba | ||
|
|
bb1928a75c | ||
|
|
7d5ff6985f | ||
|
|
841e93fc09 | ||
|
|
5cfb019b6b |
@@ -5,24 +5,11 @@ Jasmine
|
|||||||
Quick Start
|
Quick Start
|
||||||
----------
|
----------
|
||||||
|
|
||||||
### Ruby Suite Running
|
1. Get the latest release from the [downloads page](http://github.com/pivotal/jasmine/downloads).
|
||||||
|
2. Open `example/example_runner.html` in your favorite browser.
|
||||||
|
|
||||||
Please use the [jasmine-ruby gem](http://github.com/pivotal/jasmine-ruby) to run suites in a ruby environment.
|
For running within a Ruby environment, including automated execution with Selenium, please use
|
||||||
|
the [jasmine-ruby gem](http://github.com/pivotal/jasmine-ruby).
|
||||||
### HTML Suite Running
|
|
||||||
[Get the latest release from the downloads page](http://github.com/pivotal/jasmine/downloads)
|
|
||||||
|
|
||||||
Open `example/example_runner.html` in your favorite browser.
|
|
||||||
|
|
||||||
### Automatic Suite Running (w/ Selenium)
|
|
||||||
|
|
||||||
sudo gem sources -a http://gems.github.com
|
|
||||||
sudo gem install geminstaller
|
|
||||||
git clone git://github.com/pivotal/jasmine.git
|
|
||||||
cd jasmine
|
|
||||||
sudo geminstaller
|
|
||||||
cd examples/ruby
|
|
||||||
rake test:ci
|
|
||||||
|
|
||||||
Releases
|
Releases
|
||||||
----------
|
----------
|
||||||
@@ -108,7 +95,7 @@ Jasmine has several built-in matchers. Here are a few:
|
|||||||
>
|
>
|
||||||
>`expect(x).toBeDefined();` passes if `x` is not `undefined`
|
>`expect(x).toBeDefined();` passes if `x` is not `undefined`
|
||||||
>
|
>
|
||||||
>`expect(x).toBeNull();` passes if `x` is not `null`
|
>`expect(x).toBeNull();` passes if `x` is `null`
|
||||||
>
|
>
|
||||||
>`expect(x).toBeTruthy();` passes if `x` evaluates to true
|
>`expect(x).toBeTruthy();` passes if `x` evaluates to true
|
||||||
>
|
>
|
||||||
|
|||||||
14
Rakefile
14
Rakefile
@@ -56,7 +56,7 @@ namespace :jasmine do
|
|||||||
end
|
end
|
||||||
|
|
||||||
desc 'Builds lib/jasmine from source'
|
desc 'Builds lib/jasmine from source'
|
||||||
task :build => [:lint, 'gems:geminstaller'] do
|
task :build => :lint do
|
||||||
puts 'Building Jasmine from source'
|
puts 'Building Jasmine from source'
|
||||||
require 'json'
|
require 'json'
|
||||||
|
|
||||||
@@ -102,7 +102,6 @@ jasmine.version_= {
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
desc "Run jasmine tests of source via server"
|
|
||||||
task :server do
|
task :server do
|
||||||
files = jasmine_sources + ['lib/TrivialReporter.js', 'lib/consolex.js']
|
files = jasmine_sources + ['lib/TrivialReporter.js', 'lib/consolex.js']
|
||||||
jasmine_includes = lambda {
|
jasmine_includes = lambda {
|
||||||
@@ -112,14 +111,12 @@ jasmine.version_= {
|
|||||||
start_jasmine_server(jasmine_includes)
|
start_jasmine_server(jasmine_includes)
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Build jasmine and run tests via server"
|
|
||||||
task :server_build => 'jasmine:build' do
|
task :server_build => 'jasmine:build' do
|
||||||
|
|
||||||
start_jasmine_server
|
start_jasmine_server
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :test do
|
namespace :test do
|
||||||
desc "Run continuous integration tests using a local Selenium runner"
|
|
||||||
task :ci => :'ci:local'
|
task :ci => :'ci:local'
|
||||||
namespace :ci do
|
namespace :ci do
|
||||||
|
|
||||||
@@ -133,7 +130,6 @@ jasmine.version_= {
|
|||||||
Rake::Task[:lambda_ci].invoke
|
Rake::Task[:lambda_ci].invoke
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Run continuous integration tests using Sauce Labs 'Selenium in the Cloud'"
|
|
||||||
task :saucelabs => ['jasmine:copy_saucelabs_config', 'jasmine:build'] do
|
task :saucelabs => ['jasmine:copy_saucelabs_config', 'jasmine:build'] do
|
||||||
ENV['SAUCELABS'] = 'true'
|
ENV['SAUCELABS'] = 'true'
|
||||||
Rake::Task['jasmine:test:ci:local'].invoke
|
Rake::Task['jasmine:test:ci:local'].invoke
|
||||||
@@ -147,12 +143,4 @@ jasmine.version_= {
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Run specs via server"
|
|
||||||
task :jasmine => ['jasmine:server']
|
task :jasmine => ['jasmine:server']
|
||||||
|
|
||||||
namespace :gems do
|
|
||||||
desc "Run geminstaller."
|
|
||||||
task :geminstaller do
|
|
||||||
`geminstaller --sudo`
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -3,18 +3,13 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Jasmine Test Runner</title>
|
<title>Jasmine Test Runner</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../lib/jasmine.css">
|
||||||
|
<script type="text/javascript" src="../lib/jasmine-0.10.4.js"></script>
|
||||||
|
<script type="text/javascript" src="../lib/TrivialReporter.js"></script>
|
||||||
|
<script type="text/javascript" src="../lib/consolex.js"></script>
|
||||||
|
<script type="text/javascript" src="spec/example_suite.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<script type="text/javascript" src="../../lib/jasmine-0.10.1.js"></script>
|
|
||||||
<script type="text/javascript" src="../../lib/TrivialReporter.js"></script>
|
|
||||||
<script type="text/javascript" src="../../lib/consolex.js"></script>
|
|
||||||
<link rel="stylesheet" type="text/css" href="../../lib/jasmine.css">
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
jasmine.include('spec/example_suite.js', true);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var jasmineEnv = jasmine.getEnv();
|
var jasmineEnv = jasmine.getEnv();
|
||||||
jasmineEnv.reporter = new jasmine.TrivialReporter();
|
jasmineEnv.reporter = new jasmine.TrivialReporter();
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
require File.expand_path(File.join(File.dirname(__FILE__), "spec/jasmine_helper.rb"))
|
|
||||||
|
|
||||||
namespace :test do
|
|
||||||
desc "Run continuous integration tests"
|
|
||||||
task :ci => :'ci:local'
|
|
||||||
namespace :ci do
|
|
||||||
require "spec"
|
|
||||||
require 'spec/rake/spectask'
|
|
||||||
|
|
||||||
Spec::Rake::SpecTask.new(:local) do |t|
|
|
||||||
t.spec_opts = ["--color", "--format", "specdoc"]
|
|
||||||
t.spec_files = ["spec/jasmine_spec.rb"]
|
|
||||||
end
|
|
||||||
|
|
||||||
desc "Run continuous integration tests using Sauce Labs 'Selenium in the Cloud'"
|
|
||||||
task :saucelabs do
|
|
||||||
ENV['SAUCELABS'] = 'true'
|
|
||||||
Rake::Task['test:ci:local'].invoke
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
desc "Run specs via server"
|
|
||||||
task :jasmine_server do
|
|
||||||
require File.expand_path(File.join(JasmineHelper.jasmine_root, "contrib/ruby/jasmine_spec_builder"))
|
|
||||||
|
|
||||||
puts "your tests are here:"
|
|
||||||
puts " http://localhost:8888/run.html"
|
|
||||||
|
|
||||||
Jasmine::SimpleServer.start(8888,
|
|
||||||
lambda { JasmineHelper.specs },
|
|
||||||
JasmineHelper.dir_mappings)
|
|
||||||
end
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
describe('ExampleSuite', function () {
|
|
||||||
it('should have a passing test', function() {
|
|
||||||
expect(true).toEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Nested Describe', function () {
|
|
||||||
it('should also have a passing test', function () {
|
|
||||||
expect(true).toEqual(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
class JasmineHelper
|
|
||||||
def self.jasmine_lib_dir
|
|
||||||
File.expand_path(File.join(jasmine_root, 'lib'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.jasmine_root
|
|
||||||
File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.jasmine
|
|
||||||
['/lib/' + File.basename(Dir.glob("#{JasmineHelper.jasmine_lib_dir}/jasmine*.js").first)] +
|
|
||||||
['/lib/json2.js',
|
|
||||||
'/lib/TrivialReporter.js',
|
|
||||||
'/lib/consolex.js'
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.jasmine_src_dir
|
|
||||||
File.expand_path(File.join(jasmine_root, 'src'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.jasmine_spec_dir
|
|
||||||
File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.raw_spec_files
|
|
||||||
Dir.glob(File.join(jasmine_spec_dir, "**/*[Ss]pec.js"))
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.specs
|
|
||||||
raw_spec_files.collect {|f| f.sub(jasmine_spec_dir, "/spec")}
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.dir_mappings
|
|
||||||
{
|
|
||||||
"/src" => jasmine_src_dir,
|
|
||||||
"/spec" => jasmine_spec_dir,
|
|
||||||
"/lib" => jasmine_lib_dir
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
require 'rubygems'
|
|
||||||
require File.expand_path(File.join(File.dirname(__FILE__), "jasmine_helper.rb"))
|
|
||||||
require File.expand_path(File.join(JasmineHelper.jasmine_root, "contrib/ruby/jasmine_spec_builder"))
|
|
||||||
|
|
||||||
jasmine_runner = if ENV['SAUCELABS'] == 'true'
|
|
||||||
require 'sauce_tunnel'
|
|
||||||
require 'selenium_config'
|
|
||||||
Jasmine::SauceLabsRunner.new(JasmineHelper.specs,
|
|
||||||
JasmineHelper.dir_mappings,
|
|
||||||
:saucelabs_config => 'saucelabs',
|
|
||||||
:saucelabs_config_file => File.expand_path(File.join(File.dirname(__FILE__), "saucelabs.yml")))
|
|
||||||
else
|
|
||||||
require "selenium_rc"
|
|
||||||
Jasmine::Runner.new(SeleniumRC::Server.new('localhost').jar_path,
|
|
||||||
JasmineHelper.specs,
|
|
||||||
JasmineHelper.dir_mappings)
|
|
||||||
end
|
|
||||||
|
|
||||||
spec_builder = Jasmine::SpecBuilder.new(JasmineHelper.raw_spec_files, jasmine_runner)
|
|
||||||
|
|
||||||
should_stop = false
|
|
||||||
|
|
||||||
Spec::Runner.configure do |config|
|
|
||||||
config.after(:suite) do
|
|
||||||
spec_builder.stop if should_stop
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
spec_builder.start
|
|
||||||
should_stop = true
|
|
||||||
spec_builder.declare_suites
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
local:
|
|
||||||
application_framework: :selenium
|
|
||||||
#
|
|
||||||
# Possible Sauce Labs configurations as of 2009/11/19
|
|
||||||
# From: http://saucelabs.com/products/docs/sauce-ondemand/browsers
|
|
||||||
# os: "Windows 2003"
|
|
||||||
# browser: "iexplore"
|
|
||||||
# browser-version: "6.", "7.", "8."
|
|
||||||
# browser: "firefox"
|
|
||||||
# browser-version: "2.", "3.0", "3.5"
|
|
||||||
# browser: "safari"
|
|
||||||
# browser-version: "3.", "4."
|
|
||||||
# browser: "opera"
|
|
||||||
# browser-version: "9."
|
|
||||||
# browser: "googlechrome"
|
|
||||||
# browser-version: ""
|
|
||||||
# os: "Linux"
|
|
||||||
# browser: "firefox"
|
|
||||||
# browser-version: "3."
|
|
||||||
saucelabs:
|
|
||||||
application_framework: :external
|
|
||||||
selenium_server_address: "saucelabs.com"
|
|
||||||
selenium_browser_key: '{"username": "--YOUR-SAUCELABS-USERNAME--", "access-key": "--YOUR-SAUCELABS-ACCESS-KEY--", "os": "Linux", "browser": "firefox", "browser-version": "3."}'
|
|
||||||
application_port: "80"
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
---
|
|
||||||
gems:
|
|
||||||
- name: rake
|
|
||||||
version: 0.8.7
|
|
||||||
- name: ragaskar-jsdoc_helper
|
|
||||||
version: 0.0.2.1
|
|
||||||
- name: json
|
|
||||||
version: 1.1.9
|
|
||||||
- name: selenium-rc
|
|
||||||
version: 2.2.0
|
|
||||||
- name: rack
|
|
||||||
version: 1.0.0
|
|
||||||
- name: thin
|
|
||||||
version: 1.2.4
|
|
||||||
- name: eventmachine
|
|
||||||
version: 0.12.8
|
|
||||||
- name: rspec
|
|
||||||
version: 1.2.9
|
|
||||||
- name: selenium-client
|
|
||||||
version: 1.2.18
|
|
||||||
- name: rest-client
|
|
||||||
version: 1.0.3
|
|
||||||
- name: saucelabs-adapter
|
|
||||||
version: 0.3.2
|
|
||||||
install_options: --source=http://gems.pivotallabs.com
|
|
||||||
@@ -57,6 +57,10 @@ jasmine.MessageResult = function(text) {
|
|||||||
this.trace = new Error(); // todo: test better
|
this.trace = new Error(); // todo: test better
|
||||||
};
|
};
|
||||||
|
|
||||||
|
jasmine.MessageResult.prototype.toString = function() {
|
||||||
|
return this.text;
|
||||||
|
};
|
||||||
|
|
||||||
jasmine.ExpectationResult = function(params) {
|
jasmine.ExpectationResult = function(params) {
|
||||||
this.type = 'ExpectationResult';
|
this.type = 'ExpectationResult';
|
||||||
this.matcherName = params.matcherName;
|
this.matcherName = params.matcherName;
|
||||||
@@ -71,6 +75,10 @@ jasmine.ExpectationResult = function(params) {
|
|||||||
this.trace = this.passed_ ? '' : new Error(this.message);
|
this.trace = this.passed_ ? '' : new Error(this.message);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
jasmine.ExpectationResult.prototype.toString = function () {
|
||||||
|
return this.message;
|
||||||
|
};
|
||||||
|
|
||||||
jasmine.ExpectationResult.prototype.passed = function () {
|
jasmine.ExpectationResult.prototype.passed = function () {
|
||||||
return this.passed_;
|
return this.passed_;
|
||||||
};
|
};
|
||||||
@@ -741,10 +749,21 @@ jasmine.Env.prototype.describe = function(description, specDefinitions) {
|
|||||||
|
|
||||||
this.currentSuite = suite;
|
this.currentSuite = suite;
|
||||||
|
|
||||||
specDefinitions.call(suite);
|
var declarationError = null;
|
||||||
|
try {
|
||||||
|
specDefinitions.call(suite);
|
||||||
|
} catch(e) {
|
||||||
|
declarationError = e;
|
||||||
|
}
|
||||||
|
|
||||||
this.currentSuite = parentSuite;
|
this.currentSuite = parentSuite;
|
||||||
|
|
||||||
|
if (declarationError) {
|
||||||
|
this.it("encountered a declaration exception", function() {
|
||||||
|
throw declarationError;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return suite;
|
return suite;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1777,12 +1796,12 @@ jasmine.Runner.prototype.execute = function() {
|
|||||||
|
|
||||||
jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
|
jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
|
||||||
beforeEachFunction.typeName = 'beforeEach';
|
beforeEachFunction.typeName = 'beforeEach';
|
||||||
this.before_.push(beforeEachFunction);
|
this.before_.splice(0,0,beforeEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
|
jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
|
||||||
afterEachFunction.typeName = 'afterEach';
|
afterEachFunction.typeName = 'afterEach';
|
||||||
this.after_.push(afterEachFunction);
|
this.after_.splice(0,0,afterEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -2063,12 +2082,12 @@ jasmine.Suite.prototype.finish = function(onComplete) {
|
|||||||
|
|
||||||
jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
|
jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
|
||||||
beforeEachFunction.typeName = 'beforeEach';
|
beforeEachFunction.typeName = 'beforeEach';
|
||||||
this.before_.push(beforeEachFunction);
|
this.before_.unshift(beforeEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
|
jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
|
||||||
afterEachFunction.typeName = 'afterEach';
|
afterEachFunction.typeName = 'afterEach';
|
||||||
this.after_.push(afterEachFunction);
|
this.after_.unshift(afterEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.Suite.prototype.results = function() {
|
jasmine.Suite.prototype.results = function() {
|
||||||
@@ -2139,193 +2158,192 @@ jasmine.WaitsForBlock.prototype.execute = function (onComplete) {
|
|||||||
name: 'timeout',
|
name: 'timeout',
|
||||||
message: message
|
message: message
|
||||||
});
|
});
|
||||||
self.spec._next();
|
|
||||||
} else {
|
} else {
|
||||||
self.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
|
self.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
|
||||||
self.env.setTimeout(function () { self.execute(onComplete); }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
|
self.env.setTimeout(function () { self.execute(onComplete); }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Mock setTimeout, clearTimeout
|
// Mock setTimeout, clearTimeout
|
||||||
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
|
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
|
||||||
|
|
||||||
jasmine.FakeTimer = function() {
|
jasmine.FakeTimer = function() {
|
||||||
this.reset();
|
this.reset();
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
self.setTimeout = function(funcToCall, millis) {
|
self.setTimeout = function(funcToCall, millis) {
|
||||||
self.timeoutsMade++;
|
self.timeoutsMade++;
|
||||||
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
|
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
|
||||||
return self.timeoutsMade;
|
return self.timeoutsMade;
|
||||||
};
|
};
|
||||||
|
|
||||||
self.setInterval = function(funcToCall, millis) {
|
self.setInterval = function(funcToCall, millis) {
|
||||||
self.timeoutsMade++;
|
self.timeoutsMade++;
|
||||||
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
|
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
|
||||||
return self.timeoutsMade;
|
return self.timeoutsMade;
|
||||||
};
|
};
|
||||||
|
|
||||||
self.clearTimeout = function(timeoutKey) {
|
self.clearTimeout = function(timeoutKey) {
|
||||||
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
self.clearInterval = function(timeoutKey) {
|
self.clearInterval = function(timeoutKey) {
|
||||||
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.reset = function() {
|
jasmine.FakeTimer.prototype.reset = function() {
|
||||||
this.timeoutsMade = 0;
|
this.timeoutsMade = 0;
|
||||||
this.scheduledFunctions = {};
|
this.scheduledFunctions = {};
|
||||||
this.nowMillis = 0;
|
this.nowMillis = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.tick = function(millis) {
|
jasmine.FakeTimer.prototype.tick = function(millis) {
|
||||||
var oldMillis = this.nowMillis;
|
var oldMillis = this.nowMillis;
|
||||||
var newMillis = oldMillis + millis;
|
var newMillis = oldMillis + millis;
|
||||||
this.runFunctionsWithinRange(oldMillis, newMillis);
|
this.runFunctionsWithinRange(oldMillis, newMillis);
|
||||||
this.nowMillis = newMillis;
|
this.nowMillis = newMillis;
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
|
jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
|
||||||
var scheduledFunc;
|
var scheduledFunc;
|
||||||
var funcsToRun = [];
|
var funcsToRun = [];
|
||||||
for (var timeoutKey in this.scheduledFunctions) {
|
for (var timeoutKey in this.scheduledFunctions) {
|
||||||
scheduledFunc = this.scheduledFunctions[timeoutKey];
|
scheduledFunc = this.scheduledFunctions[timeoutKey];
|
||||||
if (scheduledFunc != jasmine.undefined &&
|
if (scheduledFunc != jasmine.undefined &&
|
||||||
scheduledFunc.runAtMillis >= oldMillis &&
|
scheduledFunc.runAtMillis >= oldMillis &&
|
||||||
scheduledFunc.runAtMillis <= nowMillis) {
|
scheduledFunc.runAtMillis <= nowMillis) {
|
||||||
funcsToRun.push(scheduledFunc);
|
funcsToRun.push(scheduledFunc);
|
||||||
this.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
this.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (funcsToRun.length > 0) {
|
if (funcsToRun.length > 0) {
|
||||||
funcsToRun.sort(function(a, b) {
|
funcsToRun.sort(function(a, b) {
|
||||||
return a.runAtMillis - b.runAtMillis;
|
return a.runAtMillis - b.runAtMillis;
|
||||||
});
|
});
|
||||||
for (var i = 0; i < funcsToRun.length; ++i) {
|
for (var i = 0; i < funcsToRun.length; ++i) {
|
||||||
try {
|
try {
|
||||||
var funcToRun = funcsToRun[i];
|
var funcToRun = funcsToRun[i];
|
||||||
this.nowMillis = funcToRun.runAtMillis;
|
this.nowMillis = funcToRun.runAtMillis;
|
||||||
funcToRun.funcToCall();
|
funcToRun.funcToCall();
|
||||||
if (funcToRun.recurring) {
|
if (funcToRun.recurring) {
|
||||||
this.scheduleFunction(funcToRun.timeoutKey,
|
this.scheduleFunction(funcToRun.timeoutKey,
|
||||||
funcToRun.funcToCall,
|
funcToRun.funcToCall,
|
||||||
funcToRun.millis,
|
funcToRun.millis,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.runFunctionsWithinRange(oldMillis, nowMillis);
|
this.runFunctionsWithinRange(oldMillis, nowMillis);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
|
jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
|
||||||
this.scheduledFunctions[timeoutKey] = {
|
this.scheduledFunctions[timeoutKey] = {
|
||||||
runAtMillis: this.nowMillis + millis,
|
runAtMillis: this.nowMillis + millis,
|
||||||
funcToCall: funcToCall,
|
funcToCall: funcToCall,
|
||||||
recurring: recurring,
|
recurring: recurring,
|
||||||
timeoutKey: timeoutKey,
|
timeoutKey: timeoutKey,
|
||||||
millis: millis
|
millis: millis
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @namespace
|
* @namespace
|
||||||
*/
|
*/
|
||||||
jasmine.Clock = {
|
jasmine.Clock = {
|
||||||
defaultFakeTimer: new jasmine.FakeTimer(),
|
defaultFakeTimer: new jasmine.FakeTimer(),
|
||||||
|
|
||||||
reset: function() {
|
reset: function() {
|
||||||
jasmine.Clock.assertInstalled();
|
jasmine.Clock.assertInstalled();
|
||||||
jasmine.Clock.defaultFakeTimer.reset();
|
jasmine.Clock.defaultFakeTimer.reset();
|
||||||
},
|
},
|
||||||
|
|
||||||
tick: function(millis) {
|
tick: function(millis) {
|
||||||
jasmine.Clock.assertInstalled();
|
jasmine.Clock.assertInstalled();
|
||||||
jasmine.Clock.defaultFakeTimer.tick(millis);
|
jasmine.Clock.defaultFakeTimer.tick(millis);
|
||||||
},
|
},
|
||||||
|
|
||||||
runFunctionsWithinRange: function(oldMillis, nowMillis) {
|
runFunctionsWithinRange: function(oldMillis, nowMillis) {
|
||||||
jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
|
jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
|
||||||
},
|
},
|
||||||
|
|
||||||
scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
|
scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
|
||||||
jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
|
jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
|
||||||
},
|
},
|
||||||
|
|
||||||
useMock: function() {
|
useMock: function() {
|
||||||
var spec = jasmine.getEnv().currentSpec;
|
var spec = jasmine.getEnv().currentSpec;
|
||||||
spec.after(jasmine.Clock.uninstallMock);
|
spec.after(jasmine.Clock.uninstallMock);
|
||||||
|
|
||||||
jasmine.Clock.installMock();
|
jasmine.Clock.installMock();
|
||||||
},
|
},
|
||||||
|
|
||||||
installMock: function() {
|
installMock: function() {
|
||||||
jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
|
jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
|
||||||
},
|
},
|
||||||
|
|
||||||
uninstallMock: function() {
|
uninstallMock: function() {
|
||||||
jasmine.Clock.assertInstalled();
|
jasmine.Clock.assertInstalled();
|
||||||
jasmine.Clock.installed = jasmine.Clock.real;
|
jasmine.Clock.installed = jasmine.Clock.real;
|
||||||
},
|
},
|
||||||
|
|
||||||
real: {
|
real: {
|
||||||
setTimeout: window.setTimeout,
|
setTimeout: window.setTimeout,
|
||||||
clearTimeout: window.clearTimeout,
|
clearTimeout: window.clearTimeout,
|
||||||
setInterval: window.setInterval,
|
setInterval: window.setInterval,
|
||||||
clearInterval: window.clearInterval
|
clearInterval: window.clearInterval
|
||||||
},
|
},
|
||||||
|
|
||||||
assertInstalled: function() {
|
assertInstalled: function() {
|
||||||
if (jasmine.Clock.installed != jasmine.Clock.defaultFakeTimer) {
|
if (jasmine.Clock.installed != jasmine.Clock.defaultFakeTimer) {
|
||||||
throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
|
throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
installed: null
|
installed: null
|
||||||
};
|
};
|
||||||
jasmine.Clock.installed = jasmine.Clock.real;
|
jasmine.Clock.installed = jasmine.Clock.real;
|
||||||
|
|
||||||
//else for IE support
|
//else for IE support
|
||||||
window.setTimeout = function(funcToCall, millis) {
|
window.setTimeout = function(funcToCall, millis) {
|
||||||
if (jasmine.Clock.installed.setTimeout.apply) {
|
if (jasmine.Clock.installed.setTimeout.apply) {
|
||||||
return jasmine.Clock.installed.setTimeout.apply(this, arguments);
|
return jasmine.Clock.installed.setTimeout.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.setTimeout(funcToCall, millis);
|
return jasmine.Clock.installed.setTimeout(funcToCall, millis);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window.setInterval = function(funcToCall, millis) {
|
window.setInterval = function(funcToCall, millis) {
|
||||||
if (jasmine.Clock.installed.setInterval.apply) {
|
if (jasmine.Clock.installed.setInterval.apply) {
|
||||||
return jasmine.Clock.installed.setInterval.apply(this, arguments);
|
return jasmine.Clock.installed.setInterval.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.setInterval(funcToCall, millis);
|
return jasmine.Clock.installed.setInterval(funcToCall, millis);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window.clearTimeout = function(timeoutKey) {
|
window.clearTimeout = function(timeoutKey) {
|
||||||
if (jasmine.Clock.installed.clearTimeout.apply) {
|
if (jasmine.Clock.installed.clearTimeout.apply) {
|
||||||
return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
|
return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.clearTimeout(timeoutKey);
|
return jasmine.Clock.installed.clearTimeout(timeoutKey);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window.clearInterval = function(timeoutKey) {
|
window.clearInterval = function(timeoutKey) {
|
||||||
if (jasmine.Clock.installed.clearTimeout.apply) {
|
if (jasmine.Clock.installed.clearTimeout.apply) {
|
||||||
return jasmine.Clock.installed.clearInterval.apply(this, arguments);
|
return jasmine.Clock.installed.clearInterval.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.clearInterval(timeoutKey);
|
return jasmine.Clock.installed.clearInterval(timeoutKey);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
jasmine.version_= {
|
jasmine.version_= {
|
||||||
"major": 0,
|
"major": 0,
|
||||||
"minor": 10,
|
"minor": 10,
|
||||||
"build": 3,
|
"build": 4,
|
||||||
"revision": 1270162784
|
"revision": 1275748595
|
||||||
};
|
};
|
||||||
@@ -8,13 +8,13 @@
|
|||||||
// yes, really keep this here to keep us honest, but only for jasmine's own runner! [xw]
|
// yes, really keep this here to keep us honest, but only for jasmine's own runner! [xw]
|
||||||
undefined = "diz be undefined yo";
|
undefined = "diz be undefined yo";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript" src="../src/base.js"></script>
|
<script type="text/javascript" src="../src/base.js"></script>
|
||||||
<script type="text/javascript" src="../src/util.js"></script>
|
<script type="text/javascript" src="../src/util.js"></script>
|
||||||
<script type="text/javascript" src="../src/Env.js"></script>
|
<script type="text/javascript" src="../src/Env.js"></script>
|
||||||
<script type="text/javascript" src="../src/Reporter.js"></script>
|
<script type="text/javascript" src="../src/Reporter.js"></script>
|
||||||
<script type="text/javascript" src="../src/Block.js"></script>
|
<script type="text/javascript" src="../src/Block.js"></script>
|
||||||
|
|
||||||
<script type="text/javascript" src="../src/JsApiReporter.js"></script>
|
<script type="text/javascript" src="../src/JsApiReporter.js"></script>
|
||||||
<script type="text/javascript" src="../src/Matchers.js"></script>
|
<script type="text/javascript" src="../src/Matchers.js"></script>
|
||||||
<script type="text/javascript" src="../src/mock-timeout.js"></script>
|
<script type="text/javascript" src="../src/mock-timeout.js"></script>
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<script type="text/javascript" src="../src/Suite.js"></script>
|
<script type="text/javascript" src="../src/Suite.js"></script>
|
||||||
<script type="text/javascript" src="../src/WaitsBlock.js"></script>
|
<script type="text/javascript" src="../src/WaitsBlock.js"></script>
|
||||||
<script type="text/javascript" src="../src/WaitsForBlock.js"></script>
|
<script type="text/javascript" src="../src/WaitsForBlock.js"></script>
|
||||||
|
|
||||||
<script type="text/javascript" src="../lib/TrivialReporter.js"></script>
|
<script type="text/javascript" src="../lib/TrivialReporter.js"></script>
|
||||||
<script type="text/javascript" src="../lib/consolex.js"></script>
|
<script type="text/javascript" src="../lib/consolex.js"></script>
|
||||||
|
|
||||||
@@ -50,7 +50,8 @@
|
|||||||
<script type="text/javascript" src="suites/SpySpec.js"></script>
|
<script type="text/javascript" src="suites/SpySpec.js"></script>
|
||||||
<script type="text/javascript" src="suites/SuiteSpec.js"></script>
|
<script type="text/javascript" src="suites/SuiteSpec.js"></script>
|
||||||
<script type="text/javascript" src="suites/TrivialReporterSpec.js"></script>
|
<script type="text/javascript" src="suites/TrivialReporterSpec.js"></script>
|
||||||
|
<script type="text/javascript" src="suites/WaitsForBlockSpec.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
(function() {
|
(function() {
|
||||||
|
|||||||
@@ -861,7 +861,7 @@ describe("jasmine spec running", function () {
|
|||||||
expect(suiteResults.getItems()[2].getItems()[0].passed()).toEqual(true, "testAfterExecutesSafely 3rd suite spec should pass");
|
expect(suiteResults.getItems()[2].getItems()[0].passed()).toEqual(true, "testAfterExecutesSafely 3rd suite spec should pass");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("testNestedDescribes", function() {
|
it("should permit nested describes", function() {
|
||||||
var actions = [];
|
var actions = [];
|
||||||
|
|
||||||
env.beforeEach(function () {
|
env.beforeEach(function () {
|
||||||
@@ -953,6 +953,63 @@ describe("jasmine spec running", function () {
|
|||||||
expect(actions).toEqual(expected);
|
expect(actions).toEqual(expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should run multiple befores and afters in the order they are declared", function() {
|
||||||
|
var actions = [];
|
||||||
|
|
||||||
|
env.beforeEach(function () {
|
||||||
|
actions.push('runner beforeEach1');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.afterEach(function () {
|
||||||
|
actions.push('runner afterEach1');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.beforeEach(function () {
|
||||||
|
actions.push('runner beforeEach2');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.afterEach(function () {
|
||||||
|
actions.push('runner afterEach2');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.describe('Something', function() {
|
||||||
|
env.beforeEach(function() {
|
||||||
|
actions.push('beforeEach1');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.afterEach(function() {
|
||||||
|
actions.push('afterEach1');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.beforeEach(function() {
|
||||||
|
actions.push('beforeEach2');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.afterEach(function() {
|
||||||
|
actions.push('afterEach2');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.it('does it 1', function() {
|
||||||
|
actions.push('outer it 1');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
env.execute();
|
||||||
|
|
||||||
|
var expected = [
|
||||||
|
"runner beforeEach1",
|
||||||
|
"runner beforeEach2",
|
||||||
|
"beforeEach1",
|
||||||
|
"beforeEach2",
|
||||||
|
"outer it 1",
|
||||||
|
"afterEach2",
|
||||||
|
"afterEach1",
|
||||||
|
"runner afterEach2",
|
||||||
|
"runner afterEach1"
|
||||||
|
];
|
||||||
|
expect(actions).toEqual(expected);
|
||||||
|
});
|
||||||
|
|
||||||
it("builds up nested names", function() {
|
it("builds up nested names", function() {
|
||||||
var nestedSpec;
|
var nestedSpec;
|
||||||
env.describe('Test Subject', function() {
|
env.describe('Test Subject', function() {
|
||||||
@@ -1083,4 +1140,56 @@ describe("jasmine spec running", function () {
|
|||||||
expect(exceptionMessage).toEqual('explodes function should not have been called');
|
expect(exceptionMessage).toEqual('explodes function should not have been called');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should recover gracefully when there are errors in describe functions", function() {
|
||||||
|
var specs = [];
|
||||||
|
var superSimpleReporter = new jasmine.Reporter();
|
||||||
|
superSimpleReporter.reportSpecResults = function(spec) {
|
||||||
|
specs.push("Spec: " + spec.getFullName());
|
||||||
|
var results = spec.results().getItems();
|
||||||
|
for (var i = 0; i < results.length; i++) {
|
||||||
|
var result = results[i];
|
||||||
|
specs.push("Result: " + result);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
env.describe("outer1", function() {
|
||||||
|
env.describe("inner1", function() {
|
||||||
|
env.it("should thingy", function() {
|
||||||
|
this.expect(true).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
throw new Error("fake error");
|
||||||
|
});
|
||||||
|
|
||||||
|
env.describe("inner2", function() {
|
||||||
|
env.it("should other thingy", function() {
|
||||||
|
this.expect(true).toEqual(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} catch(e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
env.describe("outer2", function() {
|
||||||
|
env.it("should xxx", function() {
|
||||||
|
this.expect(true).toEqual(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
env.addReporter(superSimpleReporter);
|
||||||
|
env.execute();
|
||||||
|
|
||||||
|
expect(specs.join('')).toMatch(new RegExp(
|
||||||
|
'Spec: outer1 inner1 should thingy.' +
|
||||||
|
'Result: Passed.' +
|
||||||
|
'Spec: outer1 encountered a declaration exception.' +
|
||||||
|
'Result: Error: fake error.*' +
|
||||||
|
'Spec: outer1 inner2 should other thingy.' +
|
||||||
|
'Result: Passed.' +
|
||||||
|
'Spec: outer2 should xxx.' +
|
||||||
|
'Result: Passed.'
|
||||||
|
));
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
88
spec/suites/WaitsForBlockSpec.js
Normal file
88
spec/suites/WaitsForBlockSpec.js
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
describe('WaitsForBlock', function () {
|
||||||
|
var env, suite, timeout, spec, message, onComplete, fakeTimer;
|
||||||
|
beforeEach(function() {
|
||||||
|
env = new jasmine.Env();
|
||||||
|
env.updateInterval = 0;
|
||||||
|
suite = new jasmine.Suite(env, 'suite 1');
|
||||||
|
timeout = 1000;
|
||||||
|
spec = new jasmine.Spec(env, suite);
|
||||||
|
message = "some error message";
|
||||||
|
onComplete = jasmine.createSpy("onComplete");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('onComplete should be called if the latchFunction returns true', function () {
|
||||||
|
var latchFunction = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
var block = new jasmine.WaitsForBlock(env, timeout, latchFunction, message, spec);
|
||||||
|
expect(onComplete).wasNotCalled();
|
||||||
|
block.execute(onComplete);
|
||||||
|
expect(onComplete).wasCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('latchFunction should run in same scope as spec', function () {
|
||||||
|
var result;
|
||||||
|
var latchFunction = function() {
|
||||||
|
result = this.scopedValue;
|
||||||
|
};
|
||||||
|
spec.scopedValue = 'foo';
|
||||||
|
var block = new jasmine.WaitsForBlock(env, timeout, latchFunction, message, spec);
|
||||||
|
block.execute(onComplete);
|
||||||
|
expect(result).toEqual('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail spec and call onComplete if there is an error in the latchFunction', function() {
|
||||||
|
var latchFunction = jasmine.createSpy('latchFunction').andThrow('some error');
|
||||||
|
spyOn(spec, 'fail');
|
||||||
|
var block = new jasmine.WaitsForBlock(env, timeout, latchFunction, message, spec);
|
||||||
|
block.execute(onComplete);
|
||||||
|
expect(spec.fail).wasCalledWith('some error');
|
||||||
|
expect(onComplete).wasCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("if latchFunction returns false", function() {
|
||||||
|
var latchFunction, fakeTimer;
|
||||||
|
beforeEach(function() {
|
||||||
|
latchFunction = jasmine.createSpy('latchFunction').andReturn(false);
|
||||||
|
fakeTimer = new jasmine.FakeTimer();
|
||||||
|
env.setTimeout = fakeTimer.setTimeout;
|
||||||
|
env.clearTimeout = fakeTimer.clearTimeout;
|
||||||
|
env.setInterval = fakeTimer.setInterval;
|
||||||
|
env.clearInterval = fakeTimer.clearInterval;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('latchFunction should be retried after 100 ms', function () {
|
||||||
|
var block = new jasmine.WaitsForBlock(env, timeout, latchFunction, message, spec);
|
||||||
|
expect(latchFunction).wasNotCalled();
|
||||||
|
block.execute(onComplete);
|
||||||
|
expect(latchFunction.callCount).toEqual(1);
|
||||||
|
fakeTimer.tick(50);
|
||||||
|
expect(latchFunction.callCount).toEqual(1);
|
||||||
|
fakeTimer.tick(50);
|
||||||
|
expect(latchFunction.callCount).toEqual(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('onComplete should be called if latchFunction returns true before timeout', function () {
|
||||||
|
var block = new jasmine.WaitsForBlock(env, timeout, latchFunction, message, spec);
|
||||||
|
expect(onComplete).wasNotCalled();
|
||||||
|
block.execute(onComplete);
|
||||||
|
expect(onComplete).wasNotCalled();
|
||||||
|
latchFunction.andReturn(true);
|
||||||
|
fakeTimer.tick(100);
|
||||||
|
expect(onComplete).wasCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('spec should fail with the passed message if the timeout is reached (and not call onComplete)', function () {
|
||||||
|
spyOn(spec, 'fail');
|
||||||
|
var block = new jasmine.WaitsForBlock(env, timeout, latchFunction, message, spec);
|
||||||
|
block.execute(onComplete);
|
||||||
|
expect(spec.fail).wasNotCalled();
|
||||||
|
fakeTimer.tick(timeout);
|
||||||
|
expect(spec.fail).wasCalled();
|
||||||
|
var failMessage = spec.fail.mostRecentCall.args[0].message;
|
||||||
|
expect(failMessage).toMatch(message);
|
||||||
|
expect(onComplete).wasNotCalled();
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
13
src/Env.js
13
src/Env.js
@@ -96,10 +96,21 @@ jasmine.Env.prototype.describe = function(description, specDefinitions) {
|
|||||||
|
|
||||||
this.currentSuite = suite;
|
this.currentSuite = suite;
|
||||||
|
|
||||||
specDefinitions.call(suite);
|
var declarationError = null;
|
||||||
|
try {
|
||||||
|
specDefinitions.call(suite);
|
||||||
|
} catch(e) {
|
||||||
|
declarationError = e;
|
||||||
|
}
|
||||||
|
|
||||||
this.currentSuite = parentSuite;
|
this.currentSuite = parentSuite;
|
||||||
|
|
||||||
|
if (declarationError) {
|
||||||
|
this.it("encountered a declaration exception", function() {
|
||||||
|
throw declarationError;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return suite;
|
return suite;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -25,12 +25,12 @@ jasmine.Runner.prototype.execute = function() {
|
|||||||
|
|
||||||
jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
|
jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
|
||||||
beforeEachFunction.typeName = 'beforeEach';
|
beforeEachFunction.typeName = 'beforeEach';
|
||||||
this.before_.push(beforeEachFunction);
|
this.before_.splice(0,0,beforeEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
|
jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
|
||||||
afterEachFunction.typeName = 'afterEach';
|
afterEachFunction.typeName = 'afterEach';
|
||||||
this.after_.push(afterEachFunction);
|
this.after_.splice(0,0,afterEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -37,12 +37,12 @@ jasmine.Suite.prototype.finish = function(onComplete) {
|
|||||||
|
|
||||||
jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
|
jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
|
||||||
beforeEachFunction.typeName = 'beforeEach';
|
beforeEachFunction.typeName = 'beforeEach';
|
||||||
this.before_.push(beforeEachFunction);
|
this.before_.unshift(beforeEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
|
jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
|
||||||
afterEachFunction.typeName = 'afterEach';
|
afterEachFunction.typeName = 'afterEach';
|
||||||
this.after_.push(afterEachFunction);
|
this.after_.unshift(afterEachFunction);
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.Suite.prototype.results = function() {
|
jasmine.Suite.prototype.results = function() {
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ jasmine.WaitsForBlock.prototype.execute = function (onComplete) {
|
|||||||
name: 'timeout',
|
name: 'timeout',
|
||||||
message: message
|
message: message
|
||||||
});
|
});
|
||||||
self.spec._next();
|
|
||||||
} else {
|
} else {
|
||||||
self.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
|
self.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
|
||||||
self.env.setTimeout(function () { self.execute(onComplete); }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
|
self.env.setTimeout(function () { self.execute(onComplete); }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
|
||||||
|
|||||||
@@ -57,6 +57,10 @@ jasmine.MessageResult = function(text) {
|
|||||||
this.trace = new Error(); // todo: test better
|
this.trace = new Error(); // todo: test better
|
||||||
};
|
};
|
||||||
|
|
||||||
|
jasmine.MessageResult.prototype.toString = function() {
|
||||||
|
return this.text;
|
||||||
|
};
|
||||||
|
|
||||||
jasmine.ExpectationResult = function(params) {
|
jasmine.ExpectationResult = function(params) {
|
||||||
this.type = 'ExpectationResult';
|
this.type = 'ExpectationResult';
|
||||||
this.matcherName = params.matcherName;
|
this.matcherName = params.matcherName;
|
||||||
@@ -71,6 +75,10 @@ jasmine.ExpectationResult = function(params) {
|
|||||||
this.trace = this.passed_ ? '' : new Error(this.message);
|
this.trace = this.passed_ ? '' : new Error(this.message);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
jasmine.ExpectationResult.prototype.toString = function () {
|
||||||
|
return this.message;
|
||||||
|
};
|
||||||
|
|
||||||
jasmine.ExpectationResult.prototype.passed = function () {
|
jasmine.ExpectationResult.prototype.passed = function () {
|
||||||
return this.passed_;
|
return this.passed_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,177 +1,177 @@
|
|||||||
// Mock setTimeout, clearTimeout
|
// Mock setTimeout, clearTimeout
|
||||||
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
|
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
|
||||||
|
|
||||||
jasmine.FakeTimer = function() {
|
jasmine.FakeTimer = function() {
|
||||||
this.reset();
|
this.reset();
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
self.setTimeout = function(funcToCall, millis) {
|
self.setTimeout = function(funcToCall, millis) {
|
||||||
self.timeoutsMade++;
|
self.timeoutsMade++;
|
||||||
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
|
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
|
||||||
return self.timeoutsMade;
|
return self.timeoutsMade;
|
||||||
};
|
};
|
||||||
|
|
||||||
self.setInterval = function(funcToCall, millis) {
|
self.setInterval = function(funcToCall, millis) {
|
||||||
self.timeoutsMade++;
|
self.timeoutsMade++;
|
||||||
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
|
self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
|
||||||
return self.timeoutsMade;
|
return self.timeoutsMade;
|
||||||
};
|
};
|
||||||
|
|
||||||
self.clearTimeout = function(timeoutKey) {
|
self.clearTimeout = function(timeoutKey) {
|
||||||
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
self.clearInterval = function(timeoutKey) {
|
self.clearInterval = function(timeoutKey) {
|
||||||
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
self.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.reset = function() {
|
jasmine.FakeTimer.prototype.reset = function() {
|
||||||
this.timeoutsMade = 0;
|
this.timeoutsMade = 0;
|
||||||
this.scheduledFunctions = {};
|
this.scheduledFunctions = {};
|
||||||
this.nowMillis = 0;
|
this.nowMillis = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.tick = function(millis) {
|
jasmine.FakeTimer.prototype.tick = function(millis) {
|
||||||
var oldMillis = this.nowMillis;
|
var oldMillis = this.nowMillis;
|
||||||
var newMillis = oldMillis + millis;
|
var newMillis = oldMillis + millis;
|
||||||
this.runFunctionsWithinRange(oldMillis, newMillis);
|
this.runFunctionsWithinRange(oldMillis, newMillis);
|
||||||
this.nowMillis = newMillis;
|
this.nowMillis = newMillis;
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
|
jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
|
||||||
var scheduledFunc;
|
var scheduledFunc;
|
||||||
var funcsToRun = [];
|
var funcsToRun = [];
|
||||||
for (var timeoutKey in this.scheduledFunctions) {
|
for (var timeoutKey in this.scheduledFunctions) {
|
||||||
scheduledFunc = this.scheduledFunctions[timeoutKey];
|
scheduledFunc = this.scheduledFunctions[timeoutKey];
|
||||||
if (scheduledFunc != jasmine.undefined &&
|
if (scheduledFunc != jasmine.undefined &&
|
||||||
scheduledFunc.runAtMillis >= oldMillis &&
|
scheduledFunc.runAtMillis >= oldMillis &&
|
||||||
scheduledFunc.runAtMillis <= nowMillis) {
|
scheduledFunc.runAtMillis <= nowMillis) {
|
||||||
funcsToRun.push(scheduledFunc);
|
funcsToRun.push(scheduledFunc);
|
||||||
this.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
this.scheduledFunctions[timeoutKey] = jasmine.undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (funcsToRun.length > 0) {
|
if (funcsToRun.length > 0) {
|
||||||
funcsToRun.sort(function(a, b) {
|
funcsToRun.sort(function(a, b) {
|
||||||
return a.runAtMillis - b.runAtMillis;
|
return a.runAtMillis - b.runAtMillis;
|
||||||
});
|
});
|
||||||
for (var i = 0; i < funcsToRun.length; ++i) {
|
for (var i = 0; i < funcsToRun.length; ++i) {
|
||||||
try {
|
try {
|
||||||
var funcToRun = funcsToRun[i];
|
var funcToRun = funcsToRun[i];
|
||||||
this.nowMillis = funcToRun.runAtMillis;
|
this.nowMillis = funcToRun.runAtMillis;
|
||||||
funcToRun.funcToCall();
|
funcToRun.funcToCall();
|
||||||
if (funcToRun.recurring) {
|
if (funcToRun.recurring) {
|
||||||
this.scheduleFunction(funcToRun.timeoutKey,
|
this.scheduleFunction(funcToRun.timeoutKey,
|
||||||
funcToRun.funcToCall,
|
funcToRun.funcToCall,
|
||||||
funcToRun.millis,
|
funcToRun.millis,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.runFunctionsWithinRange(oldMillis, nowMillis);
|
this.runFunctionsWithinRange(oldMillis, nowMillis);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
|
jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
|
||||||
this.scheduledFunctions[timeoutKey] = {
|
this.scheduledFunctions[timeoutKey] = {
|
||||||
runAtMillis: this.nowMillis + millis,
|
runAtMillis: this.nowMillis + millis,
|
||||||
funcToCall: funcToCall,
|
funcToCall: funcToCall,
|
||||||
recurring: recurring,
|
recurring: recurring,
|
||||||
timeoutKey: timeoutKey,
|
timeoutKey: timeoutKey,
|
||||||
millis: millis
|
millis: millis
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @namespace
|
* @namespace
|
||||||
*/
|
*/
|
||||||
jasmine.Clock = {
|
jasmine.Clock = {
|
||||||
defaultFakeTimer: new jasmine.FakeTimer(),
|
defaultFakeTimer: new jasmine.FakeTimer(),
|
||||||
|
|
||||||
reset: function() {
|
reset: function() {
|
||||||
jasmine.Clock.assertInstalled();
|
jasmine.Clock.assertInstalled();
|
||||||
jasmine.Clock.defaultFakeTimer.reset();
|
jasmine.Clock.defaultFakeTimer.reset();
|
||||||
},
|
},
|
||||||
|
|
||||||
tick: function(millis) {
|
tick: function(millis) {
|
||||||
jasmine.Clock.assertInstalled();
|
jasmine.Clock.assertInstalled();
|
||||||
jasmine.Clock.defaultFakeTimer.tick(millis);
|
jasmine.Clock.defaultFakeTimer.tick(millis);
|
||||||
},
|
},
|
||||||
|
|
||||||
runFunctionsWithinRange: function(oldMillis, nowMillis) {
|
runFunctionsWithinRange: function(oldMillis, nowMillis) {
|
||||||
jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
|
jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
|
||||||
},
|
},
|
||||||
|
|
||||||
scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
|
scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
|
||||||
jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
|
jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
|
||||||
},
|
},
|
||||||
|
|
||||||
useMock: function() {
|
useMock: function() {
|
||||||
var spec = jasmine.getEnv().currentSpec;
|
var spec = jasmine.getEnv().currentSpec;
|
||||||
spec.after(jasmine.Clock.uninstallMock);
|
spec.after(jasmine.Clock.uninstallMock);
|
||||||
|
|
||||||
jasmine.Clock.installMock();
|
jasmine.Clock.installMock();
|
||||||
},
|
},
|
||||||
|
|
||||||
installMock: function() {
|
installMock: function() {
|
||||||
jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
|
jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
|
||||||
},
|
},
|
||||||
|
|
||||||
uninstallMock: function() {
|
uninstallMock: function() {
|
||||||
jasmine.Clock.assertInstalled();
|
jasmine.Clock.assertInstalled();
|
||||||
jasmine.Clock.installed = jasmine.Clock.real;
|
jasmine.Clock.installed = jasmine.Clock.real;
|
||||||
},
|
},
|
||||||
|
|
||||||
real: {
|
real: {
|
||||||
setTimeout: window.setTimeout,
|
setTimeout: window.setTimeout,
|
||||||
clearTimeout: window.clearTimeout,
|
clearTimeout: window.clearTimeout,
|
||||||
setInterval: window.setInterval,
|
setInterval: window.setInterval,
|
||||||
clearInterval: window.clearInterval
|
clearInterval: window.clearInterval
|
||||||
},
|
},
|
||||||
|
|
||||||
assertInstalled: function() {
|
assertInstalled: function() {
|
||||||
if (jasmine.Clock.installed != jasmine.Clock.defaultFakeTimer) {
|
if (jasmine.Clock.installed != jasmine.Clock.defaultFakeTimer) {
|
||||||
throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
|
throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
installed: null
|
installed: null
|
||||||
};
|
};
|
||||||
jasmine.Clock.installed = jasmine.Clock.real;
|
jasmine.Clock.installed = jasmine.Clock.real;
|
||||||
|
|
||||||
//else for IE support
|
//else for IE support
|
||||||
window.setTimeout = function(funcToCall, millis) {
|
window.setTimeout = function(funcToCall, millis) {
|
||||||
if (jasmine.Clock.installed.setTimeout.apply) {
|
if (jasmine.Clock.installed.setTimeout.apply) {
|
||||||
return jasmine.Clock.installed.setTimeout.apply(this, arguments);
|
return jasmine.Clock.installed.setTimeout.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.setTimeout(funcToCall, millis);
|
return jasmine.Clock.installed.setTimeout(funcToCall, millis);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window.setInterval = function(funcToCall, millis) {
|
window.setInterval = function(funcToCall, millis) {
|
||||||
if (jasmine.Clock.installed.setInterval.apply) {
|
if (jasmine.Clock.installed.setInterval.apply) {
|
||||||
return jasmine.Clock.installed.setInterval.apply(this, arguments);
|
return jasmine.Clock.installed.setInterval.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.setInterval(funcToCall, millis);
|
return jasmine.Clock.installed.setInterval(funcToCall, millis);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window.clearTimeout = function(timeoutKey) {
|
window.clearTimeout = function(timeoutKey) {
|
||||||
if (jasmine.Clock.installed.clearTimeout.apply) {
|
if (jasmine.Clock.installed.clearTimeout.apply) {
|
||||||
return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
|
return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.clearTimeout(timeoutKey);
|
return jasmine.Clock.installed.clearTimeout(timeoutKey);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window.clearInterval = function(timeoutKey) {
|
window.clearInterval = function(timeoutKey) {
|
||||||
if (jasmine.Clock.installed.clearTimeout.apply) {
|
if (jasmine.Clock.installed.clearTimeout.apply) {
|
||||||
return jasmine.Clock.installed.clearInterval.apply(this, arguments);
|
return jasmine.Clock.installed.clearInterval.apply(this, arguments);
|
||||||
} else {
|
} else {
|
||||||
return jasmine.Clock.installed.clearInterval(timeoutKey);
|
return jasmine.Clock.installed.clearInterval(timeoutKey);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"major": 0,
|
"major": 0,
|
||||||
"minor": 10,
|
"minor": 10,
|
||||||
"build": 3
|
"build": 4
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user