tiramisu 0.0.0 → 0.0.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.
- checksums.yaml +4 -4
- data/.gitignore +0 -5
- data/.travis.yml +3 -0
- data/README.md +305 -3
- data/README.md.html +348 -0
- data/Rakefile +10 -1
- data/bin/tiramisu +4 -0
- data/lib/tiramisu.rb +117 -2
- data/lib/tiramisu/assert.rb +142 -0
- data/lib/tiramisu/core_ext.rb +102 -0
- data/lib/tiramisu/mock.rb +48 -0
- data/lib/tiramisu/mock/expectation.rb +44 -0
- data/lib/tiramisu/mock/expectation/raise.rb +34 -0
- data/lib/tiramisu/mock/expectation/return.rb +34 -0
- data/lib/tiramisu/mock/expectation/throw.rb +26 -0
- data/lib/tiramisu/mock/expectation/with.rb +38 -0
- data/lib/tiramisu/pretty_print.rb +55 -0
- data/lib/tiramisu/run.rb +77 -0
- data/lib/tiramisu/unit.rb +195 -0
- data/lib/tiramisu/util.rb +91 -0
- data/lib/tiramisu/util/assert_raise.rb +54 -0
- data/lib/tiramisu/util/assert_throw.rb +40 -0
- data/lib/tiramisu/util/refute_raise.rb +48 -0
- data/lib/tiramisu/util/refute_throw.rb +34 -0
- data/test/assert_test.rb +98 -0
- data/test/context_inheritance_test.rb +65 -0
- data/test/hooks_test.rb +36 -0
- data/test/raise_test.rb +66 -0
- data/test/receive_and_raise_test.rb +91 -0
- data/test/receive_and_return_test.rb +74 -0
- data/test/receive_and_throw_test.rb +74 -0
- data/test/receive_test.rb +48 -0
- data/test/receive_with_test.rb +62 -0
- data/test/refute_raise_test.rb +90 -0
- data/test/refute_throw_test.rb +42 -0
- data/test/setup.rb +25 -0
- data/test/skip_test.rb +40 -0
- data/test/throw_test.rb +58 -0
- data/tiramisu.gemspec +5 -4
- metadata +57 -11
- data/lib/tiramisu/version.rb +0 -3
@@ -0,0 +1,91 @@
|
|
1
|
+
module Tiramisu
|
2
|
+
|
3
|
+
def call_block block
|
4
|
+
{returned: block.call, caller: relative_source_location(block)}.freeze
|
5
|
+
rescue UncaughtThrowError => e
|
6
|
+
{raised: e, thrown: extract_thrown_symbol(e), caller: relative_source_location(block)}.freeze
|
7
|
+
rescue Exception => e
|
8
|
+
{raised: e, caller: relative_source_location(block)}.freeze
|
9
|
+
end
|
10
|
+
|
11
|
+
# extract thrown symbol from given exception
|
12
|
+
#
|
13
|
+
# @param exception
|
14
|
+
#
|
15
|
+
def extract_thrown_symbol exception
|
16
|
+
return unless exception.is_a?(Exception)
|
17
|
+
return unless s = exception.message.scan(/uncaught throw\W+(\w+)/).flatten[0]
|
18
|
+
s.to_sym
|
19
|
+
end
|
20
|
+
|
21
|
+
def identity_string type, label, block
|
22
|
+
'%s %s (%s:%s)' % [
|
23
|
+
blue(type),
|
24
|
+
label.inspect,
|
25
|
+
*relative_source_location(block)
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
def relative_source_location block
|
30
|
+
return unless block
|
31
|
+
[
|
32
|
+
relative_location(block.source_location[0]),
|
33
|
+
block.source_location[1]
|
34
|
+
]
|
35
|
+
end
|
36
|
+
|
37
|
+
def relative_location line
|
38
|
+
line.sub(/\A#{pwd}\/+/, '')
|
39
|
+
end
|
40
|
+
|
41
|
+
def pretty_backtrace e
|
42
|
+
Array(e.backtrace).map {|l| relative_location(l)}
|
43
|
+
end
|
44
|
+
|
45
|
+
def readline caller
|
46
|
+
file, line = caller_to_source_location(caller)
|
47
|
+
return unless file && line
|
48
|
+
lines = ((@__readlinecache__ ||= {})[file] ||= File.readlines(file))
|
49
|
+
return unless line = lines[line.to_i - 1]
|
50
|
+
line.sub(/(do|\{)\Z/, '').strip
|
51
|
+
end
|
52
|
+
|
53
|
+
def caller_to_source_location caller
|
54
|
+
file, line = caller.split(/:(\d+):in.+/)
|
55
|
+
[relative_location(file), line]
|
56
|
+
end
|
57
|
+
|
58
|
+
def load_files pattern_or_files
|
59
|
+
files = pattern_or_files.is_a?(Array) ? pattern_or_files : Dir[pwd(pattern_or_files)]
|
60
|
+
files.each {|f| load_file(f)}
|
61
|
+
end
|
62
|
+
|
63
|
+
def load_file file
|
64
|
+
augment_load_path(file)
|
65
|
+
require(file)
|
66
|
+
end
|
67
|
+
|
68
|
+
def augment_load_path file
|
69
|
+
# adding ./
|
70
|
+
$:.unshift(pwd) unless $:.include?(pwd)
|
71
|
+
|
72
|
+
# adding ./lib/
|
73
|
+
lib = pwd('lib')
|
74
|
+
unless $:.include?(lib)
|
75
|
+
$:.unshift(lib) if File.directory?(lib)
|
76
|
+
end
|
77
|
+
|
78
|
+
# adding file's dirname
|
79
|
+
dir = File.dirname(file)
|
80
|
+
$:.unshift(dir) unless $:.include?(dir)
|
81
|
+
end
|
82
|
+
|
83
|
+
def pwd *args
|
84
|
+
File.join(Dir.pwd, *args.map!(&:to_s))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
require 'tiramisu/util/assert_raise'
|
89
|
+
require 'tiramisu/util/refute_raise'
|
90
|
+
require 'tiramisu/util/assert_throw'
|
91
|
+
require 'tiramisu/util/refute_throw'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Tiramisu
|
2
|
+
|
3
|
+
def assert_raised_as_expected object, expected_type = nil, expected_message = nil, block = nil
|
4
|
+
f = assert_raised(object)
|
5
|
+
return f if f
|
6
|
+
|
7
|
+
return assert_raised_as_expected_by_block(object, block) if block
|
8
|
+
|
9
|
+
if expected_type
|
10
|
+
f = assert_raised_expected_type(object, expected_type)
|
11
|
+
return f if f
|
12
|
+
end
|
13
|
+
|
14
|
+
if expected_message
|
15
|
+
f = assert_raised_expected_message(object, expected_message)
|
16
|
+
return f if f
|
17
|
+
end
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def assert_raised object
|
22
|
+
return [
|
23
|
+
'Expected a exception to be raised at %s' % object[:caller]
|
24
|
+
] unless object[:raised]
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def assert_raised_as_expected_by_block object, block
|
29
|
+
return [
|
30
|
+
'Looks like wrong or no error raised at %s' % object[:caller],
|
31
|
+
'See validation block'
|
32
|
+
] unless block.call(object[:raised])
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def assert_raised_expected_type object, expected_type
|
37
|
+
return [
|
38
|
+
'Expected a %s to be raised at %s' % [expected_type, object[:caller]],
|
39
|
+
'Instead a %s raised' % object[:raised].class
|
40
|
+
] unless object[:raised].class == expected_type
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def assert_raised_expected_message object, expected_message
|
45
|
+
regexp = expected_message.is_a?(Regexp) ? expected_message : /\A#{expected_message}\z/
|
46
|
+
return [
|
47
|
+
'Expected the exception raised at %s' % object[:caller],
|
48
|
+
'to match "%s"' % regexp.source,
|
49
|
+
'Instead it looks like',
|
50
|
+
pp(object[:raised].message)
|
51
|
+
] unless object[:raised].message =~ regexp
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Tiramisu
|
2
|
+
|
3
|
+
def assert_thrown_as_expected object, expected_symbol = nil, block = nil
|
4
|
+
f = assert_thrown(object)
|
5
|
+
return f if f
|
6
|
+
|
7
|
+
return assert_thrown_as_expected_by_block(object, block) if block
|
8
|
+
|
9
|
+
if expected_symbol
|
10
|
+
f = assert_expected_symbol_thrown(object, expected_symbol)
|
11
|
+
return f if f
|
12
|
+
end
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def assert_thrown_as_expected_by_block object, block
|
17
|
+
return [
|
18
|
+
'Looks like wrong or no symbol thrown at %s' % object[:caller],
|
19
|
+
'See validating block'
|
20
|
+
] unless block.call(object[:thrown])
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def assert_thrown object
|
25
|
+
return [
|
26
|
+
'Expected a symbol to be thrown at %s' % object[:caller]
|
27
|
+
] unless object[:thrown]
|
28
|
+
nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def assert_expected_symbol_thrown object, expected_symbol
|
32
|
+
return begin
|
33
|
+
[
|
34
|
+
'Expected :%s to be thrown at %s' % [expected_symbol, object[:caller]],
|
35
|
+
'Instead :%s thrown' % object[:thrown]
|
36
|
+
]
|
37
|
+
end unless expected_symbol == object[:thrown]
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Tiramisu
|
2
|
+
|
3
|
+
def refute_raised_as_expected object, expected_type, expected_message, block = nil
|
4
|
+
f = refute_raised(object, expected_type || expected_message)
|
5
|
+
return f if f
|
6
|
+
|
7
|
+
if expected_type
|
8
|
+
f = refute_raised_expected_type(object, expected_type)
|
9
|
+
return f if f
|
10
|
+
end
|
11
|
+
|
12
|
+
if expected_message
|
13
|
+
f = refute_raised_expected_message(object, expected_message)
|
14
|
+
return f if f
|
15
|
+
end
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def refute_raised object, should_raise = false
|
20
|
+
if should_raise
|
21
|
+
return [
|
22
|
+
'Expected a exception to be raised at %s' % object[:caller]
|
23
|
+
] unless object[:raised]
|
24
|
+
else
|
25
|
+
return [
|
26
|
+
'A unexpected exception raised at %s' % object[:caller],
|
27
|
+
object[:raised]
|
28
|
+
] if object[:raised]
|
29
|
+
end
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def refute_raised_expected_type object, expected_type
|
34
|
+
return [
|
35
|
+
'Not expected a %s to be raised at %s' % [object[:raised].class, object[:caller]],
|
36
|
+
] if object[:raised].class == expected_type
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def refute_raised_expected_message object, expected_message
|
41
|
+
regexp = expected_message.is_a?(Regexp) ? expected_message : /\A#{expected_message}\z/
|
42
|
+
return [
|
43
|
+
'Not expected raised exception to match %s' % regexp.source,
|
44
|
+
object[:raised]
|
45
|
+
] if object[:raised].message =~ regexp
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Tiramisu
|
2
|
+
|
3
|
+
def refute_thrown_as_expected object, expected_symbol, block = nil
|
4
|
+
f = refute_thrown(object, expected_symbol)
|
5
|
+
return f if f
|
6
|
+
|
7
|
+
if expected_symbol
|
8
|
+
f = refute_expected_symbol_thrown(object, expected_symbol)
|
9
|
+
return f if f
|
10
|
+
end
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def refute_thrown object, should_throw = false
|
15
|
+
if should_throw
|
16
|
+
return [
|
17
|
+
'Expected a symbol to be thrown at %s' % object[:caller]
|
18
|
+
] unless object[:thrown]
|
19
|
+
else
|
20
|
+
return [
|
21
|
+
'Not expected a symbol to be thrown at %s' % object[:caller]
|
22
|
+
] if object[:thrown]
|
23
|
+
end
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def refute_expected_symbol_thrown object, expected_symbol
|
28
|
+
return [
|
29
|
+
'Not expected :%s to be thrown' % expected_symbol,
|
30
|
+
'at %s' % object[:caller]
|
31
|
+
] if expected_symbol == object[:thrown]
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
end
|
data/test/assert_test.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
describe :assert do
|
2
|
+
|
3
|
+
it 'pass ==' do
|
4
|
+
x = mock(:==, :x)
|
5
|
+
x == :x
|
6
|
+
x.verify
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'pass ===' do
|
10
|
+
x = mock(:===, :x)
|
11
|
+
x === :x
|
12
|
+
x.verify
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'pass !=' do
|
16
|
+
x = mock(:!=, :x)
|
17
|
+
x != :x
|
18
|
+
x.verify
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'pass >' do
|
22
|
+
x = mock(:>, :x)
|
23
|
+
x > :x
|
24
|
+
x.verify
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'pass >=' do
|
28
|
+
x = mock(:>=, :x)
|
29
|
+
x >= :x
|
30
|
+
x.verify
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'pass <' do
|
34
|
+
x = mock(:<, :x)
|
35
|
+
x < :x
|
36
|
+
x.verify
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'pass <=' do
|
40
|
+
x = mock(:<=, :x)
|
41
|
+
x <= :x
|
42
|
+
x.verify
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'pass eql?' do
|
46
|
+
x = mock(:eql?, :x)
|
47
|
+
x.eql? :x
|
48
|
+
x.verify
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'pass equal?' do
|
52
|
+
x = mock(:equal?, :x)
|
53
|
+
x.equal? :x
|
54
|
+
x.verify
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'pass =~' do
|
58
|
+
x = mock(:=~, :x)
|
59
|
+
x =~ :x
|
60
|
+
x.verify
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'pass match' do
|
64
|
+
x = mock(:match, :x)
|
65
|
+
x.match :x
|
66
|
+
x.verify
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'pass any?' do
|
70
|
+
m = mock(:any?)
|
71
|
+
m.any?
|
72
|
+
m.verify
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'pass all?' do
|
76
|
+
x = mock(:all?, :x)
|
77
|
+
x.all? :x
|
78
|
+
x.verify
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'pass start_with?' do
|
82
|
+
x = mock(:start_with?, :x)
|
83
|
+
x.start_with? :x
|
84
|
+
x.verify
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'pass end_with?' do
|
88
|
+
x = mock(:end_with?, :x)
|
89
|
+
x.end_with? :x
|
90
|
+
x.verify
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'pass respond_to?' do
|
94
|
+
x = mock(:respond_to?, :__id__, true)
|
95
|
+
x.respond_to? :__id__, true
|
96
|
+
x.verify
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
describe :context_inheritance_test do
|
2
|
+
|
3
|
+
it 'inherits from parent spec' do
|
4
|
+
x = nil
|
5
|
+
spec rand do
|
6
|
+
define_method(:set_x) {x = true}
|
7
|
+
context rand do
|
8
|
+
allocate.send(:set_x)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
assert_equal true, x
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'inherits from parent context' do
|
15
|
+
x = nil
|
16
|
+
spec rand do
|
17
|
+
context rand do
|
18
|
+
define_method(:set_x) {x = true}
|
19
|
+
context rand do
|
20
|
+
allocate.send(:set_x)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
assert_equal true, x
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'inherits from parent spec through parent context' do
|
28
|
+
x = nil
|
29
|
+
spec rand do
|
30
|
+
define_method(:set_x) {x = true}
|
31
|
+
context rand do
|
32
|
+
context rand do
|
33
|
+
allocate.send(:set_x)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
assert_equal true, x
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'does not inherit tests' do
|
41
|
+
spec_tests, context_tests = nil
|
42
|
+
spec rand do
|
43
|
+
test(:x) {}
|
44
|
+
context rand do
|
45
|
+
context_tests = tests.size
|
46
|
+
end
|
47
|
+
spec_tests = tests.size
|
48
|
+
end
|
49
|
+
assert_equal 1, spec_tests
|
50
|
+
assert_equal 0, context_tests
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'does not inherit hooks' do
|
54
|
+
spec_hooks, context_hooks = nil
|
55
|
+
spec rand do
|
56
|
+
before {}
|
57
|
+
context rand do
|
58
|
+
context_hooks = hooks[:before].size
|
59
|
+
end
|
60
|
+
spec_hooks = hooks[:before].size
|
61
|
+
end
|
62
|
+
assert_equal 1, spec_hooks
|
63
|
+
assert_equal 0, context_hooks
|
64
|
+
end
|
65
|
+
end
|
data/test/hooks_test.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
describe :hooks do
|
2
|
+
it 'calls wildcard hooks' do
|
3
|
+
called = 0
|
4
|
+
spec rand do
|
5
|
+
before {called += 1}
|
6
|
+
test(:a) {}
|
7
|
+
test(:b) {}
|
8
|
+
run(:a)
|
9
|
+
run(:b)
|
10
|
+
end
|
11
|
+
assert_equal 2, called
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'calls named hooks' do
|
15
|
+
called = 0
|
16
|
+
spec rand do
|
17
|
+
after(:b) {called += 1}
|
18
|
+
test(:a) {}
|
19
|
+
test(:b) {}
|
20
|
+
run(:a)
|
21
|
+
run(:b)
|
22
|
+
end
|
23
|
+
assert_equal 1, called
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'prefers named hooks over wildcard ones' do
|
27
|
+
called = nil
|
28
|
+
spec rand do
|
29
|
+
around(:a) {called = :named}
|
30
|
+
around {called = :wildcard}
|
31
|
+
test(:a) {}
|
32
|
+
run(:a)
|
33
|
+
end
|
34
|
+
assert_equal :named, called
|
35
|
+
end
|
36
|
+
end
|