kintama 0.1.13 → 0.2
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.
- checksums.yaml +5 -5
- data/README.md +1 -1
- data/lib/kintama.rb +7 -7
- data/lib/kintama/context.rb +8 -4
- data/lib/kintama/mocha.rb +21 -12
- data/lib/kintama/reporter.rb +8 -7
- 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 +8 -31
- data/test/integration/line_based_running_test.rb +51 -65
- data/test/reporters/verbose_reporter_test.rb +2 -1
- data/test/test_helper.rb +69 -3
- data/test/unit/assertions_test.rb +7 -7
- data/test/usage/03_teardown_test.rb +1 -0
- data/test/usage/08_start_and_finish_test.rb +1 -0
- data/test/usage/09_expectations_and_mocking_test.rb +7 -8
- data/test/usage/10_let_and_subject_test.rb +11 -2
- metadata +9 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '0585d375e075683687b7a47da3323ace4468f9a9f61c4fdb2c8931144a879d55'
|
4
|
+
data.tar.gz: 63325f6c21c46bec7432996421fe43ac54316a5b96c12d0c89851dd2f9fd88ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d90b1a3eb60ff446e2ebeea8e9e251384750db13dde88986aa86164da6595bbbac6ccff9dec4ad44f36d915a86e84bce64dd9fc0075ee478462236b39a828396
|
7
|
+
data.tar.gz: 317f355a6141242af6c6d5efb388b8bfa8fbc9ab14a5d56f02e1413485470901b970ae4565645adf0d7c8604bff956edc63163d6e68e78c4c33cc6c090e96aea
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ Probably the closest thing I've seen is [baretest][]. If you look around the cod
|
|
30
30
|
|
31
31
|
Another alternative test framework is [riot][], which claims to be fast, but also appears to constrain the way that tests are written by avoiding instance variables in setups, for example.
|
32
32
|
|
33
|
-
[Testy][] is interesting - it looks like its output is YAML
|
33
|
+
[Testy][] is interesting - it looks like its output is YAML! [Tryouts][] is thinking outside the box, using comment examples.
|
34
34
|
|
35
35
|
[Zebra][] addresses the apparent duplication of the test name and the test body, but does it by introducing an [RSpec][]-esque method on every object. Wild. Also, it's an extension of [Test::Unit][], so that's strike two for me, personally.
|
36
36
|
|
data/lib/kintama.rb
CHANGED
@@ -21,7 +21,7 @@ module Kintama
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def default_context
|
24
|
-
reset unless @default_context
|
24
|
+
reset unless instance_variable_defined?(:@default_context) && @default_context
|
25
25
|
@default_context
|
26
26
|
end
|
27
27
|
|
@@ -77,12 +77,12 @@ module Kintama
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def options
|
80
|
-
|
81
|
-
|
80
|
+
@options ||= begin
|
81
|
+
options = OpenStruct.new(
|
82
82
|
:reporter => Kintama::Reporter.default,
|
83
83
|
:runner => Kintama::Runner.default
|
84
84
|
)
|
85
|
-
|
85
|
+
cmd_options = OptionParser.new do |opts|
|
86
86
|
opts.banner = "Usage: ruby <test_file> [options]"
|
87
87
|
|
88
88
|
opts.separator ""
|
@@ -101,16 +101,16 @@ module Kintama
|
|
101
101
|
exit
|
102
102
|
end
|
103
103
|
end
|
104
|
-
|
104
|
+
cmd_options.parse!(ARGV)
|
105
|
+
options
|
105
106
|
end
|
106
|
-
@options
|
107
107
|
end
|
108
108
|
|
109
109
|
# Adds the hook to automatically run all known tests using #run when
|
110
110
|
# ruby exits; this is most useful when running a test file from the command
|
111
111
|
# line or from within an editor
|
112
112
|
def add_exit_hook
|
113
|
-
return if
|
113
|
+
return if instance_variable_defined?(:@__added_exit_hook)
|
114
114
|
at_exit { exit(options.runner.with(Kintama.default_context).run(options.reporter) ? 0 : 1) }
|
115
115
|
@__added_exit_hook = true
|
116
116
|
end
|
data/lib/kintama/context.rb
CHANGED
@@ -50,7 +50,7 @@ module Kintama
|
|
50
50
|
module ClassMethods
|
51
51
|
|
52
52
|
def find_definition_1_8
|
53
|
-
line = caller.find { |
|
53
|
+
line = caller.find { |l| l =~ /^[^:]+:(\d+)$/ }
|
54
54
|
if line
|
55
55
|
parts = line.split(":")
|
56
56
|
parts[1] = parts[1].to_i
|
@@ -64,8 +64,8 @@ module Kintama
|
|
64
64
|
|
65
65
|
def find_definition_rbx(&block)
|
66
66
|
if block
|
67
|
-
|
68
|
-
[
|
67
|
+
block_environment = block.block
|
68
|
+
[block_environment.file, block_environment.line]
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -150,7 +150,11 @@ module Kintama
|
|
150
150
|
def let(name, &block)
|
151
151
|
define_method(name) do
|
152
152
|
memo = "@__#{name}"
|
153
|
-
|
153
|
+
if instance_variable_defined?(memo)
|
154
|
+
instance_variable_get(memo)
|
155
|
+
else
|
156
|
+
instance_variable_set(memo, instance_eval(&block))
|
157
|
+
end
|
154
158
|
end
|
155
159
|
end
|
156
160
|
|
data/lib/kintama/mocha.rb
CHANGED
@@ -1,17 +1,6 @@
|
|
1
1
|
require 'kintama'
|
2
2
|
require 'mocha/api'
|
3
3
|
|
4
|
-
Kintama.include Mocha::API
|
5
|
-
Kintama.teardown do
|
6
|
-
begin
|
7
|
-
mocha_verify
|
8
|
-
rescue Mocha::ExpectationError => e
|
9
|
-
raise e
|
10
|
-
ensure
|
11
|
-
mocha_teardown
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
4
|
module Kintama::Mocha
|
16
5
|
module Expect
|
17
6
|
def expect(name, &block)
|
@@ -21,5 +10,25 @@ module Kintama::Mocha
|
|
21
10
|
end
|
22
11
|
end
|
23
12
|
end
|
13
|
+
|
14
|
+
def self.setup
|
15
|
+
Kintama.include Mocha::API
|
16
|
+
Kintama.include Mocha::Hooks
|
17
|
+
Kintama.extend(Kintama::Mocha::Expect)
|
18
|
+
|
19
|
+
Kintama.setup do
|
20
|
+
mocha_setup
|
21
|
+
end
|
22
|
+
Kintama.teardown do
|
23
|
+
begin
|
24
|
+
mocha_verify
|
25
|
+
rescue Mocha::ExpectationError => e
|
26
|
+
raise e
|
27
|
+
ensure
|
28
|
+
mocha_teardown
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
24
32
|
end
|
25
|
-
|
33
|
+
|
34
|
+
Kintama::Mocha.setup
|
data/lib/kintama/reporter.rb
CHANGED
@@ -2,7 +2,8 @@ module Kintama
|
|
2
2
|
class Reporter
|
3
3
|
|
4
4
|
def self.default
|
5
|
-
|
5
|
+
colour = $stdin.tty?
|
6
|
+
Verbose.new(colour)
|
6
7
|
end
|
7
8
|
|
8
9
|
def self.called(name)
|
@@ -65,7 +66,7 @@ module Kintama
|
|
65
66
|
end
|
66
67
|
|
67
68
|
def character_status_of(test)
|
68
|
-
|
69
|
+
if test.pending?
|
69
70
|
'P'
|
70
71
|
elsif test.passed?
|
71
72
|
'.'
|
@@ -139,20 +140,20 @@ module Kintama
|
|
139
140
|
end
|
140
141
|
end
|
141
142
|
|
142
|
-
def
|
143
|
-
"#{
|
143
|
+
def colour(text, colour_code)
|
144
|
+
"#{colour_code}#{text}\e[0m"
|
144
145
|
end
|
145
146
|
|
146
147
|
def green(text)
|
147
|
-
|
148
|
+
colour(text, "\e[32m")
|
148
149
|
end
|
149
150
|
|
150
151
|
def red(text)
|
151
|
-
|
152
|
+
colour(text, "\e[31m")
|
152
153
|
end
|
153
154
|
|
154
155
|
def yellow(text)
|
155
|
-
|
156
|
+
colour(text, "\e[33m")
|
156
157
|
end
|
157
158
|
end
|
158
159
|
|
data/lib/kintama/runnable.rb
CHANGED
@@ -22,7 +22,7 @@ module Kintama
|
|
22
22
|
|
23
23
|
# Returns the full name of this context, taking any parent contexts into account
|
24
24
|
def full_name
|
25
|
-
if @name
|
25
|
+
if instance_variable_defined?(:@name) && @name
|
26
26
|
[parent ? parent.full_name : nil, @name].compact.join(" ")
|
27
27
|
else
|
28
28
|
nil
|
@@ -34,4 +34,4 @@ module Kintama
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
|
-
end
|
37
|
+
end
|
data/lib/kintama/runner.rb
CHANGED
@@ -58,15 +58,15 @@ module Kintama
|
|
58
58
|
runnable = @runnables.map { |r| r.runnable_on_line(@line) }.compact.first
|
59
59
|
if runnable
|
60
60
|
if runnable.is_a_test?
|
61
|
-
|
61
|
+
hierarchy = []
|
62
62
|
parent = runnable.parent.parent
|
63
63
|
until parent == Kintama.default_context do
|
64
|
-
|
64
|
+
hierarchy.unshift parent
|
65
65
|
parent = parent.parent
|
66
66
|
end
|
67
|
-
|
67
|
+
hierarchy.each { |context| reporter.context_started(context) }
|
68
68
|
runnable.parent.run_tests([runnable], false, reporter)
|
69
|
-
|
69
|
+
hierarchy.reverse.each { |context| reporter.context_finished(context) }
|
70
70
|
[runnable.parent]
|
71
71
|
else
|
72
72
|
runnable.run(reporter)
|
@@ -74,7 +74,7 @@ module Kintama
|
|
74
74
|
end
|
75
75
|
else
|
76
76
|
puts "Nothing runnable found on line #{@line}"
|
77
|
-
exit
|
77
|
+
exit(-1)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
data/lib/kintama/test.rb
CHANGED
@@ -9,7 +9,7 @@ module Kintama
|
|
9
9
|
attr_accessor :block
|
10
10
|
|
11
11
|
def pending?
|
12
|
-
@block.nil?
|
12
|
+
!instance_variable_defined?(:@block) || @block.nil?
|
13
13
|
end
|
14
14
|
|
15
15
|
def run
|
@@ -65,4 +65,4 @@ module Kintama
|
|
65
65
|
@failure.backtrace.select { |line| File.expand_path(line).index(base_dir).nil? }.map { |l| " "*4 + File.expand_path(l) }.join("\n")
|
66
66
|
end
|
67
67
|
end
|
68
|
-
end
|
68
|
+
end
|
@@ -1,45 +1,22 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class AutomaticRunningTest <
|
3
|
+
class AutomaticRunningTest < KintamaIntegrationTest
|
4
4
|
|
5
5
|
def test_should_be_able_to_run_kintama_tests_automatically_when_file_is_loaded
|
6
|
-
|
6
|
+
test_with_content(%{
|
7
7
|
context "given a thing" do
|
8
8
|
should "work" do
|
9
9
|
assert true
|
10
10
|
end
|
11
|
-
end
|
12
|
-
|
11
|
+
end
|
12
|
+
}).run.should_have_passing_exit_status
|
13
|
+
|
14
|
+
test_with_content(%{
|
13
15
|
context "given a thing" do
|
14
16
|
should "not work" do
|
15
17
|
flunk
|
16
18
|
end
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def write_test(string)
|
23
|
-
f = File.open("/tmp/kintama_tmp_test.rb", "w") do |f|
|
24
|
-
f.puts %|$LOAD_PATH.unshift "#{File.expand_path("../../lib", __FILE__)}"; require "kintama"|
|
25
|
-
f.puts string
|
26
|
-
end
|
27
|
-
"/tmp/kintama_tmp_test.rb"
|
28
|
-
end
|
29
|
-
|
30
|
-
def run_kintama_test(path)
|
31
|
-
prev = ENV["KINTAMA_EXPLICITLY_DONT_RUN"]
|
32
|
-
ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = nil
|
33
|
-
output = `ruby #{path}`
|
34
|
-
ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = prev
|
35
|
-
$?
|
36
|
-
end
|
37
|
-
|
38
|
-
def assert_passes(path)
|
39
|
-
assert_equal 0, run_kintama_test(path).exitstatus
|
40
|
-
end
|
41
|
-
|
42
|
-
def assert_fails(path)
|
43
|
-
assert_equal 1, run_kintama_test(path).exitstatus
|
19
|
+
end
|
20
|
+
}).run.should_have_failing_exit_status
|
44
21
|
end
|
45
22
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
|
-
class LineBasedRunningTest <
|
3
|
+
class LineBasedRunningTest < KintamaIntegrationTest
|
4
4
|
def test_should_be_able_to_run_the_test_by_giving_the_line_number_the_test_is_defined_on
|
5
|
-
|
5
|
+
test = test_with_content(%{
|
6
6
|
context "given a thing" do
|
7
7
|
should "run this test" do
|
8
8
|
assert true
|
@@ -10,16 +10,20 @@ class LineBasedRunningTest < Minitest::Test
|
|
10
10
|
should "not run this test" do
|
11
11
|
flunk
|
12
12
|
end
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
end
|
14
|
+
})
|
15
|
+
test.run('--line 3') do
|
16
|
+
assert_output(/^#{passing("should run this test")}\n\n1 tests/)
|
17
|
+
assert_output(/^1 tests, 0 failures/)
|
18
|
+
end
|
19
|
+
test.run('--line 6') do
|
20
|
+
assert_output(/^#{failing("should not run this test")}\n\n1 tests/)
|
21
|
+
assert_output(/^1 tests, 1 failures/)
|
22
|
+
end
|
19
23
|
end
|
20
24
|
|
21
25
|
def test_should_be_able_to_run_the_test_by_giving_the_line_number_within_the_test_definition
|
22
|
-
|
26
|
+
test = test_with_content(%{
|
23
27
|
context "given a thing" do
|
24
28
|
should "run this test" do
|
25
29
|
assert true
|
@@ -27,13 +31,18 @@ class LineBasedRunningTest < Minitest::Test
|
|
27
31
|
should "not run this test" do
|
28
32
|
flunk
|
29
33
|
end
|
30
|
-
end
|
31
|
-
|
32
|
-
|
34
|
+
end
|
35
|
+
})
|
36
|
+
test.run('--line 4') do
|
37
|
+
assert_output(/^#{passing("should run this test")}\n\n1 tests/)
|
38
|
+
end
|
39
|
+
test.run('--line 7') do
|
40
|
+
assert_output(/^#{failing("should not run this test")}\n\n1 tests/)
|
41
|
+
end
|
33
42
|
end
|
34
43
|
|
35
44
|
def test_should_be_able_to_run_all_tests_within_a_context_when_line_falls_on_a_context
|
36
|
-
|
45
|
+
test_with_content(%{
|
37
46
|
context "given a thing" do
|
38
47
|
should "not run this test" do
|
39
48
|
flunk
|
@@ -44,12 +53,14 @@ class LineBasedRunningTest < Minitest::Test
|
|
44
53
|
should "run this test too" do
|
45
54
|
end
|
46
55
|
end
|
47
|
-
end
|
48
|
-
|
56
|
+
end
|
57
|
+
}).run('--line 6') do
|
58
|
+
assert_output(/#{passing("should run this test")}\n#{passing("should run this test too")}\n\n2 tests/)
|
59
|
+
end
|
49
60
|
end
|
50
61
|
|
51
62
|
def test_should_be_able_to_run_a_test_defined_in_a_second_top_level_context
|
52
|
-
|
63
|
+
test_with_content(%{
|
53
64
|
context "given a thing" do
|
54
65
|
should "not run this test" do
|
55
66
|
flunk
|
@@ -58,86 +69,61 @@ class LineBasedRunningTest < Minitest::Test
|
|
58
69
|
context "and another thing" do
|
59
70
|
should "run this test" do
|
60
71
|
end
|
61
|
-
end
|
62
|
-
|
72
|
+
end
|
73
|
+
}).run('--line 8') do
|
74
|
+
assert_output(/#{passing("should run this test")}\n\n1 tests/)
|
75
|
+
end
|
63
76
|
end
|
64
77
|
|
65
78
|
def test_should_print_out_the_full_nested_test_name
|
66
|
-
|
79
|
+
test_with_content(%{
|
67
80
|
context "given a test" do
|
68
81
|
context "that is nested deeply" do
|
69
82
|
should "print the full nesting name" do
|
70
83
|
end
|
71
84
|
end
|
72
|
-
end
|
73
|
-
|
85
|
+
end
|
86
|
+
}).run('--line 5') do
|
87
|
+
assert_output(/given a test\n that is nested deeply\n/)
|
88
|
+
end
|
74
89
|
end
|
75
90
|
|
76
91
|
def test_should_not_show_pending_tests_in_the_same_context_as_pending_when_not_targeted
|
77
|
-
|
92
|
+
test_with_content(%{
|
78
93
|
context "given a context with a pending test" do
|
79
94
|
should "only show the run test" do
|
80
95
|
end
|
81
96
|
should "ignore the pending test"
|
82
|
-
end
|
83
|
-
|
97
|
+
end
|
98
|
+
}).run('--line 3') do
|
99
|
+
refute_output(/1 pending/)
|
100
|
+
end
|
84
101
|
end
|
85
102
|
|
86
103
|
def test_should_be_able_to_target_a_top_level_context
|
87
104
|
end
|
88
105
|
|
89
|
-
def
|
90
|
-
|
106
|
+
def test_should_run_all_tests_when_context_is_on_target_line
|
107
|
+
test_with_content(%{
|
91
108
|
context "given a context with a pending test" do
|
92
109
|
should "run this" do
|
93
110
|
end
|
94
111
|
should "run this too" do
|
95
112
|
end
|
96
|
-
end
|
97
|
-
|
113
|
+
end
|
114
|
+
}).run('--line 2') do
|
115
|
+
assert_output(/2 tests/)
|
116
|
+
end
|
98
117
|
end
|
99
118
|
|
100
119
|
def test_should_report_if_nothing_runnable_can_be_found_for_that_line
|
101
|
-
|
120
|
+
test_with_content(%{
|
102
121
|
context "given a short context" do
|
103
122
|
should "not run this" do
|
104
123
|
end
|
105
|
-
end
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
private
|
110
|
-
|
111
|
-
def write_test(string, path)
|
112
|
-
f = File.open(path, "w") do |f|
|
113
|
-
f.puts %|$LOAD_PATH.unshift "#{File.expand_path("../../lib", __FILE__)}"; require "kintama"|
|
114
|
-
f.puts string.strip
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def run_kintama_test(test_content, options)
|
119
|
-
path = "/tmp/kintama_tmp_test.rb"
|
120
|
-
write_test(test_content.strip, path)
|
121
|
-
prev = ENV["KINTAMA_EXPLICITLY_DONT_RUN"]
|
122
|
-
ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = nil
|
123
|
-
output = `ruby #{path} #{options}`
|
124
|
-
ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = prev
|
125
|
-
output
|
126
|
-
end
|
127
|
-
|
128
|
-
def passing(test_name)
|
129
|
-
if $stdin.tty?
|
130
|
-
/\e\[32m\s*#{test_name}\e\[0m/
|
131
|
-
else
|
132
|
-
/\s*#{test_name}: ./
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def failing(test_name)
|
137
|
-
if $stdin.tty?
|
138
|
-
/\e\[31m\s*#{test_name}\e\[0m/
|
139
|
-
else
|
140
|
-
/\s*#{test_name}: F/
|
124
|
+
end
|
125
|
+
}).run('--line 1') do
|
126
|
+
assert_output(/Nothing runnable found on line 1/)
|
141
127
|
end
|
142
128
|
end
|
143
129
|
end
|
@@ -112,7 +112,8 @@ class VerboseReporterTest < KintamaIntegrationTest
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def test_should_print_out_test_names_in_colour_if_colour_is_set
|
115
|
-
|
115
|
+
use_colour = true
|
116
|
+
use_reporter Kintama::Reporter::Verbose.new(use_colour)
|
116
117
|
|
117
118
|
context "given tests reported in colour" do
|
118
119
|
should "show failures in red" do
|
data/test/test_helper.rb
CHANGED
@@ -6,7 +6,7 @@ ENV["KINTAMA_EXPLICITLY_DONT_RUN"] = "true"
|
|
6
6
|
require 'kintama'
|
7
7
|
|
8
8
|
require 'stringio'
|
9
|
-
require 'mocha/
|
9
|
+
require 'mocha/minitest'
|
10
10
|
|
11
11
|
class Minitest::Test
|
12
12
|
def setup
|
@@ -47,7 +47,7 @@ end
|
|
47
47
|
class KintamaIntegrationTest < Minitest::Test
|
48
48
|
class << self
|
49
49
|
def reporter_class
|
50
|
-
@reporter_class
|
50
|
+
@reporter_class ||= Kintama::Reporter::Verbose
|
51
51
|
end
|
52
52
|
|
53
53
|
def report_with(reporter_class)
|
@@ -77,7 +77,8 @@ class KintamaIntegrationTest < Minitest::Test
|
|
77
77
|
@test_unit_test = test_unit_test
|
78
78
|
@context = context
|
79
79
|
@result = nil
|
80
|
-
|
80
|
+
use_colour = false
|
81
|
+
@reporter = @test_unit_test.reporter || test_unit_test.class.reporter_class.new(use_colour)
|
81
82
|
@output = capture_stdout do
|
82
83
|
@result = Kintama::Runner.default.with(context).run(@reporter)
|
83
84
|
end.read
|
@@ -124,4 +125,69 @@ class KintamaIntegrationTest < Minitest::Test
|
|
124
125
|
string.gsub("\n#{initial_indent}", "\n").gsub(/^\n/, '').gsub(/\s+$/, '')
|
125
126
|
end
|
126
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
|
127
193
|
end
|
@@ -40,7 +40,7 @@ class AssertionsTest < Minitest::Test
|
|
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,13 +61,13 @@ class AssertionsTest < Minitest::Test
|
|
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
66
|
end
|
67
67
|
|
68
68
|
def test_should_provide_assert_no_match
|
69
|
-
assert_passed { @test.assert_no_match
|
70
|
-
assert_failed(%|expected "blah" not to match /ah/|) { @test.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") }
|
71
71
|
end
|
72
72
|
|
73
73
|
def test_should_provide_assert_same_elements_to_compare_arrays
|
@@ -93,7 +93,7 @@ class AssertionsTest < Minitest::Test
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
assert_passed do
|
96
|
-
@test.assert_output
|
96
|
+
@test.assert_output(/oba/) do
|
97
97
|
puts 'foobar'
|
98
98
|
end
|
99
99
|
end
|
@@ -111,7 +111,7 @@ class AssertionsTest < Minitest::Test
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
assert_passed do
|
114
|
-
@test.assert_not_output
|
114
|
+
@test.assert_not_output(/oba/) do
|
115
115
|
puts 'whambam'
|
116
116
|
end
|
117
117
|
end
|
@@ -1,15 +1,14 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'kintama/mocha'
|
2
3
|
|
3
4
|
class ExpectationsAndMockingTest < KintamaIntegrationTest
|
4
5
|
|
5
6
|
def setup
|
6
|
-
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
|
11
|
-
# is thoroughly reset after each test by default.
|
12
|
-
require 'kintama/mocha'
|
7
|
+
super
|
8
|
+
# This is normally called automatically when requiring 'kintama/mocha'
|
9
|
+
# but in these tests we totally reset Kintama, and so we need to
|
10
|
+
# ensure that the mocha integration is loaded properly.
|
11
|
+
Kintama::Mocha.setup
|
13
12
|
end
|
14
13
|
|
15
14
|
def test_should_allow_setting_of_expectations_in_tests
|
@@ -43,7 +42,7 @@ class ExpectationsAndMockingTest < KintamaIntegrationTest
|
|
43
42
|
should_fail.
|
44
43
|
with_failure(%{
|
45
44
|
unsatisfied expectations:
|
46
|
-
- expected exactly once,
|
45
|
+
- expected exactly once, invoked never: #<Mock:thing>.blah
|
47
46
|
})
|
48
47
|
end
|
49
48
|
|
@@ -87,17 +87,26 @@ class LetAndSubjectTest < KintamaIntegrationTest
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def test_subject_should_work_just_like_lets
|
90
|
+
$object_id_in_test_one = nil
|
91
|
+
$object_id_in_test_two = nil
|
92
|
+
|
90
93
|
context "Defining a `subject` attribute in a context" do
|
91
94
|
subject do
|
92
95
|
Object.new
|
93
96
|
end
|
94
97
|
|
95
98
|
should "return one instance in one test" do
|
96
|
-
$
|
99
|
+
$object_id_in_test_one = subject.object_id
|
100
|
+
if $object_id_in_test_two # this test might run first
|
101
|
+
assert_not_equal $object_id_in_test_one, $object_id_in_test_two, "object ids should be different between tests"
|
102
|
+
end
|
97
103
|
end
|
98
104
|
|
99
105
|
should "return a different instance in a different test" do
|
100
|
-
|
106
|
+
$object_id_in_test_two = subject.object_id
|
107
|
+
if $object_id_in_test_one # or this test might run first
|
108
|
+
assert_not_equal $object_id_in_test_one, $object_id_in_test_two, "object ids should be different between tests"
|
109
|
+
end
|
101
110
|
end
|
102
111
|
end.
|
103
112
|
should_run_tests(2).
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kintama
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Adam
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mocha
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.11.2
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.11.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
description:
|
55
|
+
description:
|
56
56
|
email: james@lazyatom.com
|
57
57
|
executables: []
|
58
58
|
extensions: []
|
@@ -94,7 +94,7 @@ files:
|
|
94
94
|
homepage: http://github.com/lazyatom
|
95
95
|
licenses: []
|
96
96
|
metadata: {}
|
97
|
-
post_install_message:
|
97
|
+
post_install_message:
|
98
98
|
rdoc_options:
|
99
99
|
- "--main"
|
100
100
|
- README.md
|
@@ -111,9 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0'
|
113
113
|
requirements: []
|
114
|
-
|
115
|
-
|
116
|
-
signing_key:
|
114
|
+
rubygems_version: 3.0.3
|
115
|
+
signing_key:
|
117
116
|
specification_version: 4
|
118
117
|
summary: It's for writing tests.
|
119
118
|
test_files: []
|