ryanbriones-ZenTest 3.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/History.txt +523 -0
  2. data/Manifest.txt +69 -0
  3. data/README.txt +110 -0
  4. data/Rakefile +68 -0
  5. data/articles/Article.css +721 -0
  6. data/articles/getting_started_with_autotest.html +532 -0
  7. data/articles/how_to_use_zentest.txt +393 -0
  8. data/bin/autotest +55 -0
  9. data/bin/multiruby +40 -0
  10. data/bin/multiruby_setup +68 -0
  11. data/bin/rails_test_audit +80 -0
  12. data/bin/unit_diff +38 -0
  13. data/bin/zentest +28 -0
  14. data/example.txt +42 -0
  15. data/example1.rb +7 -0
  16. data/example2.rb +15 -0
  17. data/example_dot_autotest.rb +45 -0
  18. data/lib/autotest.rb +654 -0
  19. data/lib/autotest/autoupdate.rb +26 -0
  20. data/lib/autotest/camping.rb +37 -0
  21. data/lib/autotest/cctray.rb +57 -0
  22. data/lib/autotest/discover.rb +6 -0
  23. data/lib/autotest/emacs.rb +35 -0
  24. data/lib/autotest/email_notify.rb +66 -0
  25. data/lib/autotest/fixtures.rb +12 -0
  26. data/lib/autotest/growl.rb +28 -0
  27. data/lib/autotest/heckle.rb +14 -0
  28. data/lib/autotest/html_report.rb +31 -0
  29. data/lib/autotest/jabber_notify.rb +111 -0
  30. data/lib/autotest/kdenotify.rb +14 -0
  31. data/lib/autotest/menu.rb +51 -0
  32. data/lib/autotest/migrate.rb +7 -0
  33. data/lib/autotest/notify.rb +34 -0
  34. data/lib/autotest/once.rb +9 -0
  35. data/lib/autotest/pretty.rb +83 -0
  36. data/lib/autotest/rails.rb +81 -0
  37. data/lib/autotest/rcov.rb +22 -0
  38. data/lib/autotest/redgreen.rb +21 -0
  39. data/lib/autotest/restart.rb +11 -0
  40. data/lib/autotest/screen.rb +73 -0
  41. data/lib/autotest/shame.rb +45 -0
  42. data/lib/autotest/snarl.rb +51 -0
  43. data/lib/autotest/timestamp.rb +9 -0
  44. data/lib/functional_test_matrix.rb +92 -0
  45. data/lib/multiruby.rb +401 -0
  46. data/lib/test/rails.rb +295 -0
  47. data/lib/test/rails/controller_test_case.rb +382 -0
  48. data/lib/test/rails/functional_test_case.rb +79 -0
  49. data/lib/test/rails/helper_test_case.rb +64 -0
  50. data/lib/test/rails/ivar_proxy.rb +31 -0
  51. data/lib/test/rails/pp_html_document.rb +74 -0
  52. data/lib/test/rails/rake_tasks.rb +50 -0
  53. data/lib/test/rails/render_tree.rb +93 -0
  54. data/lib/test/rails/test_case.rb +28 -0
  55. data/lib/test/rails/view_test_case.rb +597 -0
  56. data/lib/test/zentest_assertions.rb +134 -0
  57. data/lib/unit_diff.rb +259 -0
  58. data/lib/zentest.rb +566 -0
  59. data/lib/zentest_mapping.rb +99 -0
  60. data/test/test_autotest.rb +449 -0
  61. data/test/test_help.rb +36 -0
  62. data/test/test_rails_autotest.rb +229 -0
  63. data/test/test_rails_controller_test_case.rb +58 -0
  64. data/test/test_rails_helper_test_case.rb +48 -0
  65. data/test/test_rails_view_test_case.rb +275 -0
  66. data/test/test_unit_diff.rb +319 -0
  67. data/test/test_zentest.rb +566 -0
  68. data/test/test_zentest_assertions.rb +128 -0
  69. data/test/test_zentest_mapping.rb +222 -0
  70. 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,7 @@
1
+ # -*- ruby -*-
2
+
3
+ module Autotest::Migrate
4
+ Autotest.add_hook(:run) do |autotest|
5
+ system "rake db:migrate" if autotest.class.to_s == "RailsAutotest"
6
+ end
7
+ 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,9 @@
1
+ ##
2
+ # this is for autotest plugin developers only...
3
+
4
+ module Autotest::Once
5
+ Autotest.add_hook :ran_command do |at|
6
+ exit 0
7
+ end
8
+ end
9
+
@@ -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,11 @@
1
+ module Autotest::Restart
2
+ Autotest.add_hook :updated do |at, *args|
3
+ if args.flatten.include? ".autotest" then
4
+ warn "Detected change to .autotest, restarting"
5
+ cmd = "autotest"
6
+ cmd << " -v" if $v
7
+
8
+ exec cmd
9
+ end
10
+ end
11
+ 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