pretty_test 0.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.
- data/.gitignore +17 -0
- data/Gemfile +2 -0
- data/lib/pretty_test/mini_test.rb +128 -0
- data/lib/pretty_test/version.rb +3 -0
- data/lib/pretty_test.rb +2 -0
- data/pretty_test.gemspec +17 -0
- metadata +51 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
class MiniTest::Unit
|
2
|
+
|
3
|
+
STATUS_FORMAT = "\e[?7l\e[1m\e[37m(%.1fs) \e[32m%d/%d tests\e[37m, \e[36m%d assertions\e[37m, \e[31m%d errors\e[37m, \e[31m%d failures\e[37m, \e[33m%d skips \e[37m%s\e[?7h\e[0m"
|
4
|
+
|
5
|
+
def run(args = [])
|
6
|
+
options = process_args args
|
7
|
+
|
8
|
+
@verbose = options[:verbose]
|
9
|
+
|
10
|
+
filter = options[:filter] || '/./'
|
11
|
+
filter = Regexp.new $1 if filter and filter =~ /\/(.*)\//
|
12
|
+
|
13
|
+
seed = options[:seed]
|
14
|
+
unless seed then
|
15
|
+
srand
|
16
|
+
seed = srand % 0xFFFF
|
17
|
+
end
|
18
|
+
|
19
|
+
srand seed
|
20
|
+
|
21
|
+
@@out.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted"
|
22
|
+
|
23
|
+
@started_at = Time.now
|
24
|
+
run_test_suites filter
|
25
|
+
|
26
|
+
help = ["--seed", seed]
|
27
|
+
help.push "--verbose" if @verbose
|
28
|
+
help.push("--name", options[:filter].inspect) if options[:filter]
|
29
|
+
|
30
|
+
@@out.puts "\n\nTest run options: #{help.join(" ")}\n"
|
31
|
+
|
32
|
+
failures + errors if @test_count > 0
|
33
|
+
rescue Interrupt
|
34
|
+
abort "Interrupted"
|
35
|
+
end
|
36
|
+
|
37
|
+
def run_test_suites(filter = /./)
|
38
|
+
@test_count, @assertion_count = 0, 0
|
39
|
+
old_sync, @@out.sync = @@out.sync, true if @@out.respond_to? :sync=
|
40
|
+
tests = {}
|
41
|
+
TestCase.test_suites.each do |suite|
|
42
|
+
suite_name = suite.name.split("::").map { |token|
|
43
|
+
token =~ /^(test)?(.*?)(test)?$/i && $2.underscore.humanize
|
44
|
+
}.join(" ")
|
45
|
+
suite.test_methods.grep(filter).each do |test|
|
46
|
+
test_name = test =~ /^(test_)?(.*)$/ && $2.underscore.humanize.downcase
|
47
|
+
tests["#{suite_name}: #{test_name}"] = [suite, test]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
@test_count = tests.size
|
51
|
+
tests.keys.each_with_index do |name, index|
|
52
|
+
update_status(index, name)
|
53
|
+
suite, test = tests[name]
|
54
|
+
inst = suite.new(test)
|
55
|
+
inst._assertions = 0
|
56
|
+
klass, method, error = inst.run(self)
|
57
|
+
@assertion_count += inst._assertions
|
58
|
+
remove_status
|
59
|
+
print_error(klass, method, error) if error
|
60
|
+
end
|
61
|
+
update_status(@test_count)
|
62
|
+
@@out.sync = old_sync if @@out.respond_to? :sync=
|
63
|
+
[@test_count, @assertion_count]
|
64
|
+
end
|
65
|
+
|
66
|
+
def puke(klass, method, error)
|
67
|
+
[klass, method, error]
|
68
|
+
end
|
69
|
+
|
70
|
+
def print_error(klass, method, error)
|
71
|
+
report = case error
|
72
|
+
when MiniTest::Skip then
|
73
|
+
@skips += 1
|
74
|
+
"\e[30m\e[43m[SKIPPED] #{pretty_test_name(klass, method)}\e[0m\n#{pretty_location(error)}\n\e[31m#{error.message}\e[0m"
|
75
|
+
when MiniTest::Assertion then
|
76
|
+
@failures += 1
|
77
|
+
"\e[37m\e[41m\e[1m[FAILURE] #{pretty_test_name(klass, method)}\e[0m\n#{pretty_location(error)}\n#{error.message}"
|
78
|
+
else
|
79
|
+
@errors += 1
|
80
|
+
"\e[37m\e[41m\e[1m[ERROR] #{pretty_test_name(klass, method)}\e[0m\n#{pretty_trace(error)}"
|
81
|
+
end
|
82
|
+
@@out.puts "#{report}\n\n"
|
83
|
+
end
|
84
|
+
|
85
|
+
def pretty_test_name(klass, test)
|
86
|
+
suite_name = klass.name.split("::").map { |token|
|
87
|
+
token =~ /^(test)?(.*?)(test)?$/i && $2.underscore.humanize
|
88
|
+
}.join(" ")
|
89
|
+
test_name = test =~ /^(test_)?(.*)$/i && $2.underscore.humanize.downcase
|
90
|
+
"#{suite_name}: #{test_name}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def pretty_location(error)
|
94
|
+
location = error.backtrace.detect do |line|
|
95
|
+
line =~ %r{^#{Dir.pwd}/}
|
96
|
+
end
|
97
|
+
clean_trace_line("\e[1m-> ", location)
|
98
|
+
end
|
99
|
+
|
100
|
+
def pretty_trace(error)
|
101
|
+
location = error.backtrace.detect do |line|
|
102
|
+
line =~ %r{^#{Dir.pwd}/}
|
103
|
+
end
|
104
|
+
trace = error.backtrace.map do |line|
|
105
|
+
prefix = line == location ? "\e[1m-> " : " "
|
106
|
+
clean_trace_line(prefix, line)
|
107
|
+
end
|
108
|
+
"\e[31m#{error.class}: #{error.message}\e[0m\n#{trace.join("\n")}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def clean_trace_line(prefix, line)
|
112
|
+
case line
|
113
|
+
when %r{^#{Dir.pwd}/(.+?)/(.+)$} then "\e[37m#{prefix}[#{$1}] #{$2}\e[0m"
|
114
|
+
when %r{^.*/gems/(.+?)/(.+)$} then "\e[36m#{prefix}[#{$1}] #{$2}\e[0m"
|
115
|
+
when %r{^.*/rubies/(.+?)/(.+)$} then "\e[35m#{prefix}[#{$1}] #{$2}\e[0m"
|
116
|
+
else "#{prefix}#{line}"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def update_status(index, test_name = nil)
|
121
|
+
status = STATUS_FORMAT % [Time.now - @started_at, index, @test_count, @assertion_count, @errors, @failures, @skips, test_name]
|
122
|
+
@@out.print status
|
123
|
+
end
|
124
|
+
|
125
|
+
def remove_status
|
126
|
+
@@out.print "\e[2K\r"
|
127
|
+
end
|
128
|
+
end
|
data/lib/pretty_test.rb
ADDED
data/pretty_test.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path("../lib/pretty_test/version", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Vladimir Bobes Tuzinsky"]
|
6
|
+
gem.email = ["vladimir@tuzinsky.com"]
|
7
|
+
gem.summary = %q{Minitest patch for pretty output}
|
8
|
+
gem.description = %q{Minitest patch for pretty output.}
|
9
|
+
gem.homepage = "http://github.com/bobes/pretty_test"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "pretty_test"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = PrettyTest::VERSION
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pretty_test
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Vladimir Bobes Tuzinsky
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-10-08 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Minitest patch for pretty output.
|
15
|
+
email:
|
16
|
+
- vladimir@tuzinsky.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- lib/pretty_test.rb
|
24
|
+
- lib/pretty_test/mini_test.rb
|
25
|
+
- lib/pretty_test/version.rb
|
26
|
+
- pretty_test.gemspec
|
27
|
+
homepage: http://github.com/bobes/pretty_test
|
28
|
+
licenses: []
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
requirements: []
|
46
|
+
rubyforge_project:
|
47
|
+
rubygems_version: 1.8.10
|
48
|
+
signing_key:
|
49
|
+
specification_version: 3
|
50
|
+
summary: Minitest patch for pretty output
|
51
|
+
test_files: []
|