ZenTest 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/History.txt +21 -0
  2. data/Manifest.txt +8 -24
  3. data/Rakefile +32 -8
  4. data/bin/autotest +4 -1
  5. data/bin/multiruby +20 -6
  6. data/bin/ruby_fork +6 -0
  7. data/bin/ruby_fork_client +6 -0
  8. data/example_dot_autotest.rb +148 -0
  9. data/lib/autotest.rb +201 -254
  10. data/lib/rails_autotest.rb +48 -110
  11. data/lib/ruby_fork.rb +178 -0
  12. data/lib/test/rails.rb +2 -2
  13. data/lib/test/rails/controller_test_case.rb +1 -1
  14. data/lib/test/rails/helper_test_case.rb +60 -0
  15. data/lib/test/rails/pp_html_document.rb +74 -0
  16. data/lib/test/rails/rake_tasks.rb +13 -12
  17. data/lib/test/rails/view_test_case.rb +2 -2
  18. data/lib/test/zentest_assertions.rb +39 -0
  19. data/lib/unit_diff.rb +6 -3
  20. data/lib/zentest.rb +1 -1
  21. data/test/test_autotest.rb +160 -208
  22. data/test/test_rails_autotest.rb +115 -138
  23. data/test/test_ruby_fork.rb +172 -0
  24. data/test/test_unit_diff.rb +69 -1
  25. data/test/test_zentest_assertions.rb +66 -0
  26. metadata +13 -27
  27. data/test/data/normal/lib/.#photo.rb +0 -0
  28. data/test/data/normal/lib/blah.rb +0 -0
  29. data/test/data/normal/lib/photo.rb +0 -0
  30. data/test/data/normal/test/#test_photo.rb# +0 -0
  31. data/test/data/normal/test/test_camelcase.rb +0 -0
  32. data/test/data/normal/test/test_photo.rb +0 -0
  33. data/test/data/normal/test/test_route.rb +0 -0
  34. data/test/data/normal/test/test_user.rb +0 -0
  35. data/test/data/rails/app/controllers/admin/theme_controller.rb +0 -0
  36. data/test/data/rails/app/controllers/route_controller.rb +0 -0
  37. data/test/data/rails/app/models/flickr_photo.rb +0 -0
  38. data/test/data/rails/app/models/route.rb +0 -0
  39. data/test/data/rails/app/views/route/index.rhtml +0 -0
  40. data/test/data/rails/config/environment.rb +0 -0
  41. data/test/data/rails/config/routes.rb +0 -0
  42. data/test/data/rails/test/controllers/route_controller_test.rb +0 -0
  43. data/test/data/rails/test/fixtures/routes.yml +0 -0
  44. data/test/data/rails/test/functional/admin/themes_controller_test.rb +0 -0
  45. data/test/data/rails/test/functional/dummy_controller_test.rb +0 -0
  46. data/test/data/rails/test/functional/route_controller_test.rb +0 -0
  47. data/test/data/rails/test/unit/flickr_photo_test.rb +0 -0
  48. data/test/data/rails/test/unit/photo_test.rb +0 -0
  49. data/test/data/rails/test/unit/route_test.rb +0 -0
  50. data/test/data/rails/test/views/route_view_test.rb +0 -0
@@ -1,10 +1,5 @@
1
1
  require 'autotest'
2
2
 
3
- ##
4
- # RailsAutotest is an Autotest subclass designed for use with Rails projects.
5
- #
6
- # To use RailsAutotest pass the -rails flag to autotest.
7
-
8
3
  class RailsAutotest < Autotest
9
4
 
10
5
  def initialize # :nodoc:
@@ -12,112 +7,55 @@ class RailsAutotest < Autotest
12
7
  @exceptions = %r%^\./(?:db|doc|log|public|script|vendor/rails)%
13
8
  end
14
9
 
15
- def map_file_names(updated) # :nodoc:
16
- model_tests = []
17
- controller_tests = []
18
- view_tests = []
19
- functional_tests = []
20
-
21
- updated.each do |filename|
22
- filename.sub!(/^\.\//, '') # trim the ./ that Find gives us
23
-
24
- case filename
25
- when %r%^test/fixtures/(.*)s.yml% then
26
- model_tests << "test/unit/#{$1}_test.rb"
27
- controller_tests << "test/controllers/#{$1}_controller_test.rb"
28
- view_tests << "test/views/#{$1}_view_test.rb"
29
- functional_tests << "test/functional/#{$1}_controller_test.rb"
30
- when %r%^test/unit/.*rb$% then
31
- model_tests << filename
32
- when %r%^app/models/(.*)\.rb$% then
33
- test_file = "test/unit/#{$1}_test.rb"
34
- model_tests << test_file
35
- when %r%^test/controllers/.*\.rb$% then
36
- controller_tests << filename
37
- when %r%^test/views/.*\.rb$% then
38
- view_tests << filename
39
- when %r%^test/functional/.*\.rb$% then
40
- functional_tests << filename
41
- when %r%^app/helpers/application_helper.rb% then
42
- view_test_files = @files.keys.select do |f|
43
- f =~ %r%^test/views/.*_test\.rb$%
44
- end
45
- functional_test_files = @files.keys.select do |f|
46
- f =~ %r%^test/functional/.*_test\.rb$%
47
- end
48
- view_tests.push(*view_test_files.sort)
49
- functional_tests.push(*functional_test_files.sort)
50
- when %r%^app/helpers/(.*)_helper.rb% then
51
- view_test_file = "test/views/#{$1}_view_test.rb"
52
- view_tests << view_test_file
53
- functional_test_file = "test/functional/#{$1}_controller_test.rb"
54
- functional_tests << functional_test_file
55
- when %r%^app/controllers/application.rb$% then
56
- controller_test_file = "test/controllers/dummy_controller_test.rb"
57
- controller_tests << controller_test_file
58
- functional_test_file = "test/functional/dummy_controller_test.rb"
59
- functional_tests << functional_test_file
60
- when %r%^app/controllers/(.*)\.rb$% then
61
- controller_test_file = "test/controllers/#{$1}_test.rb"
62
- controller_tests << controller_test_file
63
- functional_test_file = "test/functional/#{$1}_test.rb"
64
- functional_tests << functional_test_file
65
- when %r%^app/views/layouts/% then
66
- view_test_file = "test/views/layouts_view_test.rb"
67
- view_tests << view_test_file
68
- when %r%^app/views/(.*)/% then
69
- view_test_file = "test/views/#{$1}_view_test.rb"
70
- view_tests << view_test_file
71
- functional_test_file = "test/functional/#{$1}_controller_test.rb"
72
- functional_tests << functional_test_file
73
- when %r%^config/routes.rb$% then
74
- functional_test_files = @files.keys.select do |f|
75
- f =~ %r%^test/functional/.*_test\.rb$%
76
- end
77
- controller_test_files = @files.keys.select do |f|
78
- f =~ %r%^test/controllers/.*_test\.rb$%
79
- end
80
- view_test_files = @files.keys.select do |f|
81
- f =~ %r%^test/views/.*_test\.rb$%
82
- end
83
- controller_tests.push(*controller_test_files.sort)
84
- view_tests.push(*view_test_files.sort)
85
- functional_tests.push(*functional_test_files.sort)
86
- when %r%^test/test_helper.rb$%,
87
- %r%^config/boot.rb%,
88
- %r%^config/database.yml%,
89
- %r%^config/environment.rb%,
90
- %r%^config/environments/test.rb% then
91
- model_test_files = @files.keys.select do |f|
92
- f =~ %r%^test/unit/.*_test\.rb$%
93
- end
94
- controller_test_files = @files.keys.select do |f|
95
- f =~ %r%^test/controllers/.*_test\.rb$%
96
- end
97
- view_test_files = @files.keys.select do |f|
98
- f =~ %r%^test/views/.*_test\.rb$%
99
- end
100
- functional_test_files = @files.keys.select do |f|
101
- f =~ %r%^test/functional/.*_test\.rb$%
102
- end
103
- model_tests.push(*model_test_files.sort)
104
- controller_tests.push(*controller_test_files.sort)
105
- view_tests.push(*view_test_files.sort)
106
- functional_tests.push(*functional_test_files.sort)
107
- when %r%^vendor/%, /^Rakefile$/ then
108
- # ignore standard rails files
109
- else
110
- STDERR.puts "Dunno! #{filename}" if $v or $TESTING
10
+ def tests_for_file(filename)
11
+
12
+ case filename
13
+ when %r%^test/fixtures/(.*)s.yml% then
14
+ ["test/unit/#{$1}_test.rb",
15
+ "test/controllers/#{$1}_controller_test.rb",
16
+ "test/views/#{$1}_view_test.rb",
17
+ "test/functional/#{$1}_controller_test.rb"]
18
+ when %r%^test/unit/.*rb$% then
19
+ [filename]
20
+ when %r%^test/controllers/.*\.rb$% then
21
+ [filename]
22
+ when %r%^test/views/.*\.rb$% then
23
+ [filename]
24
+ when %r%^test/functional/.*\.rb$% then
25
+ [filename]
26
+ when %r%^app/models/(.*)\.rb$% then
27
+ ["test/unit/#{$1}_test.rb"]
28
+ when %r%^app/helpers/application_helper.rb% then
29
+ @files.keys.select { |f|
30
+ f =~ %r%^test/(views|functional)/.*_test\.rb$%
31
+ }
32
+ when %r%^app/helpers/(.*)_helper.rb% then
33
+ ["test/views/#{$1}_view_test.rb",
34
+ "test/functional/#{$1}_controller_test.rb"]
35
+ when %r%^app/controllers/application.rb$% then
36
+ ["test/controllers/dummy_controller_test.rb",
37
+ "test/functional/dummy_controller_test.rb"]
38
+ when %r%^app/controllers/(.*)\.rb$% then
39
+ ["test/controllers/#{$1}_test.rb",
40
+ "test/functional/#{$1}_test.rb"]
41
+ when %r%^app/views/layouts/% then
42
+ ["test/views/layouts_view_test.rb"]
43
+ when %r%^app/views/(.*)/% then
44
+ ["test/views/#{$1}_view_test.rb",
45
+ "test/functional/#{$1}_controller_test.rb"]
46
+ when %r%^config/routes.rb$% then
47
+ @files.keys.select do |f|
48
+ f =~ %r%^test/(controllers|views|functional)/.*_test\.rb$%
111
49
  end
112
- end
113
-
114
- model_tests = model_tests.uniq.select { |f| @files.has_key? f }
115
- controller_tests = controller_tests.uniq.select { |f| @files.has_key? f }
116
- view_tests = view_tests.uniq.select { |f| @files.has_key? f }
117
- functional_tests = functional_tests.uniq.select { |f| @files.has_key? f }
118
-
119
- return model_tests, controller_tests, view_tests, functional_tests
50
+ when %r%^test/test_helper.rb%,
51
+ %r%^config/((boot|environment(s/test)?).rb|database.yml)% then
52
+ @files.keys.select do |f|
53
+ f =~ %r%^test/(unit|controllers|views|functional)/.*_test\.rb$%
54
+ end
55
+ else
56
+ @output.puts "Dunno! #{filename}" if $TESTING
57
+ []
58
+ end.uniq.select { |f| @files.has_key? f }
120
59
  end
121
-
122
60
  end
123
61
 
data/lib/ruby_fork.rb ADDED
@@ -0,0 +1,178 @@
1
+ require 'optparse'
2
+ require 'socket'
3
+
4
+ module RubyFork
5
+
6
+ PORT = 9084
7
+
8
+ DEFAULT_SETTINGS = {
9
+ :requires => [],
10
+ :code => [],
11
+ :extra_paths => [],
12
+ :port => PORT,
13
+ }
14
+
15
+ def self.add_env_args(opts, settings)
16
+ opts.separator ''
17
+ opts.separator 'Process environment options:'
18
+
19
+ opts.separator ''
20
+ opts.on('-e CODE', 'Execute CODE in parent process.',
21
+ 'May be specified multiple times.') do |code|
22
+ settings[:code] << code
23
+ end
24
+
25
+ opts.separator ''
26
+ opts.on('-I DIRECTORY', 'Adds DIRECTORY to $LOAD_PATH.',
27
+ 'May be specified multiple times.') do |dir|
28
+ settings[:extra_paths] << dir
29
+ end
30
+
31
+ opts.separator ''
32
+ opts.on('-r LIBRARY', 'Require LIBRARY in the parent process.',
33
+ 'May be specified multiple times.') do |lib|
34
+ settings[:requires] << lib
35
+ end
36
+ end
37
+
38
+ def self.daemonize(io = File.open('/dev/null', 'r+'))
39
+ fork and exit!
40
+ Process.setsid
41
+ fork and exit!
42
+
43
+ STDIN.reopen io
44
+ STDOUT.reopen io
45
+ #STDERR.reopen io
46
+
47
+ yield if block_given?
48
+ end
49
+
50
+ def self.parse_client_args(args)
51
+ settings = Marshal.load Marshal.dump(DEFAULT_SETTINGS)
52
+
53
+ opts = OptionParser.new do |opts|
54
+ opts.banner = "Usage: #{$0} [options]"
55
+
56
+ opts.separator ''
57
+ opts.on('-p', '--port PORT',
58
+ 'Listen for connections on PORT.',
59
+ "Default: #{settings[:port]}") do |port|
60
+ settings[:port] = port.to_i
61
+ end
62
+
63
+ opts.separator ''
64
+ opts.on('-h', '--help', 'You\'re looking at it.') do
65
+ $stderr.puts opts
66
+ exit 1
67
+ end
68
+
69
+ add_env_args opts, settings
70
+ end
71
+
72
+ opts.parse! args
73
+
74
+ return settings
75
+ end
76
+
77
+ def self.parse_server_args(args)
78
+ settings = Marshal.load Marshal.dump(DEFAULT_SETTINGS)
79
+ settings[:daemonize] = false
80
+
81
+ opts = OptionParser.new do |opts|
82
+ opts.banner = "Usage: #{$0} [options]"
83
+
84
+ opts.separator ''
85
+ opts.on('-d', '--daemonize',
86
+ 'Run as a daemon.',
87
+ "Default: #{settings[:daemonize]}") do |val|
88
+ settings[:daemonize] = val
89
+ end
90
+
91
+ opts.separator ''
92
+ opts.on('-p', '--port PORT',
93
+ 'Listen for connections on PORT.',
94
+ "Default: #{settings[:port]}") do |port|
95
+ settings[:port] = port.to_i
96
+ end
97
+
98
+ opts.separator ''
99
+ opts.on('-h', '--help', 'You\'re looking at it.') do
100
+ $stderr.puts opts
101
+ exit 1
102
+ end
103
+
104
+ add_env_args opts, settings
105
+ end
106
+
107
+ opts.parse! args
108
+
109
+ return settings
110
+ end
111
+
112
+ def self.start_client(args = ARGV)
113
+ trap 'INT' do exit 1 end # Exit gracefully
114
+
115
+ settings = parse_client_args args
116
+
117
+ args = Marshal.dump [settings, ARGV]
118
+
119
+ socket = TCPSocket.new 'localhost', settings[:port]
120
+
121
+ socket.puts args.length
122
+ socket.write args
123
+ socket.close_write
124
+
125
+ until socket.eof?
126
+ $stdout.puts socket.gets
127
+ end
128
+ end
129
+
130
+ def self.start_server(args = ARGV)
131
+ settings = parse_server_args args
132
+ setup_environment settings
133
+
134
+ daemonize if settings[:daemonize]
135
+
136
+ server = TCPServer.new 'localhost', settings[:port]
137
+
138
+ $stderr.puts "#{$0} Running as PID #{$$} on #{settings[:port]}" unless
139
+ settings[:daemonize]
140
+
141
+ loop do
142
+ Thread.new server.accept do |socket|
143
+ begin
144
+ args_length = socket.gets.to_i
145
+ args = socket.read args_length
146
+ settings, argv = Marshal.load args
147
+
148
+ fork do
149
+ daemonize socket do
150
+ ARGV.replace argv
151
+ setup_environment settings
152
+ socket.close
153
+ end
154
+ end
155
+
156
+ socket.close # close my copy.
157
+ rescue => e
158
+ socket.close if socket
159
+ end
160
+ end
161
+ end
162
+ rescue Exception => e
163
+ puts "Failed to catch #{e.class}:#{e.message}"
164
+ puts "\t#{e.backtrace.join "\n\t"}"
165
+ end
166
+
167
+ def self.setup_environment(settings)
168
+ settings[:extra_paths].map! { |dir| dir.split ':' }
169
+ settings[:extra_paths].flatten!
170
+ settings[:extra_paths].each { |dir| $:.unshift dir }
171
+
172
+ settings[:requires].each { |file| require file }
173
+
174
+ settings[:code].each { |code| eval code }
175
+ end
176
+
177
+ end
178
+
data/lib/test/rails.rb CHANGED
@@ -37,8 +37,7 @@ $TESTING = true
37
37
  # require 'test/rails'
38
38
  #
39
39
  # Next, change the class from "Unit" to "Rails" right after you
40
- # require +test_help+. This prevents the bad things +test_help+ performs
41
- # upon Test::Unit::TestCase.
40
+ # require +test_help+.
42
41
  #
43
42
  # Your 'test/test_helper.rb' will end up looking like this:
44
43
  #
@@ -262,6 +261,7 @@ require 'test/zentest_assertions'
262
261
  require 'test/rails/test_case'
263
262
  require 'test/rails/functional_test_case'
264
263
  require 'test/rails/controller_test_case'
264
+ require 'test/rails/helper_test_case'
265
265
  require 'test/rails/ivar_proxy'
266
266
  require 'test/rails/view_test_case'
267
267
 
@@ -199,7 +199,7 @@ class Test::Rails::ControllerTestCase < Test::Rails::FunctionalTestCase
199
199
  # +params+.
200
200
 
201
201
  def xml_http_request(request_method, action, parameters = nil)
202
- @request.env['REQUEST_METHOD'] = request_method
202
+ @request.env['REQUEST_METHOD'] = request_method.to_s
203
203
 
204
204
  @request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
205
205
  @request.env['HTTP_ACCEPT'] = 'text/javascript, text/html, application/xml, text/xml, */*'
@@ -0,0 +1,60 @@
1
+ ##
2
+ # Stub controller for testing helpers.
3
+
4
+ class HelperTestCaseController < ApplicationController
5
+
6
+ attr_accessor :request
7
+
8
+ attr_accessor :url
9
+
10
+ ##
11
+ # Re-raise errors
12
+
13
+ def rescue_action(e)
14
+ raise e
15
+ end
16
+
17
+ end
18
+
19
+ ##
20
+ # HelperTestCase allows helpers to be easily tested.
21
+ #
22
+ # Original concept by Ryan Davis, original implementation by Geoff Grosenbach.
23
+
24
+ class Test::Rails::HelperTestCase < Test::Rails::FunctionalTestCase
25
+
26
+ # Are other helpers needed?
27
+
28
+ include ActionView::Helpers::ActiveRecordHelper
29
+ include ActionView::Helpers::TagHelper
30
+ include ActionView::Helpers::FormTagHelper
31
+ include ActionView::Helpers::FormOptionsHelper
32
+ include ActionView::Helpers::FormHelper
33
+ include ActionView::Helpers::UrlHelper
34
+ include ActionView::Helpers::AssetTagHelper
35
+ include ActionView::Helpers::PrototypeHelper rescue nil # Rails 1.0 only
36
+
37
+ ##
38
+ # Automatically includes the helper module into the test sublcass.
39
+
40
+ def self.inherited(helper_testcase)
41
+ super
42
+ helper_name = helper_testcase.name.sub 'Test', ''
43
+ helper_module = Object.const_get helper_name
44
+ helper_testcase.send :include, helper_module
45
+ rescue NameError
46
+ raise "Unable to find helper #{helper_name}"
47
+ end
48
+
49
+ def setup
50
+ return if self.class.name =~ /TestCase$/
51
+ @controller_class_name = 'HelperTestCaseController'
52
+ super
53
+ @controller.request = @request
54
+ @controller.url = ActionController::UrlRewriter.new @request, {} # url_for
55
+
56
+ ActionView::Helpers::AssetTagHelper::reset_javascript_include_default
57
+ end
58
+
59
+ end
60
+
@@ -0,0 +1,74 @@
1
+ class HTML::Document
2
+ def pretty_print(q)
3
+ q.object_address_group self do
4
+ q.breakable
5
+ q.seplist @root.children_without_newlines do |v| q.pp v end
6
+ end
7
+ end
8
+ end
9
+
10
+ class HTML::Node
11
+ def children_without_newlines
12
+ @children.reject do |c|
13
+ HTML::Text == c.class and c.content_without_whitespace == "\n"
14
+ end
15
+ end
16
+
17
+ def pretty_print(q)
18
+ q.group 1, '[NODE ', ']' do
19
+ q.breakable
20
+ q.seplist children_without_newlines do |v| q.pp v end
21
+ end
22
+ end
23
+ end
24
+
25
+ class HTML::Tag
26
+ def pretty_print(q)
27
+ case @closing
28
+ when :close then
29
+ q.text "[close #{@name}]"
30
+ when :self then
31
+ pretty_print_tag 'empty', q
32
+ when nil then
33
+ pretty_print_tag 'open ', q
34
+ else
35
+ raise "Unknown closing #{@closing.inspect}"
36
+ end
37
+ end
38
+
39
+ def pretty_print_tag(type, q)
40
+ q.group 1, "(#{type} #{@name.inspect}", ')' do
41
+ unless @attributes.empty? then
42
+ q.breakable
43
+ q.pp @attributes
44
+ end
45
+ unless children_without_newlines.empty? then
46
+ q.breakable
47
+ q.group 1, '[', ']' do
48
+ q.seplist children_without_newlines do |v|
49
+ q.pp v
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ class HTML::Text
58
+ def content_without_whitespace
59
+ @content.gsub(/^[ ]+/, '').sub(/[ ]+\Z/, '')
60
+ end
61
+
62
+ def pretty_print(q)
63
+ q.pp content_without_whitespace
64
+ end
65
+ end
66
+
67
+ class HTML::CDATA
68
+ def pretty_print(q)
69
+ q.group 1, '[', ']' do
70
+ q.pp @content
71
+ end
72
+ end
73
+ end
74
+