summaryrefslogtreecommitdiff
path: root/lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'lib/test')
-rw-r--r--lib/test/unit.rb214
-rw-r--r--lib/test/unit/assertionfailederror.rb14
-rw-r--r--lib/test/unit/assertions.rb394
-rw-r--r--lib/test/unit/error.rb68
-rw-r--r--lib/test/unit/failure.rb45
-rw-r--r--lib/test/unit/testcase.rb152
-rw-r--r--lib/test/unit/testresult.rb81
-rw-r--r--lib/test/unit/testsuite.rb64
-rw-r--r--lib/test/unit/ui/console/testrunner.rb135
-rw-r--r--lib/test/unit/ui/fox/testrunner.rb270
-rw-r--r--lib/test/unit/ui/gtk/testrunner.rb389
-rw-r--r--lib/test/unit/ui/testrunnermediator.rb75
-rw-r--r--lib/test/unit/ui/testrunnerutilities.rb36
-rw-r--r--lib/test/unit/util/observable.rb90
-rw-r--r--lib/test/unit/util/procwrapper.rb48
15 files changed, 0 insertions, 2075 deletions
diff --git a/lib/test/unit.rb b/lib/test/unit.rb
deleted file mode 100644
index f4202c5294..0000000000
--- a/lib/test/unit.rb
+++ /dev/null
@@ -1,214 +0,0 @@
-# :include: ../../../../README
-#
-# ----
-#
-# = Usage
-#
-# The general idea behind unit testing is that you write a _test_
-# _method_ that makes certain _assertions_ about your code, working
-# against a _test_ _fixture_. A bunch of these _test_ _methods_ are
-# bundled up into a _test_ _suite_ and can be run any time the
-# developer wants. The results of a run are gathered in a _test_
-# _result_ and displayed to the user through some UI. So, lets break
-# this down and see how Test::Unit provides each of these necessary
-# pieces.
-#
-#
-# == Assertions
-#
-# These are the heart of the framework. Think of an assertion as a
-# statement of expected outcome, i.e. "I assert that x should be equal
-# to y". If, when the assertion is executed, it turns out to be
-# correct, nothing happens, and life is good. If, on the other hand,
-# your assertion turns out to be false, an error is propagated with
-# pertinent information so that you can go back and make your
-# assertion succeed, and, once again, life is good. For an explanation
-# of the current assertions, see Test::Unit::Assertions.
-#
-#
-# == Test Method & Test Fixture
-#
-# Obviously, these assertions have to be called within a context that
-# knows about them and can do something meaningful with their
-# pass/fail value. Also, it's handy to collect a bunch of related
-# tests, each test represented by a method, into a common test class
-# that knows how to run them. The tests will be in a separate class
-# from the code they're testing for a couple of reasons. First of all,
-# it allows your code to stay uncluttered with test code, making it
-# easier to maintain. Second, it allows the tests to be stripped out
-# for deployment, since they're really there for you, the developer,
-# and your users don't need them. Third, and most importantly, it
-# allows you to set up a common test fixture for your tests to run
-# against.
-#
-# What's a test fixture? Well, tests do not live in a vacuum; rather,
-# they're run against the code they are testing. Often, a collection
-# of tests will run against a common set of data, also called a
-# fixture. If they're all bundled into the same test class, they can
-# all share the setting up and tearing down of that data, eliminating
-# unnecessary duplication and making it much easier to add related
-# tests.
-#
-# Test::Unit::TestCase wraps up a collection of test methods together
-# and allows you to easily set up and tear down the same test fixture
-# for each test. This is done by overriding #setup and/or #teardown,
-# which will be called before and after each test method that is
-# run. The TestCase also knows how to collect the results of your
-# assertions into a Test::Unit::TestResult, which can then be reported
-# back to you... but I'm getting ahead of myself. To write a test,
-# follow these steps:
-#
-# * Make sure Test::Unit is in your library path.
-# * require 'test/unit' in your test script.
-# * Create a class that subclasses Test::Unit::TestCase.
-# * Add a method that begins with "test" to your class.
-# * Make assertions in your test method.
-# * Optionally define #setup and/or #teardown to set up and/or tear
-# down your common test fixture.
-# * You can now run your test as you would any other Ruby
-# script... try it and see!
-#
-# A really simple test might look like this (#setup and #teardown are
-# commented out to indicate that they are completely optional):
-#
-# require 'test/unit'
-#
-# class TC_MyTest < Test::Unit::TestCase
-# # def setup
-# # end
-#
-# # def teardown
-# # end
-#
-# def test_fail
-# assert(false, 'Assertion was false.')
-# end
-# end
-#
-#
-# == Test Runners
-#
-# So, now you have this great test class, but you still need a way to
-# run it and view any failures that occur during the run. This is
-# where Test::Unit::UI::Console::TestRunner (and others, such as
-# Test::Unit::UI::GTK::TestRunner) comes into play. The console test
-# runner is automatically invoked for you if you require 'test/unit'
-# and simply run the file. To use another runner, or to manually
-# invoke a runner, simply call its run class method and pass in an
-# object that responds to the suite message with a
-# Test::Unit::TestSuite. This can be as simple as passing in your
-# TestCase class (which has a class suite method). It might look
-# something like this:
-#
-# require 'test/unit/ui/console/testrunner'
-# Test::Unit::UI::Console::TestRunner.run(TC_MyTest)
-#
-#
-# == Test Suite
-#
-# As more and more unit tests accumulate for a given project, it
-# becomes a real drag running them one at a time, and it also
-# introduces the potential to overlook a failing test because you
-# forget to run it. Suddenly it becomes very handy that the
-# TestRunners can take any object that returns a Test::Unit::TestSuite
-# in response to a suite method. The TestSuite can, in turn, contain
-# other TestSuites or individual tests (typically created by a
-# TestCase). In other words, you can easily wrap up a group of
-# TestCases and TestSuites like this:
-#
-# require 'test/unit/testsuite'
-# require 'tc_myfirsttests'
-# require 'tc_moretestsbyme'
-# require 'ts_anothersetoftests'
-#
-# class TS_MyTests
-# def self.suite
-# suite = Test::Unit::TestSuite.new
-# suite << TC_MyFirstTests.suite
-# suite << TC_MoreTestsByMe.suite
-# suite << TS_AnotherSetOfTests.suite
-# return suite
-# end
-# end
-# Test::Unit::UI::Console::TestRunner.run(TS_MyTests)
-#
-# Now, this is a bit cumbersome, so Test::Unit does a little bit more
-# for you, by wrapping these up automatically when you require
-# 'test/unit'. What does this mean? It means you could write the above
-# test case like this instead:
-#
-# require 'test/unit'
-# require 'tc_myfirsttests'
-# require 'tc_moretestsbyme'
-# require 'ts_anothersetoftests'
-#
-# Test::Unit is smart enough to find all the test cases existing in
-# the ObjectSpace and wrap them up into a suite for you. It then runs
-# the dynamic suite using the console TestRunner.
-#
-#
-# == Questions?
-#
-# I'd really like to get feedback from all levels of Ruby
-# practitioners about typos, grammatical errors, unclear statements,
-# missing points, etc., in this document (or any other).
-
-
-
-
-require 'test/unit/testcase'
-require 'test/unit/ui/testrunnermediator'
-
-at_exit {
- # We can't debug tests run with at_exit unless we add the following:
- set_trace_func DEBUGGER__.context.method(:trace_func).to_proc if (defined? DEBUGGER__)
-
- if (!Test::Unit::UI::TestRunnerMediator.run?)
- suite_name = $0.sub(/\.rb$/, '')
- suite = Test::Unit::TestSuite.new(suite_name)
- test_classes = []
- ObjectSpace.each_object(Class) {
- | klass |
- test_classes << klass if (Test::Unit::TestCase > klass)
- }
-
- runners = {
- '--console' => proc do |suite|
- require 'test/unit/ui/console/testrunner'
- Test::Unit::UI::Console::TestRunner.run(suite)
- end,
- '--gtk' => proc do |suite|
- require 'test/unit/ui/gtk/testrunner'
- Test::Unit::UI::GTK::TestRunner.run(suite)
- end,
- '--fox' => proc do |suite|
- require 'test/unit/ui/fox/testrunner'
- Test::Unit::UI::Fox::TestRunner.run(suite)
- end,
- }
-
- unless (ARGV.empty?)
- runner = runners[ARGV[0]]
- ARGV.shift unless (runner.nil?)
- end
- runner = runners['--console'] if (runner.nil?)
-
- if ARGV.empty?
- test_classes.each { |klass| suite << klass.suite }
- else
- tests = test_classes.map { |klass| klass.suite.tests }.flatten
- criteria = ARGV.map { |arg| (arg =~ %r{^/(.*)/$}) ? Regexp.new($1) : arg }
- criteria.each {
- | criterion |
- if (criterion.instance_of?(Regexp))
- tests.each { |test| suite << test if (criterion =~ test.name) }
- elsif (/^A-Z/ =~ criterion)
- tests.each { |test| suite << test if (criterion == test.class.name) }
- else
- tests.each { |test| suite << test if (criterion == test.method_name) }
- end
- }
- end
- runner.call(suite)
- end
-}
diff --git a/lib/test/unit/assertionfailederror.rb b/lib/test/unit/assertionfailederror.rb
deleted file mode 100644
index 9b9e53f16c..0000000000
--- a/lib/test/unit/assertionfailederror.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-module Test
- module Unit
-
- # Thrown by Test::Unit::Assertions when an assertion fails.
- class AssertionFailedError < Exception
- end
- end
-end
diff --git a/lib/test/unit/assertions.rb b/lib/test/unit/assertions.rb
deleted file mode 100644
index 0af3468b9b..0000000000
--- a/lib/test/unit/assertions.rb
+++ /dev/null
@@ -1,394 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'test/unit/assertionfailederror'
-
-module Test # :nodoc:
- module Unit # :nodoc:
-
- # Contains all of the standard Test::Unit assertions. Mixed in
- # to Test::Unit::TestCase. To mix it in and use its
- # functionality, you simply need to rescue
- # Test::Unit::AssertionFailedError, and you can additionally
- # override add_assertion to be notified whenever an assertion
- # is made.
- #
- # Notes:
- # * The message to each assertion, if given, will be
- # propagated with the failure.
- # * It's easy to add your own assertions based on assert_block().
- module Assertions
-
- # The assertion upon which all other assertions are
- # based. Passes if the block yields true.
- public
- def assert_block(message="") # :yields:
- _wrap_assertion do
- if (! yield)
- raise AssertionFailedError.new(message.to_s)
- end
- end
- end
-
- # Passes if boolean is true.
- public
- def assert(boolean, message="")
- _wrap_assertion do
- assert_block("assert should not be called with a block.") { !block_given? }
- assert_block(message) { boolean }
- end
- end
-
- # Passes if expected == actual. Note that the ordering of
- # arguments is important, since a helpful error message is
- # generated when this one fails that tells you the values
- # of expected and actual.
- public
- def assert_equal(expected, actual, message=nil)
- full_message = build_message(message, expected, actual) do |arg1, arg2|
- "<#{arg1}> expected but was\n" +
- "<#{arg2}>"
- end
- assert_block(full_message) { expected == actual }
- end
-
- # Passes if block raises exception.
- public
- def assert_raises(expected_exception_klass, message="")
- _wrap_assertion do
- assert_instance_of(Class, expected_exception_klass, "Should expect a class of exception")
- actual_exception = nil
- full_message = build_message(message, expected_exception_klass) do |arg|
- "<#{arg}> exception expected but none was thrown"
- end
- assert_block(full_message) do
- thrown = false
- begin
- yield
- rescue Exception => thrown_exception
- actual_exception = thrown_exception
- thrown = true
- end
- thrown
- end
- full_message = build_message(message, expected_exception_klass, actual_exception) do |arg1, arg2|
- "<#{arg1}> exception expected but was\n" +
- arg2
- end
- assert_block(full_message) { expected_exception_klass == actual_exception.class }
- actual_exception
- end
- end
-
- # Passes if object.class == klass.
- public
- def assert_instance_of(klass, object, message="")
- _wrap_assertion do
- assert_equal(Class, klass.class, "assert_instance_of takes a Class as its first argument")
- full_message = build_message(message, object, klass, object.class) do |arg1, arg2, arg3|
- "<#{arg1}> expected to be an instance of\n" +
- "<#{arg2}> but was\n" +
- "<#{arg3}>"
- end
- assert_block(full_message) { klass == object.class }
- end
- end
-
- # Passes if object.nil?.
- public
- def assert_nil(object, message="")
- assert_equal(nil, object, message)
- end
-
- # Passes if object.kind_of?(klass).
- public
- def assert_kind_of(klass, object, message="")
- _wrap_assertion do
- assert(klass.kind_of?(Module), "The first parameter to assert_kind_of should be a kind_of Module.")
- full_message = build_message(message, object, klass) do |arg1, arg2|
- "<#{arg1}>\n" +
- "expected to be kind_of?<#{arg2}>"
- end
- assert_block(full_message) { object.kind_of?(klass) }
- end
- end
-
- # Passes if object.respond_to?(method) is true.
- public
- def assert_respond_to(object, method, message="")
- _wrap_assertion do
- assert(method.kind_of?(Symbol) || method.kind_of?(String), "The method argument to #assert_respond_to should be specified as a Symbol or a String.")
- full_message = build_message(message, object, object.class, method) do |arg1, arg2, arg3|
- "<#{arg1}>\n" +
- "of type <#{arg2}>\n" +
- "expected to respond_to?<#{arg3}>"
- end
- assert_block(full_message) { object.respond_to?(method) }
- end
- end
-
- # Passes if string =~ pattern.
- public
- def assert_match(pattern, string, message="")
- _wrap_assertion do
- full_message = build_message(message, string, pattern) do |arg1, arg2|
- "<#{arg1}> expected to be =~\n" +
- "<#{arg2}>"
- end
- assert_block(full_message) { string =~ pattern }
- end
- end
-
- # Passes if actual.equal?(expected) (i.e. they are the
- # same instance).
- public
- def assert_same(expected, actual, message="")
- full_message = build_message(message, expected, expected.__id__, actual, actual.__id__) do |arg1, arg2, arg3, arg4|
- "<#{arg1}:#{arg2}> expected to be equal? to\n" +
- "<#{arg3}:#{arg4}>"
- end
- assert_block(full_message) { actual.equal?(expected) }
- end
-
- # Compares the two objects based on the passed
- # operator. Passes if object1.send(operator, object2) is
- # true.
- public
- def assert_operator(object1, operator, object2, message="")
- full_message = build_message(message, object1, operator, object2) do |arg1, arg2, arg3|
- "<#{arg1}> expected to be\n" +
- "#{arg2}\n" +
- "<#{arg3}>"
- end
- assert_block(full_message) { object1.send(operator, object2) }
- end
-
- # Passes if block does not raise an exception.
- public
- def assert_nothing_raised(*args)
- _wrap_assertion do
- message = ""
- if (!args[-1].instance_of?(Class))
- message = args.pop
- end
- begin
- yield
- rescue Exception => thrown_exception
- if (args.empty? || args.include?(thrown_exception.class))
- full_message = build_message(message, thrown_exception) do |arg1|
- "Exception raised:\n" +
- arg1
- end
- flunk(full_message)
- else
- raise thrown_exception.class, thrown_exception.message, thrown_exception.backtrace
- end
- end
- nil
- end
- end
-
- # Always fails.
- public
- def flunk(message="")
- assert(false, message)
- end
-
- # Passes if !actual.equal?(expected).
- public
- def assert_not_same(expected, actual, message="")
- full_message = build_message(message, expected, expected.__id__, actual, actual.__id__) do |arg1, arg2, arg3, arg4|
- "<#{arg1}:#{arg2}> expected to not be equal? to\n" +
- "<#{arg3}:#{arg4}>"
- end
- assert_block(full_message) { !actual.equal?(expected) }
- end
-
- # Passes if expected != actual.
- public
- def assert_not_equal(expected, actual, message="")
- full_message = build_message(message, expected, actual) do |arg1, arg2|
- "<#{arg1}> expected to be != to\n" +
- "<#{arg2}>"
- end
- assert_block(full_message) { expected != actual }
- end
-
- # Passes if !object.nil?.
- public
- def assert_not_nil(object, message="")
- full_message = build_message(message, object) do |arg|
- "<#{arg}> expected to not be nil"
- end
- assert_block(full_message) { !object.nil? }
- end
-
- # Passes if string !~ regularExpression.
- public
- def assert_no_match(regexp, string, message="")
- _wrap_assertion do
- assert_instance_of(Regexp, regexp, "The first argument to assert_does_not_match should be a Regexp.")
- full_message = build_message(message, regexp.source, string) do |arg1, arg2|
- "</#{arg1}/> expected to not match\n" +
- " <#{arg2}>"
- end
- assert_block(full_message) { regexp !~ string }
- end
- end
-
- # Passes if block throws symbol.
- public
- def assert_throws(expected_symbol, message="", &proc)
- _wrap_assertion do
- assert_instance_of(Symbol, expected_symbol, "assert_throws expects the symbol that should be thrown for its first argument")
- assert(block_given?, "Should have passed a block to assert_throws")
- caught = true
- begin
- catch(expected_symbol) do
- proc.call
- caught = false
- end
- full_message = build_message(message, expected_symbol) do |arg|
- "<:#{arg}> should have been thrown"
- end
- assert(caught, full_message)
- rescue NameError => name_error
- if ( name_error.message !~ /^uncaught throw `(.+)'$/ ) #`
- raise name_error
- end
- full_message = build_message(message, expected_symbol, $1) do |arg1, arg2|
- "<:#{arg1}> expected to be thrown but\n" +
- "<:#{arg2}> was thrown"
- end
- flunk(full_message)
- end
- end
- end
-
- # Passes if block does not throw anything.
- public
- def assert_nothing_thrown(message="", &proc)
- _wrap_assertion do
- assert(block_given?, "Should have passed a block to assert_nothing_thrown")
- begin
- proc.call
- rescue NameError => name_error
- if (name_error.message !~ /^uncaught throw `(.+)'$/ ) #`
- raise name_error
- end
- full_message = build_message(message, $1) do |arg|
- "<:#{arg}> was thrown when nothing was expected"
- end
- flunk(full_message)
- end
- full_message = build_message(message) { || "Expected nothing to be thrown" }
- assert(true, full_message)
- end
- end
-
- # Passes if expected_float and actual_float are equal
- # within delta tolerance.
- public
- def assert_in_delta(expected_float, actual_float, delta, message="")
- _wrap_assertion do
- {expected_float => "first float", actual_float => "second float", delta => "delta"}.each do |float, name|
- assert_respond_to(float, :to_f, "The arguments must respond to to_f; the #{name} did not")
- end
- assert_operator(delta, :>=, 0.0, "The delta should not be negative")
- full_message = build_message(message, expected_float, actual_float, delta) do |arg1, arg2, arg3|
- "<#{arg1}> and\n" +
- "<#{arg2}> expected to be within\n" +
- "<#{arg3}> of each other"
- end
- assert_block(full_message) { (expected_float.to_f - actual_float.to_f).abs <= delta.to_f }
- end
- end
-
- # Passes if the method sent returns a true value.
- public
- def assert_send(send_array, message="")
- _wrap_assertion do
- assert_instance_of(Array, send_array, "assert_send requires an array of send information")
- assert(send_array.size >= 2, "assert_send requires at least a receiver and a message name")
- full_message = build_message(message, send_array[0], send_array[1], send_array[2..-1]) do |arg1, arg2, arg3|
- "<#{arg1}> expected to respond to\n" +
- "<#{arg2}(#{arg3})> with true"
- end
- assert_block(full_message) { send_array[0].__send__(send_array[1], *send_array[2..-1]) }
- end
- end
-
- public
- def build_message(message, *arguments, &block) # :nodoc:
- return AssertionMessage.new(message.to_s, arguments, block)
- end
-
- private
- def _wrap_assertion # :nodoc:
- @_assertion_wrapped ||= false
- unless (@_assertion_wrapped)
- @_assertion_wrapped = true
- begin
- add_assertion
- return yield
- ensure
- @_assertion_wrapped = false
- end
- else
- return yield
- end
- end
-
- # Called whenever an assertion is made.
- private
- def add_assertion
- end
-
- class AssertionMessage # :nodoc: all
- def self.convert(object)
- case object
- when String
- return object
- when Symbol
- return object.to_s
- when Regexp
- return "/#{object.source}/"
- when Exception
- return "Class: <#{object.class}>\n" +
- "Message: <#{object.message}>\n" +
- "---Backtrace---\n" +
- object.backtrace.join("\n") + "\n" +
- "---------------"
- else
- return object.inspect
- end
- end
-
- def initialize(message, parameters, block)
- @message = message
- @parameters = parameters
- @block = block
- end
-
- def to_s
- message_parts = []
- if (@message != nil && @message != "")
- if (@message !~ /\.$/)
- @message << "."
- end
- message_parts << @message
- end
- @parameters = @parameters.collect {
- | parameter |
- self.class.convert(parameter)
- }
- message_parts << @block.call(*@parameters)
- return message_parts.join("\n")
- end
- end
- end
- end
-end
diff --git a/lib/test/unit/error.rb b/lib/test/unit/error.rb
deleted file mode 100644
index 46c6663d86..0000000000
--- a/lib/test/unit/error.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-module Test
- module Unit
-
- # Encapsulates an error in a test. Created by
- # Test::Unit::TestCase when it rescues an exception thrown
- # during the processing of a test.
- class Error
- attr_reader(:location, :exception)
-
- SINGLE_CHARACTER = 'E'
-
- # Creates a new Error with the given location and
- # exception.
- def initialize(location, exception)
- @location = location
- @exception = exception
- end
-
- # Returns a single character representation of an error.
- def single_character_display
- SINGLE_CHARACTER
- end
-
- # Returns the message associated with the error.
- def message
- "#{@exception.class.name}: #{@exception.message}"
- end
-
- # Returns a brief version of the error description.
- def short_display
- "#{@location}:\n#{message}"
- end
-
- # Returns a verbose version of the error description.
- def long_display
- backtrace = self.class.filter(@exception.backtrace).join("\n ")
- "Error!!!\n#{short_display}\n #{backtrace}"
- end
-
- # Overridden to return long_display.
- def to_s
- long_display
- end
-
- SEPARATOR_PATTERN = '[\\\/:]'
- def self.filter(backtrace) # :nodoc:
- @test_unit_patterns ||= $:.collect {
- | path |
- /^#{Regexp.escape(path)}#{SEPARATOR_PATTERN}test#{SEPARATOR_PATTERN}unit#{SEPARATOR_PATTERN}/
- }.push(/#{SEPARATOR_PATTERN}test#{SEPARATOR_PATTERN}unit\.rb/)
-
- return backtrace.delete_if {
- | line |
- @test_unit_patterns.detect {
- | pattern |
- line =~ pattern
- }
- }
- end
- end
- end
-end
diff --git a/lib/test/unit/failure.rb b/lib/test/unit/failure.rb
deleted file mode 100644
index 6817d8f3bf..0000000000
--- a/lib/test/unit/failure.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-module Test
- module Unit
-
- # Encapsulates a test failure. Created by Test::Unit::TestCase
- # when an assertion fails.
- class Failure
- attr_reader(:location, :message)
-
- SINGLE_CHARACTER = 'F'
-
- # Creates a new Failure with the given location and
- # message.
- def initialize(location, message)
- @location = location
- @message = message
- end
-
- # Returns a single character representation of a failure.
- def single_character_display
- SINGLE_CHARACTER
- end
-
- # Returns a brief version of the error description.
- def short_display
- "#{@location}:\n#{@message}"
- end
-
- # Returns a verbose version of the error description.
- def long_display
- "Failure!!!\n#{short_display}"
- end
-
- # Overridden to return long_display.
- def to_s
- long_display
- end
- end
- end
-end
diff --git a/lib/test/unit/testcase.rb b/lib/test/unit/testcase.rb
deleted file mode 100644
index 2ccf192906..0000000000
--- a/lib/test/unit/testcase.rb
+++ /dev/null
@@ -1,152 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'test/unit/assertions'
-require 'test/unit/failure'
-require 'test/unit/error'
-require 'test/unit/testsuite'
-require 'test/unit/assertionfailederror'
-
-module Test
- module Unit
-
- # Ties everything together. If you subclass and add your own
- # test methods, it takes care of making them into tests and
- # wrapping those tests into a suite. It also does the
- # nitty-gritty of actually running an individual test and
- # collecting its results into a Test::Unit::TestResult object.
- class TestCase
- include Assertions
-
- attr_reader :method_name
-
- STARTED = name + "::STARTED"
- FINISHED = name + "::FINISHED"
-
- # Creates a new instance of the fixture for running the
- # test represented by test_method_name.
- def initialize(test_method_name)
- if ((!respond_to?(test_method_name)) || (method(test_method_name).arity != 0))
- throw :invalid_test
- end
- @method_name = test_method_name
- @test_passed = true
- end
-
- # Rolls up all of the test* methods in the fixture into
- # one suite, creating a new instance of the fixture for
- # each method.
- def self.suite
- method_names = public_instance_methods(true)
- tests = method_names.delete_if { |method_name| method_name !~ /^test.+/ }
- suite = TestSuite.new(name)
- tests.each do
- |test|
- catch(:invalid_test) do
- suite << new(test)
- end
- end
- if (suite.empty?)
- catch(:invalid_test) do
- suite << new(:default_test)
- end
- end
- return suite
- end
-
- # Runs the individual test method represented by this
- # instance of the fixture, collecting statistics, failures
- # and errors in result.
- def run(result)
- yield(STARTED, name)
- @_result = result
- begin
- setup
- send(@method_name)
- rescue AssertionFailedError => e
- add_failure(e.message, e.backtrace)
- rescue StandardError, ScriptError
- add_error($!)
- ensure
- begin
- teardown
- rescue AssertionFailedError => e
- add_failure(e.message, e.backtrace)
- rescue StandardError, ScriptError
- add_error($!)
- end
- end
- result.add_run
- yield(FINISHED, name)
- end
-
- # Called before every test method runs. Can be used
- # to set up fixture information.
- def setup
- end
-
- # Called after every test method runs. Can be used to tear
- # down fixture information.
- def teardown
- end
-
- def default_test
- flunk("No tests were specified")
- end
-
- # Returns whether this individual test passed or
- # not. Primarily for use in teardown so that artifacts
- # can be left behind if the test fails.
- def passed?
- return @test_passed
- end
- private :passed?
-
- def size # :nodoc:
- 1
- end
-
- def add_assertion # :nodoc:
- @_result.add_assertion
- end
- private :add_assertion
-
- def add_failure(message, all_locations=caller()) # :nodoc:
- @test_passed = false
- assertions_pattern = /[^A-Za-z_]assertions\.rb:/
- if (all_locations.detect { |entry| entry =~ assertions_pattern })
- all_locations.shift
- until (all_locations[0] =~ assertions_pattern || all_locations.empty?)
- all_locations.shift
- end
- location = all_locations.detect { |entry| entry !~ assertions_pattern }
- else
- location = all_locations[0]
- end
- location = location[/^.+:\d+/]
- @_result.add_failure(Failure.new("#{name} [#{location}]", message))
- end
- private :add_failure
-
- def add_error(exception) # :nodoc:
- @test_passed = false
- @_result.add_error(Error.new(name, exception))
- end
- private :add_error
-
- # Returns a human-readable name for the specific test that
- # this instance of TestCase represents.
- def name
- "#{@method_name}(#{self.class.name})"
- end
-
- # Overriden to return #name.
- def to_s
- name
- end
- end
- end
-end
diff --git a/lib/test/unit/testresult.rb b/lib/test/unit/testresult.rb
deleted file mode 100644
index b1bfbf72e4..0000000000
--- a/lib/test/unit/testresult.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'test/unit/util/observable'
-
-module Test
- module Unit
-
- # Collects Test::Unit::Failure and Test::Unit::Error so that
- # they can be displayed to the user. To this end, observers
- # can be added to it, allowing the dynamic updating of, say, a
- # UI.
- class TestResult
- include Util::Observable
-
- CHANGED = "CHANGED"
- FAULT = "FAULT"
-
- attr_reader(:run_count, :assertion_count)
-
- # Constructs a new, empty TestResult.
- def initialize
- @run_count, @assertion_count = 0, 0
- @failures, @errors = Array.new, Array.new
- end
-
- # Records a test run.
- def add_run
- @run_count += 1
- notify_listeners(CHANGED, self)
- end
-
- # Records a Test::Unit::Failure.
- def add_failure(failure)
- @failures << failure
- notify_listeners(FAULT, failure)
- notify_listeners(CHANGED, self)
- end
-
- # Records a Test::Unit::Error.
- def add_error(error)
- @errors << error
- notify_listeners(FAULT, error)
- notify_listeners(CHANGED, self)
- end
-
- # Records an individual assertion.
- def add_assertion
- @assertion_count += 1
- notify_listeners(CHANGED, self)
- end
-
- # Returns a string contain the recorded runs, assertions,
- # failures and errors in this TestResult.
- def to_s
- "#{run_count} tests, #{assertion_count} assertions, #{failure_count} failures, #{error_count} errors"
- end
-
- # Returns whether or not this TestResult represents
- # successful completion.
- def passed?
- return @failures.empty? && @errors.empty?
- end
-
- # Returns the number of failures this TestResult has
- # recorded.
- def failure_count
- return @failures.size
- end
-
- # Returns the number of errors this TestResult has
- # recorded.
- def error_count
- return @errors.size
- end
- end
- end
-end
diff --git a/lib/test/unit/testsuite.rb b/lib/test/unit/testsuite.rb
deleted file mode 100644
index e3a164cb6e..0000000000
--- a/lib/test/unit/testsuite.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-module Test
- module Unit
-
- # A collection of tests which can be #run.
- #
- # Note: It is easy to confuse a TestSuite instance with
- # something that has a static suite method; I know because _I_
- # have trouble keeping them straight. Think of something that
- # has a suite method as simply providing a way to get a
- # meaningful TestSuite instance.
- class TestSuite
- attr_reader :name, :tests
-
- STARTED = name + "::STARTED"
- FINISHED = name + "::FINISHED"
-
- # Creates a new TestSuite with the given name.
- def initialize(name="Unnamed TestSuite")
- @name = name
- @tests = []
- end
-
- # Runs the tests and/or suites contained in this
- # TestSuite.
- def run(result, &progress_block)
- yield(STARTED, name)
- @tests.sort { |test1, test2| test1.name <=> test2.name }.each do |test|
- test.run(result, &progress_block)
- end
- yield(FINISHED, name)
- end
-
- # Adds the test to the suite.
- def <<(test)
- @tests << test
- end
-
- # Retuns the rolled up number of tests in this suite;
- # i.e. if the suite contains other suites, it counts the
- # tests within those suites, not the suites themselves.
- def size
- total_size = 0
- @tests.each { |test| total_size += test.size }
- total_size
- end
-
- def empty?
- tests.empty?
- end
-
- # Overriden to return the name given the suite at
- # creation.
- def to_s
- @name
- end
- end
- end
-end
diff --git a/lib/test/unit/ui/console/testrunner.rb b/lib/test/unit/ui/console/testrunner.rb
deleted file mode 100644
index 0a5e264006..0000000000
--- a/lib/test/unit/ui/console/testrunner.rb
+++ /dev/null
@@ -1,135 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'test/unit/ui/testrunnermediator'
-require 'test/unit/ui/testrunnerutilities'
-
-module Test
- module Unit
- module UI
- module Console # :nodoc:
-
- # Runs a Test::Unit::TestSuite on the console.
- class TestRunner
- extend TestRunnerUtilities
-
- SILENT = 0
- PROGRESS_ONLY = 1
- NORMAL = 2
- VERBOSE = 3
-
- # Creates a new TestRunner and runs the suite.
- def self.run(suite, output_level=NORMAL)
- return new(suite, output_level).start
- end
-
- # Creates a new TestRunner for running the passed
- # suite. If quiet_mode is true, the output while
- # running is limited to progress dots, errors and
- # failures, and the final result. io specifies
- # where runner output should go to; defaults to
- # STDERR.
- def initialize(suite, output_level=NORMAL, io=STDOUT)
- if (suite.respond_to?(:suite))
- @suite = suite.suite
- else
- @suite = suite
- end
- @output_level = output_level
- @io = io
- @already_outputted = false
- @faults = []
- end
-
- # Begins the test run.
- def start
- setup_mediator
- attach_to_mediator
- return start_mediator
- end
-
- private
- def setup_mediator # :nodoc:
- @mediator = create_mediator(@suite)
- suite_name = @suite.to_s
- if ( @suite.kind_of?(Module) )
- suite_name = @suite.name
- end
- output("Loaded suite #{suite_name}")
- end
-
- def create_mediator(suite) # :nodoc:
- return TestRunnerMediator.new(suite)
- end
-
- def attach_to_mediator # :nodoc:
- @mediator.add_listener(TestResult::FAULT, &method(:add_fault))
- @mediator.add_listener(TestRunnerMediator::STARTED, &method(:started))
- @mediator.add_listener(TestRunnerMediator::FINISHED, &method(:finished))
- @mediator.add_listener(TestCase::STARTED, &method(:test_started))
- @mediator.add_listener(TestCase::FINISHED, &method(:test_finished))
- end
-
- def start_mediator # :nodoc:
- return @mediator.run_suite
- end
-
- def add_fault(fault) # :nodoc:
- @faults << fault
- output_single(fault.single_character_display, PROGRESS_ONLY)
- @already_outputted = true
- end
-
- def started(result)
- @result = result
- output("Started")
- end
-
- def finished(elapsed_time)
- nl
- output("Finished in #{elapsed_time} seconds.")
- @faults.each_with_index do |fault, index|
- nl
- output("%3d) %s" % [index + 1, fault.long_display])
- end
- nl
- output(@result)
- end
-
- def test_started(name)
- output_single(name + ": ", VERBOSE)
- end
-
- def test_finished(name)
- output_single(".", PROGRESS_ONLY) unless (@already_outputted)
- nl(VERBOSE)
- @already_outputted = false
- end
-
- def nl(level=NORMAL)
- output("", level)
- end
-
- def output(something, level=NORMAL)
- @io.puts(something) if (output?(level))
- end
-
- def output_single(something, level=NORMAL)
- @io.write(something) if (output?(level))
- end
-
- def output?(level)
- level <= @output_level
- end
- end
- end
- end
- end
-end
-
-if __FILE__ == $0
- Test::Unit::UI::Console::TestRunner.start_command_line_test
-end
diff --git a/lib/test/unit/ui/fox/testrunner.rb b/lib/test/unit/ui/fox/testrunner.rb
deleted file mode 100644
index 8b82ec634d..0000000000
--- a/lib/test/unit/ui/fox/testrunner.rb
+++ /dev/null
@@ -1,270 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'fox'
-require 'test/unit/ui/testrunnermediator'
-require 'test/unit/ui/testrunnerutilities'
-
-include Fox
-
-module Test
- module Unit
- module UI
- module Fox # :nodoc:
-
- # Runs a Test::Unit::TestSuite in a Fox UI. Obviously,
- # this one requires you to have Fox
- # (http://www.fox-toolkit.org/fox.html) and the Ruby
- # Fox extension (http://fxruby.sourceforge.net/)
- # installed.
- class TestRunner
-
- extend TestRunnerUtilities
-
- RED_STYLE = FXRGBA(0xFF,0,0,0xFF) #0xFF000000
- GREEN_STYLE = FXRGBA(0,0xFF,0,0xFF) #0x00FF0000
-
- # Creates a new TestRunner and runs the suite.
- def self.run(suite)
- new(suite).start
- end
-
- # Creates a new TestRunner for running the passed
- # suite.
- def initialize(suite)
- if (suite.respond_to?(:suite))
- @suite = suite.suite
- else
- @suite = suite
- end
-
- @red = false
- end
-
- # Begins the test run.
- def start
- setup_ui
- setup_mediator
- attach_to_mediator
- start_ui
- end
-
- def setup_mediator # :nodoc:
- @mediator = TestRunnerMediator.new(@suite)
- suite_name = @suite.to_s
- if ( @suite.kind_of?(Module) )
- suite_name = @suite.name
- end
- @suite_name_entry.text = suite_name
- end
-
- def attach_to_mediator # :nodoc:
- @mediator.add_listener(TestRunnerMediator::RESET, &method(:reset_ui))
- @mediator.add_listener(TestResult::FAULT, &method(:add_fault))
- @mediator.add_listener(TestResult::CHANGED, &method(:result_changed))
- @mediator.add_listener(TestRunnerMediator::STARTED, &method(:started))
- @mediator.add_listener(TestCase::STARTED, &method(:test_started))
- @mediator.add_listener(TestRunnerMediator::FINISHED, &method(:finished))
- end
-
- def start_ui # :nodoc:
- @application.create
- @window.show(PLACEMENT_SCREEN)
- @application.addTimeout(1) do
- @mediator.run_suite
- end
- @application.run
- end
-
- def stop # :nodoc:
- @application.exit(0)
- end
-
- def reset_ui(count) # :nodoc:
- @test_progress_bar.barColor = GREEN_STYLE
- @test_progress_bar.total = count
- @test_progress_bar.progress = 0
- @red = false
-
- @test_count_label.text = "0"
- @assertion_count_label.text = "0"
- @failure_count_label.text = "0"
- @error_count_label.text = "0"
-
- @fault_list.clearItems
- end
-
- def add_fault(fault) # :nodoc:
- if ( ! @red )
- @test_progress_bar.barColor = RED_STYLE
- @red = true
- end
- item = FaultListItem.new(fault)
- @fault_list.appendItem(item)
- end
-
- def show_fault(fault) # :nodoc:
- raw_show_fault(fault.long_display)
- end
-
- def raw_show_fault(string) # :nodoc:
- @detail_text.setText(string)
- end
-
- def clear_fault # :nodoc:
- raw_show_fault("")
- end
-
- def result_changed(result) # :nodoc:
- @test_progress_bar.progress = result.run_count
-
- @test_count_label.text = result.run_count.to_s
- @assertion_count_label.text = result.assertion_count.to_s
- @failure_count_label.text = result.failure_count.to_s
- @error_count_label.text = result.error_count.to_s
-
- # repaint now!
- @info_panel.repaint
- @application.flush
- end
-
- def started(result) # :nodoc:
- output_status("Started...")
- end
-
- def test_started(test_name)
- output_status("Running #{test_name}...")
- end
-
- def finished(elapsed_time)
- output_status("Finished in #{elapsed_time} seconds")
- end
-
- def output_status(string)
- @status_entry.text = string
- @status_entry.repaint
- end
-
- def setup_ui # :nodoc:
- @application = create_application
- create_tooltip(@application)
-
- @window = create_window(@application)
-
- @status_entry = create_entry(@window)
-
- main_panel = create_main_panel(@window)
-
- suite_panel = create_suite_panel(main_panel)
- create_label(suite_panel, "Suite:")
- @suite_name_entry = create_entry(suite_panel)
- create_button(suite_panel, "&Run\tRun the current suite", proc { @mediator.run_suite })
-
- @test_progress_bar = create_progress_bar(main_panel)
-
- @info_panel = create_info_panel(main_panel)
- create_label(@info_panel, "Tests:")
- @test_count_label = create_label(@info_panel, "0")
- create_label(@info_panel, "Assertions:")
- @assertion_count_label = create_label(@info_panel, "0")
- create_label(@info_panel, "Failures:")
- @failure_count_label = create_label(@info_panel, "0")
- create_label(@info_panel, "Errors:")
- @error_count_label = create_label(@info_panel, "0")
-
- list_panel = create_list_panel(main_panel)
- @fault_list = create_fault_list(list_panel)
-
- detail_panel = create_detail_panel(main_panel)
- @detail_text = create_text(detail_panel)
- end
-
- def create_application # :nodoc:
- app = FXApp.new("TestRunner", "Test::Unit")
- app.init([])
- app
- end
-
- def create_window(app)
- FXMainWindow.new(app, "Test::Unit TestRunner", nil, nil, DECOR_ALL, 0, 0, 450)
- end
-
- def create_tooltip(app)
- FXTooltip.new(app)
- end
-
- def create_main_panel(parent) # :nodoc:
- panel = FXVerticalFrame.new(parent, LAYOUT_FILL_X | LAYOUT_FILL_Y)
- panel.vSpacing = 10
- panel
- end
-
- def create_suite_panel(parent) # :nodoc:
- FXHorizontalFrame.new(parent, LAYOUT_SIDE_LEFT | LAYOUT_FILL_X)
- end
-
- def create_button(parent, text, action) # :nodoc:
- FXButton.new(parent, text).connect(SEL_COMMAND, &action)
- end
-
- def create_progress_bar(parent) # :nodoc:
- FXProgressBar.new(parent, nil, 0, PROGRESSBAR_NORMAL | LAYOUT_FILL_X)
- end
-
- def create_info_panel(parent) # :nodoc:
- FXMatrix.new(parent, 1, MATRIX_BY_ROWS | LAYOUT_FILL_X)
- end
-
- def create_label(parent, text)
- FXLabel.new(parent, text, nil, JUSTIFY_CENTER_X | LAYOUT_FILL_COLUMN)
- end
-
- def create_list_panel(parent) # :nodoc:
- FXHorizontalFrame.new(parent, LAYOUT_FILL_X | FRAME_SUNKEN | FRAME_THICK)
- end
-
- def create_fault_list(parent) # :nodoc:
- list = FXList.new(parent, 10, nil, 0, LIST_SINGLESELECT | LAYOUT_FILL_X) #, 0, 0, 0, 150)
- list.connect(SEL_COMMAND) do |sender, sel, ptr|
- if sender.retrieveItem(sender.currentItem).selected?
- show_fault(sender.retrieveItem(sender.currentItem).fault)
- else
- clear_fault
- end
- end
- list
- end
-
- def create_detail_panel(parent) # :nodoc:
- FXHorizontalFrame.new(parent, LAYOUT_FILL_X | LAYOUT_FILL_Y | FRAME_SUNKEN | FRAME_THICK)
- end
-
- def create_text(parent) # :nodoc:
- FXText.new(parent, nil, 0, TEXT_READONLY | LAYOUT_FILL_X | LAYOUT_FILL_Y)
- end
-
- def create_entry(parent) # :nodoc:
- entry = FXTextField.new(parent, 30, nil, 0, TEXTFIELD_NORMAL | LAYOUT_SIDE_BOTTOM | LAYOUT_FILL_X)
- entry.disable
- entry
- end
- end
-
- class FaultListItem < FXListItem # :nodoc: all
- attr_reader(:fault)
- def initialize(fault)
- super(fault.short_display)
- @fault = fault
- end
- end
- end
- end
- end
-end
-
-if __FILE__ == $0
- Test::Unit::UI::Fox::TestRunner.start_command_line_test
-end
diff --git a/lib/test/unit/ui/gtk/testrunner.rb b/lib/test/unit/ui/gtk/testrunner.rb
deleted file mode 100644
index 229df3e358..0000000000
--- a/lib/test/unit/ui/gtk/testrunner.rb
+++ /dev/null
@@ -1,389 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'gtk'
-require 'test/unit/ui/testrunnermediator'
-require 'test/unit/ui/testrunnerutilities'
-
-module Test
- module Unit
- module UI
- module GTK # :nodoc:
-
- # Runs a Test::Unit::TestSuite in a Gtk UI. Obviously,
- # this one requires you to have Gtk
- # (http://www.gtk.org/) and the Ruby Gtk extension
- # (http://ruby-gnome.sourceforge.net/) installed.
- class TestRunner
- extend TestRunnerUtilities
-
- # Creates a new TestRunner and runs the suite.
- def self.run(suite)
- new(suite).start
-
- end
-
- # Creates a new TestRunner for running the passed
- # suite.
- def initialize(suite)
- if (suite.respond_to?(:suite))
- @suite = suite.suite
- else
- @suite = suite
- end
- end
-
- # Begins the test run.
- def start
- setup_mediator
- setup_ui
- attach_to_mediator
- start_ui
- end
-
- private
- def setup_mediator # :nodoc:
- @mediator = TestRunnerMediator.new(@suite)
- suite_name = @suite.to_s
- if ( @suite.kind_of?(Module) )
- suite_name = @suite.name
- end
- suite_name_entry.set_text(suite_name)
- end
-
- def attach_to_mediator # :nodoc:
- run_button.signal_connect("clicked", nil) { @mediator.run_suite }
- @mediator.add_listener(TestRunnerMediator::RESET, &method(:reset_ui))
- @mediator.add_listener(TestResult::FAULT, &method(:add_fault))
- @mediator.add_listener(TestResult::CHANGED, &method(:result_changed))
- @mediator.add_listener(TestRunnerMediator::STARTED, &method(:started))
- @mediator.add_listener(TestCase::STARTED, &method(:test_started))
- @mediator.add_listener(TestRunnerMediator::FINISHED, &method(:finished))
- end
-
- def start_ui # :nodoc:
- timer = Gtk::timeout_add(0) {
- Gtk::timeout_remove(timer)
- @mediator.run_suite
- }
- Gtk.main
- end
-
- def stop # :nodoc:
- Gtk.main_quit
- end
-
- def reset_ui(count) # :nodoc:
- test_progress_bar.set_style(green_style)
- test_progress_bar.configure(0, 0, count)
- @red = false
-
- run_count_label.set_text("0")
- assertion_count_label.set_text("0")
- failure_count_label.set_text("0")
- error_count_label.set_text("0")
-
- fault_list.remove_items(fault_list.children)
- end
-
- def add_fault(fault) # :nodoc:
- if ( ! @red )
- test_progress_bar.set_style(red_style)
- @red = true
- end
- item = FaultListItem.new(fault)
- item.show
- fault_list.append_items([item])
- end
-
- def show_fault(fault) # :nodoc:
- raw_show_fault(fault.longDisplay)
- end
-
- def raw_show_fault(string) # :nodoc:
- faultDetailLabel.set_text(string)
- outerDetailSubPanel.queue_resize
- end
-
- def clear_fault # :nodoc:
- raw_show_fault("")
- end
-
- def result_changed(result) # :nodoc:
- test_progress_bar.set_value(test_progress_bar.get_value + 1)
-
- run_count_label.set_text(result.run_count.to_s)
- assertion_count_label.set_text(result.assertion_count.to_s)
- failure_count_label.set_text(result.failure_count.to_s)
- error_count_label.set_text(result.error_count.to_s)
- end
-
- def started(result) # :nodoc:
- output_status("Started...")
- end
-
- def test_started(test_name)
- output_status("Running #{test_name}...")
- end
-
- def finished(elapsed_time)
- output_status("Finished in #{elapsed_time} seconds")
- end
-
- def output_status(string) # :nodoc:
- status_entry.set_text(string)
- end
-
- def setup_ui # :nodoc:
- main_window.signal_connect("destroy", nil) { stop }
- main_window.show_all
- fault_list.signal_connect("select-child", nil) {
- | list, item, data |
- show_fault(item.fault)
- }
- fault_list.signal_connect("unselect-child", nil) {
- clear_fault
- }
- @red = false
- end
-
- def main_window # :nodoc:
- lazy_initialize(:main_window) {
- @main_window = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
- @main_window.set_title("Test::Unit TestRunner")
- @main_window.set_usize(800, 600)
- @main_window.set_uposition(20, 20)
- @main_window.set_policy(true, true, false)
- @main_window.add(main_panel)
- }
- end
-
- def main_panel # :nodoc:
- lazy_initialize(:main_panel) {
- @main_panel = Gtk::VBox.new(false, 0)
- @main_panel.pack_start(suite_panel, false, false, 0)
- @main_panel.pack_start(progress_panel, false, false, 0)
- @main_panel.pack_start(info_panel, false, false, 0)
- @main_panel.pack_start(list_panel, false, false, 0)
- @main_panel.pack_start(detail_panel, true, true, 0)
- @main_panel.pack_start(status_panel, false, false, 0)
- }
- end
-
- def suite_panel # :nodoc:
- lazy_initialize(:suite_panel) {
- @suite_panel = Gtk::HBox.new(false, 10)
- @suite_panel.border_width(10)
- @suite_panel.pack_start(Gtk::Label.new("Suite:"), false, false, 0)
- @suite_panel.pack_start(suite_name_entry, true, true, 0)
- @suite_panel.pack_start(run_button, false, false, 0)
- }
- end
-
- def suite_name_entry # :nodoc:
- lazy_initialize(:suite_name_entry) {
- @suite_name_entry = Gtk::Entry.new
- @suite_name_entry.set_editable(false)
- }
- end
-
- def run_button # :nodoc:
- lazy_initialize(:run_button) {
- @run_button = Gtk::Button.new("Run")
- }
- end
-
- def progress_panel # :nodoc:
- lazy_initialize(:progress_panel) {
- @progress_panel = Gtk::HBox.new(false, 10)
- @progress_panel.border_width(10)
- @progress_panel.pack_start(test_progress_bar, true, true, 0)
- }
- end
-
- def test_progress_bar # :nodoc:
- lazy_initialize(:test_progress_bar) {
- @test_progress_bar = EnhancedProgressBar.new
- @test_progress_bar.set_usize(@test_progress_bar.allocation.width, 50)
- @test_progress_bar.set_style(green_style)
- }
- end
-
- def green_style # :nodoc:
- lazy_initialize(:green_style) {
- @green_style = Gtk::Style.new
- @green_style.set_bg(Gtk::STATE_PRELIGHT, 0x0000, 0xFFFF, 0x0000)
- }
- end
-
- def red_style # :nodoc:
- lazy_initialize(:red_style) {
- @red_style = Gtk::Style.new
- @red_style.set_bg(Gtk::STATE_PRELIGHT, 0xFFFF, 0x0000, 0x0000)
- }
- end
-
- def info_panel # :nodoc:
- lazy_initialize(:info_panel) {
- @info_panel = Gtk::HBox.new(false, 0)
- @info_panel.border_width(10)
- @info_panel.pack_start(Gtk::Label.new("Runs:"), false, false, 0)
- @info_panel.pack_start(run_count_label, true, false, 0)
- @info_panel.pack_start(Gtk::Label.new("Assertions:"), false, false, 0)
- @info_panel.pack_start(assertion_count_label, true, false, 0)
- @info_panel.pack_start(Gtk::Label.new("Failures:"), false, false, 0)
- @info_panel.pack_start(failure_count_label, true, false, 0)
- @info_panel.pack_start(Gtk::Label.new("Errors:"), false, false, 0)
- @info_panel.pack_start(error_count_label, true, false, 0)
- }
- end
-
- def run_count_label # :nodoc:
- lazy_initialize(:run_count_label) {
- @run_count_label = Gtk::Label.new("0")
- @run_count_label.set_justify(Gtk::JUSTIFY_LEFT)
- }
- end
-
- def assertion_count_label # :nodoc:
- lazy_initialize(:assertion_count_label) {
- @assertion_count_label = Gtk::Label.new("0")
- @assertion_count_label.set_justify(Gtk::JUSTIFY_LEFT)
- }
- end
-
- def failure_count_label # :nodoc:
- lazy_initialize(:failure_count_label) {
- @failure_count_label = Gtk::Label.new("0")
- @failure_count_label.set_justify(Gtk::JUSTIFY_LEFT)
- }
- end
-
- def error_count_label # :nodoc:
- lazy_initialize(:error_count_label) {
- @error_count_label = Gtk::Label.new("0")
- @error_count_label.set_justify(Gtk::JUSTIFY_LEFT)
- }
- end
-
- def list_panel # :nodoc:
- lazy_initialize(:list_panel) {
- @list_panel = Gtk::HBox.new
- @list_panel.border_width(10)
- @list_panel.pack_start(list_scrolled_window, true, true, 0)
- }
- end
-
- def list_scrolled_window # :nodoc:
- lazy_initialize(:list_scrolled_window) {
- @list_scrolled_window = Gtk::ScrolledWindow.new
- @list_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC)
- @list_scrolled_window.set_usize(@list_scrolled_window.allocation.width, 150)
- @list_scrolled_window.add_with_viewport(fault_list)
- }
- end
-
- def fault_list # :nodoc:
- lazy_initialize(:fault_list) {
- @fault_list = Gtk::List.new
- }
- end
-
- def detail_panel # :nodoc:
- lazy_initialize(:detail_panel) {
- @detail_panel = Gtk::HBox.new
- @detail_panel.border_width(10)
- @detail_panel.pack_start(detail_scrolled_window, true, true, 0)
- }
- end
-
- def detail_scrolled_window # :nodoc:
- lazy_initialize(:detail_scrolled_window) {
- @detail_scrolled_window = Gtk::ScrolledWindow.new
- @detail_scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC)
- @detail_scrolled_window.set_usize(400, @detail_scrolled_window.allocation.height)
- @detail_scrolled_window.add_with_viewport(outer_detail_sub_panel)
- }
- end
-
- def outer_detail_sub_panel # :nodoc:
- lazy_initialize(:outer_detail_sub_panel) {
- @outer_detail_sub_panel = Gtk::VBox.new
- @outer_detail_sub_panel.pack_start(inner_detail_sub_panel, false, false, 0)
- }
- end
-
- def inner_detail_sub_panel # :nodoc:
- lazy_initialize(:inner_detail_sub_panel) {
- @inner_detail_sub_panel = Gtk::HBox.new
- @inner_detail_sub_panel.pack_start(fault_detail_label, false, false, 0)
- }
- end
-
- def fault_detail_label # :nodoc:
- lazy_initialize(:fault_detail_label) {
- @fault_detail_label = EnhancedLabel.new("")
- style = Gtk::Style.new
- font = Gdk::Font.font_load("-*-Courier New-medium-r-normal--*-120-*-*-*-*-*-*")
- style.set_font(font)
- @fault_detail_label.set_style(style)
- @fault_detail_label.set_justify(Gtk::JUSTIFY_LEFT)
- @fault_detail_label.set_line_wrap(false)
- }
- end
-
- def status_panel # :nodoc:
- lazy_initialize(:status_panel) {
- @status_panel = Gtk::HBox.new
- @status_panel.border_width(10)
- @status_panel.pack_start(status_entry, true, true, 0)
- }
- end
-
- def status_entry # :nodoc:
- lazy_initialize(:status_entry) {
- @status_entry = Gtk::Entry.new
- @status_entry.set_editable(false)
- }
- end
-
- def lazy_initialize(symbol) # :nodoc:
- if (!instance_eval("defined?(@#{symbol.to_s})"))
- yield
- end
- return instance_eval("@" + symbol.to_s)
- end
- end
-
- class EnhancedProgressBar < Gtk::ProgressBar # :nodoc: all
- def set_style(style)
- super
- hide
- show
- end
- end
-
- class EnhancedLabel < Gtk::Label # :nodoc: all
- def set_text(text)
- super(text.gsub(/\n\t/, "\n" + (" " * 4)))
- end
- end
-
- class FaultListItem < Gtk::ListItem # :nodoc: all
- attr_reader(:fault)
- def initialize(fault)
- super(fault.short_display)
- @fault = fault
- end
- end
- end
- end
- end
-end
-
-if __FILE__ == $0
- Test::Unit::UI::GTK::TestRunner.start_command_line_test
-end
diff --git a/lib/test/unit/ui/testrunnermediator.rb b/lib/test/unit/ui/testrunnermediator.rb
deleted file mode 100644
index 41c77dc7a9..0000000000
--- a/lib/test/unit/ui/testrunnermediator.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'test/unit/util/observable'
-require 'test/unit/testresult'
-
-module Test
- module Unit
- module UI # :nodoc:
-
- # Provides an interface to write any given UI against,
- # hopefully making it easy to write new UIs.
- class TestRunnerMediator
- RESET = name + "::RESET"
- STARTED = name + "::STARTED"
- FINISHED = name + "::FINISHED"
-
- include Util::Observable
-
- @@run = false
-
- # Returns true if any TestRunnerMediator instances
- # have been run.
- def self.run?
- return @@run
- end
-
- # Creates a new TestRunnerMediator initialized to run
- # the passed suite.
- def initialize(suite)
- @suite = suite
- end
-
- # Runs the suite the TestRunnerMediator was created
- # with.
- def run_suite
- @@run = true
- begin_time = Time.now
- notify_listeners(RESET, @suite.size)
- result = create_result
- notify_listeners(STARTED, result)
- result_listener = result.add_listener(TestResult::CHANGED) do |updated_result|
- notify_listeners(TestResult::CHANGED, updated_result)
- end
-
- fault_listener = result.add_listener(TestResult::FAULT) do |fault|
- notify_listeners(TestResult::FAULT, fault)
- end
-
- @suite.run(result) do |channel, value|
- notify_listeners(channel, value)
- end
-
- result.remove_listener(TestResult::FAULT, fault_listener)
- result.remove_listener(TestResult::CHANGED, result_listener)
- end_time = Time.now
- elapsed_time = end_time - begin_time
- notify_listeners(FINISHED, elapsed_time) #"Finished in #{elapsed_time} seconds.")
- return result
- end
-
- private
- # A factory method to create the result the mediator
- # should run with. Can be overridden by subclasses if
- # one wants to use a different result.
- def create_result
- return TestResult.new
- end
- end
- end
- end
-end
diff --git a/lib/test/unit/ui/testrunnerutilities.rb b/lib/test/unit/ui/testrunnerutilities.rb
deleted file mode 100644
index 69811608c2..0000000000
--- a/lib/test/unit/ui/testrunnerutilities.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-module Test
- module Unit
- module UI
-
- # Provides some utilities common to most, if not all,
- # TestRunners.
- #
- #--
- #
- # Perhaps there ought to be a TestRunner superclass? There
- # seems to be a decent amount of shared code between test
- # runners.
-
- module TestRunnerUtilities
-
- # Takes care of the ARGV parsing and suite
- # determination necessary for running one of the
- # TestRunners from the command line.
- def start_command_line_test
- if ARGV.empty?
- puts "You should supply the name of a test suite file to the runner"
- exit
- end
- require ARGV[0].gsub(/.+::/, '')
- new(eval(ARGV[0])).start
- end
- end
- end
- end
-end
diff --git a/lib/test/unit/util/observable.rb b/lib/test/unit/util/observable.rb
deleted file mode 100644
index f5066d3425..0000000000
--- a/lib/test/unit/util/observable.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-require 'test/unit/util/procwrapper'
-
-module Test
- module Unit
- module Util # :nodoc:
-
- # This is a utility class that allows anything mixing
- # it in to notify a set of listeners about interesting
- # events.
- module Observable
- # We use this for defaults since nil might mean something
- NOTHING = "NOTHING/#{__id__}"
-
- # Adds the passed proc as a listener on the
- # channel indicated by channel_name. listener_key
- # is used to remove the listener later; if none is
- # specified, the proc itself is used.
- #
- # Whatever is used as the listener_key is
- # returned, making it very easy to use the proc
- # itself as the listener_key:
- #
- # listener = add_listener("Channel") { ... }
- # remove_listener("Channel", listener)
- def add_listener(channel_name, listener_key=NOTHING, &listener) # :yields: value
- unless(block_given?)
- raise ArgumentError.new("No callback was passed as a listener")
- end
-
- key = listener_key
- if (listener_key == NOTHING)
- listener_key = listener
- key = ProcWrapper.new(listener)
- end
-
- channels[channel_name] ||= {}
- channels[channel_name][key] = listener
- return listener_key
- end
-
- # Removes the listener indicated by listener_key
- # from the channel indicated by
- # channel_name. Returns the registered proc, or
- # nil if none was found.
- def remove_listener(channel_name, listener_key)
- channel = channels[channel_name]
- return nil unless (channel)
- key = listener_key
- if (listener_key.instance_of?(Proc))
- key = ProcWrapper.new(listener_key)
- end
- if (channel.has_key?(key))
- return channel.delete(key)
- end
- return nil
- end
-
- # Calls all the procs registered on the channel
- # indicated by channel_name. If value is
- # specified, it is passed in to the procs,
- # otherwise they are called with no arguments.
- #
- #--
- #
- # Perhaps this should be private? Would it ever
- # make sense for an external class to call this
- # method directly?
- def notify_listeners(channel_name, *arguments)
- channel = channels[channel_name]
- return 0 unless (channel)
- listeners = channel.values
- listeners.each { |listener| listener.call(*arguments) }
- return listeners.size
- end
-
- private
- def channels # :nodoc:
- @channels ||= {}
- return @channels
- end
- end
- end
- end
-end
diff --git a/lib/test/unit/util/procwrapper.rb b/lib/test/unit/util/procwrapper.rb
deleted file mode 100644
index fea66d7671..0000000000
--- a/lib/test/unit/util/procwrapper.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# :nodoc:
-#
-# Author:: Nathaniel Talbott.
-# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
-# License:: Ruby license.
-
-module Test
- module Unit
- module Util
-
- # Allows the storage of a Proc passed through '&' in a
- # hash.
- #
- # Note: this may be inefficient, since the hash being
- # used is not necessarily very good. In Observable,
- # efficiency is not too important, since the hash is
- # only accessed when adding and removing listeners,
- # not when notifying.
-
- class ProcWrapper
-
- # Creates a new wrapper for a_proc.
- def initialize(a_proc)
- @a_proc = a_proc
- @hash = a_proc.inspect.sub(/^(#<#{a_proc.class}:)/){''}.sub(/(>)$/){''}.hex
- end
-
- def hash # :nodoc:
- return @hash
- end
-
- def ==(other) # :nodoc:
- case(other)
- when ProcWrapper
- return @a_proc == other.to_proc
- else
- return super
- end
- end
- alias :eql? :==
-
- def to_proc # :nodoc:
- return @a_proc
- end
- end
- end
- end
-end