uspec 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/example_specs/spec_helper.rb +0 -7
- data/lib/uspec/cli.rb +1 -27
- data/lib/uspec/harness.rb +35 -3
- data/lib/uspec/result.rb +50 -8
- data/lib/uspec/spec.rb +1 -0
- data/lib/uspec/version.rb +1 -1
- data/lib/uspec.rb +9 -5
- data/uspec/result_spec.rb +49 -8
- data/uspec/stats_spec.rb +8 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14e2539758227d31271ce1e3cf534b0edb491cb685f62ab7c16a7fbc711caf88
|
4
|
+
data.tar.gz: 638daabf4483e4ca6a34b480030f896078dd49bb4286afee24830f3395ed3563
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22747fc9d720163116d69d3f8fa8ba7ad15df46f37dcc3138b93b1eab3a07f1fe765a01b8a1d6ef7ec3cb094c60adbefa39813098841d50a23b62291ac4b9116
|
7
|
+
data.tar.gz: ca54684feb09cdd6b4fc4370b0dc492fd13dfb20ef32c5255329b7a7744ca1b799fce6afc7f8fa039f5658b473334ee06124b908d5a8f113f8a6c035efbcb7a2
|
data/lib/uspec/cli.rb
CHANGED
@@ -74,36 +74,10 @@ class Uspec::CLI
|
|
74
74
|
end
|
75
75
|
elsif path.exist? then
|
76
76
|
puts "#{path.basename path.extname}:"
|
77
|
-
harness.
|
77
|
+
harness.file_eval path
|
78
78
|
else
|
79
79
|
warn "path not found: #{path}"
|
80
80
|
end
|
81
|
-
rescue Exception => error
|
82
|
-
|
83
|
-
if SignalException === error || SystemExit === error then
|
84
|
-
exit 3
|
85
|
-
end
|
86
|
-
|
87
|
-
error_file, error_line, _ = error.backtrace.first.split ?:
|
88
|
-
|
89
|
-
message = <<-MSG
|
90
|
-
#{error.class} : #{error.message}
|
91
|
-
|
92
|
-
Uspec encountered an error when loading a test file.
|
93
|
-
This is probably a typo in the test file or the file it is testing.
|
94
|
-
|
95
|
-
If you think this is a bug in Uspec please report it: https://github.com/acook/uspec/issues/new
|
96
|
-
|
97
|
-
Error occured when loading test file `#{spec || path}`.
|
98
|
-
The origin of the error may be in file `#{error_file}` on line ##{error_line}.
|
99
|
-
|
100
|
-
\t#{error.backtrace[0,3].join "\n\t"}
|
101
|
-
MSG
|
102
|
-
puts
|
103
|
-
warn message
|
104
|
-
stats << Uspec::Result.new(message, error, caller)
|
105
|
-
|
106
|
-
handle_interrupt! error
|
107
81
|
end
|
108
82
|
|
109
83
|
end
|
data/lib/uspec/harness.rb
CHANGED
@@ -14,21 +14,53 @@ module Uspec
|
|
14
14
|
cli.stats
|
15
15
|
end
|
16
16
|
|
17
|
+
def file_eval path
|
18
|
+
define.instance_eval(path.read, path.to_s)
|
19
|
+
rescue Exception => error
|
20
|
+
if SignalException === error || SystemExit === error then
|
21
|
+
exit 3
|
22
|
+
end
|
23
|
+
|
24
|
+
error_file, error_line, _ = error.backtrace.first.split ?:
|
25
|
+
|
26
|
+
message = <<-MSG
|
27
|
+
#{error.class} : #{error.message}
|
28
|
+
|
29
|
+
Uspec encountered an error when loading a test file.
|
30
|
+
This is probably a typo in the test file or the file it is testing.
|
31
|
+
|
32
|
+
If you think this is a bug in Uspec please report it: https://github.com/acook/uspec/issues/new
|
33
|
+
|
34
|
+
Error occured when loading test file `#{spec || path}`.
|
35
|
+
The origin of the error may be in file `#{error_file}` on line ##{error_line}.
|
36
|
+
|
37
|
+
\t#{error.backtrace[0,3].join "\n\t"}
|
38
|
+
MSG
|
39
|
+
puts
|
40
|
+
warn message
|
41
|
+
stats << Uspec::Result.new(message, error, true)
|
42
|
+
|
43
|
+
cli.handle_interrupt! error
|
44
|
+
end
|
45
|
+
|
17
46
|
def spec_eval description, &block
|
47
|
+
ex = nil
|
18
48
|
state = 0
|
19
49
|
print ' -- ', description
|
20
50
|
|
21
51
|
if block then
|
22
52
|
begin
|
23
53
|
state = 1
|
24
|
-
|
54
|
+
spec = Uspec::Spec.new(self, description, &block)
|
55
|
+
raw_result = spec.__uspec_block
|
25
56
|
state = 2
|
26
57
|
rescue Exception => raw_result
|
27
58
|
state = 3
|
59
|
+
ex = true
|
28
60
|
end
|
29
61
|
end
|
30
62
|
|
31
|
-
result = Uspec::Result.new
|
63
|
+
result = Uspec::Result.new spec, raw_result, ex
|
32
64
|
|
33
65
|
unless block then
|
34
66
|
state = 4
|
@@ -49,7 +81,7 @@ module Uspec
|
|
49
81
|
MSG
|
50
82
|
puts
|
51
83
|
warn message
|
52
|
-
stats << Uspec::Result.new(message, error,
|
84
|
+
stats << Uspec::Result.new(message, error, true)
|
53
85
|
ensure
|
54
86
|
cli.handle_interrupt! result.raw
|
55
87
|
return [state, error, result, raw_result]
|
data/lib/uspec/result.rb
CHANGED
@@ -6,14 +6,17 @@ module Uspec
|
|
6
6
|
include Terminal
|
7
7
|
|
8
8
|
PREFIX = "#{Uspec::Terminal.newline}#{Uspec::Terminal.yellow}>\t#{Uspec::Terminal.normal}"
|
9
|
+
TRACE_EXCLUDE_PATTERN = /#{Uspec.libpath.join 'lib'}|#{Uspec.libpath.join 'bin'}/
|
9
10
|
|
10
|
-
def initialize spec, raw,
|
11
|
+
def initialize spec, raw, ex
|
11
12
|
@spec = spec
|
12
13
|
@raw = raw
|
13
|
-
@
|
14
|
+
@ex = ex
|
14
15
|
@handler = ::TOISB.wrap raw
|
16
|
+
@full_backtrace = false
|
17
|
+
@caller = caller
|
15
18
|
end
|
16
|
-
attr_reader :spec, :raw, :
|
19
|
+
attr_reader :spec, :raw, :ex, :handler, :full_backtrace
|
17
20
|
|
18
21
|
def pretty
|
19
22
|
if raw == true then
|
@@ -22,7 +25,7 @@ module Uspec
|
|
22
25
|
red raw
|
23
26
|
elsif pending? then
|
24
27
|
yellow 'pending'
|
25
|
-
elsif
|
28
|
+
elsif ex == true then
|
26
29
|
[
|
27
30
|
red('Exception'), vspace,
|
28
31
|
hspace, 'Spec encountered an Exception ', newline,
|
@@ -41,8 +44,32 @@ module Uspec
|
|
41
44
|
end
|
42
45
|
|
43
46
|
def trace
|
44
|
-
raw.backtrace
|
47
|
+
@backtrace ||= indent_bt clean_bt(raw.backtrace, !full_backtrace)
|
48
|
+
end
|
49
|
+
|
50
|
+
def source
|
51
|
+
@source ||= clean_bt @caller
|
52
|
+
end
|
53
|
+
|
54
|
+
def indent_bt bt
|
55
|
+
bt.inject(String.new) do |text, line|
|
45
56
|
text << "#{hspace}#{line}#{newline}"
|
57
|
+
end if bt
|
58
|
+
end
|
59
|
+
|
60
|
+
def clean_bt bt, skip_internal = true
|
61
|
+
bt.inject(Array.new) do |t, line|
|
62
|
+
next t if skip_internal && line.match(TRACE_EXCLUDE_PATTERN)
|
63
|
+
t << rewrite_bt_caller(line)
|
64
|
+
end if bt
|
65
|
+
end
|
66
|
+
|
67
|
+
def rewrite_bt_caller line
|
68
|
+
return line if full_backtrace
|
69
|
+
if line.match TRACE_EXCLUDE_PATTERN then
|
70
|
+
line
|
71
|
+
else
|
72
|
+
line.sub /file_eval/, 'spec_block'
|
46
73
|
end
|
47
74
|
end
|
48
75
|
|
@@ -54,14 +81,29 @@ module Uspec
|
|
54
81
|
"#{handler.subklassinfo}: "
|
55
82
|
end
|
56
83
|
|
84
|
+
def desc
|
85
|
+
if String === spec then
|
86
|
+
spec
|
87
|
+
elsif Uspec::Spec === spec then
|
88
|
+
spec.instance_variable_get :@__uspec_description
|
89
|
+
else
|
90
|
+
spec.inspect
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
57
94
|
# Attempts to inspect an object
|
58
95
|
def inspector
|
59
96
|
if String === raw && raw.include?(?\n) then
|
60
97
|
# if object is a multiline string, display it unescaped
|
61
|
-
|
62
98
|
[
|
63
99
|
raw.split(newline).unshift(newline).join(PREFIX), normal, newline,
|
64
100
|
].join
|
101
|
+
elsif Exception === raw then
|
102
|
+
[
|
103
|
+
raw.message, vspace,
|
104
|
+
white(trace),
|
105
|
+
normal, newline,
|
106
|
+
].join
|
65
107
|
else
|
66
108
|
handler.inspector!
|
67
109
|
end
|
@@ -82,7 +124,7 @@ module Uspec
|
|
82
124
|
|
83
125
|
If you think this is a bug in Uspec please report it: https://github.com/acook/uspec/issues/new
|
84
126
|
|
85
|
-
Error may have occured in test `#{
|
127
|
+
Error may have occured in test `#{desc}` in file `#{error_file}` on line ##{error_line}.
|
86
128
|
|
87
129
|
\t#{error.backtrace.join "\n\t"}
|
88
130
|
MSG
|
@@ -105,7 +147,7 @@ module Uspec
|
|
105
147
|
end
|
106
148
|
|
107
149
|
def inspect
|
108
|
-
"#{self.class} for `#{
|
150
|
+
"#{self.class} for `#{desc}` -> #{pretty}"
|
109
151
|
end
|
110
152
|
end
|
111
153
|
end
|
data/lib/uspec/spec.rb
CHANGED
data/lib/uspec/version.rb
CHANGED
data/lib/uspec.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
require_relative 'uspec/version'
|
2
|
-
require_relative 'uspec/harness'
|
3
|
-
require_relative 'uspec/define'
|
4
|
-
require_relative 'uspec/stats'
|
5
|
-
|
6
1
|
module Uspec
|
7
2
|
def self.included object
|
8
3
|
warn 'Use extend instead of include.'
|
@@ -15,4 +10,13 @@ module Uspec
|
|
15
10
|
# object.extend Uspec::DSL
|
16
11
|
#end
|
17
12
|
end
|
13
|
+
|
14
|
+
def self.libpath
|
15
|
+
Pathname.new(__FILE__).dirname.dirname
|
16
|
+
end
|
18
17
|
end
|
18
|
+
|
19
|
+
require_relative 'uspec/version'
|
20
|
+
require_relative 'uspec/harness'
|
21
|
+
require_relative 'uspec/define'
|
22
|
+
require_relative 'uspec/stats'
|
data/uspec/result_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require_relative "uspec_helper"
|
|
3
3
|
bo = BasicObject.new
|
4
4
|
|
5
5
|
spec "#pretty doesn't die when given a BasicObject" do
|
6
|
-
result = Uspec::Result.new "BasicObject Result", bo,
|
6
|
+
result = Uspec::Result.new "BasicObject Result", bo, nil
|
7
7
|
expected = "#<BasicObject:"
|
8
8
|
actual = result.pretty
|
9
9
|
actual.include?(expected) || actual
|
@@ -14,28 +14,28 @@ class ::TestObject < BasicObject; end
|
|
14
14
|
obj = TestObject.new
|
15
15
|
|
16
16
|
spec "ensure BasicObject subclass instances work" do
|
17
|
-
result = Uspec::Result.new "BasicObject Subclass Result", obj,
|
17
|
+
result = Uspec::Result.new "BasicObject Subclass Result", obj, nil
|
18
18
|
expected = "#<BasicObject/TestObject:"
|
19
19
|
actual = result.pretty
|
20
20
|
actual.include?(expected) || result.pretty
|
21
21
|
end
|
22
22
|
|
23
23
|
spec "display basic info about Object" do
|
24
|
-
result = Uspec::Result.new "Object Result", Object.new,
|
24
|
+
result = Uspec::Result.new "Object Result", Object.new, nil
|
25
25
|
expected = "Object < BasicObject: \e[0m#<Object:"
|
26
26
|
actual = result.pretty
|
27
27
|
actual.include?(expected) || result.pretty
|
28
28
|
end
|
29
29
|
|
30
30
|
spec "display basic info about Array" do
|
31
|
-
result = Uspec::Result.new "Array Result", [],
|
31
|
+
result = Uspec::Result.new "Array Result", [], nil
|
32
32
|
expected = "Array < Object"
|
33
33
|
actual = result.pretty
|
34
34
|
actual.include?(expected) || result.pretty
|
35
35
|
end
|
36
36
|
|
37
37
|
spec "display basic info about Array class" do
|
38
|
-
result = Uspec::Result.new "Array Class Result", Array,
|
38
|
+
result = Uspec::Result.new "Array Class Result", Array, nil
|
39
39
|
expected = "Class < Module: \e[0mArray Class"
|
40
40
|
actual = result.pretty
|
41
41
|
actual.include?(expected) || result.pretty
|
@@ -44,7 +44,7 @@ end
|
|
44
44
|
parent = [obj]
|
45
45
|
|
46
46
|
spec "ensure parent object of BasicObject subclasses get a useful error message" do
|
47
|
-
result = Uspec::Result.new "BasicObject Parent Result", parent,
|
47
|
+
result = Uspec::Result.new "BasicObject Parent Result", parent, nil
|
48
48
|
expected = "BasicObject and its subclasses"
|
49
49
|
actual = result.pretty
|
50
50
|
actual.include?(expected) || result.inspector
|
@@ -54,7 +54,7 @@ class ::InspectFail; def inspect; raise RuntimeError, "This error is intentional
|
|
54
54
|
inspect_fail = InspectFail.new
|
55
55
|
|
56
56
|
spec "display a useful error message when a user-defined inspect method fails" do
|
57
|
-
result = Uspec::Result.new "Inspect Fail Result", inspect_fail,
|
57
|
+
result = Uspec::Result.new "Inspect Fail Result", inspect_fail, nil
|
58
58
|
expected = "raises an exception"
|
59
59
|
actual = result.pretty
|
60
60
|
actual.include?(expected) || result.inspector
|
@@ -63,7 +63,48 @@ end
|
|
63
63
|
spec "display strings more like their actual contents" do
|
64
64
|
string = "this string:\nshould display \e\[42;2mproperly"
|
65
65
|
expected = /this string:\n.*should display \e\[42;2mproperly/
|
66
|
-
result = Uspec::Result.new "Inspect Fail Result", string,
|
66
|
+
result = Uspec::Result.new "Inspect Fail Result", string, nil
|
67
67
|
actual = result.pretty
|
68
68
|
actual.match?(expected) || result.inspector
|
69
69
|
end
|
70
|
+
|
71
|
+
def exception_value
|
72
|
+
raise "A test exception!"
|
73
|
+
rescue => err
|
74
|
+
return err
|
75
|
+
end
|
76
|
+
|
77
|
+
spec "handles exception values" do
|
78
|
+
result = Uspec::Result.new "Exception Value Result", exception_value, nil
|
79
|
+
expected = "RuntimeError < StandardError: \e[0mA test exception!"
|
80
|
+
actual = result.pretty
|
81
|
+
actual.include?(expected) || result.pretty
|
82
|
+
end
|
83
|
+
|
84
|
+
spec "handles exception values including backtraces" do
|
85
|
+
result = Uspec::Result.new "Exception Value Result", exception_value, nil
|
86
|
+
expected = "exception_value"
|
87
|
+
actual = result.pretty
|
88
|
+
actual.include?(expected) || result.pretty
|
89
|
+
end
|
90
|
+
|
91
|
+
spec "handles raised exceptions" do
|
92
|
+
result = Uspec::Result.new "Exception Raised Result", exception_value, true
|
93
|
+
expected = "RuntimeError < StandardError: \e[0mA test exception!"
|
94
|
+
actual = result.pretty
|
95
|
+
actual.include?(expected) || result.pretty
|
96
|
+
end
|
97
|
+
|
98
|
+
spec "handles raised exceptions without backtraces" do
|
99
|
+
result = Uspec::Result.new "Exception Raised Result", Exception.new, true
|
100
|
+
expected = "Exception < Object: \e[0mException"
|
101
|
+
actual = result.pretty
|
102
|
+
actual.include?(expected) || result.pretty
|
103
|
+
end
|
104
|
+
|
105
|
+
spec "doesn't show 'run' for spec file in stack trace" do
|
106
|
+
result = Uspec::Result.new "No Run Exception Trace Result", exception_value, true
|
107
|
+
expected = /uspec.*run/
|
108
|
+
actual = result.pretty
|
109
|
+
!actual.match?(expected) || result.pretty
|
110
|
+
end
|
data/uspec/stats_spec.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
require_relative 'uspec_helper'
|
2
2
|
|
3
|
+
def stats_object
|
4
|
+
Uspec::Stats.new
|
5
|
+
end
|
6
|
+
|
3
7
|
spec 'stats can be inspected' do
|
8
|
+
# this is a regression test
|
9
|
+
# the issue it covers occured because of a refactor where stats had a custom inspect method
|
10
|
+
# stats no longer has a custom inspect method, but this makes sure that nothing breaks
|
4
11
|
actual = @__uspec_harness.stats.inspect
|
5
12
|
actual.include?("failure") || actual
|
6
13
|
end
|
7
14
|
|
8
15
|
spec 'stats inspect does not have any stray whitespace' do
|
9
|
-
output =
|
16
|
+
output = stats_object.inspect
|
10
17
|
match = output.match /(.*(?: |\n))/m
|
11
18
|
match == nil || match
|
12
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony M. Cook
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: that_object_is_so_basic
|