rroonga 0.9.4-x86-mingw32 → 0.9.5-x86-mingw32
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/NEWS.ja.rdoc +29 -0
- data/NEWS.rdoc +29 -0
- data/Rakefile +6 -6
- data/ext/groonga/rb-grn-array.c +1 -1
- data/ext/groonga/rb-grn-context.c +15 -28
- data/ext/groonga/rb-grn-exception.c +46 -1
- data/ext/groonga/rb-grn-expression.c +22 -13
- data/ext/groonga/rb-grn-fix-size-column.c +2 -8
- data/ext/groonga/rb-grn-hash.c +8 -1
- data/ext/groonga/rb-grn-object.c +1 -1
- data/ext/groonga/rb-grn-patricia-trie.c +23 -1
- data/ext/groonga/rb-grn-table-key-support.c +22 -0
- data/ext/groonga/rb-grn-table.c +37 -5
- data/ext/groonga/rb-grn-utils.c +20 -2
- data/ext/groonga/rb-grn.h +1 -1
- data/ext/groonga/rb-groonga.c +76 -38
- data/extconf.rb +17 -1
- data/html/developer.html +32 -7
- data/html/footer.html.erb +5 -0
- data/html/heading-mark.svg +393 -0
- data/html/index.html +33 -3
- data/lib/1.8/groonga.so +0 -0
- data/lib/1.9/groonga.so +0 -0
- data/lib/groonga.rb +3 -7
- data/lib/groonga/context.rb +2 -13
- data/lib/groonga/expression-builder.rb +273 -67
- data/lib/groonga/pagination.rb +143 -0
- data/lib/groonga/record.rb +2 -0
- data/lib/groonga/schema.rb +140 -29
- data/pkg/rroonga-0.9.5/NEWS.ja.rdoc +156 -0
- data/pkg/rroonga-0.9.5/NEWS.rdoc +158 -0
- data/pkg/rroonga-0.9.5/README.ja.rdoc +65 -0
- data/pkg/rroonga-0.9.5/README.rdoc +66 -0
- data/pkg/rroonga-0.9.5/text/TUTORIAL.ja.rdoc +394 -0
- data/pkg/rroonga-0.9.5/text/expression.rdoc +285 -0
- data/rroonga-build.rb +2 -2
- data/test-unit/Rakefile +40 -0
- data/test-unit/TODO +5 -0
- data/test-unit/bin/testrb +5 -0
- data/test-unit/html/classic.html +15 -0
- data/test-unit/html/index.html +25 -0
- data/test-unit/html/index.html.ja +27 -0
- data/test-unit/lib/test/unit.rb +323 -0
- data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
- data/test-unit/lib/test/unit/assertions.rb +1230 -0
- data/test-unit/lib/test/unit/attribute.rb +125 -0
- data/test-unit/lib/test/unit/autorunner.rb +360 -0
- data/test-unit/lib/test/unit/collector.rb +36 -0
- data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
- data/test-unit/lib/test/unit/collector/dir.rb +108 -0
- data/test-unit/lib/test/unit/collector/load.rb +144 -0
- data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
- data/test-unit/lib/test/unit/color-scheme.rb +102 -0
- data/test-unit/lib/test/unit/color.rb +96 -0
- data/test-unit/lib/test/unit/diff.rb +724 -0
- data/test-unit/lib/test/unit/error.rb +130 -0
- data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
- data/test-unit/lib/test/unit/failure.rb +136 -0
- data/test-unit/lib/test/unit/fixture.rb +176 -0
- data/test-unit/lib/test/unit/notification.rb +129 -0
- data/test-unit/lib/test/unit/omission.rb +191 -0
- data/test-unit/lib/test/unit/pending.rb +150 -0
- data/test-unit/lib/test/unit/priority.rb +180 -0
- data/test-unit/lib/test/unit/runner/console.rb +52 -0
- data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
- data/test-unit/lib/test/unit/runner/tap.rb +8 -0
- data/test-unit/lib/test/unit/testcase.rb +476 -0
- data/test-unit/lib/test/unit/testresult.rb +89 -0
- data/test-unit/lib/test/unit/testsuite.rb +110 -0
- data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
- data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
- data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
- data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
- data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
- data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
- data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
- data/test-unit/lib/test/unit/util/observable.rb +90 -0
- data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
- data/test-unit/lib/test/unit/version.rb +7 -0
- data/test-unit/sample/adder.rb +13 -0
- data/test-unit/sample/subtracter.rb +12 -0
- data/test-unit/sample/test_adder.rb +20 -0
- data/test-unit/sample/test_subtracter.rb +20 -0
- data/test-unit/sample/test_user.rb +23 -0
- data/test-unit/test/collector/test-descendant.rb +133 -0
- data/test-unit/test/collector/test-load.rb +442 -0
- data/test-unit/test/collector/test_dir.rb +406 -0
- data/test-unit/test/collector/test_objectspace.rb +100 -0
- data/test-unit/test/run-test.rb +15 -0
- data/test-unit/test/test-attribute.rb +86 -0
- data/test-unit/test/test-color-scheme.rb +67 -0
- data/test-unit/test/test-color.rb +47 -0
- data/test-unit/test/test-diff.rb +518 -0
- data/test-unit/test/test-emacs-runner.rb +60 -0
- data/test-unit/test/test-fixture.rb +287 -0
- data/test-unit/test/test-notification.rb +33 -0
- data/test-unit/test/test-omission.rb +81 -0
- data/test-unit/test/test-pending.rb +70 -0
- data/test-unit/test/test-priority.rb +119 -0
- data/test-unit/test/test-testcase.rb +544 -0
- data/test-unit/test/test_assertions.rb +1151 -0
- data/test-unit/test/test_error.rb +26 -0
- data/test-unit/test/test_failure.rb +33 -0
- data/test-unit/test/test_testresult.rb +113 -0
- data/test-unit/test/test_testsuite.rb +129 -0
- data/test-unit/test/testunit-test-util.rb +14 -0
- data/test-unit/test/ui/test_testrunmediator.rb +20 -0
- data/test-unit/test/util/test-method-owner-finder.rb +38 -0
- data/test-unit/test/util/test_backtracefilter.rb +41 -0
- data/test-unit/test/util/test_observable.rb +102 -0
- data/test-unit/test/util/test_procwrapper.rb +36 -0
- data/test/groonga-test-utils.rb +3 -2
- data/test/run-test.rb +14 -2
- data/test/test-column.rb +7 -7
- data/test/test-context-select.rb +34 -11
- data/test/test-exception.rb +3 -0
- data/test/test-expression-builder.rb +11 -0
- data/test/test-expression.rb +3 -6
- data/test/test-gqtp.rb +3 -5
- data/test/test-pagination.rb +249 -0
- data/test/test-record.rb +36 -8
- data/test/test-remote.rb +11 -4
- data/test/test-schema-create-table.rb +251 -0
- data/test/test-schema.rb +4 -24
- data/test/test-table-offset-and-limit.rb +3 -5
- data/test/test-table-select-mecab.rb +80 -0
- data/test/test-table-select-weight.rb +104 -0
- data/test/test-table.rb +22 -4
- data/test/test-version.rb +1 -1
- data/text/TUTORIAL.ja.rdoc +2 -0
- data/text/expression.rdoc +1 -0
- data/vendor/local/bin/grntest.exe +0 -0
- data/vendor/local/bin/groonga.exe +0 -0
- data/vendor/local/bin/libgroonga-0.dll +0 -0
- data/vendor/local/include/{groonga.h → groonga/groonga.h} +93 -32
- data/vendor/local/lib/groonga/modules/functions/cast.dll +0 -0
- data/vendor/local/lib/groonga/modules/functions/cast.la +41 -0
- data/vendor/local/lib/pkgconfig/groonga.pc +12 -0
- data/vendor/local/share/groonga/admin_html/css/admin.css +104 -0
- data/vendor/local/share/groonga/admin_html/css/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
- data/vendor/local/share/groonga/admin_html/index.html +1355 -0
- data/vendor/local/share/groonga/admin_html/js/jquery-1.4.2.min.js +154 -0
- data/vendor/local/share/groonga/admin_html/js/jquery-ui-1.8.1.custom.min.js +756 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_cpu_load +47 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_cpu_time +57 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_disk +162 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_memory +51 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_n_records +110 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_query_performance +133 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_status +84 -0
- metadata +126 -36
@@ -0,0 +1,89 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Nathaniel Talbott.
|
3
|
+
# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
|
4
|
+
# License:: Ruby license.
|
5
|
+
|
6
|
+
require 'test/unit/util/observable'
|
7
|
+
require 'test/unit/failure'
|
8
|
+
require 'test/unit/error'
|
9
|
+
require 'test/unit/omission'
|
10
|
+
require 'test/unit/pending'
|
11
|
+
require 'test/unit/notification'
|
12
|
+
|
13
|
+
module Test
|
14
|
+
module Unit
|
15
|
+
module NullResultContainerInitializer
|
16
|
+
private
|
17
|
+
def initialize_containers
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Collects Test::Unit::Failure and Test::Unit::Error so that
|
22
|
+
# they can be displayed to the user. To this end, observers
|
23
|
+
# can be added to it, allowing the dynamic updating of, say, a
|
24
|
+
# UI.
|
25
|
+
class TestResult
|
26
|
+
include Util::Observable
|
27
|
+
include NullResultContainerInitializer
|
28
|
+
include TestResultFailureSupport
|
29
|
+
include TestResultErrorSupport
|
30
|
+
include TestResultPendingSupport
|
31
|
+
include TestResultOmissionSupport
|
32
|
+
include TestResultNotificationSupport
|
33
|
+
|
34
|
+
CHANGED = "CHANGED"
|
35
|
+
FAULT = "FAULT"
|
36
|
+
|
37
|
+
attr_reader :run_count, :assertion_count, :faults
|
38
|
+
|
39
|
+
# Constructs a new, empty TestResult.
|
40
|
+
def initialize
|
41
|
+
@run_count, @assertion_count = 0, 0
|
42
|
+
@summary_generators = []
|
43
|
+
@problem_checkers = []
|
44
|
+
@faults = []
|
45
|
+
initialize_containers
|
46
|
+
end
|
47
|
+
|
48
|
+
# Records a test run.
|
49
|
+
def add_run
|
50
|
+
@run_count += 1
|
51
|
+
notify_changed
|
52
|
+
end
|
53
|
+
|
54
|
+
# Records an individual assertion.
|
55
|
+
def add_assertion
|
56
|
+
@assertion_count += 1
|
57
|
+
notify_changed
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns a string contain the recorded runs, assertions,
|
61
|
+
# failures and errors in this TestResult.
|
62
|
+
def summary
|
63
|
+
["#{run_count} tests",
|
64
|
+
"#{assertion_count} assertions",
|
65
|
+
*@summary_generators.collect {|generator| send(generator)}].join(", ")
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_s
|
69
|
+
summary
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns whether or not this TestResult represents
|
73
|
+
# successful completion.
|
74
|
+
def passed?
|
75
|
+
@problem_checkers.all? {|checker| not send(checker)}
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
def notify_changed
|
80
|
+
notify_listeners(CHANGED, self)
|
81
|
+
end
|
82
|
+
|
83
|
+
def notify_fault(fault)
|
84
|
+
@faults << fault
|
85
|
+
notify_listeners(FAULT, fault)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Author:: Nathaniel Talbott.
|
4
|
+
# Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
|
5
|
+
# License:: Ruby license.
|
6
|
+
|
7
|
+
require 'test/unit/error'
|
8
|
+
|
9
|
+
module Test
|
10
|
+
module Unit
|
11
|
+
|
12
|
+
# A collection of tests which can be #run.
|
13
|
+
#
|
14
|
+
# Note: It is easy to confuse a TestSuite instance with
|
15
|
+
# something that has a static suite method; I know because _I_
|
16
|
+
# have trouble keeping them straight. Think of something that
|
17
|
+
# has a suite method as simply providing a way to get a
|
18
|
+
# meaningful TestSuite instance.
|
19
|
+
class TestSuite
|
20
|
+
attr_reader :name, :tests
|
21
|
+
|
22
|
+
STARTED = name + "::STARTED"
|
23
|
+
FINISHED = name + "::FINISHED"
|
24
|
+
|
25
|
+
# Creates a new TestSuite with the given name.
|
26
|
+
def initialize(name="Unnamed TestSuite", test_case=nil)
|
27
|
+
@name = name
|
28
|
+
@tests = []
|
29
|
+
@test_case = test_case
|
30
|
+
end
|
31
|
+
|
32
|
+
# Runs the tests and/or suites contained in this
|
33
|
+
# TestSuite.
|
34
|
+
def run(result, &progress_block)
|
35
|
+
yield(STARTED, name)
|
36
|
+
run_startup(result)
|
37
|
+
@tests.each do |test|
|
38
|
+
test.run(result, &progress_block)
|
39
|
+
end
|
40
|
+
run_shutdown(result)
|
41
|
+
yield(FINISHED, name)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Adds the test to the suite.
|
45
|
+
def <<(test)
|
46
|
+
@tests << test
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete(test)
|
51
|
+
@tests.delete(test)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Retuns the rolled up number of tests in this suite;
|
55
|
+
# i.e. if the suite contains other suites, it counts the
|
56
|
+
# tests within those suites, not the suites themselves.
|
57
|
+
def size
|
58
|
+
total_size = 0
|
59
|
+
@tests.each { |test| total_size += test.size }
|
60
|
+
total_size
|
61
|
+
end
|
62
|
+
|
63
|
+
def empty?
|
64
|
+
tests.empty?
|
65
|
+
end
|
66
|
+
|
67
|
+
# Overridden to return the name given the suite at
|
68
|
+
# creation.
|
69
|
+
def to_s
|
70
|
+
@name
|
71
|
+
end
|
72
|
+
|
73
|
+
# It's handy to be able to compare TestSuite instances.
|
74
|
+
def ==(other)
|
75
|
+
return false unless(other.kind_of?(self.class))
|
76
|
+
return false unless(@name == other.name)
|
77
|
+
@tests == other.tests
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
def run_startup(result)
|
82
|
+
return if @test_case.nil? or !@test_case.respond_to?(:startup)
|
83
|
+
begin
|
84
|
+
@test_case.startup
|
85
|
+
rescue Exception
|
86
|
+
raise unless handle_exception($!, result)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def run_shutdown(result)
|
91
|
+
return if @test_case.nil? or !@test_case.respond_to?(:shutdown)
|
92
|
+
begin
|
93
|
+
@test_case.shutdown
|
94
|
+
rescue Exception
|
95
|
+
raise unless handle_exception($!, result)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def handle_exception(exception, result)
|
100
|
+
case exception
|
101
|
+
when *ErrorHandler::PASS_THROUGH_EXCEPTIONS
|
102
|
+
false
|
103
|
+
else
|
104
|
+
result.add_error(Error.new(@test_case.name, exception))
|
105
|
+
true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,466 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Author:: Nathaniel Talbott.
|
4
|
+
# Copyright::
|
5
|
+
# * Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
|
6
|
+
# * Copyright (c) 2008-2009 Kouhei Sutou <kou@clear-code.com>
|
7
|
+
# License:: Ruby license.
|
8
|
+
|
9
|
+
require 'test/unit/color-scheme'
|
10
|
+
require 'test/unit/ui/testrunner'
|
11
|
+
require 'test/unit/ui/testrunnermediator'
|
12
|
+
require 'test/unit/ui/console/outputlevel'
|
13
|
+
|
14
|
+
module Test
|
15
|
+
module Unit
|
16
|
+
module UI
|
17
|
+
module Console
|
18
|
+
|
19
|
+
# Runs a Test::Unit::TestSuite on the console.
|
20
|
+
class TestRunner < UI::TestRunner
|
21
|
+
include OutputLevel
|
22
|
+
|
23
|
+
# Creates a new TestRunner for running the passed
|
24
|
+
# suite. If quiet_mode is true, the output while
|
25
|
+
# running is limited to progress dots, errors and
|
26
|
+
# failures, and the final result. io specifies
|
27
|
+
# where runner output should go to; defaults to
|
28
|
+
# STDOUT.
|
29
|
+
def initialize(suite, options={})
|
30
|
+
super
|
31
|
+
@output_level = @options[:output_level] || NORMAL
|
32
|
+
@output = @options[:output] || STDOUT
|
33
|
+
@use_color = @options[:use_color]
|
34
|
+
@use_color = guess_color_availability if @use_color.nil?
|
35
|
+
@color_scheme = @options[:color_scheme] || ColorScheme.default
|
36
|
+
@reset_color = Color.new("reset")
|
37
|
+
@progress_row = 0
|
38
|
+
@progress_row_max = @options[:progress_row_max]
|
39
|
+
@progress_row_max ||= guess_progress_row_max
|
40
|
+
@already_outputted = false
|
41
|
+
@n_successes = 0
|
42
|
+
@n_omissions = 0
|
43
|
+
@indent = 0
|
44
|
+
@top_level = true
|
45
|
+
@faults = []
|
46
|
+
end
|
47
|
+
|
48
|
+
# Begins the test run.
|
49
|
+
def start
|
50
|
+
setup_mediator
|
51
|
+
attach_to_mediator
|
52
|
+
return start_mediator
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def setup_mediator
|
57
|
+
@mediator = create_mediator(@suite)
|
58
|
+
output_setup_end
|
59
|
+
end
|
60
|
+
|
61
|
+
def output_setup_end
|
62
|
+
suite_name = @suite.to_s
|
63
|
+
suite_name = @suite.name if @suite.kind_of?(Module)
|
64
|
+
output("Loaded suite #{suite_name}")
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_mediator(suite)
|
68
|
+
return TestRunnerMediator.new(suite)
|
69
|
+
end
|
70
|
+
|
71
|
+
def attach_to_mediator
|
72
|
+
@mediator.add_listener(TestResult::FAULT, &method(:add_fault))
|
73
|
+
@mediator.add_listener(TestRunnerMediator::STARTED, &method(:started))
|
74
|
+
@mediator.add_listener(TestRunnerMediator::FINISHED, &method(:finished))
|
75
|
+
@mediator.add_listener(TestCase::STARTED, &method(:test_started))
|
76
|
+
@mediator.add_listener(TestCase::FINISHED, &method(:test_finished))
|
77
|
+
@mediator.add_listener(TestSuite::STARTED, &method(:test_suite_started))
|
78
|
+
@mediator.add_listener(TestSuite::FINISHED, &method(:test_suite_finished))
|
79
|
+
end
|
80
|
+
|
81
|
+
def start_mediator
|
82
|
+
return @mediator.run_suite
|
83
|
+
end
|
84
|
+
|
85
|
+
def add_fault(fault)
|
86
|
+
@faults << fault
|
87
|
+
output_progress(fault.single_character_display, fault_color(fault))
|
88
|
+
@n_omissions += 1 if fault.is_a?(Omission)
|
89
|
+
@already_outputted = true if fault.critical?
|
90
|
+
end
|
91
|
+
|
92
|
+
def started(result)
|
93
|
+
@result = result
|
94
|
+
output_started
|
95
|
+
end
|
96
|
+
|
97
|
+
def output_started
|
98
|
+
output("Started")
|
99
|
+
end
|
100
|
+
|
101
|
+
def finished(elapsed_time)
|
102
|
+
nl if output?(NORMAL) and !output?(VERBOSE)
|
103
|
+
@faults.each_with_index do |fault, index|
|
104
|
+
nl
|
105
|
+
output_single("%3d) " % (index + 1))
|
106
|
+
output_fault(fault)
|
107
|
+
end
|
108
|
+
nl
|
109
|
+
output("Finished in #{elapsed_time} seconds.")
|
110
|
+
nl
|
111
|
+
output(@result, result_color)
|
112
|
+
n_tests = @result.run_count - @n_omissions
|
113
|
+
if n_tests.zero?
|
114
|
+
pass_percentage = 0
|
115
|
+
else
|
116
|
+
pass_percentage = 100.0 * (@n_successes / n_tests.to_f)
|
117
|
+
end
|
118
|
+
output("%g%% passed" % pass_percentage, result_color)
|
119
|
+
end
|
120
|
+
|
121
|
+
def output_fault(fault)
|
122
|
+
if @use_color and fault.is_a?(Failure) and
|
123
|
+
fault.inspected_expected and fault.inspected_actual
|
124
|
+
output_single(fault.label, fault_color(fault))
|
125
|
+
output(":")
|
126
|
+
output_fault_backtrace(fault)
|
127
|
+
output_fault_message(fault)
|
128
|
+
else
|
129
|
+
label, detail = format_fault(fault).split(/\r?\n/, 2)
|
130
|
+
output(label, fault_color(fault))
|
131
|
+
output(detail)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def output_fault_backtrace(fault)
|
136
|
+
backtrace = fault.location
|
137
|
+
if backtrace.size == 1
|
138
|
+
output(fault.test_name +
|
139
|
+
backtrace[0].sub(/\A(.+:\d+).*/, ' [\\1]') +
|
140
|
+
":")
|
141
|
+
else
|
142
|
+
output(fault.test_name)
|
143
|
+
backtrace.each_with_index do |entry, i|
|
144
|
+
if i.zero?
|
145
|
+
prefix = "["
|
146
|
+
postfix = ""
|
147
|
+
elsif i == backtrace.size - 1
|
148
|
+
prefix = " "
|
149
|
+
postfix = "]:"
|
150
|
+
else
|
151
|
+
prefix = " "
|
152
|
+
postfix = ""
|
153
|
+
end
|
154
|
+
output(" #{prefix}#{entry}#{postfix}")
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def output_fault_message(fault)
|
160
|
+
output(fault.user_message) if fault.user_message
|
161
|
+
output_single("<")
|
162
|
+
output_single(fault.inspected_expected, color("success"))
|
163
|
+
output("> expected but was")
|
164
|
+
output_single("<")
|
165
|
+
output_single(fault.inspected_actual, color("failure"))
|
166
|
+
output(">")
|
167
|
+
from, to = prepare_for_diff(fault.expected, fault.actual)
|
168
|
+
if from and to
|
169
|
+
differ = ColorizedReadableDiffer.new(from.split(/\r?\n/),
|
170
|
+
to.split(/\r?\n/),
|
171
|
+
self)
|
172
|
+
if differ.need_diff?
|
173
|
+
output("")
|
174
|
+
output("diff:")
|
175
|
+
differ.diff
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def format_fault(fault)
|
181
|
+
fault.long_display
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_started(name)
|
185
|
+
return unless output?(VERBOSE)
|
186
|
+
|
187
|
+
name = name.sub(/\(.+?\)\z/, '')
|
188
|
+
right_space = 8 * 2
|
189
|
+
left_space = @progress_row_max - right_space
|
190
|
+
left_space = left_space - indent.size - name.size
|
191
|
+
tab_stop = "\t" * ([left_space - 1, 0].max / 8)
|
192
|
+
output_single("#{indent}#{name}:#{tab_stop}", nil, VERBOSE)
|
193
|
+
@test_start = Time.now
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_finished(name)
|
197
|
+
unless @already_outputted
|
198
|
+
@n_successes += 1
|
199
|
+
output_progress(".", color("success"))
|
200
|
+
end
|
201
|
+
@already_outputted = false
|
202
|
+
|
203
|
+
return unless output?(VERBOSE)
|
204
|
+
|
205
|
+
output(": (%f)" % (Time.now - @test_start), nil, VERBOSE)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_suite_started(name)
|
209
|
+
if @top_level
|
210
|
+
@top_level = false
|
211
|
+
return
|
212
|
+
end
|
213
|
+
|
214
|
+
output_single(indent, nil, VERBOSE)
|
215
|
+
if /\A[A-Z]/ =~ name
|
216
|
+
_color = color("case")
|
217
|
+
else
|
218
|
+
_color = color("suite")
|
219
|
+
end
|
220
|
+
output_single(name, _color, VERBOSE)
|
221
|
+
output(": ", nil, VERBOSE)
|
222
|
+
@indent += 2
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_suite_finished(name)
|
226
|
+
@indent -= 2
|
227
|
+
end
|
228
|
+
|
229
|
+
def indent
|
230
|
+
if output?(VERBOSE)
|
231
|
+
" " * @indent
|
232
|
+
else
|
233
|
+
""
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def nl(level=NORMAL)
|
238
|
+
output("", nil, level)
|
239
|
+
end
|
240
|
+
|
241
|
+
def output(something, color=nil, level=NORMAL)
|
242
|
+
return unless output?(level)
|
243
|
+
output_single(something, color, level)
|
244
|
+
@output.puts
|
245
|
+
end
|
246
|
+
|
247
|
+
def output_single(something, color=nil, level=NORMAL)
|
248
|
+
return false unless output?(level)
|
249
|
+
if @use_color and color
|
250
|
+
something = "%s%s%s" % [color.escape_sequence,
|
251
|
+
something,
|
252
|
+
@reset_color.escape_sequence]
|
253
|
+
end
|
254
|
+
@output.write(something)
|
255
|
+
@output.flush
|
256
|
+
true
|
257
|
+
end
|
258
|
+
|
259
|
+
def output_progress(mark, color=nil)
|
260
|
+
if output_single(mark, color, PROGRESS_ONLY)
|
261
|
+
return unless @progress_row_max > 0
|
262
|
+
@progress_row += mark.size
|
263
|
+
if @progress_row >= @progress_row_max
|
264
|
+
nl unless @output_level == VERBOSE
|
265
|
+
@progress_row = 0
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def output?(level)
|
271
|
+
level <= @output_level
|
272
|
+
end
|
273
|
+
|
274
|
+
def color(name)
|
275
|
+
@color_scheme[name] || ColorScheme.default[name]
|
276
|
+
end
|
277
|
+
|
278
|
+
def fault_color(fault)
|
279
|
+
color(fault.class.name.split(/::/).last.downcase)
|
280
|
+
end
|
281
|
+
|
282
|
+
def result_color
|
283
|
+
if @result.passed?
|
284
|
+
if @result.pending_count > 0
|
285
|
+
color("pending")
|
286
|
+
elsif @result.omission_count > 0
|
287
|
+
color("omission")
|
288
|
+
elsif @result.notification_count > 0
|
289
|
+
color("notification")
|
290
|
+
else
|
291
|
+
color("success")
|
292
|
+
end
|
293
|
+
elsif @result.error_count > 0
|
294
|
+
color("error")
|
295
|
+
elsif @result.failure_count > 0
|
296
|
+
color("failure")
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def guess_color_availability
|
301
|
+
return false unless @output.tty?
|
302
|
+
case ENV["TERM"]
|
303
|
+
when /term(?:-color)?\z/, "screen"
|
304
|
+
true
|
305
|
+
else
|
306
|
+
return true if ENV["EMACS"] == "t"
|
307
|
+
false
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def guess_progress_row_max
|
312
|
+
term_width = guess_term_width
|
313
|
+
if term_width.zero?
|
314
|
+
if ENV["EMACS"] == "t"
|
315
|
+
-1
|
316
|
+
else
|
317
|
+
79
|
318
|
+
end
|
319
|
+
else
|
320
|
+
term_width
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
def guess_term_width
|
325
|
+
Integer(ENV["TERM_WIDTH"] || 0)
|
326
|
+
rescue ArgumentError
|
327
|
+
0
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
class ColorizedReadableDiffer < Diff::ReadableDiffer
|
332
|
+
def initialize(from, to, runner)
|
333
|
+
@runner = runner
|
334
|
+
super(from, to)
|
335
|
+
end
|
336
|
+
|
337
|
+
def need_diff?(options={})
|
338
|
+
operations.each do |tag,|
|
339
|
+
return true if [:replace, :equal].include?(tag)
|
340
|
+
end
|
341
|
+
false
|
342
|
+
end
|
343
|
+
|
344
|
+
private
|
345
|
+
def output_single(something, color=nil)
|
346
|
+
@runner.send(:output_single, something, color)
|
347
|
+
end
|
348
|
+
|
349
|
+
def output(something, color=nil)
|
350
|
+
@runner.send(:output, something, color)
|
351
|
+
end
|
352
|
+
|
353
|
+
def color(name)
|
354
|
+
@runner.send(:color, name)
|
355
|
+
end
|
356
|
+
|
357
|
+
def cut_off_ratio
|
358
|
+
0
|
359
|
+
end
|
360
|
+
|
361
|
+
def default_ratio
|
362
|
+
0
|
363
|
+
end
|
364
|
+
|
365
|
+
def tag(mark, color_name, contents)
|
366
|
+
_color = color(color_name)
|
367
|
+
contents.each do |content|
|
368
|
+
output_single(mark, _color)
|
369
|
+
output_single(" ")
|
370
|
+
output(content)
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
def tag_deleted(contents)
|
375
|
+
tag("-", "diff-deleted-tag", contents)
|
376
|
+
end
|
377
|
+
|
378
|
+
def tag_inserted(contents)
|
379
|
+
tag("+", "diff-inserted-tag", contents)
|
380
|
+
end
|
381
|
+
|
382
|
+
def tag_equal(contents)
|
383
|
+
tag(" ", "normal", contents)
|
384
|
+
end
|
385
|
+
|
386
|
+
def tag_difference(contents)
|
387
|
+
tag("?", "diff-difference-tag", contents)
|
388
|
+
end
|
389
|
+
|
390
|
+
def diff_line(from_line, to_line)
|
391
|
+
to_operations = []
|
392
|
+
from_line, to_line, _operations = line_operations(from_line, to_line)
|
393
|
+
|
394
|
+
no_replace = true
|
395
|
+
_operations.each do |tag,|
|
396
|
+
if tag == :replace
|
397
|
+
no_replace = false
|
398
|
+
break
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
output_single("?", color("diff-difference-tag"))
|
403
|
+
output_single(" ")
|
404
|
+
_operations.each do |tag, from_start, from_end, to_start, to_end|
|
405
|
+
from_width = compute_width(from_line, from_start, from_end)
|
406
|
+
to_width = compute_width(to_line, to_start, to_end)
|
407
|
+
case tag
|
408
|
+
when :replace
|
409
|
+
output_single(from_line[from_start...from_end],
|
410
|
+
color("diff-deleted"))
|
411
|
+
if (from_width < to_width)
|
412
|
+
output_single(" " * (to_width - from_width))
|
413
|
+
end
|
414
|
+
to_operations << Proc.new do
|
415
|
+
output_single(to_line[to_start...to_end],
|
416
|
+
color("diff-inserted"))
|
417
|
+
if (to_width < from_width)
|
418
|
+
output_single(" " * (from_width - to_width))
|
419
|
+
end
|
420
|
+
end
|
421
|
+
when :delete
|
422
|
+
output_single(from_line[from_start...from_end],
|
423
|
+
color("diff-deleted"))
|
424
|
+
unless no_replace
|
425
|
+
to_operations << Proc.new {output_single(" " * from_width)}
|
426
|
+
end
|
427
|
+
when :insert
|
428
|
+
if no_replace
|
429
|
+
output_single(to_line[to_start...to_end],
|
430
|
+
color("diff-inserted"))
|
431
|
+
else
|
432
|
+
output_single(" " * to_width)
|
433
|
+
to_operations << Proc.new do
|
434
|
+
output_single(to_line[to_start...to_end],
|
435
|
+
color("diff-inserted"))
|
436
|
+
end
|
437
|
+
end
|
438
|
+
when :equal
|
439
|
+
output_single(from_line[from_start...from_end])
|
440
|
+
unless no_replace
|
441
|
+
to_operations << Proc.new {output_single(" " * to_width)}
|
442
|
+
end
|
443
|
+
else
|
444
|
+
raise "unknown tag: #{tag}"
|
445
|
+
end
|
446
|
+
end
|
447
|
+
output("")
|
448
|
+
|
449
|
+
unless to_operations.empty?
|
450
|
+
output_single("?", color("diff-difference-tag"))
|
451
|
+
output_single(" ")
|
452
|
+
to_operations.each do |operation|
|
453
|
+
operation.call
|
454
|
+
end
|
455
|
+
output("")
|
456
|
+
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
if __FILE__ == $0
|
465
|
+
Test::Unit::UI::Console::TestRunner.start_command_line_test
|
466
|
+
end
|