ryanbriones-ZenTest 3.11.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.
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