blob: fdd8535eee183ab64ff8b11c1e6501699e2ae0f4 [file] [log] [blame]
desc "Generate JavaScript code coverage report in ./covershot"
task :coverage => %w(
coverage:dependencies
coverage:clean
coverage:prepare
coverage:instrumentation
coverage:write_manifest
coverage:execute
coverage:generate
coverage:done
)
namespace :coverage do
task :dependencies do
unless File.exist?(base_path.join('node_modules'))
if %x[which npm].strip.length == 0
raise <<-end_error
Could not execute `npm`! Please make sure node.js and the Node Package
Manager (NPM) are available and can be executed without root
permissions.
end_error
else
cmd = "npm install && bundle exec #{$0} #{ARGV.join ' '}"
puts "Executing the following command:"
puts
puts " #{cmd}"
puts
puts
Kernel.exec cmd
end
end
end
task :clean do
rm_rf base_path.join('covershot')
rm_rf base_path.join('tmp')
end
task :prepare do
manifest = sprockets['gl-matrix-manifest.js']
coverage_path = base_path.join('tmp/coverage')
manifest.dependencies.each do |part|
path = coverage_path.join('lib').join(part.pathname.basename)
mkdir_p(path.dirname) unless File.directory?(path.dirname)
File.open(path, 'w') do |f|
f.print part.body
end
end
end
task :instrumentation do
bin = 'jscoverage'
opts = [ '--no-highlight' ]
input = base_path.join('tmp/coverage/lib').to_s
output = base_path.join('tmp/coverage/lib-cov').to_s
unless system *[bin, opts, input, output].flatten
raise "Instrumentation failure. Please make sure `jscoverage` is installed."
end
end
task :write_manifest do
manifest = sprockets['gl-matrix-manifest.js']
coverage_path = base_path.join('tmp/coverage')
File.open(coverage_path.join('manifest.js'), 'w') do |manifest_out|
manifest_out.puts <<-end_script
var covershot = require('covershot');
var csrequire = covershot.require.bind(null, require);
function pull(str) {
var exps = csrequire(str);
for (var i in exps) {
global[i] = exps[i];
}
}
global.GLMAT_EPSILON = 0.000001;
global.GLMAT_ARRAY_TYPE = Float32Array;
end_script
manifest.dependencies.each do |part|
path = coverage_path.join('lib-cov').join(part.pathname.basename)
manifest_out.puts "pull('#{path}');"
end
manifest_out.puts <<-end_script
function CoverageReporter() {
this.reportRunnerResults = function(suite) {
covershot.writeCoverage();
};
};
jasmine.getEnv().addReporter(new CoverageReporter());
end_script
end
end
task :execute do
jasmine_node = base_path.join('node_modules/jasmine-node/bin/jasmine-node').to_s
spec = base_path.join('spec').to_s
unless system jasmine_node, spec
raise "jasmine-node tests failed. Coverage report not generated."
end
end
task :generate do
covershot = base_path.join('node_modules/covershot/bin/covershot').to_s
data_dir = base_path.join('covershot/data').to_s
format = 'html'
unless system covershot, data_dir, '-f', format
raise "Execution of covershot failed. Coverage report not generated."
end
end
task :done do
rm_rf base_path.join('tmp')
puts
puts
puts "Coverage report generated in: #{base_path.join("covershot/index.html")}"
puts
end
end