Home | History | Annotate | Download | only in test
      1 desc "Generate JavaScript code coverage report in ./covershot"
      2 task :coverage => %w(
      3   coverage:dependencies
      4   coverage:clean
      5   coverage:prepare
      6   coverage:instrumentation
      7   coverage:write_manifest
      8   coverage:execute
      9   coverage:generate
     10   coverage:done
     11 )
     12 
     13 namespace :coverage do
     14   task :dependencies do
     15     unless File.exist?(base_path.join('node_modules'))
     16       if %x[which npm].strip.length == 0
     17         raise <<-end_error
     18           Could not execute `npm`! Please make sure node.js and the Node Package
     19           Manager (NPM) are available and can be executed without root
     20           permissions.
     21         end_error
     22       else
     23         cmd = "npm install && bundle exec #{$0} #{ARGV.join ' '}"
     24         puts "Executing the following command:"
     25         puts
     26         puts "  #{cmd}"
     27         puts
     28         puts
     29         Kernel.exec cmd
     30       end
     31     end
     32   end
     33 
     34   task :clean do
     35     rm_rf base_path.join('covershot')
     36     rm_rf base_path.join('tmp')
     37   end
     38 
     39   task :prepare do
     40     manifest = sprockets['gl-matrix-manifest.js']
     41     coverage_path = base_path.join('tmp/coverage')
     42 
     43     manifest.dependencies.each do |part|
     44       path = coverage_path.join('lib').join(part.pathname.basename)
     45       mkdir_p(path.dirname) unless File.directory?(path.dirname)
     46       File.open(path, 'w') do |f|
     47         f.print part.body
     48       end
     49     end
     50   end
     51 
     52   task :instrumentation do
     53     bin = 'jscoverage'
     54     opts = [ '--no-highlight' ]
     55     input = base_path.join('tmp/coverage/lib').to_s
     56     output = base_path.join('tmp/coverage/lib-cov').to_s
     57 
     58     unless system *[bin, opts, input, output].flatten
     59       raise "Instrumentation failure. Please make sure `jscoverage` is installed."
     60     end
     61   end
     62 
     63   task :write_manifest do
     64     manifest = sprockets['gl-matrix-manifest.js']
     65     coverage_path = base_path.join('tmp/coverage')
     66 
     67     File.open(coverage_path.join('manifest.js'), 'w') do |manifest_out|
     68       manifest_out.puts <<-end_script
     69         var covershot = require('covershot');
     70         var csrequire = covershot.require.bind(null, require);
     71 
     72         function pull(str) {
     73           var exps = csrequire(str);
     74           for (var i in exps) {
     75             global[i] = exps[i];
     76           }
     77         }
     78 
     79         global.GLMAT_EPSILON = 0.000001;
     80         global.GLMAT_ARRAY_TYPE = Float32Array;
     81 
     82       end_script
     83       manifest.dependencies.each do |part|
     84         path = coverage_path.join('lib-cov').join(part.pathname.basename)
     85         manifest_out.puts "pull('#{path}');"
     86       end
     87       manifest_out.puts <<-end_script
     88         function CoverageReporter() {
     89           this.reportRunnerResults = function(suite) {
     90             covershot.writeCoverage();
     91           };
     92         };
     93 
     94         jasmine.getEnv().addReporter(new CoverageReporter());
     95       end_script
     96     end
     97   end
     98 
     99   task :execute do
    100     jasmine_node = base_path.join('node_modules/jasmine-node/bin/jasmine-node').to_s
    101     spec = base_path.join('spec').to_s
    102 
    103     unless system jasmine_node, spec
    104       raise "jasmine-node tests failed. Coverage report not generated."
    105     end
    106   end
    107 
    108   task :generate do
    109     covershot = base_path.join('node_modules/covershot/bin/covershot').to_s
    110     data_dir = base_path.join('covershot/data').to_s
    111     format = 'html'
    112 
    113     unless system covershot, data_dir, '-f', format
    114       raise "Execution of covershot failed. Coverage report not generated."
    115     end
    116   end
    117 
    118   task :done do
    119     rm_rf base_path.join('tmp')
    120     puts
    121     puts
    122     puts "Coverage report generated in: #{base_path.join("covershot/index.html")}"
    123     puts
    124   end
    125 end
    126