jstdutil 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +20 -0
- data/README.rdoc +18 -0
- data/Rakefile +64 -0
- data/VERSION +1 -0
- data/bin/jsautotest +5 -0
- data/bin/jstestdriver +13 -0
- data/lib/jstdutil.rb +40 -0
- data/lib/jstdutil/autotest.rb +39 -0
- data/lib/jstdutil/cli.rb +22 -0
- data/lib/jstdutil/hooks.rb +29 -0
- data/lib/jstdutil/jstestdriver/config.rb +39 -0
- data/lib/jstdutil/jstestdriver/server.rb +58 -0
- data/lib/jstdutil/redgreen.rb +40 -0
- data/lib/jstdutil/test_file.rb +33 -0
- data/lib/jstdutil/test_runner.rb +55 -0
- data/lib/watchr_script +4 -0
- data/test/cli_test.rb +26 -0
- data/test/jstdutil_test.rb +32 -0
- data/test/jstestdriver_config_test.rb +42 -0
- data/test/jstestdriver_test.rb +24 -0
- data/test/redgreen_test.rb +45 -0
- data/test/test_file_test.rb +49 -0
- data/test/test_helper.rb +64 -0
- metadata +114 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Christian Johansen
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
= jstdutil
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but
|
13
|
+
bump version in a commit by itself I can ignore when I pull)
|
14
|
+
* Send me a pull request. Bonus points for topic branches.
|
15
|
+
|
16
|
+
== Copyright
|
17
|
+
|
18
|
+
Copyright (c) 2009 Christian Johansen. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "jstdutil"
|
8
|
+
gem.summary = "Thin wrapper over Google's JsTestDriver that adds colors and autotest"
|
9
|
+
gem.description = "Thin wrapper over Google's JsTestDriver that adds colors and autotest"
|
10
|
+
gem.email = "christian@cjohansen.no"
|
11
|
+
gem.homepage = "http://github.com/cjohansen/jstdutil"
|
12
|
+
gem.authors = ["Christian Johansen"]
|
13
|
+
gem.rubyforge_project = "jstdutil"
|
14
|
+
gem.add_development_dependency "thoughtbot-shoulda"
|
15
|
+
gem.add_dependency "watchr"
|
16
|
+
gem.add_dependency "rake"
|
17
|
+
gem.executables = ["jstestdriver", "jsautotest"]
|
18
|
+
gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*"]
|
19
|
+
end
|
20
|
+
Jeweler::GemcutterTasks.new
|
21
|
+
Jeweler::RubyforgeTasks.new do |rubyforge|
|
22
|
+
rubyforge.doc_task = "rdoc"
|
23
|
+
end
|
24
|
+
rescue LoadError
|
25
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/*_test.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
|
35
|
+
begin
|
36
|
+
require 'rcov/rcovtask'
|
37
|
+
Rcov::RcovTask.new do |test|
|
38
|
+
test.libs << 'test'
|
39
|
+
test.pattern = 'test/**/*_test.rb'
|
40
|
+
test.verbose = true
|
41
|
+
end
|
42
|
+
rescue LoadError
|
43
|
+
task :rcov do
|
44
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
task :test => :check_dependencies
|
49
|
+
|
50
|
+
task :default => :test
|
51
|
+
|
52
|
+
require 'rake/rdoctask'
|
53
|
+
Rake::RDocTask.new do |rdoc|
|
54
|
+
if File.exist?('VERSION')
|
55
|
+
version = File.read('VERSION')
|
56
|
+
else
|
57
|
+
version = ""
|
58
|
+
end
|
59
|
+
|
60
|
+
rdoc.rdoc_dir = 'rdoc'
|
61
|
+
rdoc.title = "jstdutil #{version}"
|
62
|
+
rdoc.rdoc_files.include('README*')
|
63
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
64
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/bin/jsautotest
ADDED
data/bin/jstestdriver
ADDED
data/lib/jstdutil.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require "jstdutil/redgreen"
|
2
|
+
#require "jstdutil/autotest"
|
3
|
+
|
4
|
+
module Jstdutil
|
5
|
+
def self.install_dir
|
6
|
+
File.expand_path(File.dirname(__FILE__))
|
7
|
+
end
|
8
|
+
|
9
|
+
#
|
10
|
+
# Locate Jar file from a given path. Default classpath is $JSTDUTIL_HOME
|
11
|
+
# Finds and returns the first file matching jstest*.jar (case insensitive).
|
12
|
+
# Also checks current working directory
|
13
|
+
#
|
14
|
+
def self.jar(classpath = ENV["JSTESTDRIVER_HOME"] || Dir.pwd)
|
15
|
+
files = Dir.glob(File.join(classpath, 'jstest*.jar'), File::FNM_CASEFOLD)
|
16
|
+
files.sort! { |f1, f2| f1.downcase <=> f2.downcase }
|
17
|
+
|
18
|
+
if !files || !files.first
|
19
|
+
msg = "Unable to load jar file from #{classpath}\n" <<
|
20
|
+
"Check that $JSTESTDRIVER_HOME is set correctly"
|
21
|
+
raise FileNotFoundError.new(msg)
|
22
|
+
end
|
23
|
+
|
24
|
+
files[-1]
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Run the jar through the java command
|
29
|
+
#
|
30
|
+
def self.run(args, jar)
|
31
|
+
begin
|
32
|
+
`java -jar #{jar} #{args}`
|
33
|
+
rescue Exception
|
34
|
+
puts "I N T E R R U P T"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class FileNotFoundError < StandardError
|
40
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "jstdutil/test_runner"
|
2
|
+
require "jstdutil/hooks"
|
3
|
+
require "watchr"
|
4
|
+
|
5
|
+
module Jstdutil
|
6
|
+
class Autotest
|
7
|
+
attr_reader :runner
|
8
|
+
AVAILABLE_HOOKS = [:initialize, :died, :quit, :ran_command, :run_command, :waiting]
|
9
|
+
include Hooks
|
10
|
+
|
11
|
+
def initialize(args)
|
12
|
+
absolute_path = Pathname(File.join(Jstdutil.install_dir, "watchr_script"))
|
13
|
+
script = Watchr::Script.new(absolute_path)
|
14
|
+
@watchr_controller = Watchr::Controller.new(script, Watchr.handler.new)
|
15
|
+
@runner = Jstdutil::TestRunner.new(args)
|
16
|
+
$jstestdriver_test_runner = @runner
|
17
|
+
@interrupted_at = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
hook(:initialize)
|
22
|
+
|
23
|
+
trap("INT") do
|
24
|
+
if @interrupted_at && Time.now - @interrupted_at < 2
|
25
|
+
puts "No more testing today, shutting down"
|
26
|
+
@runner.finalize
|
27
|
+
exit
|
28
|
+
else
|
29
|
+
@interrupted_at = Time.now
|
30
|
+
puts "Running all tests, hit Ctrl-c again to exit"
|
31
|
+
@runner.run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
@runner.run
|
36
|
+
@watchr_controller.run
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/jstdutil/cli.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Jstdutil
|
2
|
+
#
|
3
|
+
# <tt>Jstdutil::Cli</tt> is a tiny wrapper to the JsTestDriver
|
4
|
+
# jar, simply allowing you to avoid the clunkiness of <tt>`java -jar FILE [ARGS]`</tt>
|
5
|
+
#
|
6
|
+
# The wrapper also formats output with <tt>JsRedGreen</tt>, yielding
|
7
|
+
# beautiful test reports.
|
8
|
+
#
|
9
|
+
# In addition to the JsTestDriver arguments you can specify the path
|
10
|
+
# to the jar file by --jar. This kinda defeats the purpose, though,
|
11
|
+
# so a better solution is to set the environment variable
|
12
|
+
# $JSTESTDRIVER_HOME to where the jar file lives (see <tt>JsTestDriver.jar</tt>).
|
13
|
+
#
|
14
|
+
class Cli
|
15
|
+
def self.run(args = [])
|
16
|
+
args = args.join(" ")
|
17
|
+
jar = (args.match(/--jar\s+([^\s]+)/) || [])[1] || Jstdutil.jar
|
18
|
+
|
19
|
+
Jstdutil::RedGreen.format(Jstdutil.run("#{args.sub(/--jar\s+[^\s]+/, '')}", jar))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#
|
2
|
+
# Observer module/hooks module, modeled exactly like
|
3
|
+
# ZenTest::Autotest, in order to ease porting of addons like autotest-screen
|
4
|
+
#
|
5
|
+
# In order to use the hooks module, the including class needs to define an
|
6
|
+
# AVAILABLE_HOOKS constant hash. The rest is handled by the mixin module.
|
7
|
+
#
|
8
|
+
module Hooks
|
9
|
+
def self.included(target)
|
10
|
+
target.class_eval do
|
11
|
+
@@hooks = {}
|
12
|
+
target::AVAILABLE_HOOKS.each { |hook| @@hooks[hook] = [] }
|
13
|
+
|
14
|
+
def self.add_hook(hook, &block)
|
15
|
+
@@hooks[hook] << block
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.hook(hook, *args)
|
19
|
+
@@hooks[hook].any? do |plugin|
|
20
|
+
plugin[self, *args]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def hook(hook)
|
25
|
+
self.class.hook(hook)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Jstdutil
|
2
|
+
module JsTestDriver
|
3
|
+
# Simple interface to JsTestDriver configuration
|
4
|
+
# Can instantiate with either a configuration file or string contents
|
5
|
+
#
|
6
|
+
# config = Jstdutil::JsTestDriverConfig.new "jsTestDriver.conf"
|
7
|
+
# config.server #=> "http://localhost:4224"
|
8
|
+
#
|
9
|
+
class Config
|
10
|
+
def initialize(file)
|
11
|
+
begin
|
12
|
+
load_config(File.read(file))
|
13
|
+
rescue
|
14
|
+
load_config(file)
|
15
|
+
rescue
|
16
|
+
msg = "Configuration must be an existing file or valid JsTestDriver " <<
|
17
|
+
"configuration string (contain atleast server)"
|
18
|
+
raise ArgumentError.new(msg)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def method_missing(name, *args, &block)
|
23
|
+
return @contents[name.to_s] if @contents.key?(name.to_s)
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def load_config(contents)
|
29
|
+
@contents = YAML.load(contents)
|
30
|
+
|
31
|
+
if !@contents.respond_to?(:key?) || !@contents.key?("server")
|
32
|
+
raise ArgumentError.new("Error: Missing 'server' setting")
|
33
|
+
end
|
34
|
+
|
35
|
+
@contents
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# require 'open3'
|
2
|
+
require "uri"
|
3
|
+
|
4
|
+
module Jstdutil
|
5
|
+
module JsTestDriver
|
6
|
+
class Server
|
7
|
+
def initialize(config, args = nil)
|
8
|
+
@uri = URI.parse(config.respond_to?(:server) ? config.server : config)
|
9
|
+
@args = args
|
10
|
+
# @server = nil
|
11
|
+
@pid = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def running?
|
15
|
+
response = nil
|
16
|
+
|
17
|
+
begin
|
18
|
+
Net::HTTP.start(@uri.host, @uri.port) { |http| response = http.head("/") }
|
19
|
+
rescue Errno::ECONNREFUSED => err
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
|
23
|
+
response.code == "200"
|
24
|
+
end
|
25
|
+
|
26
|
+
def start
|
27
|
+
if !["localhost", "127.0.0.1", "0.0.0.0"].include?(@uri.host)
|
28
|
+
raise "Unable to start remote server on #{@uri.host}"
|
29
|
+
end
|
30
|
+
|
31
|
+
puts "Starting server on http://#{@uri.host}:#{@uri.port}"
|
32
|
+
# @server = IO.popen("jstestdriver #{@args} --port #{@uri.port}")
|
33
|
+
# [stdin, stdout, stderr] = Open3.popen3("jstestdriver #{@args} --port #{@uri.port}")
|
34
|
+
# @server = stderr
|
35
|
+
|
36
|
+
@pid = Process.fork do
|
37
|
+
io = `jstestdriver --port #{@uri.port}`
|
38
|
+
|
39
|
+
Signal.trap("HUP") do
|
40
|
+
puts "JsTestDriver at port #@port going down"
|
41
|
+
!io.closed? && io.close!
|
42
|
+
exit
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# sleep 0.5
|
47
|
+
end
|
48
|
+
|
49
|
+
def stop
|
50
|
+
# @server && !@server.closed? && @server.close
|
51
|
+
if @pid
|
52
|
+
Process.kill("HUP", @pid)
|
53
|
+
Process.wait
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Jstdutil
|
2
|
+
class RedGreen
|
3
|
+
# Borrowed from the ruby redgreen gem
|
4
|
+
# Not included as a gem dependency since it drags in Test::Unit
|
5
|
+
# and friends, which is overkill for our situation
|
6
|
+
module Color
|
7
|
+
COLORS = { :clear => 0, :red => 31, :green => 32, :yellow => 33 }
|
8
|
+
|
9
|
+
def self.method_missing(color_name, *args)
|
10
|
+
color(color_name) + args.first + color(:clear)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.color(color)
|
14
|
+
"\e[#{COLORS[color.to_sym]}m"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Process report from JsTestDriver and colorize it with beautiful
|
20
|
+
# colors. Returns report with encoded colors.
|
21
|
+
#
|
22
|
+
def self.format(report)
|
23
|
+
report.split("\n").collect do |line|
|
24
|
+
if line =~ /Passed: \d+; Fails: (\d+); Errors:? (\d+)/
|
25
|
+
Color.send($1.to_i + $2.to_i != 0 ? :red : :green, line)
|
26
|
+
elsif line =~ /^[\.EF]+$/
|
27
|
+
line.gsub(/\./, Color.green(".")).gsub(/F/, Color.red("F")).gsub("E", Color.yellow("E"))
|
28
|
+
elsif line =~ /failed/
|
29
|
+
Color.red(line)
|
30
|
+
elsif line =~ /passed/
|
31
|
+
Color.green(line)
|
32
|
+
elsif line =~ /error/
|
33
|
+
Color.yellow(line)
|
34
|
+
else
|
35
|
+
line
|
36
|
+
end
|
37
|
+
end.join("\n")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "rake"
|
2
|
+
|
3
|
+
module Jstdutil
|
4
|
+
# Knows how to map source files to test files, how to extract test cases
|
5
|
+
# and so on.
|
6
|
+
#
|
7
|
+
class TestFile
|
8
|
+
def initialize(file)
|
9
|
+
@file = file
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_files
|
13
|
+
return @test_files if @test_files
|
14
|
+
|
15
|
+
if @file =~ /(_test[^\/]+)|([^\/]+_test)\.js/
|
16
|
+
@test_files = [@file]
|
17
|
+
else
|
18
|
+
name = File.basename(@file).gsub(/(_test)|(test_)|(\.js)/, "")
|
19
|
+
@test_files = FileList["**/#{name}_test.js", "**/test_#{name}.js"].uniq
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_cases
|
24
|
+
return @cases if @cases
|
25
|
+
|
26
|
+
@cases = test_files.collect do |file|
|
27
|
+
File.read(file).scan(/TestCase\(["']([^"']*)/)
|
28
|
+
end
|
29
|
+
|
30
|
+
@cases.flatten!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "jstdutil/jstestdriver/config"
|
2
|
+
require "jstdutil/jstestdriver/server"
|
3
|
+
require "jstdutil/cli"
|
4
|
+
require "jstdutil/test_file"
|
5
|
+
require "net/http"
|
6
|
+
|
7
|
+
module Jstdutil
|
8
|
+
class TestRunner
|
9
|
+
def initialize(args = [])
|
10
|
+
@args = strip_opt(args.join(" "), "tests")
|
11
|
+
config = @args.scan(/--config\s+([^\s]+)/).flatten
|
12
|
+
config = config.first || File.expand_path("jsTestDriver.conf")
|
13
|
+
config = JsTestDriver::Config.new(config)
|
14
|
+
|
15
|
+
if config && config.server
|
16
|
+
@server = JsTestDriver::Server.new(config, args({}, ["port"]).join(" "))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_cases(files)
|
21
|
+
files = files.respond_to?(:captures) ? files.captures : files
|
22
|
+
cases = files.collect { |file| TestFile.new(file).test_cases }.flatten.join(",")
|
23
|
+
|
24
|
+
cases == "" && "all" || cases
|
25
|
+
end
|
26
|
+
|
27
|
+
def run(tests = "all")
|
28
|
+
begin
|
29
|
+
@server.start unless @server.running?
|
30
|
+
rescue StandardError => err
|
31
|
+
puts err.message
|
32
|
+
end
|
33
|
+
|
34
|
+
puts(Time.now.strftime("%F %H:%M:%S Running #{tests}"))
|
35
|
+
puts(Jstdutil::Cli.run(args("tests" => tests)))
|
36
|
+
end
|
37
|
+
|
38
|
+
def finalize
|
39
|
+
@server.stop
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def args(add = {}, remove = [])
|
44
|
+
args = @args
|
45
|
+
(remove + add.keys).uniq.each { |opt| args = strip_opt(args, opt) }
|
46
|
+
add.each { |opt, value| args += " --#{opt} #{value}" }
|
47
|
+
args.strip.split(/\s+/)
|
48
|
+
end
|
49
|
+
|
50
|
+
def strip_opt(str, opt)
|
51
|
+
str.sub(/--#{opt}\s+[^\s]+/, "")
|
52
|
+
str
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/watchr_script
ADDED
data/test/cli_test.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "jstdutil/cli"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
class JstdutilCliTest < Test::Unit::TestCase
|
6
|
+
context "running the cli" do
|
7
|
+
should "run jstestdriver command through JsRedGreen with given jar" do
|
8
|
+
jar = "path/to.jar"
|
9
|
+
result = "REPORT"
|
10
|
+
Jstdutil.expects(:run).with("--tests all ", jar).returns(result)
|
11
|
+
Jstdutil::RedGreen.expects(:format).with(result).returns(result * 2)
|
12
|
+
|
13
|
+
assert_equal result * 2, Jstdutil::Cli.run("--tests all --jar #{jar}".split(" "))
|
14
|
+
end
|
15
|
+
|
16
|
+
should "run jstestdriver command through JsRedGreen with jar from env" do
|
17
|
+
jar = "path/to.jar"
|
18
|
+
result = "REPORT"
|
19
|
+
Jstdutil.expects(:jar).returns(jar)
|
20
|
+
Jstdutil.expects(:run).with("--tests all", jar).returns(result)
|
21
|
+
Jstdutil::RedGreen.expects(:format).with(result).returns(result * 2)
|
22
|
+
|
23
|
+
assert_equal result * 2, Jstdutil::Cli.run("--tests all".split(" "))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class JstdutilTest < Test::Unit::TestCase
|
4
|
+
context "locating jar file" do
|
5
|
+
setup do
|
6
|
+
@newest = "jstestdriver-1.1.jar"
|
7
|
+
@jars = ["JsTestDriver-1.0b.jar", "jstestdriver-1.0.jar", @newest]
|
8
|
+
end
|
9
|
+
|
10
|
+
should "use most recent test driver" do
|
11
|
+
with_jars(@jars) do |dir|
|
12
|
+
assert_equal @newest, File.basename(Jstdutil.jar(dir))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
should "use $JSTESTDRIVER_HOME if no classpath is given" do
|
17
|
+
with_jars(@jars) do |dir|
|
18
|
+
with_env("JSTESTDRIVER_HOME", dir) do
|
19
|
+
assert_equal @newest, File.basename(Jstdutil.jar)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
should "raise exception if no classpath is provided, and env not set" do
|
25
|
+
with_env("JSTESTDRIVER_HOME", nil) do
|
26
|
+
assert_raise FileNotFoundError do
|
27
|
+
Jstdutil.jar
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "jstdutil/jstestdriver_config"
|
3
|
+
|
4
|
+
class JsTestDriverConfigTest < Test::Unit::TestCase
|
5
|
+
context "creating JsTestDriverConfig instances" do
|
6
|
+
setup do
|
7
|
+
@file = "__jstd.conf"
|
8
|
+
@server = "http://localhost:4242"
|
9
|
+
File.open(@file, "w") { |f| f.puts "server: #{@server}" }
|
10
|
+
end
|
11
|
+
|
12
|
+
teardown do
|
13
|
+
File.delete(@file) if File.exists?(@file)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "work from existing file" do
|
17
|
+
config = nil
|
18
|
+
|
19
|
+
assert_nothing_raised do
|
20
|
+
config = Jstdutil::JsTestDriverConfig.new @file
|
21
|
+
end
|
22
|
+
|
23
|
+
assert_equal @server, config.server
|
24
|
+
end
|
25
|
+
|
26
|
+
should "work from string config" do
|
27
|
+
config = nil
|
28
|
+
|
29
|
+
assert_nothing_raised do
|
30
|
+
config = Jstdutil::JsTestDriverConfig.new "server: #{@server}"
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_equal @server, config.server
|
34
|
+
end
|
35
|
+
|
36
|
+
should "raise error if no valid configuration is provided" do
|
37
|
+
assert_raise ArgumentError do
|
38
|
+
Jstdutil::JsTestDriverConfig.new "bogus"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class JstdutilCliTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@bin = File.join(File.dirname(__FILE__), "..", "bin", "jstestdriver")
|
6
|
+
end
|
7
|
+
|
8
|
+
context "running the binary" do
|
9
|
+
should "report success to $stdout" do
|
10
|
+
jar = "JsTestDriver.jar"
|
11
|
+
stdout = nil
|
12
|
+
|
13
|
+
capture_stderr do
|
14
|
+
stdout = capture_stdout do
|
15
|
+
with_jars(jar) do |dir|
|
16
|
+
`ruby -Ilib #@bin --jar #{File.join(dir, jar)}`
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
assert_equal "\n", stdout
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class RedGreenTest < Test::Unit::TestCase
|
4
|
+
context "formatting report" do
|
5
|
+
setup do
|
6
|
+
@report = <<-REPORT
|
7
|
+
.FE
|
8
|
+
Total 3 tests (Passed: 1; Fails: 1; Errors: 1) (2.00 ms)
|
9
|
+
Mozilla 1.9.1.2: Run 3 tests (Passed: 1; Fails: 1; Errors 1) (2.00 ms)
|
10
|
+
GreeterTest.testSomethingElse failed (1.00 ms): expected "1" but was "2"
|
11
|
+
()@http://localhost:4224/test/test/greeter_test.js:10
|
12
|
+
[LOG] UH!
|
13
|
+
GreeterTest.testSomethingElseFails error (1.00 ms): assertEqual is not defined
|
14
|
+
()@http://localhost:4224/test/test/greeter_test.js:14
|
15
|
+
REPORT
|
16
|
+
end
|
17
|
+
|
18
|
+
should "add pretty colors" do
|
19
|
+
report = Jstdutil::RedGreen.format(@report)
|
20
|
+
|
21
|
+
lines = @report.split("\n")
|
22
|
+
|
23
|
+
expected = Jstdutil::RedGreen::Color.green(".") +
|
24
|
+
Jstdutil::RedGreen::Color.red("F") +
|
25
|
+
Jstdutil::RedGreen::Color.yellow("E") + "\n"
|
26
|
+
expected << Jstdutil::RedGreen::Color.red(lines[1]) + "\n"
|
27
|
+
expected << Jstdutil::RedGreen::Color.red(lines[2]) + "\n"
|
28
|
+
expected << Jstdutil::RedGreen::Color.red(lines[3]) + "\n"
|
29
|
+
expected << lines[4] + "\n"
|
30
|
+
expected << lines[5] + "\n"
|
31
|
+
expected << Jstdutil::RedGreen::Color.yellow(lines[6]) + "\n"
|
32
|
+
expected << lines[7]
|
33
|
+
|
34
|
+
assert_equal expected.split("\n")[0], report.split("\n")[0]
|
35
|
+
assert_equal expected.split("\n")[1], report.split("\n")[1]
|
36
|
+
assert_equal expected.split("\n")[2], report.split("\n")[2]
|
37
|
+
assert_equal expected.split("\n")[3], report.split("\n")[3]
|
38
|
+
assert_equal expected.split("\n")[4], report.split("\n")[4]
|
39
|
+
assert_equal expected.split("\n")[5], report.split("\n")[5]
|
40
|
+
assert_equal expected.split("\n")[6], report.split("\n")[6]
|
41
|
+
assert_equal expected.split("\n")[7], report.split("\n")[7]
|
42
|
+
assert_equal expected, report
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "jstdutil/test_file"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
class TestFileTest < Test::Unit::TestCase
|
6
|
+
context "test files" do
|
7
|
+
should "be file itself if name is like _test.js" do
|
8
|
+
file = "some_test.js"
|
9
|
+
test_file = Jstdutil::TestFile.new(file)
|
10
|
+
|
11
|
+
assert_equal [file], test_file.test_files
|
12
|
+
end
|
13
|
+
|
14
|
+
should "find files like _test.js" do
|
15
|
+
file = "some.js"
|
16
|
+
test_file = Jstdutil::TestFile.new(file)
|
17
|
+
FileList.expects(:new).with("**/some_test.js", "**/test_some.js").returns([])
|
18
|
+
|
19
|
+
assert test_file.test_files
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "test cases" do
|
24
|
+
setup do
|
25
|
+
@dir = "__testdata"
|
26
|
+
@files = ["src/some.js", "test/some_test.js", "test/other_test.js"]
|
27
|
+
@cases = ["SomeTest", "OtherTest", "YetAnotherTest"]
|
28
|
+
@contents = { @files[1] => 'new TestCase("' + @cases[0] + '", {});',
|
29
|
+
@files[2] => "new TestCase('#{@cases[1]}', {});\nnew TestCase('#{@cases[2]}', {});" }
|
30
|
+
|
31
|
+
@files.each do |file|
|
32
|
+
content = @contents[file] || ""
|
33
|
+
file = File.join(@dir, file)
|
34
|
+
FileUtils.mkdir_p(File.dirname(file))
|
35
|
+
File.open(file, "w") { |f| f.puts(content) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
teardown do
|
40
|
+
FileUtils.rm_rf(@dir)
|
41
|
+
end
|
42
|
+
|
43
|
+
should "find test case in file" do
|
44
|
+
test_file = Jstdutil::TestFile.new(@files[0])
|
45
|
+
|
46
|
+
assert_equal @cases[0..0], test_file.test_cases
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'mocha'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'redgreen'
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
9
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
10
|
+
require 'jstdutil'
|
11
|
+
|
12
|
+
class Test::Unit::TestCase
|
13
|
+
def capture_stdout
|
14
|
+
ios = StringIO.new
|
15
|
+
stdout = $stdout
|
16
|
+
$stdout = ios
|
17
|
+
|
18
|
+
begin
|
19
|
+
yield
|
20
|
+
ensure
|
21
|
+
$stdout = stdout
|
22
|
+
ios
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def capture_stderr
|
27
|
+
ios = StringIO.new
|
28
|
+
stderr = $stderr
|
29
|
+
$stderr = ios
|
30
|
+
|
31
|
+
begin
|
32
|
+
yield
|
33
|
+
ensure
|
34
|
+
$stderr = stderr
|
35
|
+
ios
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def with_jars(jars = "JsTestDriver-1.0b.jar", dir = "data")
|
40
|
+
FileUtils.rm_rf(dir)
|
41
|
+
Dir.mkdir(dir)
|
42
|
+
|
43
|
+
[jars].flatten.each do |lib|
|
44
|
+
File.open(File.join(dir, lib), "w") { |f| f.puts "" }
|
45
|
+
end
|
46
|
+
|
47
|
+
begin
|
48
|
+
yield dir
|
49
|
+
ensure
|
50
|
+
FileUtils.rm_rf(dir)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def with_env(name, value)
|
55
|
+
env = ENV[name]
|
56
|
+
ENV[name] = value
|
57
|
+
|
58
|
+
begin
|
59
|
+
yield
|
60
|
+
ensure
|
61
|
+
ENV[name] = value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
metadata
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jstdutil
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Christian Johansen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-04 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: thoughtbot-shoulda
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: watchr
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rake
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
description: Thin wrapper over Google's JsTestDriver that adds colors and autotest
|
46
|
+
email: christian@cjohansen.no
|
47
|
+
executables:
|
48
|
+
- jstestdriver
|
49
|
+
- jsautotest
|
50
|
+
extensions: []
|
51
|
+
|
52
|
+
extra_rdoc_files:
|
53
|
+
- LICENSE
|
54
|
+
- README.rdoc
|
55
|
+
files:
|
56
|
+
- LICENSE
|
57
|
+
- README.rdoc
|
58
|
+
- Rakefile
|
59
|
+
- VERSION
|
60
|
+
- bin/jsautotest
|
61
|
+
- bin/jstestdriver
|
62
|
+
- lib/jstdutil.rb
|
63
|
+
- lib/jstdutil/autotest.rb
|
64
|
+
- lib/jstdutil/cli.rb
|
65
|
+
- lib/jstdutil/hooks.rb
|
66
|
+
- lib/jstdutil/jstestdriver/config.rb
|
67
|
+
- lib/jstdutil/jstestdriver/server.rb
|
68
|
+
- lib/jstdutil/redgreen.rb
|
69
|
+
- lib/jstdutil/test_file.rb
|
70
|
+
- lib/jstdutil/test_runner.rb
|
71
|
+
- lib/watchr_script
|
72
|
+
- test/cli_test.rb
|
73
|
+
- test/jstdutil_test.rb
|
74
|
+
- test/jstestdriver_config_test.rb
|
75
|
+
- test/jstestdriver_test.rb
|
76
|
+
- test/redgreen_test.rb
|
77
|
+
- test/test_file_test.rb
|
78
|
+
- test/test_helper.rb
|
79
|
+
has_rdoc: true
|
80
|
+
homepage: http://github.com/cjohansen/jstdutil
|
81
|
+
licenses: []
|
82
|
+
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options:
|
85
|
+
- --charset=UTF-8
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: "0"
|
93
|
+
version:
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: "0"
|
99
|
+
version:
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project: jstdutil
|
103
|
+
rubygems_version: 1.3.5
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: Thin wrapper over Google's JsTestDriver that adds colors and autotest
|
107
|
+
test_files:
|
108
|
+
- test/cli_test.rb
|
109
|
+
- test/jstdutil_test.rb
|
110
|
+
- test/jstestdriver_config_test.rb
|
111
|
+
- test/jstestdriver_test.rb
|
112
|
+
- test/redgreen_test.rb
|
113
|
+
- test/test_file_test.rb
|
114
|
+
- test/test_helper.rb
|