25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.1KB

  1. require File.expand_path('../helper', __FILE__)
  2. require 'fileutils'
  3. require 'json'
  4. module Mustache
  5. class Test < Test::Unit::TestCase
  6. def self.run_tests_for(engine)
  7. TESTS.each do |test|
  8. define_method("test_#{engine}_#{test}") do
  9. template, view, partial, expect = load_test(test)
  10. assert_equal expect, run_js(engine, <<-JS).chomp
  11. try {
  12. #{boilerplate_for(engine)}
  13. var template = #{template.to_json};
  14. var view = #{view};
  15. var partials = {partial: #{partial.to_json}};
  16. print(Mustache.render(template, view, partials));
  17. } catch(e) {
  18. print('ERROR: ' + e.message);
  19. }
  20. JS
  21. end
  22. end
  23. end
  24. unless Mustache.has_any_engines?
  25. abort "ERROR: Please install node, SpiderMonkey, JavaScriptCore or Rhino"
  26. end
  27. run_tests_for :v8 if Mustache.has_v8?
  28. run_tests_for :spidermonkey if Mustache.has_spidermonkey?
  29. run_tests_for :javascriptcore if Mustache.has_javascriptcore?
  30. run_tests_for :rhino if Mustache.has_rhino?
  31. private
  32. def load_test(name)
  33. template_file = File.join(TEST_FILES, "#{name}.mustache")
  34. view_file = File.join(TEST_FILES, "#{name}.js")
  35. partial_file = File.join(TEST_FILES, "#{name}.partial")
  36. expect_file = File.join(TEST_FILES, "#{name}.txt")
  37. [template_file, view_file, partial_file, expect_file].map do |file|
  38. File.exist?(file) ? File.read(file) : ""
  39. end
  40. end
  41. def runner_file
  42. "runner.js"
  43. end
  44. def run_js(engine, js)
  45. cmd = case engine
  46. when :v8 then NODE_PATH
  47. when :spidermonkey then JS_PATH
  48. when :javascriptcore then JSC_PATH
  49. when :rhino then "java #{RHINO_JAR}"
  50. end
  51. File.open(runner_file, 'w') {|file| file.write(js) }
  52. `#{cmd} #{runner_file}`
  53. ensure
  54. FileUtils.rm_r(runner_file)
  55. end
  56. def boilerplate_for(engine)
  57. boilerplate = MUSTACHE_JS
  58. boilerplate += "\nvar print = console.log;" if engine == :v8
  59. boilerplate
  60. end
  61. end
  62. end