Refactor config file/path handling.

This commit is contained in:
Christian Williams 2009-12-28 16:27:02 -06:00
parent 2045226ba7
commit 81aeeeedee
15 changed files with 150 additions and 76 deletions

View File

@ -28,12 +28,12 @@ Gem::Specification.new do |s|
"lib/jasmine/jasmine_helper.rb", "lib/jasmine/jasmine_helper.rb",
"lib/jasmine/jasmine_meta_spec.rb", "lib/jasmine/jasmine_meta_spec.rb",
"lib/jasmine/jasmine_runner.rb", "lib/jasmine/jasmine_runner.rb",
"lib/jasmine/jasmine_spec_builder.rb", "lib/jasmine/spec_builder.rb",
"lib/jasmine/run.html", "lib/jasmine/run.html",
"templates/Rakefile", "templates/Rakefile",
"templates/example_spec.js", "templates/ExampleSpec.js",
"templates/jasmine_helper.rb", "templates/jasmine_helper.rb",
"templates/spec_helper.js" "templates/SpecHelper.js"
] ]
s.homepage = %q{http://github.com/ragaskar/jasmine} s.homepage = %q{http://github.com/ragaskar/jasmine}
s.rdoc_options = ["--charset=UTF-8"] s.rdoc_options = ["--charset=UTF-8"]

View File

@ -1,6 +1,7 @@
require 'jasmine/base' require 'jasmine/base'
require 'jasmine/config' require 'jasmine/config'
require 'jasmine/server' require 'jasmine/server'
require 'jasmine/selenium_driver'
require 'jasmine/jasmine_helper' require 'jasmine/jasmine_helper'
require 'jasmine/jasmine_spec_builder' require 'jasmine/spec_builder'

View File

@ -16,7 +16,7 @@ module Jasmine
def start def start
start_servers start_servers
@client = Jasmine::SimpleClient.new("localhost", @selenium_server_port, "*#{@browser}", "http://localhost:#{@jasmine_server_port}/") @client = Jasmine::SeleniumDriver.new("localhost", @selenium_server_port, "*#{@browser}", "http://localhost:#{@jasmine_server_port}/")
@client.connect @client.connect
end end
@ -83,8 +83,40 @@ module Jasmine
raise "You need to declare a spec_files method in #{self.class}!" raise "You need to declare a spec_files method in #{self.class}!"
end end
def match_files(dir, pattern)
dir = File.expand_path(dir)
Dir.glob(File.join(dir, pattern)).collect {|f| f.sub("#{dir}/", "")}.sort
end
def src_files
match_files(src_dir, "**/*.js")
end
def src_path
"src"
end
def spec_path
"spec"
end
def spec_files
match_files(spec_dir, "**/*.js")
end
def mappings
{
"/" + src_path => src_dir,
"/" + spec_path => spec_dir
}
end
def js_files def js_files
src_files + spec_files src_files.collect {|f| File.join(src_path, f) } + spec_files.collect {|f| File.join(spec_path, f) }
end
def spec_files_full_paths
spec_files.collect {|spec_file| File.join(spec_dir, spec_file) }
end end
end end
end end

View File

@ -6,7 +6,7 @@ if File.exist?(helper_overrides)
require helper_overrides require helper_overrides
end end
require File.expand_path(File.join(File.dirname(__FILE__), "jasmine_runner.rb")) require File.expand_path(File.join(File.dirname(__FILE__), "jasmine_runner.rb"))
require File.expand_path(File.join(File.dirname(__FILE__), "jasmine_spec_builder")) require File.expand_path(File.join(File.dirname(__FILE__), "spec_builder"))
jasmine_runner = Jasmine::Runner.new(SeleniumRC::Server.new.jar_path, jasmine_runner = Jasmine::Runner.new(SeleniumRC::Server.new.jar_path,
Dir.pwd, Dir.pwd,

View File

@ -1,3 +0,0 @@
module Jasmine
end

View File

@ -0,0 +1,44 @@
module Jasmine
class SeleniumDriver
def initialize(selenium_host, selenium_port, selenium_browser_start_command, http_address)
require 'selenium/client'
@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 connect
@driver.start
@driver.open("/")
end
def disconnect
@driver.stop
end
def run
until tests_have_finished? do
sleep 0.1
end
puts @driver.get_eval("window.results()")
failed_count = @driver.get_eval("window.jasmine.getEnv().currentRunner.results().failedCount").to_i
failed_count == 0
end
def eval_js(script)
escaped_script = "'" + script.gsub(/(['\\])/) { '\\' + $1 } + "'"
result = @driver.get_eval(" try { eval(#{escaped_script}, window); } catch(err) { window.eval(#{escaped_script}); }")
JSON.parse("[#{result}]")[0]
end
end
end

View File

@ -127,47 +127,4 @@ module Jasmine
thin.stop thin.stop
end end
end end
class SimpleClient
def initialize(selenium_host, selenium_port, selenium_browser_start_command, http_address)
require 'selenium/client'
@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 connect
@driver.start
@driver.open("/")
end
def disconnect
@driver.stop
end
def run
until tests_have_finished? do
sleep 0.1
end
puts @driver.get_eval("window.results()")
failed_count = @driver.get_eval("window.jasmine.getEnv().currentRunner.results().failedCount").to_i
failed_count == 0
end
def eval_js(script)
escaped_script = "'" + script.gsub(/(['\\])/) { '\\' + $1 } + "'"
result = @driver.get_eval(" try { eval(#{escaped_script}, window); } catch(err) { window.eval(#{escaped_script}); }")
JSON.parse("[#{result}]")[0]
end
end
end end

View File

@ -1,12 +1,13 @@
require 'enumerator' require 'enumerator'
module Jasmine
module Jasmine
class SpecBuilder class SpecBuilder
attr_accessor :suites attr_accessor :suites
def initialize(runner) def initialize(config)
@spec_files = runner.spec_files @config = config
@runner = runner @spec_files = config.spec_files
@runner = config
@spec_ids = [] @spec_ids = []
end end
@ -31,7 +32,7 @@ module Jasmine
example_name_parts = [] example_name_parts = []
previous_indent_level = 0 previous_indent_level = 0
@spec_files.each do |filename| @config.spec_files_full_paths.each do |filename|
line_number = 1 line_number = 1
File.open(filename, "r") do |file| File.open(filename, "r") do |file|
file.readlines.each do |line| file.readlines.each do |line|

53
spec/config_spec.rb Normal file
View File

@ -0,0 +1,53 @@
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
describe Jasmine::Config do
before(:each) do
@template_dir = File.expand_path(File.join(File.dirname(__FILE__), "../templates"))
@config = Jasmine::Config.new
@config.stub!(:src_dir).and_return(File.join(@template_dir, "public"))
@config.stub!(:spec_dir).and_return(File.join(@template_dir, "spec"))
end
it "should provide a list of all src and spec files" do
@config.src_files.should == ['javascripts/Example.js']
@config.spec_files.should == ['javascript/ExampleSpec.js', 'javascript/SpecHelper.js']
end
it "should provide a list of all spec files with full paths" do
@config.spec_files_full_paths.should == [
File.join(@template_dir, 'spec/javascript/ExampleSpec.js'),
File.join(@template_dir, 'spec/javascript/SpecHelper.js')
]
end
it "should provide a list of all js files" do
@config.js_files.should == [
'src/javascripts/Example.js',
'spec/javascript/ExampleSpec.js',
'spec/javascript/SpecHelper.js',
]
end
it "should provide dir mappings" do
@config.mappings.should == {
'/src' => @config.src_dir,
'/spec' => @config.spec_dir
}
end
it "should allow overriding src and spec paths" do
@config.stub!(:src_path).and_return("public")
@config.stub!(:spec_path).and_return("spekz")
@config.js_files.should == [
'public/javascripts/Example.js',
'spekz/javascript/ExampleSpec.js',
'spekz/javascript/SpecHelper.js',
]
@config.mappings.should == {
'/public' => @config.src_dir,
'/spekz' => @config.spec_dir
}
end
end

View File

@ -9,22 +9,7 @@ class JasmineSelfTestConfig < Jasmine::Config
File.join(proj_root, 'src') File.join(proj_root, 'src')
end end
def src_files
Dir.glob(File.join(src_dir, "**/*.js"))
end
def spec_dir def spec_dir
File.join(proj_root, 'jasmine/spec') File.join(proj_root, 'jasmine/spec')
end end
def spec_files
Dir.glob(File.join(spec_dir, "**/*[Ss]pec.js")).collect { |f| f.sub("#{spec_dir}/", "spec/") }
end
def mappings
{
"/src" => src_dir,
"/spec" => spec_dir
}
end
end end

View File

@ -1,6 +1,8 @@
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
require 'jasmine_self_test_config' require 'jasmine_self_test_config'
jasmine_runner = JasmineSelfTestRunner.new jasmine_runner = JasmineSelfTestConfig.new
spec_builder = Jasmine::SpecBuilder.new(jasmine_runner) spec_builder = Jasmine::SpecBuilder.new(jasmine_runner)
should_stop = false should_stop = false

View File

@ -0,0 +1,2 @@
ExampleClass = function() {
};

View File

@ -1,9 +1,9 @@
describe('ExampleSuite', function () { describe('Example', function () {
it('should have a passing test', function() { it('should have a passing test', function() {
expect(true).toEqual(true); expect(true).toEqual(true);
}); });
describe('Nested Describe', function () { describe('nested describe', function () {
it('should also have a passing test', function () { it('should also have a passing test', function () {
expect(true).toEqual(true); expect(true).toEqual(true);
}); });