diff --git a/Gemfile b/Gemfile
index fc8fa1e..bfcf6b6 100644
--- a/Gemfile
+++ b/Gemfile
@@ -14,3 +14,4 @@ gem 'rake', '0.8.7'
gem 'mocha', '0.9.12'
gem 'guard-jasmine-headless-webkit'
gem 'facter'
+
diff --git a/Rakefile b/Rakefile
index d13a827..db8bed4 100644
--- a/Rakefile
+++ b/Rakefile
@@ -9,6 +9,7 @@ RSpec::Core::RakeTask.new(:spec)
$: << File.expand_path('../lib', __FILE__)
+require 'jasmine-headless-webkit'
require 'jasmine/headless/task'
Jasmine::Headless::Task.new
diff --git a/bin/jasmine-headless-webkit b/bin/jasmine-headless-webkit
index a38610d..2988f6c 100755
--- a/bin/jasmine-headless-webkit
+++ b/bin/jasmine-headless-webkit
@@ -8,6 +8,8 @@ def gem_dir
end
$:.unshift(File.join(gem_dir, 'lib'))
+require 'jasmine-headless-webkit'
+
require 'jasmine/headless/errors'
require 'jasmine/headless/runner'
require 'jasmine/headless/options'
diff --git a/ext/jasmine-webkit-specrunner/Makefile.dummy b/ext/jasmine-webkit-specrunner/Makefile.dummy
new file mode 100644
index 0000000..9b9a271
--- /dev/null
+++ b/ext/jasmine-webkit-specrunner/Makefile.dummy
@@ -0,0 +1,5 @@
+build:
+ true
+install:
+ true
+
diff --git a/ext/jasmine-webkit-specrunner/extconf.rb b/ext/jasmine-webkit-specrunner/extconf.rb
index d950511..6980885 100644
--- a/ext/jasmine-webkit-specrunner/extconf.rb
+++ b/ext/jasmine-webkit-specrunner/extconf.rb
@@ -7,3 +7,4 @@ require 'qt/qmake'
system %{make clean}
Qt::Qmake.make!('jasmine-headless-webkit', 'specrunner.pro')
+FileUtils.cp File.expand_path('../Makefile.dummy', __FILE__), File.expand_path('../Makefile', __FILE__)
diff --git a/jasmine-headless-webkit.gemspec b/jasmine-headless-webkit.gemspec
index 17aeb06..834f207 100644
--- a/jasmine-headless-webkit.gemspec
+++ b/jasmine-headless-webkit.gemspec
@@ -1,10 +1,10 @@
# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
-require "jasmine-headless-webkit/version"
+require "jasmine/headless/version"
Gem::Specification.new do |s|
s.name = "jasmine-headless-webkit"
- s.version = Jasmine::Headless::Webkit::VERSION
+ s.version = Jasmine::Headless::VERSION
s.platform = Gem::Platform::RUBY
s.authors = ["John Bintz", "Sencha Inc.", "Pivotal Labs"]
s.email = ["john@coswellproductions.com"]
diff --git a/lib/jasmine-headless-webkit.rb b/lib/jasmine-headless-webkit.rb
index d5b1fb7..561a8a1 100644
--- a/lib/jasmine-headless-webkit.rb
+++ b/lib/jasmine-headless-webkit.rb
@@ -1,9 +1,19 @@
module Jasmine
+ autoload :FilesList, 'jasmine/files_list'
+ autoload :TemplateWriter, 'jasmine/template_writer'
+
module Headless
- module Webkit
- end
+ autoload :CoffeeScriptCache, 'jasmine/headless/coffee_script_cache'
+ autoload :SpecFileAnalyzer, 'jasmine/headless/spec_file_analyzer'
+ autoload :CacheableAction, 'jasmine/headless/cacheable_action'
+ autoload :VERSION, 'jasmine/headless/version'
+ autoload :Runner, 'jasmine/headless/runner'
+ autoload :Options, 'jasmine/headless/options'
+ autoload :Task, 'jasmine/headless/task'
end
end
+require 'jasmine/headless/errors'
+
require 'jasmine/headless/railtie' if defined?(Rails) && Rails::VERSION::MAJOR >= 3
diff --git a/lib/jasmine-headless-webkit/version.rb b/lib/jasmine-headless-webkit/version.rb
deleted file mode 100644
index b429569..0000000
--- a/lib/jasmine-headless-webkit/version.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-module Jasmine
- module Headless
- module Webkit
- VERSION = "0.6.4"
- end
- end
-end
diff --git a/lib/jasmine/files_list.rb b/lib/jasmine/files_list.rb
index 0b4db1b..fc482c8 100644
--- a/lib/jasmine/files_list.rb
+++ b/lib/jasmine/files_list.rb
@@ -1,5 +1,6 @@
require 'jasmine-core'
require 'iconv'
+require 'time'
module Jasmine
class FilesList
@@ -11,21 +12,7 @@ module Jasmine
File.expand_path('../../../jasmine/jasmine.headless-reporter.js', __FILE__)
]
- class << self
- def get_spec_line_numbers(file)
- line_numbers = {}
-
- ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
- file.lines.each_with_index.each { |line, index|
- line = ic.iconv(line + ' ')[0..-2]
- if description = line[%r{(describe|context|it)[( ]*(["'])(.*)\2}, 3]
- (line_numbers[description] ||= []) << (index + 1)
- end
- }
-
- line_numbers
- end
- end
+ PLEASE_WAIT_IM_WORKING_TIME = 2
def initialize(options = {})
@options = options
@@ -55,7 +42,7 @@ module Jasmine
def spec_file_line_numbers
@spec_file_line_numbers ||= Hash[@spec_files.collect { |file|
if File.exist?(file)
- if !(lines = self.class.get_spec_line_numbers(File.read(file))).empty?
+ if !(lines = Jasmine::Headless::SpecFileAnalyzer.for(file)).empty?
[ file, lines ]
end
else
@@ -66,51 +53,31 @@ module Jasmine
private
def to_html(files)
- coffeescript_run = []
+ alert_time = Time.now + PLEASE_WAIT_IM_WORKING_TIME
files.collect { |file|
- coffeescript_run << file if (ext = File.extname(file)) == '.coffee'
-
- output = []
- if (files.last == file or ext != '.coffee') and !coffeescript_run.empty?
- output << ensure_coffeescript_run!(coffeescript_run)
+ if alert_time && alert_time < Time.now
+ puts "Rebuilding cache, please wait..."
+ alert_time = nil
end
- if ext != '.coffee'
- output << case File.extname(file)
- when '.js'
- %{}
- when '.css'
- %{}
+ case File.extname(file)
+ when '.coffee'
+ begin
+ %{}
+ rescue CoffeeScript::CompilationError => ne
+ puts "[%s] %s: %s" % [ 'coffeescript'.color(:red), file.color(:yellow), ne.message.to_s.color(:white) ]
+ raise ne
+ rescue StandardError => e
+ puts "[%s] Error in compiling one of the followng: %s" % [ 'coffeescript'.color(:red), files.join(' ').color(:yellow) ]
+ raise e
end
+ when '.js'
+ %{}
+ when '.css'
+ %{}
end
-
- output
- }.flatten.reject(&:empty?)
- end
-
- def ensure_coffeescript_run!(files)
- data = StringIO.new
- files.each { |file| data << File.read(file) << "\n" }
- data.rewind
-
- %{}
- rescue CoffeeScript::CompilationError => e
- files.each do |file|
- begin
- CoffeeScript.compile(fh = File.open(file))
- rescue CoffeeScript::CompilationError => ne
- puts "[%s] %s: %s" % [ 'coffeescript'.color(:red), file.color(:yellow), ne.message.to_s.color(:white) ]
- raise ne
- ensure
- fh.close
- end
- end
- rescue StandardError => e
- puts "[%s] Error in compiling one of the followng: %s" % [ 'coffeescript'.color(:red), files.join(' ').color(:yellow) ]
- raise e
- ensure
- files.clear
+ }.flatten.compact.reject(&:empty?)
end
def spec_filter
@@ -131,7 +98,7 @@ module Jasmine
@files += found_files
if searches == 'spec_files'
- @spec_files = @files + spec_filter
+ @spec_files += spec_filter
end
@filtered_files += (if searches == 'spec_files'
diff --git a/lib/jasmine/headless/cacheable_action.rb b/lib/jasmine/headless/cacheable_action.rb
new file mode 100644
index 0000000..1b7e474
--- /dev/null
+++ b/lib/jasmine/headless/cacheable_action.rb
@@ -0,0 +1,77 @@
+module Jasmine::Headless
+ class CacheableAction
+ class << self
+ def enabled=(bool)
+ @enabled = bool
+ end
+
+ def enabled?
+ @enabled = true if @enabled == nil
+ @enabled
+ end
+
+ def cache_type
+ raise ArgumentError.new("No cache type defined for #{self.name}") if @cache_type == nil
+ @cache_type
+ end
+
+ def cache_type=(type)
+ @cache_type = type
+ end
+
+ def cache_dir=(dir)
+ @cache_dir = dir
+ end
+
+ def cache_dir
+ @cache_dir ||= '.jhw-cache'
+ end
+
+ def for(file)
+ new(file).handle
+ end
+ end
+
+ attr_reader :file
+
+ def initialize(file)
+ @file = file
+ end
+
+ def handle
+ if CacheableAction.enabled?
+ if fresh?
+ unserialize(File.read(cache_file))
+ else
+ result = action
+ FileUtils.mkdir_p File.split(cache_file).first
+ File.open(cache_file, 'wb') { |fh| fh.print serialize(result) }
+ result
+ end
+ else
+ action
+ end
+ end
+
+ def cache_file
+ @cache_file ||= File.join(self.class.cache_dir, self.class.cache_type, Digest::SHA1.hexdigest(file))
+ end
+
+ def fresh?
+ File.exist?(cache_file) && (File.mtime(file) < File.mtime(cache_file))
+ end
+
+ def action
+ raise StandardError.new("Override action")
+ end
+
+ def serialize(data)
+ data
+ end
+
+ def unserialize(data)
+ data
+ end
+ end
+end
+
diff --git a/lib/jasmine/headless/coffee_script_cache.rb b/lib/jasmine/headless/coffee_script_cache.rb
new file mode 100644
index 0000000..5ae5efe
--- /dev/null
+++ b/lib/jasmine/headless/coffee_script_cache.rb
@@ -0,0 +1,20 @@
+require 'coffee_script'
+require 'digest/sha1'
+require 'fileutils'
+
+module Jasmine
+ module Headless
+ class CoffeeScriptCache < CacheableAction
+ class << self
+ def cache_type
+ "coffee_script"
+ end
+ end
+
+ def action
+ CoffeeScript.compile(File.read(file))
+ end
+ end
+ end
+end
+
diff --git a/lib/jasmine/headless/options.rb b/lib/jasmine/headless/options.rb
index 7afbd63..fff6302 100644
--- a/lib/jasmine/headless/options.rb
+++ b/lib/jasmine/headless/options.rb
@@ -15,6 +15,7 @@ module Jasmine
:report => false,
:do_list => false,
:full_run => true,
+ :enable_cache => true,
:files => []
}
@@ -42,6 +43,10 @@ module Jasmine
@options[:colors] = true
when '--no-colors', '-nc'
@options[:colors] = false
+ when '--cache'
+ @options[:enable_cache] = true
+ when '--no-cache'
+ @options[:enable_cache] = false
when '--keep'
@options[:remove_html_file] = false
when '--report'
@@ -67,6 +72,8 @@ module Jasmine
command_line_args = GetoptLong.new(
[ '--colors', '-c', GetoptLong::NO_ARGUMENT ],
[ '--no-colors', GetoptLong::NO_ARGUMENT ],
+ [ '--cache', GetoptLong::NO_ARGUMENT ],
+ [ '--no-t stcache', GetoptLong::NO_ARGUMENT ],
[ '--keep', GetoptLong::NO_ARGUMENT ],
[ '--report', GetoptLong::REQUIRED_ARGUMENT ],
[ '--jasmine-config', '-j', GetoptLong::REQUIRED_ARGUMENT ],
diff --git a/lib/jasmine/headless/railtie.rb b/lib/jasmine/headless/railtie.rb
index 02441c4..5af2660 100644
--- a/lib/jasmine/headless/railtie.rb
+++ b/lib/jasmine/headless/railtie.rb
@@ -1,5 +1,3 @@
-require 'jasmine/headless/task'
-
module Jasmine
module Headless
class Railtie < Rails::Railtie
diff --git a/lib/jasmine/headless/runner.rb b/lib/jasmine/headless/runner.rb
index f3e4343..7791103 100644
--- a/lib/jasmine/headless/runner.rb
+++ b/lib/jasmine/headless/runner.rb
@@ -1,14 +1,8 @@
-require 'jasmine/headless/errors'
-require 'jasmine/headless/options'
-
require 'fileutils'
require 'coffee-script'
require 'rainbow'
-require 'jasmine/files_list'
-require 'jasmine/template_writer'
-
require 'yaml'
module Jasmine
@@ -61,6 +55,8 @@ module Jasmine
end
def run
+ Jasmine::Headless::CacheableAction.enabled = @options[:enable_cache]
+
files_list = Jasmine::FilesList.new(
:config => jasmine_config,
:only => @options[:files]
diff --git a/lib/jasmine/headless/spec_file_analyzer.rb b/lib/jasmine/headless/spec_file_analyzer.rb
new file mode 100644
index 0000000..252b067
--- /dev/null
+++ b/lib/jasmine/headless/spec_file_analyzer.rb
@@ -0,0 +1,37 @@
+require 'iconv'
+require 'multi_json'
+
+module Jasmine::Headless
+ class SpecFileAnalyzer < CacheableAction
+ class << self
+ def cache_type
+ "spec_file_analysis"
+ end
+ end
+
+ def action
+ line_numbers = {}
+
+ ic = Iconv.new('UTF-8//IGNORE', 'US-ASCII')
+ data = ic.iconv(File.read(file) + ' ')[0..-2]
+ data.force_encoding('US-ASCII') if data.respond_to?(:force_encoding)
+
+ data.lines.each_with_index.each { |line, index|
+ if description = line[%r{(describe|context|it)[( ]*(["'])(.*)\2}, 3]
+ (line_numbers[description] ||= []) << (index + 1)
+ end
+ }
+
+ line_numbers
+ end
+
+ def serialize(data)
+ MultiJson.encode(data)
+ end
+
+ def unserialize(data)
+ MultiJson.decode(data)
+ end
+ end
+end
+
diff --git a/lib/jasmine/headless/task.rb b/lib/jasmine/headless/task.rb
index 113030e..d6456a2 100644
--- a/lib/jasmine/headless/task.rb
+++ b/lib/jasmine/headless/task.rb
@@ -1,5 +1,3 @@
-require 'jasmine/headless/runner'
-
module Digest
class JasmineTest
def self.file(file)
diff --git a/lib/jasmine/headless/version.rb b/lib/jasmine/headless/version.rb
new file mode 100644
index 0000000..8fd51dc
--- /dev/null
+++ b/lib/jasmine/headless/version.rb
@@ -0,0 +1,5 @@
+module Jasmine
+ module Headless
+ VERSION = "0.6.4"
+ end
+end
diff --git a/spec/bin/jasmine-headless-webkit_spec.rb b/spec/bin/jasmine-headless-webkit_spec.rb
index 37a4fbf..9bd3765 100644
--- a/spec/bin/jasmine-headless-webkit_spec.rb
+++ b/spec/bin/jasmine-headless-webkit_spec.rb
@@ -120,7 +120,6 @@ describe "jasmine-headless-webkit" do
describe 'files' do
it 'should list all the files that will be found' do
files = %x{bin/jasmine-headless-webkit -l -j spec/jasmine/success/success.yml}
- p files
$?.exitstatus.should == 0
files.lines.to_a.should include("./spec/jasmine/success/success.js\n")
diff --git a/spec/lib/jasmine/files_list_spec.rb b/spec/lib/jasmine/files_list_spec.rb
index 26cd34a..324ee62 100644
--- a/spec/lib/jasmine/files_list_spec.rb
+++ b/spec/lib/jasmine/files_list_spec.rb
@@ -147,127 +147,38 @@ describe Jasmine::FilesList do
describe '#.*files_to_html' do
include FakeFS::SpecHelpers
- context 'one coffeescript file' do
- before do
- files_list.instance_variable_set(:@files, [
- 'test.js',
- 'test.coffee',
- 'test.css'
- ])
+ before do
+ files_list.instance_variable_set(:@files, [
+ 'test.js',
+ 'test.coffee',
+ 'test.whatever',
+ 'test.css'
+ ])
- files_list.instance_variable_set(:@filtered_files, [
- 'test.js',
- 'test.coffee'
- ])
+ files_list.instance_variable_set(:@filtered_files, [
+ 'test.js',
+ 'test.coffee'
+ ])
- File.open('test.coffee', 'w') { |fh| fh.print "first" }
+ Jasmine::Headless::CoffeeScriptCache.stubs(:for).with('test.coffee').returns("i compiled")
+ end
- CoffeeScript.stubs(:compile).with() { |field| field.read == "first\n" }.returns("i compiled")
- end
-
- context '#files_to_html' do
- it "should create the right HTML" do
- files_list.files_to_html.should == [
- %{},
- %{},
- %{}
- ]
- end
- end
-
- context '#filtered_files_to_html' do
- it "should create the right HTML" do
- files_list.filtered_files_to_html.should == [
- %{},
- %{}
- ]
- end
+ context '#files_to_html' do
+ it "should create the right HTML" do
+ files_list.files_to_html.should == [
+ %{},
+ %{},
+ %{}
+ ]
end
end
- context 'two coffeescript files' do
- before do
- files_list.instance_variable_set(:@files, [
- 'test.js',
- 'test.coffee',
- 'test2.coffee',
- 'test.css'
- ])
-
- files_list.instance_variable_set(:@filtered_files, [
- 'test.js',
- 'test.coffee'
- ])
-
- File.open('test.coffee', 'w') { |fh| fh.print "first" }
- File.open('test2.coffee', 'w') { |fh| fh.print "second" }
- end
-
- context '#files_to_html' do
- it "should create the right HTML" do
- CoffeeScript.stubs(:compile).with() { |field| field.read == "first\nsecond\n" }.returns("i compiled")
-
- files_list.files_to_html.should == [
- %{},
- %{},
- %{}
- ]
- end
- end
-
- context '#filtered_files_to_html' do
- it "should create the right HTML" do
- CoffeeScript.stubs(:compile).with() { |field| field.read == "first\n" }.returns("i compiled")
-
- files_list.filtered_files_to_html.should == [
- %{},
- %{}
- ]
- end
- end
- end
- end
-
- describe '.get_spec_line_numbers' do
- let(:line_numbers) do
- described_class.get_spec_line_numbers(file)
- end
-
- context 'coffeescript' do
- let(:file) do
- <<-SPEC
-describe 'test', ->
- context 'yes', ->
- it 'should do something', ->
- "yes"
- "PR.registerLangHandler(PR.createSimpleLexer([[\"com\",/^#[^\\n\\r]*/,null,\"#\"],[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \xC2\\xa0\"],[\"str\",/^\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)/,null,'\"']],[[\"kwd\",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\\s/,\n"
- SPEC
- end
-
- it 'should get the line numbers' do
- line_numbers['test'].should == [ 1 ]
- line_numbers['yes'].should == [ 2 ]
- line_numbers['should do something'].should == [ 3 ]
- end
- end
-
- context 'javascript' do
- let(:file) do
- <<-SPEC
-describe('test', function() {
- context('yes', function() {
- it('should do something', function() {
-
- });
- });
-});
- SPEC
- end
-
- it 'should get the line numbers' do
- line_numbers['test'].should == [ 1 ]
- line_numbers['yes'].should == [ 2 ]
- line_numbers['should do something'].should == [ 3 ]
+ context '#filtered_files_to_html' do
+ it "should create the right HTML" do
+ files_list.filtered_files_to_html.should == [
+ %{},
+ %{}
+ ]
end
end
end
diff --git a/spec/lib/jasmine/headless/cacheable_action_spec.rb b/spec/lib/jasmine/headless/cacheable_action_spec.rb
new file mode 100644
index 0000000..5e55a91
--- /dev/null
+++ b/spec/lib/jasmine/headless/cacheable_action_spec.rb
@@ -0,0 +1,88 @@
+require 'spec_helper'
+
+describe Jasmine::Headless::CacheableAction do
+ include FakeFS::SpecHelpers
+
+ let(:file) { 'file.whatever' }
+ let(:data) { 'data' }
+ let(:compiled) { 'compiled' }
+
+ before do
+ File.open(file, 'wb') { |fh| fh.print(data) }
+ described_class.cache_dir = cache_dir
+ described_class.cache_type = cache_type
+ end
+
+ let(:action_runs!) do
+ described_class.any_instance.expects(:action).returns(compiled)
+ end
+
+ let(:cache_type) { 'action' }
+ let(:cache_dir) { 'cache' }
+ let(:cache_file) { File.join(cache_dir, cache_type, Digest::SHA1.hexdigest(file)) }
+ let(:cache_file_data) { YAML.load(File.read(cache_file)) }
+
+ describe '.for' do
+ context 'cache disabled' do
+ before do
+ described_class.enabled = false
+ end
+
+ it 'should compile' do
+ action_runs!
+ described_class.for(file).should == compiled
+ cache_file.should_not be_a_file
+ end
+ end
+
+ context 'cache enabled' do
+ before do
+ described_class.enabled = true
+ FileUtils.mkdir_p(cache_dir)
+
+ File.stubs(:mtime).with(file).returns(Time.at(10))
+ File.stubs(:mtime).with(cache_file).returns(Time.at(cache_file_mtime))
+ end
+
+ context 'cache empty' do
+ let(:cache_file_mtime) { 0 }
+
+ it 'should compile' do
+ action_runs!
+ described_class.for(file).should == compiled
+
+ cache_file_data.should == compiled
+ end
+ end
+
+ context 'cache fresh' do
+ let(:cache_file_mtime) { 15 }
+
+ before do
+ File.open(cache_file, 'wb') { |fh| fh.print compiled }
+ end
+
+ it 'should not compile' do
+ action_runs!.never
+
+ described_class.for(file).should == compiled
+
+ cache_file_data.should == compiled
+ end
+ end
+
+ context 'cache stale' do
+ let(:cache_file_mtime) { 5 }
+
+ it 'should compile' do
+ action_runs!
+
+ described_class.for(file).should == compiled
+
+ cache_file_data.should == compiled
+ end
+ end
+ end
+ end
+end
+
diff --git a/spec/lib/jasmine/headless/coffee_script_cache_spec.rb b/spec/lib/jasmine/headless/coffee_script_cache_spec.rb
new file mode 100644
index 0000000..9952270
--- /dev/null
+++ b/spec/lib/jasmine/headless/coffee_script_cache_spec.rb
@@ -0,0 +1,21 @@
+require 'spec_helper'
+
+describe Jasmine::Headless::CoffeeScriptCache do
+ include FakeFS::SpecHelpers
+
+ describe '#action' do
+ let(:file) { 'file' }
+ let(:data) { 'data' }
+ let(:compiled) { 'compiled' }
+
+ before do
+ CoffeeScript.expects(:compile).with(data).returns(compiled)
+ File.open(file, 'wb') { |fh| fh.print(data) }
+ end
+
+ it 'should compile coffeescript' do
+ described_class.new(file).action.should == compiled
+ end
+ end
+end
+
diff --git a/spec/lib/jasmine/headless/spec_file_analyzer_spec.rb b/spec/lib/jasmine/headless/spec_file_analyzer_spec.rb
new file mode 100644
index 0000000..fbde25c
--- /dev/null
+++ b/spec/lib/jasmine/headless/spec_file_analyzer_spec.rb
@@ -0,0 +1,57 @@
+require 'spec_helper'
+
+describe Jasmine::Headless::SpecFileAnalyzer do
+ include FakeFS::SpecHelpers
+
+ let(:file) { 'file' }
+ let(:analyzer) { described_class.new(file) }
+
+ describe '#action' do
+ let(:line_numbers) do
+ analyzer.action
+ end
+
+ before do
+ File.open(file, 'wb') { |fh| fh.print file_data }
+ end
+
+ context 'coffeescript' do
+ let(:file_data) do
+ <<-SPEC
+describe 'test', ->
+ context 'yes', ->
+ it 'should do something', ->
+ "yes"
+ "PR.registerLangHandler(PR.createSimpleLexer([[\"com\",/^#[^\\n\\r]*/,null,\"#\"],[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \xC2\\xa0\"],[\"str\",/^\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)/,null,'\"']],[[\"kwd\",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\\s/,\n"
+SPEC
+ end
+
+ it 'should get the line numbers' do
+ line_numbers['test'].should == [ 1 ]
+ line_numbers['yes'].should == [ 2 ]
+ line_numbers['should do something'].should == [ 3 ]
+ end
+ end
+
+ context 'javascript' do
+ let(:file_data) do
+ <<-SPEC
+describe('test', function() {
+ context('yes', function() {
+ it('should do something', function() {
+
+ });
+ });
+});
+SPEC
+ end
+
+ it 'should get the line numbers' do
+ line_numbers['test'].should == [ 1 ]
+ line_numbers['yes'].should == [ 2 ]
+ line_numbers['should do something'].should == [ 3 ]
+ end
+ end
+ end
+end
+
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 1f9e555..472d170 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,5 +1,12 @@
+require 'jasmine-headless-webkit'
+require 'fakefs/spec_helpers'
+
RSpec.configure do |c|
c.mock_with :mocha
+
+ c.before(:each) do
+ Jasmine::Headless::CacheableAction.enabled = false
+ end
end
specrunner = 'ext/jasmine-webkit-specrunner/jasmine-webkit-specrunner'
@@ -10,32 +17,39 @@ if !File.file?(specrunner)
end
end
-RSpec::Matchers.define :be_a_report_containing do |total, fails, used_console|
- match do |filename|
- parts(filename).length.should == 4
- parts[0].should == total.to_s
- parts[1].should == fails.to_s
- parts[2].should == (used_console ? "T" : "F")
- true
+module RSpec::Matchers
+ define :be_a_report_containing do |total, fails, used_console|
+ match do |filename|
+ parts(filename).length.should == 4
+ parts[0].should == total.to_s
+ parts[1].should == fails.to_s
+ parts[2].should == (used_console ? "T" : "F")
+ true
+ end
+
+ failure_message_for_should do |filename|
+ parts(filename)
+ "expected #{filename} to be a report containing (#{total}, #{fails}, #{used_console.inspect}), instead it contained (#{parts[0]}, #{parts[1]}, #{(parts[2] == "T").inspect})"
+ end
+
+ def parts(filename = nil)
+ @parts ||= File.readlines(filename).first.strip.split('/')
+ end
end
- failure_message_for_should do |filename|
- parts(filename)
- "expected #{filename} to be a report containing (#{total}, #{fails}, #{used_console.inspect}), instead it contained (#{parts[0]}, #{parts[1]}, #{(parts[2] == "T").inspect})"
+ define :contain_a_failing_spec do |*parts|
+ match do |filename|
+ report(filename).include?(parts.join("||")).should be_true
+ end
+
+ def report(filename)
+ @report ||= File.readlines(filename)[1..-1].collect(&:strip)
+ end
end
- def parts(filename = nil)
- @parts ||= File.readlines(filename).first.strip.split('/')
+ define :be_a_file do
+ match do |file|
+ File.file?(file)
+ end
end
end
-
-RSpec::Matchers.define :contain_a_failing_spec do |*parts|
- match do |filename|
- report(filename).include?(parts.join("||")).should be_true
- end
-
- def report(filename)
- @report ||= File.readlines(filename)[1..-1].collect(&:strip)
- end
-end
-