From 3a518b2a3c3bdff5b038bec0bae8d8be48f61727 Mon Sep 17 00:00:00 2001 From: Christian Williams Date: Thu, 9 Jul 2009 11:17:58 -0700 Subject: [PATCH 01/19] Move jasmine_runner.rb to emi/jasmine fork. --- contrib/ruby/jasmine_runner.rb | 68 ++++++++++++++++++++++++++++++++++ contrib/ruby/run.html | 26 +++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 contrib/ruby/jasmine_runner.rb create mode 100644 contrib/ruby/run.html diff --git a/contrib/ruby/jasmine_runner.rb b/contrib/ruby/jasmine_runner.rb new file mode 100644 index 00000000..3565e639 --- /dev/null +++ b/contrib/ruby/jasmine_runner.rb @@ -0,0 +1,68 @@ +require 'erb' + +module Jasmine + class RunAdapter + def initialize(spec_files) + p "spec_files: #{spec_files}" + + @spec_files = spec_files + end + + def call(env) + spec_files = @spec_files + body = ERB.new(File.read(File.join(File.dirname(__FILE__), "run.html"))).result(binding) + [ + 200, + { 'Content-Type' => 'text/html' }, + body + ] + end + end + + class SimpleServer + def self.start(spec_dir, mappings) + require "thin" + + config = { + '/run.html' => Jasmine::RunAdapter.new(spec_dir) + } + mappings.each do |from, to| + config[from] = Rack::File.new(to) + end + + app = Rack::URLMap.new(config) + + Thin::Server.start('0.0.0.0', 8080, app) + end + end + + class SimpleClient + def initialize(selenium_host, selenium_port, selenium_browser_start_command, http_address) + require 'selenium' + @driver = Selenium::Client::Driver.new( + selenium_host, + selenium_port, + selenium_browser_start_command, + http_address + ) + @http_address = http_address + end + + def tests_have_finished? + @driver.get_eval("window.jasmine.getEnv().currentRunner.finished") == "true" + end + + def run() + @driver.start + @driver.open(@http_address) + + until tests_have_finished? do + sleep 0.1 + end + + puts @driver.get_eval("window.getResults()") + failed_count = @driver.get_eval("window.jasmine.getEnv().currentRunner.getResults().failedCount").to_i + failed_count == 0 + end + end +end diff --git a/contrib/ruby/run.html b/contrib/ruby/run.html new file mode 100644 index 00000000..53879183 --- /dev/null +++ b/contrib/ruby/run.html @@ -0,0 +1,26 @@ + + + + + Jasmine suite + + + + + + + + <% spec_files.each do |spec_file| %> + + <% end %> + + +
+ + From ae610eca0d7796cc024edbc34e6daa49341bdb8f Mon Sep 17 00:00:00 2001 From: Christian Williams & Aaron Peckham Date: Thu, 9 Jul 2009 18:14:10 -0700 Subject: [PATCH 02/19] Created Jasmine::Runner, added rspec builder. --- contrib/ruby/jasmine_runner.rb | 35 +++++++++ contrib/ruby/jasmine_spec_builder.rb | 112 +++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 contrib/ruby/jasmine_spec_builder.rb diff --git a/contrib/ruby/jasmine_runner.rb b/contrib/ruby/jasmine_runner.rb index 3565e639..028fb3d5 100644 --- a/contrib/ruby/jasmine_runner.rb +++ b/contrib/ruby/jasmine_runner.rb @@ -65,4 +65,39 @@ module Jasmine failed_count == 0 end end + + class Runner + def initialize(selenium_jar_path, spec_files, dir_mappings) + @selenium_jar_path = selenium_jar_path + @spec_files = spec_files + @dir_mappings = dir_mappings + end + + def run + selenium_pid = nil + jasmine_server_pid = nil + begin + selenium_pid = fork do + exec "java -jar #{@selenium_jar_path}" + end + puts "selenium started. pid is #{selenium_pid}" + + jasmine_server_pid = fork do + Jasmine::SimpleServer.start(@spec_files, @dir_mappings) + end + puts "jasmine server started. pid is #{jasmine_server_pid}" + + wait_for_listener(4444, "selenium server") + wait_for_listener(8080, "jasmine server") + + puts "servers are listening on their ports -- running the test script..." + tests_passed = Jasmine::SimpleClient.new("localhost", 4444, "*firefox", "http://localhost:8080/run.html").run + ensure + puts "shutting down the servers..." + Process.kill 15, selenium_pid if selenium_pid + Process.kill 15, jasmine_server_pid if jasmine_server_pid + end + return tests_passed + end + end end diff --git a/contrib/ruby/jasmine_spec_builder.rb b/contrib/ruby/jasmine_spec_builder.rb new file mode 100644 index 00000000..c9af0fd2 --- /dev/null +++ b/contrib/ruby/jasmine_spec_builder.rb @@ -0,0 +1,112 @@ +require File.expand_path(File.join(File.dirname(__FILE__), "jasmine_runner.rb")) + +module Jasmine + + class RemoteResults + attr_accessor :suites + + def initialize(spec_files) + @spec_files = spec_files + guess_example_locations + load_suite_info + @spec_results = {} + end + + def script_path + File.expand_path(__FILE__) + end + + def guess_example_locations + @example_locations = {} + + example_name_parts = [] + previous_indent_level = 0 + @spec_files.each do |filename| + line_number = 1 + File.open(filename, "r") do |file| + file.readlines.each do |line| + match = /^(\s*)(describe|it)\s*\(\s*["'](.*)["']\s*,\s*function/.match(line) + if (match) + indent_level = match[1].length / 2 + example_name = match[3] + example_name_parts[indent_level] = example_name + + full_example_name = example_name_parts.slice(0, indent_level + 1).join(" ") + @example_locations[full_example_name] = "#{filename}:#{line_number}: in `it'" + end + line_number += 1 + end + end + end + end + + def load_suite_info + while eval('typeof reportingBridge == "undefined" || !!!reportingBridge.suiteInfoReady') do + sleep 0.1 + end + + @suites = eval('Object.toJSON(reportingBridge.suiteInfo)') + end + + def results_for(spec_id) + spec_id = spec_id.to_s + return @spec_results[spec_id] if @spec_results[spec_id] + + @spec_results[spec_id] = eval("Object.toJSON(reportingBridge.specResults[#{spec_id}])") + while @spec_results[spec_id].nil? do + sleep 0.1 + @spec_results[spec_id] = eval("Object.toJSON(reportingBridge.specResults[#{spec_id}])") + end + + @spec_results[spec_id] + end + + def declare_suites + me = self + suites.each do |suite| + declare_suite(self, suite) + end + end + + def declare_suite(parent, suite) + me = self + parent.describe suite["name"] do + suite["children"].each do |suite_or_spec| + type = suite_or_spec["type"] + if type == "suite" + me.declare_suite(self, suite_or_spec) + elsif type == "spec" + me.declare_spec(self, suite_or_spec) + else + raise "unknown type #{type}" + end + end + end + end + + def declare_spec(parent, spec) + me = self + example_name = spec["name"] + + backtrace = @example_locations[parent.description + " " + example_name] + parent.it example_name, {}, backtrace do + me.report_spec(spec["id"]) + end + end + + def report_spec(spec_id) + spec_results = results_for(spec_id) + + messages = spec_results['messages'].join "\n---\n" + puts messages + fail messages if (spec_results['result'] != 'passed') + end + + private + + def eval(js) + @runner.eval(js) + end + end +end + \ No newline at end of file From 8b7ecc3f5c5c96f271cd94e256ff16d04e7a8613 Mon Sep 17 00:00:00 2001 From: Christian Williams & Aaron Peckham Date: Thu, 9 Jul 2009 18:25:04 -0700 Subject: [PATCH 03/19] Be smarter about picking a server port, so multiple instances could run on the same box --- contrib/ruby/jasmine_runner.rb | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/contrib/ruby/jasmine_runner.rb b/contrib/ruby/jasmine_runner.rb index 028fb3d5..e6294910 100644 --- a/contrib/ruby/jasmine_runner.rb +++ b/contrib/ruby/jasmine_runner.rb @@ -1,6 +1,14 @@ +require 'socket' require 'erb' module Jasmine + def self.find_unused_port + socket = TCPserver.open(0) + port = socket.addr[1] + socket.close + port + end + class RunAdapter def initialize(spec_files) p "spec_files: #{spec_files}" @@ -20,7 +28,7 @@ module Jasmine end class SimpleServer - def self.start(spec_dir, mappings) + def self.start(port, spec_dir, mappings) require "thin" config = { @@ -32,7 +40,8 @@ module Jasmine app = Rack::URLMap.new(config) - Thin::Server.start('0.0.0.0', 8080, app) + server_port = Jasmine::find_unused_port + Thin::Server.start('0.0.0.0', port, app) end end @@ -54,7 +63,7 @@ module Jasmine def run() @driver.start - @driver.open(@http_address) + @driver.open("/run.html") until tests_have_finished? do sleep 0.1 @@ -77,21 +86,24 @@ module Jasmine selenium_pid = nil jasmine_server_pid = nil begin + jasmine_server_port = Jasmine::find_unused_port + selenium_server_port = Jasmine::find_unused_port + selenium_pid = fork do - exec "java -jar #{@selenium_jar_path}" + exec "java -jar #{@selenium_jar_path} -port #{selenium_server_port}" end puts "selenium started. pid is #{selenium_pid}" jasmine_server_pid = fork do - Jasmine::SimpleServer.start(@spec_files, @dir_mappings) + Jasmine::SimpleServer.start(jasmine_server_port, @spec_files, @dir_mappings) end puts "jasmine server started. pid is #{jasmine_server_pid}" - wait_for_listener(4444, "selenium server") - wait_for_listener(8080, "jasmine server") + wait_for_listener(selenium_server_port, "selenium server") + wait_for_listener(jasmine_server_port, "jasmine server") puts "servers are listening on their ports -- running the test script..." - tests_passed = Jasmine::SimpleClient.new("localhost", 4444, "*firefox", "http://localhost:8080/run.html").run + tests_passed = Jasmine::SimpleClient.new("localhost", selenium_server_port, "*firefox", "http://localhost:#{jasmine_server_port}/").run ensure puts "shutting down the servers..." Process.kill 15, selenium_pid if selenium_pid From fe7c91220f705d165c608022d41c39f349239884 Mon Sep 17 00:00:00 2001 From: Christian Williams & Aaron Peckham Date: Fri, 10 Jul 2009 10:14:27 -0700 Subject: [PATCH 04/19] Exposing eval_js and more interface. --- contrib/ruby/jasmine_runner.rb | 101 +++++++++++++++++++++------ contrib/ruby/jasmine_spec_builder.rb | 19 +++-- 2 files changed, 90 insertions(+), 30 deletions(-) diff --git a/contrib/ruby/jasmine_runner.rb b/contrib/ruby/jasmine_runner.rb index e6294910..109fa431 100644 --- a/contrib/ruby/jasmine_runner.rb +++ b/contrib/ruby/jasmine_runner.rb @@ -61,10 +61,16 @@ module Jasmine @driver.get_eval("window.jasmine.getEnv().currentRunner.finished") == "true" end - def run() + def connect @driver.start @driver.open("/run.html") + end + def disconnect + @driver.stop + end + + def run until tests_have_finished? do sleep 0.1 end @@ -73,6 +79,12 @@ module Jasmine failed_count = @driver.get_eval("window.jasmine.getEnv().currentRunner.getResults().failedCount").to_i failed_count == 0 end + + def eval_js(script) + escaped_script = "'" + script.gsub(/(['\\])/) { '\\' + $1 } + "'" + + @driver.get_eval("window.eval(#{escaped_script})") + end end class Runner @@ -80,36 +92,79 @@ module Jasmine @selenium_jar_path = selenium_jar_path @spec_files = spec_files @dir_mappings = dir_mappings + + @selenium_pid = nil + @jasmine_server_pid = nil + end + + def start + start_servers + @client = Jasmine::SimpleClient.new("localhost", @selenium_server_port, "*firefox", "http://localhost:#{@jasmine_server_port}/") + @client.connect + end + + def stop + @client.disconnect + stop_servers + end + + def server_is_listening_on(hostname, port) + require 'socket' + begin + socket = TCPSocket.open(hostname, port) + rescue Errno::ECONNREFUSED + return false + end + socket.close + true + end + + def wait_for_listener(port, name = "required process", seconds_to_wait = 10) + seconds_waited = 0 + until server_is_listening_on "localhost", port + sleep 1 + puts "Waiting for #{name} on #{port}..." + raise "#{name} didn't show up on port #{port} after #{seconds_to_wait} seconds." if (seconds_waited += 1) >= seconds_to_wait + end + end + + def start_servers + @jasmine_server_port = Jasmine::find_unused_port + @selenium_server_port = Jasmine::find_unused_port + + @selenium_pid = fork do + exec "java -jar #{@selenium_jar_path} -port #{@selenium_server_port}" + end + puts "selenium started. pid is #{@selenium_pid}" + + @jasmine_server_pid = fork do + Jasmine::SimpleServer.start(@jasmine_server_port, @spec_files, @dir_mappings) + end + puts "jasmine server started. pid is #{@jasmine_server_pid}" + + wait_for_listener(@selenium_server_port, "selenium server") + wait_for_listener(@jasmine_server_port, "jasmine server") + end + + def stop_servers + puts "shutting down the servers..." + Process.kill 15, @selenium_pid if @selenium_pid + Process.kill 15, @jasmine_server_pid if @jasmine_server_pid end def run - selenium_pid = nil - jasmine_server_pid = nil begin - jasmine_server_port = Jasmine::find_unused_port - selenium_server_port = Jasmine::find_unused_port - - selenium_pid = fork do - exec "java -jar #{@selenium_jar_path} -port #{selenium_server_port}" - end - puts "selenium started. pid is #{selenium_pid}" - - jasmine_server_pid = fork do - Jasmine::SimpleServer.start(jasmine_server_port, @spec_files, @dir_mappings) - end - puts "jasmine server started. pid is #{jasmine_server_pid}" - - wait_for_listener(selenium_server_port, "selenium server") - wait_for_listener(jasmine_server_port, "jasmine server") - + start puts "servers are listening on their ports -- running the test script..." - tests_passed = Jasmine::SimpleClient.new("localhost", selenium_server_port, "*firefox", "http://localhost:#{jasmine_server_port}/").run + tests_passed = @client.run ensure - puts "shutting down the servers..." - Process.kill 15, selenium_pid if selenium_pid - Process.kill 15, jasmine_server_pid if jasmine_server_pid + stop end return tests_passed end + + def eval_js(script) + @client.eval_js(script) + end end end diff --git a/contrib/ruby/jasmine_spec_builder.rb b/contrib/ruby/jasmine_spec_builder.rb index c9af0fd2..22f4d165 100644 --- a/contrib/ruby/jasmine_spec_builder.rb +++ b/contrib/ruby/jasmine_spec_builder.rb @@ -5,11 +5,16 @@ module Jasmine class RemoteResults attr_accessor :suites - def initialize(spec_files) + def initialize(spec_files, runner) @spec_files = spec_files + @runner = runner + guess_example_locations + + @runner.start load_suite_info @spec_results = {} + end def script_path @@ -41,21 +46,21 @@ module Jasmine end def load_suite_info - while eval('typeof reportingBridge == "undefined" || !!!reportingBridge.suiteInfoReady') do + while eval_js('typeof reportingBridge == "undefined" || !!!reportingBridge.suiteInfoReady') do sleep 0.1 end - @suites = eval('Object.toJSON(reportingBridge.suiteInfo)') + @suites = eval_js('Object.toJSON(reportingBridge.suiteInfo)') end def results_for(spec_id) spec_id = spec_id.to_s return @spec_results[spec_id] if @spec_results[spec_id] - @spec_results[spec_id] = eval("Object.toJSON(reportingBridge.specResults[#{spec_id}])") + @spec_results[spec_id] = eval_js("Object.toJSON(reportingBridge.specResults[#{spec_id}])") while @spec_results[spec_id].nil? do sleep 0.1 - @spec_results[spec_id] = eval("Object.toJSON(reportingBridge.specResults[#{spec_id}])") + @spec_results[spec_id] = eval_js("Object.toJSON(reportingBridge.specResults[#{spec_id}])") end @spec_results[spec_id] @@ -104,8 +109,8 @@ module Jasmine private - def eval(js) - @runner.eval(js) + def eval_js(js) + @runner.eval_js(js) end end end From d378ce76e558d875bdedd8c066d6a6391cce5911 Mon Sep 17 00:00:00 2001 From: Christian Williams & Aaron Peckham Date: Fri, 10 Jul 2009 10:31:34 -0700 Subject: [PATCH 05/19] More work on meta_spec.rb. --- contrib/ruby/jasmine_spec_builder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ruby/jasmine_spec_builder.rb b/contrib/ruby/jasmine_spec_builder.rb index 22f4d165..a1ce80d8 100644 --- a/contrib/ruby/jasmine_spec_builder.rb +++ b/contrib/ruby/jasmine_spec_builder.rb @@ -46,7 +46,7 @@ module Jasmine end def load_suite_info - while eval_js('typeof reportingBridge == "undefined" || !!!reportingBridge.suiteInfoReady') do + while !eval_js('jasmine.getEnv().currentRunner.finished') do sleep 0.1 end From 5b695d3debc19e9de4fbf7b28950e95fc4245ad3 Mon Sep 17 00:00:00 2001 From: Christian Williams & Aaron Peckham Date: Fri, 10 Jul 2009 14:35:24 -0700 Subject: [PATCH 06/19] Report spec results properly. --- contrib/ruby/jasmine_runner.rb | 5 ++- contrib/ruby/jasmine_spec_builder.rb | 34 +++++++++++----- contrib/ruby/run.html | 5 ++- lib/jasmine.js | 60 +++++++++++++++++++++++++++- src/JsApiReporter.js | 58 +++++++++++++++++++++++++++ src/Reporter.js | 2 +- 6 files changed, 150 insertions(+), 14 deletions(-) create mode 100644 src/JsApiReporter.js diff --git a/contrib/ruby/jasmine_runner.rb b/contrib/ruby/jasmine_runner.rb index 109fa431..72c76c9d 100644 --- a/contrib/ruby/jasmine_runner.rb +++ b/contrib/ruby/jasmine_runner.rb @@ -29,7 +29,7 @@ module Jasmine class SimpleServer def self.start(port, spec_dir, mappings) - require "thin" + require 'thin' config = { '/run.html' => Jasmine::RunAdapter.new(spec_dir) @@ -83,7 +83,8 @@ module Jasmine def eval_js(script) escaped_script = "'" + script.gsub(/(['\\])/) { '\\' + $1 } + "'" - @driver.get_eval("window.eval(#{escaped_script})") + result = @driver.get_eval("window.eval(#{escaped_script})") + JSON.parse("[#{result}]")[0] end end diff --git a/contrib/ruby/jasmine_spec_builder.rb b/contrib/ruby/jasmine_spec_builder.rb index a1ce80d8..31cf26c5 100644 --- a/contrib/ruby/jasmine_spec_builder.rb +++ b/contrib/ruby/jasmine_spec_builder.rb @@ -8,13 +8,18 @@ module Jasmine def initialize(spec_files, runner) @spec_files = spec_files @runner = runner - + end + + def start guess_example_locations @runner.start load_suite_info @spec_results = {} + end + def stop + @runner.stop end def script_path @@ -46,21 +51,21 @@ module Jasmine end def load_suite_info - while !eval_js('jasmine.getEnv().currentRunner.finished') do + while !eval_js('jsApiReporter.started') do sleep 0.1 end - @suites = eval_js('Object.toJSON(reportingBridge.suiteInfo)') + @suites = eval_js('JSON.stringify(jsApiReporter.suites)') end def results_for(spec_id) spec_id = spec_id.to_s return @spec_results[spec_id] if @spec_results[spec_id] - @spec_results[spec_id] = eval_js("Object.toJSON(reportingBridge.specResults[#{spec_id}])") + @spec_results[spec_id] = eval_js("JSON.stringify(jsApiReporter.results[#{spec_id}])") while @spec_results[spec_id].nil? do sleep 0.1 - @spec_results[spec_id] = eval_js("Object.toJSON(reportingBridge.specResults[#{spec_id}])") + @spec_results[spec_id] = eval_js("JSON.stringify(jsApiReporter.results[#{spec_id}])") end @spec_results[spec_id] @@ -83,7 +88,7 @@ module Jasmine elsif type == "spec" me.declare_spec(self, suite_or_spec) else - raise "unknown type #{type}" + raise "unknown type #{type} for #{suite_or_spec.inspect}" end end end @@ -102,9 +107,20 @@ module Jasmine def report_spec(spec_id) spec_results = results_for(spec_id) - messages = spec_results['messages'].join "\n---\n" - puts messages - fail messages if (spec_results['result'] != 'passed') + out = "" + messages = spec_results['messages'].each do |message| + out << message["message"] + out << "\n" + + unless message["passed"] + stack_trace = message["trace"]["stack"] + out << stack_trace.gsub(/\(.*\)@http:\/\/localhost:[0-9]+\/specs\//, "/spec/") + out << "\n" + end + + end + fail out unless spec_results['result'] == 'passed' + puts out end private diff --git a/contrib/ruby/run.html b/contrib/ruby/run.html index 53879183..7ddbe809 100644 --- a/contrib/ruby/run.html +++ b/contrib/ruby/run.html @@ -4,13 +4,16 @@ Jasmine suite + + + diff --git a/src/Env.js b/src/Env.js index fd4dc70d..851adce2 100644 --- a/src/Env.js +++ b/src/Env.js @@ -18,6 +18,7 @@ jasmine.Env = function() { }; this.nextSpecId_ = 0; + this.nextSuiteId_ = 0; this.equalityTesters_ = []; }; diff --git a/src/NestedResults.js b/src/NestedResults.js index c5fabf7f..4e4842fa 100644 --- a/src/NestedResults.js +++ b/src/NestedResults.js @@ -75,6 +75,6 @@ jasmine.NestedResults.prototype.addResult = function(result) { /** * @returns {Boolean} True if everything below passed */ -jasmine.NestedResults.prototype.passed = function() { +jasmine.NestedResults.prototype.__defineGetter__('passed', function() { return this.passedCount === this.totalCount; -}; +}); diff --git a/src/PrettyPrinter.js b/src/PrettyPrinter.js index 9d8f4f96..9bf7083e 100644 --- a/src/PrettyPrinter.js +++ b/src/PrettyPrinter.js @@ -28,7 +28,7 @@ jasmine.PrettyPrinter.prototype.format = function(value) { } else if (value instanceof jasmine.Matchers.Any) { this.emitScalar(value.toString()); } else if (typeof value === 'string') { - this.emitScalar("'" + value + "'"); + this.emitScalar(value); } else if (typeof value === 'function') { this.emitScalar('Function'); } else if (typeof value.nodeType === 'number') { diff --git a/src/Suite.js b/src/Suite.js index 60ac46c0..9113ecab 100644 --- a/src/Suite.js +++ b/src/Suite.js @@ -9,7 +9,8 @@ */ jasmine.Suite = function(env, description, specDefinitions, parentSuite) { jasmine.ActionCollection.call(this, env); - + + this.id = env.nextSuiteId_++; this.description = description; this.specs = this.actions; this.parentSuite = parentSuite; @@ -43,6 +44,9 @@ jasmine.Suite.prototype.afterEach = function(afterEachFunction) { jasmine.Suite.prototype.getResults = function() { var results = new jasmine.NestedResults(); + results.description = this.description; + results.id = this.id; + for (var i = 0; i < this.specs.length; i++) { results.rollupCounts(this.specs[i].getResults()); } From 1da0c1c890ed483909f95fa7eed523d7e2987dbb Mon Sep 17 00:00:00 2001 From: pivotal Date: Tue, 28 Jul 2009 17:57:29 -0700 Subject: [PATCH 17/19] carl/bosh - fixed PrettyPrinter --- src/PrettyPrinter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PrettyPrinter.js b/src/PrettyPrinter.js index 9bf7083e..9d8f4f96 100644 --- a/src/PrettyPrinter.js +++ b/src/PrettyPrinter.js @@ -28,7 +28,7 @@ jasmine.PrettyPrinter.prototype.format = function(value) { } else if (value instanceof jasmine.Matchers.Any) { this.emitScalar(value.toString()); } else if (typeof value === 'string') { - this.emitScalar(value); + this.emitScalar("'" + value + "'"); } else if (typeof value === 'function') { this.emitScalar('Function'); } else if (typeof value.nodeType === 'number') { From 40577433aaf5269170c5ba55722934ccc0c0400a Mon Sep 17 00:00:00 2001 From: pivotal Date: Wed, 29 Jul 2009 10:04:55 -0700 Subject: [PATCH 18/19] carl/bosh - fixed runner.html ( was too early); cleanup of script files that no longer existed; use passed getter --- lib/TrivialReporter.js | 2 +- spec/bootstrap.html | 4 -- spec/runner.html | 113 ++++++++++++++++++++--------------------- 3 files changed, 56 insertions(+), 63 deletions(-) diff --git a/lib/TrivialReporter.js b/lib/TrivialReporter.js index 5d10f5d0..39b0c5e8 100644 --- a/lib/TrivialReporter.js +++ b/lib/TrivialReporter.js @@ -35,7 +35,7 @@ jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { var specDiv = this.createDom('div', { - className: spec.getResults().passed() ? 'spec passed' : 'spec failed' + className: spec.getResults().passed ? 'spec passed' : 'spec failed' }, spec.getFullName()); var resultItems = spec.getResults().getItems(); diff --git a/spec/bootstrap.html b/spec/bootstrap.html index 19aa1a88..cac38e95 100755 --- a/spec/bootstrap.html +++ b/spec/bootstrap.html @@ -3,10 +3,6 @@ Jasmine Tests - - - - diff --git a/spec/runner.html b/spec/runner.html index 41c87bd4..6d58415d 100644 --- a/spec/runner.html +++ b/spec/runner.html @@ -3,65 +3,62 @@ Jasmine Test Runner + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - From 19241ed03df9a5a8af1d80aa04836391b256dd44 Mon Sep 17 00:00:00 2001 From: pivotal Date: Wed, 29 Jul 2009 11:33:23 -0700 Subject: [PATCH 19/19] carl/bosh - killed bootstrap dead; refactored to have emitString for use by subclasses. --- lib/jasmine.js | 7 ++- spec/bootstrap.html | 48 -------------- spec/bootstrap.js | 146 ------------------------------------------- src/PrettyPrinter.js | 7 ++- 4 files changed, 12 insertions(+), 196 deletions(-) delete mode 100755 spec/bootstrap.html delete mode 100755 spec/bootstrap.js diff --git a/lib/jasmine.js b/lib/jasmine.js index a9c2390b..63ef64b3 100644 --- a/lib/jasmine.js +++ b/lib/jasmine.js @@ -1499,7 +1499,7 @@ jasmine.PrettyPrinter.prototype.format = function(value) { } else if (value instanceof jasmine.Matchers.Any) { this.emitScalar(value.toString()); } else if (typeof value === 'string') { - this.emitScalar(value); + this.emitString(value); } else if (typeof value === 'function') { this.emitScalar('Function'); } else if (typeof value.nodeType === 'number') { @@ -1534,6 +1534,7 @@ jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; jasmine.StringPrettyPrinter = function() { jasmine.PrettyPrinter.call(this); @@ -1546,6 +1547,10 @@ jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { this.append(value); }; +jasmine.StringPrettyPrinter.prototype.emitString = function(value) { + this.append("'" + value + "'"); +}; + jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { this.append('[ '); for (var i = 0; i < array.length; i++) { diff --git a/spec/bootstrap.html b/spec/bootstrap.html deleted file mode 100755 index cac38e95..00000000 --- a/spec/bootstrap.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - Jasmine Tests - - - - - - - - - - - - - - - - - - - - - -

- Running all Jasmine Test Suites -

-
- - -
-
- - -
- - - - - - diff --git a/spec/bootstrap.js b/spec/bootstrap.js deleted file mode 100755 index 342b10e5..00000000 --- a/spec/bootstrap.js +++ /dev/null @@ -1,146 +0,0 @@ -var createElement = function(tag, attrs) { - var element = document.createElement(tag); - for (var attr in attrs) { - element[attr] = attrs[attr]; - } - return element; -}; - -// Bootstrap Test Reporter function -var Reporter = function () { - this.total = 0; - this.passes = 0; - this.fails = 0; - this.start = new Date(); -}; - -Reporter.prototype.toJSON = function(object) { - return JSON.stringify(object); -}; - -Reporter.prototype.test = function (result, message) { - this.total++; - - if (result) { - this.passes++; - iconElement = document.getElementById('icons'); - iconElement.appendChild(createElement('img', {src: '../images/go-16.png'})); - } - else { - this.fails++; - var fails_report = document.getElementById('fails'); - fails_report.style.display = ""; - - var iconElement = document.getElementById('icons'); - iconElement.appendChild(createElement('img', {src: '../images/fail-16.png'})); - - var failMessages = document.getElementById('fail_messages'); - var newFail = createElement('p', {'class': 'fail'}); - newFail.innerHTML = message; - failMessages.appendChild(newFail); - } -}; - -Reporter.prototype.summary = function () { - var el = createElement('p', {'class': ((this.fails > 0) ? 'fail_in_summary' : '') }); - el.innerHTML = this.total + ' expectations, ' + this.passes + ' passing, ' + this.fails + ' failed in ' + (new Date().getTime() - this.start.getTime()) + "ms."; - - var summaryElement = document.getElementById('results_summary'); - summaryElement.appendChild(el); - summaryElement.style.display = ""; -}; - - -var reporter = new Reporter(); - -function runSuite(filename) { - console.log(filename); - var suite = jasmine.include(filename); - suite.execute(); - emitSuiteResults(filename, suite); -} - -function emitSpecResults(testName, spec) { - var results = spec.results.getItems(); - reporter.test(results.length > 0, testName + ": should have results, got " + results.length); - - for (var i = 0; i < results.length; i++) { - reporter.test(results[i].passed === true, testName + ':' + spec.getFullName() + ": expectation number " + i + " failed: " + results[i].message); - } -} - -function emitSuiteResults(testName, suite) { - for (var j = 0; j < suite.specs.length; j++) { - var specOrSuite = suite.specs[j]; - - if (specOrSuite instanceof jasmine.Suite) { - emitSuiteResults(testName, specOrSuite); - } else { - emitSpecResults(testName, specOrSuite); - } - } -} - -var testExplodes = function () { - var suite = describe('exploding', function () { - it('should throw an exception when this.explodes is called inside a spec', function() { - var exceptionMessage = false; - - try { - this.explodes(); - } - catch (e) { - exceptionMessage = e; - } - expect(exceptionMessage).toEqual('explodes function should not have been called'); - }); - - }); - suite.execute(); - - emitSuiteResults('testExplodes', suite); -}; - -function newJasmineEnv() { - return new jasmine.Env(); -} - -var testRunner = function() { -}; - -var testRunnerFinishCallback = function () { - var env = newJasmineEnv(); - var foo = 0; - - env.currentRunner.finish(); - - reporter.test((env.currentRunner.finished === true), - "Runner finished flag was not set."); - - env.currentRunner.finishCallback = function () { - foo++; - }; - - env.currentRunner.finish(); - - reporter.test((env.currentRunner.finished === true), - "Runner finished flag was not set."); - reporter.test((foo === 1), - "Runner finish callback was not called"); -}; - -var runTests = function () { - document.getElementById('spinner').style.display = ""; - - runSuite('suites/PrettyPrintTest.js'); - runSuite('suites/MatchersTest.js'); - runSuite('suites/SpecRunningTest.js'); - runSuite('suites/NestedResultsTest.js'); - runSuite('suites/ReporterTest.js'); - runSuite('suites/RunnerTest.js'); - runSuite('suites/SpyTest.js'); - runSuite('suites/ExceptionsTest.js'); - - reporter.summary(); - document.getElementById('spinner').style.display = "none"; -}; \ No newline at end of file diff --git a/src/PrettyPrinter.js b/src/PrettyPrinter.js index 9d8f4f96..ff793a91 100644 --- a/src/PrettyPrinter.js +++ b/src/PrettyPrinter.js @@ -28,7 +28,7 @@ jasmine.PrettyPrinter.prototype.format = function(value) { } else if (value instanceof jasmine.Matchers.Any) { this.emitScalar(value.toString()); } else if (typeof value === 'string') { - this.emitScalar("'" + value + "'"); + this.emitString(value); } else if (typeof value === 'function') { this.emitScalar('Function'); } else if (typeof value.nodeType === 'number') { @@ -63,6 +63,7 @@ jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; jasmine.StringPrettyPrinter = function() { jasmine.PrettyPrinter.call(this); @@ -75,6 +76,10 @@ jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { this.append(value); }; +jasmine.StringPrettyPrinter.prototype.emitString = function(value) { + this.append("'" + value + "'"); +}; + jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { this.append('[ '); for (var i = 0; i < array.length; i++) {