ryanbriones-ZenTest 3.11.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +523 -0
- data/Manifest.txt +69 -0
- data/README.txt +110 -0
- data/Rakefile +68 -0
- data/articles/Article.css +721 -0
- data/articles/getting_started_with_autotest.html +532 -0
- data/articles/how_to_use_zentest.txt +393 -0
- data/bin/autotest +55 -0
- data/bin/multiruby +40 -0
- data/bin/multiruby_setup +68 -0
- data/bin/rails_test_audit +80 -0
- data/bin/unit_diff +38 -0
- data/bin/zentest +28 -0
- data/example.txt +42 -0
- data/example1.rb +7 -0
- data/example2.rb +15 -0
- data/example_dot_autotest.rb +45 -0
- data/lib/autotest.rb +654 -0
- data/lib/autotest/autoupdate.rb +26 -0
- data/lib/autotest/camping.rb +37 -0
- data/lib/autotest/cctray.rb +57 -0
- data/lib/autotest/discover.rb +6 -0
- data/lib/autotest/emacs.rb +35 -0
- data/lib/autotest/email_notify.rb +66 -0
- data/lib/autotest/fixtures.rb +12 -0
- data/lib/autotest/growl.rb +28 -0
- data/lib/autotest/heckle.rb +14 -0
- data/lib/autotest/html_report.rb +31 -0
- data/lib/autotest/jabber_notify.rb +111 -0
- data/lib/autotest/kdenotify.rb +14 -0
- data/lib/autotest/menu.rb +51 -0
- data/lib/autotest/migrate.rb +7 -0
- data/lib/autotest/notify.rb +34 -0
- data/lib/autotest/once.rb +9 -0
- data/lib/autotest/pretty.rb +83 -0
- data/lib/autotest/rails.rb +81 -0
- data/lib/autotest/rcov.rb +22 -0
- data/lib/autotest/redgreen.rb +21 -0
- data/lib/autotest/restart.rb +11 -0
- data/lib/autotest/screen.rb +73 -0
- data/lib/autotest/shame.rb +45 -0
- data/lib/autotest/snarl.rb +51 -0
- data/lib/autotest/timestamp.rb +9 -0
- data/lib/functional_test_matrix.rb +92 -0
- data/lib/multiruby.rb +401 -0
- data/lib/test/rails.rb +295 -0
- data/lib/test/rails/controller_test_case.rb +382 -0
- data/lib/test/rails/functional_test_case.rb +79 -0
- data/lib/test/rails/helper_test_case.rb +64 -0
- data/lib/test/rails/ivar_proxy.rb +31 -0
- data/lib/test/rails/pp_html_document.rb +74 -0
- data/lib/test/rails/rake_tasks.rb +50 -0
- data/lib/test/rails/render_tree.rb +93 -0
- data/lib/test/rails/test_case.rb +28 -0
- data/lib/test/rails/view_test_case.rb +597 -0
- data/lib/test/zentest_assertions.rb +134 -0
- data/lib/unit_diff.rb +259 -0
- data/lib/zentest.rb +566 -0
- data/lib/zentest_mapping.rb +99 -0
- data/test/test_autotest.rb +449 -0
- data/test/test_help.rb +36 -0
- data/test/test_rails_autotest.rb +229 -0
- data/test/test_rails_controller_test_case.rb +58 -0
- data/test/test_rails_helper_test_case.rb +48 -0
- data/test/test_rails_view_test_case.rb +275 -0
- data/test/test_unit_diff.rb +319 -0
- data/test/test_zentest.rb +566 -0
- data/test/test_zentest_assertions.rb +128 -0
- data/test/test_zentest_mapping.rb +222 -0
- metadata +151 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
module Autotest::Menu
|
4
|
+
WINDOZE = /win32/ =~ RUBY_PLATFORM unless defined? WINDOZE
|
5
|
+
|
6
|
+
if WINDOZE then
|
7
|
+
require "Win32API"
|
8
|
+
def self.getchar
|
9
|
+
Win32API.new("crtdll", "_getch", [], "L").Call
|
10
|
+
end
|
11
|
+
else
|
12
|
+
STTY_SAVE_STATE=`stty -g`
|
13
|
+
def self.getchar
|
14
|
+
system 'stty raw echo'
|
15
|
+
STDIN.getc
|
16
|
+
ensure
|
17
|
+
system "stty '#{STTY_SAVE_STATE}'"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.menu(choices)
|
22
|
+
result = nil
|
23
|
+
choices.sort.each do |c, desc|
|
24
|
+
puts "#{c.chr}: #{desc}"
|
25
|
+
end
|
26
|
+
until choices[result]
|
27
|
+
print "menu> "
|
28
|
+
result = getchar
|
29
|
+
print " invalid input" unless choices[result]
|
30
|
+
puts
|
31
|
+
end
|
32
|
+
result
|
33
|
+
end
|
34
|
+
|
35
|
+
Autotest.add_hook(:interrupt) do |at|
|
36
|
+
$stderr.puts "menu"
|
37
|
+
case menu ?q => "quit", ?c => "continue", ?r => "restart"
|
38
|
+
when ?c
|
39
|
+
true
|
40
|
+
when ?r
|
41
|
+
at.reset
|
42
|
+
true
|
43
|
+
when ?q
|
44
|
+
at.wants_to_quit = true
|
45
|
+
true
|
46
|
+
else
|
47
|
+
false
|
48
|
+
end
|
49
|
+
# puts "you chose #{c.chr}"
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Autotest::Notify
|
2
|
+
def self.notify(title, message, priority='critical')
|
3
|
+
icon = if priority == 'critical'
|
4
|
+
'dialog-error'
|
5
|
+
else
|
6
|
+
'dialog-information'
|
7
|
+
end
|
8
|
+
system "notify-send -u #{priority} -t 10000 -i #{icon} '#{title}' '#{message.inspect}'"
|
9
|
+
end
|
10
|
+
|
11
|
+
Autotest.add_hook :red do |at|
|
12
|
+
tests = 0
|
13
|
+
assertions = 0
|
14
|
+
failures = 0
|
15
|
+
errors = 0
|
16
|
+
at.results.scan(/(\d+) tests, (\d+) assertions, (\d+) failures, (\d+) errors/) do |t, a, f, e|
|
17
|
+
tests += t.to_i
|
18
|
+
assertions += a.to_i
|
19
|
+
failures += f.to_i
|
20
|
+
errors += e.to_i
|
21
|
+
end
|
22
|
+
message = "%d tests, %d assertions, %d failures, %d errors" %
|
23
|
+
[tests, assertions, failures, errors]
|
24
|
+
notify("Tests Failed", message)
|
25
|
+
end
|
26
|
+
|
27
|
+
Autotest.add_hook :green do |at|
|
28
|
+
notify("Tests Passed", "Outstanding tests passed", 'low') if at.tainted
|
29
|
+
end
|
30
|
+
|
31
|
+
Autotest.add_hook :all do |at|_hook
|
32
|
+
notify("autotest", "Tests have fully passed", 'low')
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'osx/cocoa'
|
4
|
+
include Math
|
5
|
+
include OSX
|
6
|
+
|
7
|
+
OSX::NSBundle.bundleWithPath(File.expand_path("~/Library/Frameworks/Aquaterm.framework")).load
|
8
|
+
OSX.ns_import :AQTAdapter
|
9
|
+
|
10
|
+
class Autotest::Pretty
|
11
|
+
BLACK = 0
|
12
|
+
WHITE = 1
|
13
|
+
RED = 2
|
14
|
+
GREEN = 3
|
15
|
+
GRAY = 4
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@past = []
|
19
|
+
|
20
|
+
@adapter = AQTAdapter.alloc.init
|
21
|
+
@adapter.openPlotWithIndex 1
|
22
|
+
@adapter.setPlotSize([122,122])
|
23
|
+
@adapter.setPlotTitle("Autotest Status")
|
24
|
+
|
25
|
+
@adapter.setColormapEntry_red_green_blue(0, 0.0, 0.0, 0.0) # black
|
26
|
+
@adapter.setColormapEntry_red_green_blue(1, 1.0, 1.0, 1.0) # white
|
27
|
+
@adapter.setColormapEntry_red_green_blue(2, 1.0, 0.0, 0.0) # red
|
28
|
+
@adapter.setColormapEntry_red_green_blue(3, 0.0, 1.0, 0.0) # green
|
29
|
+
@adapter.setColormapEntry_red_green_blue(4, 0.7, 0.7, 0.7) # gray
|
30
|
+
|
31
|
+
draw
|
32
|
+
end
|
33
|
+
|
34
|
+
def draw
|
35
|
+
@past.shift if @past.size > 100
|
36
|
+
|
37
|
+
@adapter.takeColorFromColormapEntry(@past.last ? GREEN : RED)
|
38
|
+
@adapter.addFilledRect([0, 0, 122, 122])
|
39
|
+
|
40
|
+
@adapter.takeColorFromColormapEntry(BLACK)
|
41
|
+
@adapter.addFilledRect([10, 10, 102, 102])
|
42
|
+
|
43
|
+
@adapter.takeColorFromColormapEntry(GRAY)
|
44
|
+
@adapter.addFilledRect([11, 11, 100, 100])
|
45
|
+
|
46
|
+
@adapter.takeColorFromColormapEntry(0)
|
47
|
+
|
48
|
+
@past.each_with_index do |passed,i|
|
49
|
+
x = i % 10
|
50
|
+
y = i / 10
|
51
|
+
|
52
|
+
@adapter.takeColorFromColormapEntry(passed ? GREEN : RED)
|
53
|
+
@adapter.addFilledRect([x*10+11, y*10+11, 10, 10])
|
54
|
+
end
|
55
|
+
@adapter.renderPlot
|
56
|
+
end
|
57
|
+
|
58
|
+
def pass
|
59
|
+
@past.push true
|
60
|
+
draw
|
61
|
+
end
|
62
|
+
|
63
|
+
def fail
|
64
|
+
@past.push false
|
65
|
+
draw
|
66
|
+
end
|
67
|
+
|
68
|
+
def close
|
69
|
+
@adapter.closePlot
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
unless $TESTING then
|
74
|
+
board = Autotest::Pretty.new
|
75
|
+
|
76
|
+
Autotest.add_hook :red do |at|
|
77
|
+
board.fail unless $TESTING
|
78
|
+
end
|
79
|
+
|
80
|
+
Autotest.add_hook :green do |at|
|
81
|
+
board.pass unless $TESTING
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'autotest'
|
2
|
+
|
3
|
+
class Autotest::Rails < Autotest
|
4
|
+
|
5
|
+
def initialize # :nodoc:
|
6
|
+
super
|
7
|
+
|
8
|
+
add_exception %r%^\./(?:db|doc|log|public|script|tmp|vendor)%
|
9
|
+
|
10
|
+
clear_mappings
|
11
|
+
|
12
|
+
self.add_mapping(/^lib\/.*\.rb$/) do |filename, _|
|
13
|
+
impl = File.basename(filename, '.rb')
|
14
|
+
files_matching %r%^test/unit/#{impl}_test.rb$%
|
15
|
+
# TODO: (unit|functional|integration) maybe?
|
16
|
+
end
|
17
|
+
|
18
|
+
add_mapping %r%^test/fixtures/(.*)s.yml% do |_, m|
|
19
|
+
["test/unit/#{m[1]}_test.rb",
|
20
|
+
"test/controllers/#{m[1]}_controller_test.rb",
|
21
|
+
"test/views/#{m[1]}_view_test.rb",
|
22
|
+
"test/functional/#{m[1]}_controller_test.rb"]
|
23
|
+
end
|
24
|
+
|
25
|
+
add_mapping %r%^test/(unit|integration|controllers|views|functional)/.*rb$% do |filename, _|
|
26
|
+
filename
|
27
|
+
end
|
28
|
+
|
29
|
+
add_mapping %r%^app/models/(.*)\.rb$% do |_, m|
|
30
|
+
"test/unit/#{m[1]}_test.rb"
|
31
|
+
end
|
32
|
+
|
33
|
+
add_mapping %r%^app/helpers/application_helper.rb% do
|
34
|
+
files_matching %r%^test/(views|functional)/.*_test\.rb$%
|
35
|
+
end
|
36
|
+
|
37
|
+
add_mapping %r%^app/helpers/(.*)_helper.rb% do |_, m|
|
38
|
+
if m[1] == "application" then
|
39
|
+
files_matching %r%^test/(views|functional)/.*_test\.rb$%
|
40
|
+
else
|
41
|
+
["test/views/#{m[1]}_view_test.rb",
|
42
|
+
"test/functional/#{m[1]}_controller_test.rb"]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
add_mapping %r%^app/views/(.*)/% do |_, m|
|
47
|
+
["test/views/#{m[1]}_view_test.rb",
|
48
|
+
"test/functional/#{m[1]}_controller_test.rb"]
|
49
|
+
end
|
50
|
+
|
51
|
+
add_mapping %r%^app/controllers/(.*)\.rb$% do |_, m|
|
52
|
+
if m[1] == "application" then
|
53
|
+
files_matching %r%^test/(controllers|views|functional)/.*_test\.rb$%
|
54
|
+
else
|
55
|
+
["test/controllers/#{m[1]}_test.rb",
|
56
|
+
"test/functional/#{m[1]}_test.rb"]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
add_mapping %r%^app/views/layouts/% do
|
61
|
+
"test/views/layouts_view_test.rb"
|
62
|
+
end
|
63
|
+
|
64
|
+
add_mapping %r%^config/routes.rb$% do # FIX:
|
65
|
+
files_matching %r%^test/(controllers|views|functional)/.*_test\.rb$%
|
66
|
+
end
|
67
|
+
|
68
|
+
add_mapping %r%^test/test_helper.rb|config/((boot|environment(s/test)?).rb|database.yml)% do
|
69
|
+
files_matching %r%^test/(unit|controllers|views|functional)/.*_test\.rb$%
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Convert the pathname s to the name of class.
|
74
|
+
def path_to_classname(s)
|
75
|
+
sep = File::SEPARATOR
|
76
|
+
f = s.sub(/^test#{sep}((unit|functional|integration|views|controllers|helpers)#{sep})?/, '').sub(/\.rb$/, '').split(sep)
|
77
|
+
f = f.map { |path| path.split(/_/).map { |seg| seg.capitalize }.join }
|
78
|
+
f = f.map { |path| path =~ /Test$/ ? path : "#{path}Test" }
|
79
|
+
f.join('::')
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Autotest::RCov
|
2
|
+
@@command, @@pattern = "rcov", "test/*.rb"
|
3
|
+
|
4
|
+
def self.command= o
|
5
|
+
@@command = o
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.pattern= o
|
9
|
+
@@pattern = o
|
10
|
+
end
|
11
|
+
|
12
|
+
Autotest.add_hook :all_good do |at|
|
13
|
+
system "rake #{@@command} PATTERN=#{@@pattern}"
|
14
|
+
end
|
15
|
+
|
16
|
+
Autotest.add_hook :initialize do |at|
|
17
|
+
at.add_exception 'coverage'
|
18
|
+
at.add_exception 'coverage.info'
|
19
|
+
false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
# special thanks to Pat Eyler, Sean Carley, and Rob Sanheim
|
4
|
+
# and to Peter Havens for rspec patches
|
5
|
+
module Autotest::RedGreen
|
6
|
+
BAR = "=" * 78
|
7
|
+
REDCODE = 31
|
8
|
+
GREENCODE = 32
|
9
|
+
|
10
|
+
Autotest.add_hook :ran_command do |at|
|
11
|
+
green = case at.results.last
|
12
|
+
when /^.* (\d+) failures, (\d+) errors$/ # Test::Unit
|
13
|
+
($1 == "0" and $2 == "0")
|
14
|
+
when /^\d+\s+examples?,\s+(\d+)\s+failure/ # RSpec
|
15
|
+
($1 == "0")
|
16
|
+
end
|
17
|
+
|
18
|
+
code = green ? GREENCODE : REDCODE
|
19
|
+
puts "\e[#{ code }m#{ BAR }\e[0m\n\n" unless green.nil?
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
##
|
2
|
+
# Autotest::Screen is test result notify GNU Screen's statusline.
|
3
|
+
#
|
4
|
+
# === screenshots
|
5
|
+
# * <img src="http://f.hatena.ne.jp/images/fotolife/s/secondlife/20061109/20061109015543.png" />
|
6
|
+
# * <img src="http://f.hatena.ne.jp/images/fotolife/s/secondlife/20061109/20061109015522.png" />
|
7
|
+
#
|
8
|
+
# == SYNOPSIS
|
9
|
+
# require 'autotest/screen'
|
10
|
+
# # Autotest::Screen.statusline = '%H %`%-w%{=b bw}%n %t%{-}%+w (your statusline)'
|
11
|
+
#
|
12
|
+
|
13
|
+
class Autotest::Screen
|
14
|
+
DEFAULT_STATUSLINE = '%H %`%-w%{=b bw}%n %t%{-}%+w'
|
15
|
+
DEFAULT_SCREEN_CMD = 'screen'
|
16
|
+
|
17
|
+
SCREEN_COLOR = {
|
18
|
+
:black => 'dd',
|
19
|
+
:green => 'gk',
|
20
|
+
:red => 'rw',
|
21
|
+
}
|
22
|
+
|
23
|
+
def self.message(msg, color = :black)
|
24
|
+
col = SCREEN_COLOR[color]
|
25
|
+
msg = %Q[ %{=b #{col}} #{msg} %{-}]
|
26
|
+
send_cmd(msg)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.clear
|
30
|
+
send_cmd('')
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.run_screen_session?
|
34
|
+
str = `#{screen_cmd} -ls`
|
35
|
+
str.match(/(\d+) Socket/) && ($1.to_i > 0)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.execute?
|
39
|
+
!($TESTING || !run_screen_session?)
|
40
|
+
end
|
41
|
+
|
42
|
+
@statusline, @screen_cmd = nil
|
43
|
+
def self.statusline; @statusline || DEFAULT_STATUSLINE.dup; end
|
44
|
+
def self.statusline=(a); @statusline = a; end
|
45
|
+
def self.screen_cmd; @screen_cmd || DEFAULT_SCREEN_CMD.dup; end
|
46
|
+
def self.screen_cmd=(a); @screen_cmd = a; end
|
47
|
+
|
48
|
+
def self.send_cmd(msg)
|
49
|
+
cmd = %(#{screen_cmd} -X eval 'hardstatus alwayslastline "#{(statusline + msg).gsub('"', '\"')}"') #' stupid ruby-mode
|
50
|
+
system cmd
|
51
|
+
end
|
52
|
+
|
53
|
+
Autotest.add_hook :run do |at|
|
54
|
+
message 'Run Tests' if execute?
|
55
|
+
end
|
56
|
+
|
57
|
+
Autotest.add_hook :quit do |at|
|
58
|
+
clear if execute?
|
59
|
+
end
|
60
|
+
|
61
|
+
Autotest.add_hook :ran_command do |at|
|
62
|
+
if execute? then
|
63
|
+
output = at.results.join
|
64
|
+
failed = output.scan(/^\s+\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/)
|
65
|
+
if failed.size == 0 then
|
66
|
+
message "All Green", :green
|
67
|
+
else
|
68
|
+
f,e = failed.partition { |s| s =~ /Failure/ }
|
69
|
+
message "Red F:#{f.size} E:#{e.size}", :red
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'code_statistics'
|
2
|
+
require 'rbosa'
|
3
|
+
|
4
|
+
module Autotest::Shame
|
5
|
+
@@chat_app = :adium
|
6
|
+
|
7
|
+
def self.chat_app= o
|
8
|
+
@@chat_app = o
|
9
|
+
end
|
10
|
+
|
11
|
+
# Until the rails team learns how to write modular code... I must steal :/
|
12
|
+
STATS_DIRECTORIES = [
|
13
|
+
%w(Controllers app/controllers),
|
14
|
+
%w(Helpers app/helpers),
|
15
|
+
%w(Models app/models),
|
16
|
+
%w(Libraries lib/),
|
17
|
+
%w(APIs app/apis),
|
18
|
+
%w(Components components),
|
19
|
+
%w(Integration\ tests test/integration),
|
20
|
+
%w(Functional\ tests test/functional),
|
21
|
+
%w(Unit\ tests test/unit),
|
22
|
+
].select { |name, dir| File.directory?(dir) }
|
23
|
+
|
24
|
+
def self.shame
|
25
|
+
stats = CodeStatistics.new(*STATS_DIRECTORIES)
|
26
|
+
code = stats.send :calculate_code
|
27
|
+
tests = stats.send :calculate_tests
|
28
|
+
msg = "Code To Test Ratio: 1:#{sprintf("%.2f", tests.to_f/code)}"
|
29
|
+
$-w = ! $-w
|
30
|
+
case @@chat_app
|
31
|
+
when :adium then
|
32
|
+
OSA.app('Adium').adium_controller.my_status_message = msg
|
33
|
+
when :ichat then
|
34
|
+
OSA.app('ichat').status_message = msg
|
35
|
+
else
|
36
|
+
raise "huh?"
|
37
|
+
end
|
38
|
+
$-w = ! $-w
|
39
|
+
$stderr.puts "Status set to: #{msg.inspect}"
|
40
|
+
end
|
41
|
+
|
42
|
+
Autotest.add_hook(:all_good) do |autotest|
|
43
|
+
shame
|
44
|
+
end
|
45
|
+
end
|