GUnit 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
data/gunit.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{GUnit}
8
- s.version = "0.2.2"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Greg Sterndale"]
12
- s.date = %q{2010-01-23}
12
+ s.date = %q{2010-01-27}
13
13
  s.description = %q{GUnit is a fresh new XUnit Test implementation, poppin' a cap in the ass of TestUnit. Just playin'. TestUnit is our boy.}
14
14
  s.email = %q{gsterndale@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -40,6 +40,10 @@ Gem::Specification.new do |s|
40
40
  "lib/gunit/test_suite.rb",
41
41
  "lib/gunit/to_do_response.rb",
42
42
  "lib/gunit/verification.rb",
43
+ "samples/Rakefile",
44
+ "samples/martini.rb",
45
+ "samples/test/martini_test.rb",
46
+ "samples/test/test_helper.rb",
43
47
  "test/integration/foo_test.rb",
44
48
  "test/test_helper.rb",
45
49
  "test/unit/assertions_test.rb",
@@ -1,5 +1,4 @@
1
1
  module GUnit
2
-
3
2
  # Acts as a TestSuite Factory
4
3
  # Creates a TestCase Object for each Test Method
5
4
  # Adds all TestCase Objects onto a TestSuite Object
@@ -12,9 +11,8 @@ module GUnit
12
11
 
13
12
  # count, run, display
14
13
  class TestCase
15
-
16
14
  include Assertions
17
-
15
+
18
16
  TEST_METHOD_PREFIX = 'test'
19
17
 
20
18
  attr_accessor :method_name
@@ -23,23 +21,39 @@ module GUnit
23
21
  @@method_count = 0
24
22
  @@context_stack = [ GUnit::Context.new ]
25
23
  @@test_method_contexts = {}
26
-
24
+ @@autorun = true
25
+ @@subclasses = []
26
+
27
27
  def initialize(method=nil)
28
28
  self.method_name = method
29
29
  end
30
-
31
- def context
32
- self.class.context_for_method(self.method_name)
30
+
31
+ def self.subclasses
32
+ @@subclasses
33
33
  end
34
-
35
- def run
36
- self.run_setups
37
- self.run_excercise
38
- response = self.send(self.method_name.to_sym)
39
- self.run_teardowns
40
- response
34
+
35
+ def self.inherited(subclass)
36
+ subclasses << subclass
37
+ # autorun must happen at exit, otherwise the subclass won't be loaded
38
+ at_exit { subclass.autorun }
41
39
  end
42
-
40
+
41
+ def self.autorun=(a)
42
+ @@autorun = !a.nil? && a
43
+ end
44
+
45
+ def self.autorun?
46
+ @@autorun
47
+ end
48
+
49
+ def self.autorun
50
+ if GUnit::TestCase.autorun?
51
+ test_runner = GUnit::TestRunner.instance
52
+ test_runner.tests << suite
53
+ test_runner.run!
54
+ end
55
+ end
56
+
43
57
  def self.suite
44
58
  # Create an new instance of self.class for each test method and add them to a TestSuite Object
45
59
  test_suite = TestSuite.new
@@ -119,9 +133,21 @@ module GUnit
119
133
  TEST_METHOD_PREFIX.to_sym
120
134
  end
121
135
  end
122
-
136
+
137
+ def context
138
+ self.class.context_for_method(self.method_name)
139
+ end
140
+
141
+ def run
142
+ self.run_setups
143
+ self.run_excercise
144
+ response = self.send(self.method_name.to_sym)
145
+ self.run_teardowns
146
+ response
147
+ end
148
+
123
149
  protected
124
-
150
+
125
151
  def run_setups
126
152
  self.context.all_setups.each {|s| s.run(self) }
127
153
  end
@@ -145,7 +171,7 @@ module GUnit
145
171
  end
146
172
  name
147
173
  end
148
-
174
+
149
175
  end
150
-
176
+
151
177
  end
@@ -1,3 +1,5 @@
1
+ require 'singleton'
2
+
1
3
  module GUnit
2
4
 
3
5
  # How many tests have run
@@ -15,28 +17,53 @@ module GUnit
15
17
  # After all tests have run, the TestRunner displays a summery of results
16
18
 
17
19
  class TestRunner
18
-
20
+
21
+ include Singleton
22
+
19
23
  PASS_CHAR = '.'
20
24
  FAIL_CHAR = 'F'
21
25
  TODO_CHAR = '*'
22
26
  EXCEPTION_CHAR = 'E'
23
27
 
28
+ DEFAULT_PATTERNS = ['test/**/*_test.rb', 'test/**/test_*.rb']
29
+
24
30
  # TestSuites and/or TestCases
25
- attr_accessor :io, :silent
26
- attr_writer :tests
31
+ attr_accessor :io, :silent, :patterns
32
+ attr_writer :tests, :autorun
27
33
  attr_reader :responses
28
34
 
29
35
  def initialize(*args)
30
- @responses = []
31
- @io = STDOUT
32
36
  STDOUT.sync = true
33
- @silent = false
37
+ reset
34
38
  end
35
-
39
+
40
+ def reset
41
+ @io = STDOUT
42
+ @silent = false
43
+ @responses = []
44
+ @tests = []
45
+ @patterns = DEFAULT_PATTERNS
46
+ @autorun = true
47
+ end
48
+
49
+ def discover
50
+ files = self.patterns.inject([]){|memo, pattern| memo + Dir.glob(pattern) }.compact
51
+ files.each {|file| Kernel.require file }
52
+ self.tests = TestCase.subclasses.inject([]){|memo, test_case| memo << test_case.suite }.compact
53
+ end
54
+
36
55
  def tests
37
56
  @tests ||= []
38
57
  end
39
-
58
+
59
+ def autorun?
60
+ ! @autorun.nil? && @autorun
61
+ end
62
+
63
+ def run!
64
+ self.run if self.autorun?
65
+ end
66
+
40
67
  def run
41
68
  self.tests.each do |test|
42
69
  case
data/lib/gunit.rb CHANGED
@@ -17,9 +17,9 @@ require 'gunit/fail_response'
17
17
  require 'gunit/pass_response'
18
18
  require 'gunit/to_do_response'
19
19
 
20
- require 'gunit/test_case'
21
- require 'gunit/test_suite'
22
20
  require 'gunit/test_runner'
21
+ require 'gunit/test_suite'
22
+ require 'gunit/test_case'
23
23
 
24
24
 
25
25
 
data/samples/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ # require 'GUnit'
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'gunit')
5
+
6
+ task :default => "gunit:test"
7
+
8
+ namespace :gunit do
9
+
10
+ desc "Run GUnit tests"
11
+ task :test do
12
+ test_runner = GUnit::TestRunner.instance
13
+ test_runner.autorun = false
14
+ test_runner.patterns = ['test/**/*_test.rb']
15
+ test_runner.discover
16
+ test_runner.run
17
+ end
18
+
19
+ end
20
+
21
+
@@ -0,0 +1,34 @@
1
+ class Martini
2
+
3
+ class BadBartender < Exception; end
4
+
5
+ attr_accessor :ice, :vermouth, :olive_brine
6
+ attr_reader :liquor, :garnish
7
+
8
+ def initialize(*args)
9
+ @ice = false
10
+ @vermouth = false
11
+ @olive_brine = true
12
+ @garnish = 'olives'
13
+ @liquor = 'vodka'
14
+ end
15
+
16
+ def dirty?
17
+ olive_brine && ! (garnish =~ /olive/).nil?
18
+ end
19
+
20
+ def straight_up?
21
+ ! ice
22
+ end
23
+
24
+ def garnish=(g)
25
+ raise BadBartender unless g =~ /lemon|olive/
26
+ @garnish = g
27
+ end
28
+
29
+ def liquor=(l)
30
+ raise BadBartender unless l =~ /vodka|gin/
31
+ @liquor = l
32
+ end
33
+
34
+ end
@@ -0,0 +1,57 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class MartiniTest < GUnit::TestCase
4
+
5
+ setup do
6
+ @martini = Martini.new
7
+ end
8
+
9
+ verify "ice attribute" do
10
+ ice = false
11
+ @martini.ice = ice
12
+ assert ice === @martini.ice
13
+ end
14
+
15
+ verify "vermouth attribute" do
16
+ vermouth = false
17
+ @martini.vermouth = vermouth
18
+ assert vermouth === @martini.vermouth
19
+ end
20
+
21
+ verify "olive_brine attribute" do
22
+ olive_brine = false
23
+ @martini.olive_brine = olive_brine
24
+ assert olive_brine === @martini.olive_brine
25
+ end
26
+
27
+ verify "liquor attribute" do
28
+ liquor = 'gin'
29
+ @martini.liquor = liquor
30
+ assert liquor === @martini.liquor
31
+ end
32
+
33
+ verify "garnish attribute" do
34
+ garnish = 'lemon'
35
+ @martini.garnish = garnish
36
+ assert garnish === @martini.garnish
37
+ end
38
+
39
+ verify "dirty by default" do
40
+ assert @martini.dirty?
41
+ end
42
+
43
+ verify "straight up by default" do
44
+ assert @martini.straight_up?
45
+ end
46
+
47
+ context "with ice" do
48
+ setup do
49
+ @martini.ice = true
50
+ end
51
+
52
+ verify "not straight up" do
53
+ assert ! @martini.straight_up?
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'ruby-debug'
3
+ require File.join(File.dirname(__FILE__), '..', 'martini')
4
+ require File.join(File.dirname(__FILE__), '..', '..', 'lib', 'gunit')
5
+
6
+ # $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+ # $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+ # require 'gunit'
@@ -171,7 +171,7 @@ end
171
171
 
172
172
  class FooGUnitTestTest < Test::Unit::TestCase
173
173
  def setup
174
- @test_runner = GUnit::TestRunner.new
174
+ @test_runner = GUnit::TestRunner.instance
175
175
  @test_runner.io = mock('io')
176
176
  @test_runner.io.stubs(:print)
177
177
  @test_runner.io.stubs(:puts)
data/test/test_helper.rb CHANGED
@@ -11,4 +11,5 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
11
11
  require 'gunit'
12
12
 
13
13
  class Test::Unit::TestCase
14
+ GUnit::TestCase.autorun = false
14
15
  end
@@ -21,7 +21,23 @@ class GUnit::TestCaseTest < Test::Unit::TestCase
21
21
  def test_it_is_a_test_case
22
22
  assert @my_test_case.is_a?(GUnit::TestCase)
23
23
  end
24
-
24
+
25
+ def test_subclasses_class_attr
26
+ assert ! GUnit::TestCase.subclasses.empty?
27
+ assert GUnit::TestCase.subclasses.include?(MyClassTest)
28
+ end
29
+
30
+ def test_autorun_class_attr
31
+ assert GUnit::TestCase.autorun? === false # set to false in test_helper.rb
32
+ GUnit::TestCase.autorun = true
33
+ assert GUnit::TestCase.autorun?
34
+ GUnit::TestRunner.expects(:instance).times(1).returns(mock(:tests => [], :run! => true))
35
+ MyClassTest.autorun
36
+ GUnit::TestCase.autorun = false
37
+ GUnit::TestRunner.expects(:instance).times(0)
38
+ MyClassTest.autorun
39
+ end
40
+
25
41
  def test_method_name_setter_getter
26
42
  method_name = "my_method"
27
43
  assert_not_equal method_name, @my_test_case.method_name
@@ -3,24 +3,96 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
3
3
  class GUnit::TestRunnerTest < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
- @test_runner = GUnit::TestRunner.new
6
+ @test_runner = GUnit::TestRunner.instance
7
+ @test_runner.reset
7
8
  io = Object.new
8
9
  @test_runner.io = io
9
10
  @test_runner.io.stubs(:print)
10
11
  @test_runner.io.stubs(:puts)
11
12
  end
12
-
13
+
13
14
  def test_it_is_a_test_runner
14
15
  assert @test_runner.is_a?(GUnit::TestRunner)
15
16
  end
16
-
17
+
18
+ def test_singleton
19
+ assert_raise NoMethodError do; @test_runner.new; end
20
+ tests = [GUnit::TestSuite.new, GUnit::TestCase.new]
21
+ assert @test_runner.tests != tests
22
+ @test_runner.tests = tests
23
+ assert @test_runner.tests == tests
24
+ @test_runner = GUnit::TestRunner.instance
25
+ assert @test_runner.tests == tests
26
+ end
27
+
17
28
  def test_tests_getter_setter
18
29
  tests = [GUnit::TestSuite.new, GUnit::TestCase.new]
19
30
  assert @test_runner.tests != tests
20
31
  @test_runner.tests = tests
21
32
  assert @test_runner.tests == tests
22
33
  end
34
+
35
+ def test_patterns_getter_setter
36
+ patterns = ['test/**/*_MY_test.rb', 'test/**/MY_test_*.rb']
37
+ assert @test_runner.patterns != patterns
38
+ @test_runner.patterns = patterns
39
+ assert @test_runner.patterns == patterns
40
+ end
41
+
42
+ def test_autorun_getter_setter
43
+ assert @test_runner.autorun?
44
+ @test_runner.autorun = false
45
+ assert ! @test_runner.autorun?
46
+ end
47
+
48
+ def test_default_patterns
49
+ assert ! @test_runner.patterns.empty?
50
+ assert_equal GUnit::TestRunner::DEFAULT_PATTERNS, @test_runner.patterns
51
+ end
52
+
53
+ def test_discover_tests
54
+ pattern1 = 'foo'
55
+ pattern2 = 'bar'
56
+ file1 = 'foo.rb'
57
+ file2 = 'bar.rb'
58
+ file3 = 'baz.rb'
59
+ @test_runner.patterns = [ pattern1, pattern2 ]
60
+ Dir.expects(:glob).with(pattern1).returns( [ file1, file2 ] ).once
61
+ Dir.expects(:glob).with(pattern2).returns( [ file3 ] ).once
62
+ Kernel.expects(:require).with(file1).returns(true).once
63
+ Kernel.expects(:require).with(file2).returns(true).once
64
+ Kernel.expects(:require).with(file3).returns(true).once
65
+ suite1 = mock
66
+ suite2 = mock
67
+ test_case_subclass1 = mock(:suite => suite1)
68
+ test_case_subclass2 = mock(:suite => suite2)
69
+ GUnit::TestCase.expects(:subclasses).returns([test_case_subclass1, test_case_subclass2])
70
+ @test_runner.discover
71
+ assert @test_runner.tests.include?(suite1)
72
+ assert @test_runner.tests.include?(suite2)
73
+ end
23
74
 
75
+
76
+ def test_reset_clears_tests_responses_patterns_autorun
77
+ patterns = [ 'test/**/*_MY_test.rb', 'test/**/MY_test_*.rb' ]
78
+ @test_runner.patterns = patterns
79
+ test_response1 = GUnit::PassResponse.new
80
+ test_suite = GUnit::TestSuite.new
81
+ test_suite.expects(:run).multiple_yields(test_response1)
82
+ @test_runner.tests = [test_suite]
83
+ @test_runner.autorun = false
84
+ @test_runner.run
85
+ assert @test_runner.responses.include?(test_response1)
86
+ assert ! @test_runner.tests.empty?
87
+ assert ! @test_runner.responses.empty?
88
+ assert_not_equal GUnit::TestRunner::DEFAULT_PATTERNS, @test_runner.patterns
89
+ @test_runner.reset
90
+ assert @test_runner.autorun?
91
+ assert @test_runner.tests.empty?
92
+ assert @test_runner.responses.empty?
93
+ assert_equal GUnit::TestRunner::DEFAULT_PATTERNS, @test_runner.patterns
94
+ end
95
+
24
96
  def test_tests_set_nil_has_empty_tests
25
97
  @test_runner.tests = nil
26
98
  assert @test_runner.tests.empty?
@@ -44,7 +116,8 @@ class GUnit::TestRunnerTest < Test::Unit::TestCase
44
116
  end
45
117
 
46
118
  def test_io_default
47
- assert GUnit::TestRunner.new.io == STDOUT
119
+ @test_runner.reset
120
+ assert @test_runner.io == STDOUT
48
121
  end
49
122
 
50
123
  def test_silent_getter_setter
@@ -64,6 +137,22 @@ class GUnit::TestRunnerTest < Test::Unit::TestCase
64
137
  @test_runner.run
65
138
  end
66
139
 
140
+ def test_run_bang
141
+ @test_runner.io = mock() # fails if any methods on io are called
142
+ @test_runner.silent = true
143
+ test_response1 = GUnit::PassResponse.new
144
+ test_suite = GUnit::TestSuite.new
145
+ @test_runner.tests = [test_suite]
146
+
147
+ test_suite.expects(:run).times(0)
148
+ @test_runner.autorun = false
149
+ @test_runner.run!
150
+
151
+ test_suite.expects(:run).times(1).yields(test_response1)
152
+ @test_runner.autorun = true
153
+ @test_runner.run!
154
+ end
155
+
67
156
  def test_run_not_silent
68
157
  test_response1 = GUnit::PassResponse.new
69
158
  fail_response_message = "Whoops. Failed."
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: GUnit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Sterndale
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-23 00:00:00 -05:00
12
+ date: 2010-01-27 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -46,6 +46,10 @@ files:
46
46
  - lib/gunit/test_suite.rb
47
47
  - lib/gunit/to_do_response.rb
48
48
  - lib/gunit/verification.rb
49
+ - samples/Rakefile
50
+ - samples/martini.rb
51
+ - samples/test/martini_test.rb
52
+ - samples/test/test_helper.rb
49
53
  - test/integration/foo_test.rb
50
54
  - test/test_helper.rb
51
55
  - test/unit/assertions_test.rb