112 lines
2.4 KiB
Ruby
112 lines
2.4 KiB
Ruby
module JasmineMixin
|
|
JASMINE_PROGRAM = File.expand_path('../../../bin/jasmine-headless-webkit', __FILE__)
|
|
|
|
JAVASCRIPT_EXTENSIONS = %w{js coffee}
|
|
|
|
def self.included(klass)
|
|
klass::ALL_HOOKS << [ :run_jasmine, :ran_jasmine ]
|
|
end
|
|
|
|
attr_accessor :is_jasmine_running, :jasmine_to_run, :jasmine_ran_once
|
|
|
|
def initialize
|
|
super()
|
|
setup_jasmine_project_mappings
|
|
jasmine_ran_once = false
|
|
end
|
|
|
|
def get_to_green
|
|
begin
|
|
reset_jasmine(:no)
|
|
super if find_files_to_test
|
|
|
|
reset_jasmine(:yes)
|
|
self.last_mtime = Time.at(0) if !options[:no_full_after_start] && !jasmine_ran_once
|
|
run_jasmine if find_files_to_test
|
|
|
|
self.is_jasmine_running = :all
|
|
wait_for_changes unless all_jasmine_good
|
|
end until all_jasmine_good
|
|
|
|
reset_jasmine(:all)
|
|
end
|
|
|
|
def rerun_all_tests
|
|
reset_jasmine(:no)
|
|
super
|
|
|
|
reset_jasmine(:yes)
|
|
run_jasmine
|
|
|
|
reset_jasmine(:all)
|
|
end
|
|
|
|
def reset_jasmine(method)
|
|
self.files_to_test = new_hash_of_arrays
|
|
self.is_jasmine_running = method
|
|
end
|
|
|
|
def run_jasmine
|
|
hook :run_jasmine
|
|
|
|
self.jasmine_to_run = :all
|
|
|
|
if mtime = find_files_to_test
|
|
self.last_mtime = mtime
|
|
end
|
|
|
|
begin
|
|
system make_jasmine_cmd
|
|
|
|
self.jasmine_to_run = ($?.exitstatus == 0) ? :none : :all
|
|
end
|
|
|
|
hook :ran_jasmine
|
|
|
|
jasmine_ran_once = true
|
|
end
|
|
|
|
def all_jasmine_good
|
|
self.jasmine_to_run == :none
|
|
self.files_to_test = new_hash_of_arrays
|
|
end
|
|
|
|
def find_files
|
|
Hash[super.find_all { |file, mtime|
|
|
is_js = (file[%r{\.(#{JAVASCRIPT_EXTENSIONS.join('|')})$}] != nil)
|
|
|
|
case self.is_jasmine_running
|
|
when :all
|
|
true
|
|
when :no
|
|
!is_js
|
|
when :yes
|
|
is_js
|
|
end
|
|
}]
|
|
end
|
|
|
|
def make_jasmine_cmd
|
|
self.files_to_test.empty? ? '' :
|
|
%{#{JASMINE_PROGRAM} #{self.files_to_test.keys.collect { |key| %{'#{key}'} }.join(' ')}}.tap { |o| p o }
|
|
end
|
|
|
|
def setup_jasmine_project_mappings
|
|
add_mapping(%r{spec/javascripts/.*_spec\.(js|coffee)}) { |filename, _|
|
|
filename
|
|
}
|
|
|
|
add_mapping(%r{public/javascripts/(.*)\.js}) { |_, m|
|
|
files_matching(%r{spec/javascripts/#{m[1]}_spec\..*$})
|
|
}
|
|
|
|
add_mapping(%r{app/coffeescripts/(.*)\.coffee}) { |_, m|
|
|
files_matching(%r{spec/javascripts/#{m[1]}_spec\..*$})
|
|
}
|
|
end
|
|
|
|
def add_javascript_extensions(*extensions)
|
|
self.class::JAVASCRIPT_EXTENSIONS << extensions
|
|
end
|
|
end
|