kintama 0.1.9 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +2 -2
- data/lib/kintama.rb +26 -12
- data/lib/kintama/assertions.rb +40 -1
- data/lib/kintama/context.rb +65 -50
- data/lib/kintama/mocha.rb +32 -10
- data/lib/kintama/no_conflict.rb +2 -0
- data/lib/kintama/reporter.rb +11 -10
- data/lib/kintama/runnable.rb +2 -2
- data/lib/kintama/runner.rb +5 -5
- data/lib/kintama/test.rb +2 -2
- data/test/integration/automatic_running_test.rb +22 -0
- data/test/integration/line_based_running_test.rb +129 -0
- data/test/reporters/base_reporter_test.rb +31 -101
- data/test/reporters/inline_reporter_test.rb +23 -35
- data/test/reporters/verbose_reporter_test.rb +78 -76
- data/test/test_helper.rb +159 -2
- data/test/{assertions_test.rb → unit/assertions_test.rb} +54 -5
- data/test/unit/context_test.rb +15 -0
- data/test/unit/runner_test.rb +87 -0
- data/test/{test_and_subcontext_access_test.rb → unit/test_and_subcontext_access_test.rb} +6 -33
- data/test/usage/01_basic_usage_test.rb +131 -0
- data/test/usage/02_setup_test.rb +98 -0
- data/test/usage/03_teardown_test.rb +121 -0
- data/test/usage/04_pending_tests_test.rb +16 -0
- data/test/usage/05_aliases_test.rb +73 -0
- data/test/usage/06_defining_methods_in_tests_test.rb +202 -0
- data/test/usage/07_exceptions_test.rb +42 -0
- data/test/usage/08_start_and_finish_test.rb +261 -0
- data/test/usage/09_expectations_and_mocking_test.rb +85 -0
- data/test/usage/10_let_and_subject_test.rb +134 -0
- data/test/usage/11_matcher_test.rb +148 -0
- data/test/usage/12_action_test.rb +118 -0
- metadata +55 -48
- data/test/aliases_test.rb +0 -26
- data/test/automatic_running_test.rb +0 -45
- data/test/exceptions_test.rb +0 -40
- data/test/kintama_test.rb +0 -114
- data/test/line_based_running_test.rb +0 -143
- data/test/matcher_test.rb +0 -80
- data/test/method_behaviour_test.rb +0 -176
- data/test/pending_test_and_context.rb +0 -20
- data/test/setup_test.rb +0 -107
- data/test/start_and_finish_test.rb +0 -94
- data/test/teardown_test.rb +0 -106
@@ -1,147 +1,149 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class VerboseReporterTest <
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@reporter = Kintama::Reporter::Verbose.new(false)
|
7
|
-
end
|
3
|
+
class VerboseReporterTest < KintamaIntegrationTest
|
4
|
+
report_with Kintama::Reporter::Verbose
|
8
5
|
|
9
6
|
def test_should_print_out_test_names
|
10
|
-
|
11
|
-
should "
|
7
|
+
context "given something" do
|
8
|
+
should "pass" do
|
12
9
|
assert true
|
13
10
|
end
|
14
|
-
should "pass" do
|
11
|
+
should "pass too" do
|
15
12
|
assert true
|
16
13
|
end
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
end.
|
15
|
+
should_output(%{
|
16
|
+
given something
|
17
|
+
should pass: .
|
18
|
+
should pass too: .
|
19
|
+
})
|
21
20
|
end
|
22
21
|
|
23
22
|
def test_should_print_out_Ps_beside_pending_test_names
|
24
|
-
|
23
|
+
context "given something" do
|
25
24
|
should "not be implemented"
|
26
25
|
should "pass" do
|
27
26
|
assert true
|
28
27
|
end
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
end.
|
29
|
+
should_output(%{
|
30
|
+
given something
|
31
|
+
should not be implemented: P
|
32
|
+
should pass: .
|
33
|
+
})
|
33
34
|
end
|
34
35
|
|
35
36
|
def test_should_nest_printed_context_and_test_names
|
36
|
-
|
37
|
+
context "given something" do
|
37
38
|
should "pass" do
|
38
39
|
assert true
|
39
40
|
end
|
40
|
-
context "and
|
41
|
-
should "
|
41
|
+
context "and something else" do
|
42
|
+
should "pass" do
|
42
43
|
assert true
|
43
44
|
end
|
44
45
|
end
|
45
|
-
context "and
|
46
|
-
should "pass" do
|
46
|
+
context "and then this" do
|
47
|
+
should "also pass" do
|
47
48
|
assert true
|
48
49
|
end
|
49
50
|
end
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
end.
|
52
|
+
should_output(%{
|
53
|
+
given something
|
54
|
+
should pass: .
|
55
|
+
and something else
|
56
|
+
should pass: .
|
57
|
+
and then this
|
58
|
+
should also pass: .
|
59
|
+
})
|
54
60
|
end
|
55
61
|
|
56
62
|
def test_should_print_out_a_summary_of_the_failing_tests_if_some_fail
|
57
|
-
|
63
|
+
context "given something" do
|
58
64
|
should "fail" do
|
59
65
|
assert 1 == 2, "1 should equal 2"
|
60
66
|
end
|
61
|
-
end
|
62
|
-
|
67
|
+
end.
|
68
|
+
should_output(%{
|
69
|
+
given something should fail:
|
70
|
+
1 should equal 2
|
71
|
+
})
|
63
72
|
end
|
64
73
|
|
65
74
|
def test_should_print_out_a_summary_of_the_failing_tests_if_an_exception_occurs_in_a_test
|
66
|
-
|
75
|
+
context "given something" do
|
67
76
|
should "fail" do
|
68
77
|
raise "unexpected issue!"
|
69
78
|
end
|
70
|
-
end
|
71
|
-
|
79
|
+
end.
|
80
|
+
should_output(%{
|
81
|
+
given something should fail:
|
82
|
+
unexpected issue!
|
83
|
+
})
|
72
84
|
end
|
73
85
|
|
74
86
|
def test_should_print_out_a_summary_of_the_failing_tests_if_a_nested_test_fails
|
75
|
-
|
87
|
+
context "given something" do
|
76
88
|
context "and something else" do
|
77
89
|
should "fail" do
|
78
90
|
assert 1 == 2, "1 should equal 2"
|
79
91
|
end
|
80
92
|
end
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
c1 = context "given something" do
|
87
|
-
should "pass" do
|
88
|
-
assert true
|
89
|
-
end
|
90
|
-
end
|
91
|
-
c2 = context "given another thing" do
|
92
|
-
should "also pass" do
|
93
|
-
assert true
|
94
|
-
end
|
95
|
-
end
|
96
|
-
assert_output(/^given something\n should pass: \.\n\ngiven another thing\n should also pass: \./) do
|
97
|
-
runner(c1, c2).run(@reporter)
|
98
|
-
end
|
93
|
+
end.
|
94
|
+
should_output(%{
|
95
|
+
given something and something else should fail:
|
96
|
+
1 should equal 2
|
97
|
+
})
|
99
98
|
end
|
100
99
|
|
101
100
|
def test_should_treat_a_context_as_transparent_if_it_has_no_name
|
102
|
-
|
101
|
+
context "given something" do
|
103
102
|
context do
|
104
103
|
should "pass" do
|
105
104
|
assert true
|
106
105
|
end
|
107
106
|
end
|
108
|
-
end
|
109
|
-
|
110
|
-
|
111
|
-
|
107
|
+
end.
|
108
|
+
should_output(%{
|
109
|
+
given something
|
110
|
+
should pass: .
|
111
|
+
})
|
112
112
|
end
|
113
113
|
|
114
114
|
def test_should_print_out_test_names_in_colour_if_colour_is_set
|
115
|
-
|
116
|
-
|
115
|
+
use_colour = true
|
116
|
+
use_reporter Kintama::Reporter::Verbose.new(use_colour)
|
117
|
+
|
118
|
+
context "given tests reported in colour" do
|
119
|
+
should "show failures in red" do
|
117
120
|
flunk
|
118
121
|
end
|
119
|
-
should "
|
122
|
+
should "show passes in green" do
|
120
123
|
assert true
|
121
124
|
end
|
122
|
-
should "
|
123
|
-
end
|
124
|
-
|
125
|
-
|
126
|
-
|
125
|
+
should "show pending tests in yellow"
|
126
|
+
end.
|
127
|
+
should_output(%{
|
128
|
+
given tests reported in colour
|
129
|
+
\e\[31m should show failures in red\e\[0m
|
130
|
+
\e\[32m should show passes in green\e\[0m
|
131
|
+
\e\[33m should show pending tests in yellow\e\[0m
|
132
|
+
})
|
127
133
|
end
|
128
134
|
|
129
135
|
def test_should_print_appropriate_test_names_when_given_and_it_aliases_are_used
|
130
|
-
|
136
|
+
context "In a world without hope" do
|
131
137
|
given "a massive gun" do
|
132
138
|
it "should work out well in the end" do
|
133
139
|
assert true
|
134
140
|
end
|
135
141
|
end
|
136
|
-
end
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
private
|
143
|
-
|
144
|
-
def runner(*args)
|
145
|
-
Kintama::Runner::Default.new.with(*args)
|
142
|
+
end.
|
143
|
+
should_output(%{
|
144
|
+
In a world without hope
|
145
|
+
given a massive gun
|
146
|
+
it should work out well in the end: .
|
147
|
+
})
|
146
148
|
end
|
147
|
-
end
|
149
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
|
2
|
-
require '
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'minitest/autorun'
|
3
4
|
|
4
5
|
ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = "true"
|
5
6
|
require 'kintama'
|
6
7
|
|
7
8
|
require 'stringio'
|
9
|
+
require 'mocha/minitest'
|
8
10
|
|
9
|
-
class Test
|
11
|
+
class Minitest::Test
|
10
12
|
def setup
|
11
13
|
Kintama.reset
|
12
14
|
end
|
@@ -23,6 +25,13 @@ class Test::Unit::TestCase
|
|
23
25
|
ensure
|
24
26
|
$stdout = STDOUT
|
25
27
|
end
|
28
|
+
|
29
|
+
def silence_stdout
|
30
|
+
$stdout = StringIO.new
|
31
|
+
return yield
|
32
|
+
ensure
|
33
|
+
$stdout = STDOUT
|
34
|
+
end
|
26
35
|
end
|
27
36
|
|
28
37
|
def assert_output(expected, &block)
|
@@ -34,3 +43,151 @@ class Test::Unit::TestCase
|
|
34
43
|
end
|
35
44
|
end
|
36
45
|
end
|
46
|
+
|
47
|
+
class KintamaIntegrationTest < Minitest::Test
|
48
|
+
class << self
|
49
|
+
def reporter_class
|
50
|
+
@reporter_class ||= Kintama::Reporter::Verbose
|
51
|
+
end
|
52
|
+
|
53
|
+
def report_with(reporter_class)
|
54
|
+
@reporter_class = reporter_class
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
attr_reader :reporter
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def use_reporter(reporter)
|
63
|
+
@reporter = reporter
|
64
|
+
end
|
65
|
+
|
66
|
+
def context(name, &block)
|
67
|
+
ContextTestRunner.new(Kintama.context(name, &block), self)
|
68
|
+
end
|
69
|
+
|
70
|
+
def running_default_context(name, &block)
|
71
|
+
Kintama.context(name, &block)
|
72
|
+
ContextTestRunner.new(Kintama.default_context, self)
|
73
|
+
end
|
74
|
+
|
75
|
+
class ContextTestRunner
|
76
|
+
def initialize(context, test_unit_test)
|
77
|
+
@test_unit_test = test_unit_test
|
78
|
+
@context = context
|
79
|
+
@result = nil
|
80
|
+
use_colour = false
|
81
|
+
@reporter = @test_unit_test.reporter || test_unit_test.class.reporter_class.new(use_colour)
|
82
|
+
@output = capture_stdout do
|
83
|
+
@result = Kintama::Runner.default.with(context).run(@reporter)
|
84
|
+
end.read
|
85
|
+
end
|
86
|
+
|
87
|
+
def should_output(expected_output)
|
88
|
+
if expected_output.is_a?(Regexp)
|
89
|
+
processed_output = expected_output
|
90
|
+
else
|
91
|
+
processed_output = deindent_string_argument(expected_output)
|
92
|
+
end
|
93
|
+
@test_unit_test.assert_match processed_output, @output
|
94
|
+
self
|
95
|
+
end
|
96
|
+
alias_method :and_output, :should_output
|
97
|
+
|
98
|
+
def should_pass(message=nil)
|
99
|
+
@test_unit_test.assert(@result == true, message || "Expected a pass, but failed: #{@context.failures.map { |f| f.failure.message }.join(", ")}")
|
100
|
+
self
|
101
|
+
end
|
102
|
+
alias_method :and_pass, :should_pass
|
103
|
+
|
104
|
+
def should_fail(message=nil)
|
105
|
+
@test_unit_test.assert(@result == false, message || "Expected a failure, but passed!")
|
106
|
+
self
|
107
|
+
end
|
108
|
+
alias_method :and_fail, :should_fail
|
109
|
+
|
110
|
+
def with_failure(failure)
|
111
|
+
@test_unit_test.assert_match deindent_string_argument(failure), @output
|
112
|
+
self
|
113
|
+
end
|
114
|
+
|
115
|
+
def should_run_tests(number)
|
116
|
+
@test_unit_test.assert_equal number, @reporter.test_count, "Expected #{number} tests to run, but #{@reporter.test_count} actually did"
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def deindent_string_argument(string)
|
123
|
+
initial_indent = string.gsub(/^\n/, '').match(/^(\s+)/)
|
124
|
+
initial_indent = initial_indent ? initial_indent[1] : ""
|
125
|
+
string.gsub("\n#{initial_indent}", "\n").gsub(/^\n/, '').gsub(/\s+$/, '')
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_with_content(content)
|
130
|
+
IntegrationTestRunner.new(self, content)
|
131
|
+
end
|
132
|
+
|
133
|
+
class IntegrationTestRunner
|
134
|
+
def initialize(test_unit_test, test_body)
|
135
|
+
@test_unit_test = test_unit_test
|
136
|
+
@test_body = test_body
|
137
|
+
end
|
138
|
+
|
139
|
+
def run(options = nil, &block)
|
140
|
+
path = write_test(@test_body)
|
141
|
+
prev = ENV["KINTAMA_EXPLICITLY_DONT_RUN"]
|
142
|
+
ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = nil
|
143
|
+
@output = `ruby #{path} #{options}`
|
144
|
+
ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = prev
|
145
|
+
@exit_status = $?
|
146
|
+
instance_eval(&block) if block_given?
|
147
|
+
self
|
148
|
+
end
|
149
|
+
|
150
|
+
def should_have_passing_exit_status
|
151
|
+
@test_unit_test.assert_equal 0, @exit_status.exitstatus
|
152
|
+
end
|
153
|
+
|
154
|
+
def should_have_failing_exit_status
|
155
|
+
@test_unit_test.assert_equal 1, @exit_status.exitstatus
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
|
160
|
+
def assert_output(match)
|
161
|
+
@test_unit_test.assert_match(match, @output)
|
162
|
+
end
|
163
|
+
|
164
|
+
def refute_output(match)
|
165
|
+
@test_unit_test.refute_match(match, @output)
|
166
|
+
end
|
167
|
+
|
168
|
+
def passing(test_name)
|
169
|
+
if $stdin.tty?
|
170
|
+
/\e\[32m\s*#{test_name}\e\[0m/
|
171
|
+
else
|
172
|
+
/\s*#{test_name}: ./
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def failing(test_name)
|
177
|
+
if $stdin.tty?
|
178
|
+
/\e\[31m\s*#{test_name}\e\[0m/
|
179
|
+
else
|
180
|
+
/\s*#{test_name}: F/
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def write_test(string)
|
185
|
+
path = "/tmp/kintama_tmp_test.rb"
|
186
|
+
File.open(path, "w") do |f|
|
187
|
+
f.puts %|$LOAD_PATH.unshift "#{File.expand_path("../../lib", __FILE__)}"; require "kintama"|
|
188
|
+
f.puts string.strip
|
189
|
+
end
|
190
|
+
path
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class AssertionsTest < Test
|
3
|
+
class AssertionsTest < Minitest::Test
|
4
4
|
|
5
5
|
class PseudoTest
|
6
6
|
include Kintama::Assertions
|
@@ -40,7 +40,7 @@ class AssertionsTest < Test::Unit::TestCase
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_should_provide_assert_kind_of
|
43
|
-
assert_passed { @test.assert_kind_of
|
43
|
+
assert_passed { @test.assert_kind_of Integer, 1 }
|
44
44
|
assert_passed { @test.assert_kind_of Object, 1 }
|
45
45
|
assert_passed { @test.assert_kind_of String, "hello" }
|
46
46
|
assert_failed("pa!") { @test.assert_kind_of String, 1, "pa!" }
|
@@ -61,8 +61,13 @@ class AssertionsTest < Test::Unit::TestCase
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_should_provide_assert_match
|
64
|
-
assert_passed { @test.assert_match
|
65
|
-
assert_failed(%|expected "blah" to match /mm/|) { @test.assert_match
|
64
|
+
assert_passed { @test.assert_match(/jam/, "bluejam") }
|
65
|
+
assert_failed(%|expected "blah" to match /mm/|) { @test.assert_match(/mm/, "blah") }
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_should_provide_assert_no_match
|
69
|
+
assert_passed { @test.assert_no_match(/jam/, "bluejay") }
|
70
|
+
assert_failed(%|expected "blah" not to match /ah/|) { @test.assert_no_match(/ah/, "blah") }
|
66
71
|
end
|
67
72
|
|
68
73
|
def test_should_provide_assert_same_elements_to_compare_arrays
|
@@ -73,6 +78,50 @@ class AssertionsTest < Test::Unit::TestCase
|
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
81
|
+
def test_should_provide_assert_same
|
82
|
+
expected, actual = 'foo', 'foo'
|
83
|
+
assert_passed { @test.assert_same expected, expected }
|
84
|
+
assert_failed("Expected #{expected.inspect} (oid=#{expected.object_id}) to be the same as #{actual.inspect} (oid=#{actual.object_id})") do
|
85
|
+
@test.assert_same expected, actual
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_should_provide_assert_output
|
90
|
+
assert_passed do
|
91
|
+
@test.assert_output 'foobar' do
|
92
|
+
puts 'foobar'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
assert_passed do
|
96
|
+
@test.assert_output(/oba/) do
|
97
|
+
puts 'foobar'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
assert_failed('Expected output to match "foobar"') do
|
101
|
+
@test.assert_output 'foobar' do
|
102
|
+
puts 'whambam'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_should_provide_assert_not_output
|
108
|
+
assert_passed do
|
109
|
+
@test.assert_not_output 'foobar' do
|
110
|
+
puts 'whambam'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
assert_passed do
|
114
|
+
@test.assert_not_output(/oba/) do
|
115
|
+
puts 'whambam'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
assert_failed('Expected output not to match "foobar"') do
|
119
|
+
@test.assert_not_output 'foobar' do
|
120
|
+
puts 'foobar'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
76
125
|
private
|
77
126
|
|
78
127
|
def assert_passed
|
@@ -87,4 +136,4 @@ class AssertionsTest < Test::Unit::TestCase
|
|
87
136
|
assert_equal message, e.message, "assertion failure message didn't match"
|
88
137
|
end
|
89
138
|
end
|
90
|
-
end
|
139
|
+
end
|