junit-3.8.2/0000755000175000017500000000000010402050446011634 5ustar mkochmkochjunit-3.8.2/javadoc/0000755000175000017500000000000010402050444013241 5ustar mkochmkochjunit-3.8.2/javadoc/index-all.html0000644000175000017500000014002110402050444016002 0ustar mkochmkoch Index (JUnit API)
A B C E F G I J P R S T W

A

ActiveTestSuite - class junit.extensions.ActiveTestSuite.
A TestSuite for active Tests.
ActiveTestSuite() - Constructor for class junit.extensions.ActiveTestSuite
 
ActiveTestSuite(Class) - Constructor for class junit.extensions.ActiveTestSuite
 
ActiveTestSuite(String) - Constructor for class junit.extensions.ActiveTestSuite
 
ActiveTestSuite(Class, String) - Constructor for class junit.extensions.ActiveTestSuite
 
Assert - class junit.framework.Assert.
A set of assert methods.
Assert() - Constructor for class junit.framework.Assert
Protect constructor since it is a static only class
AssertionFailedError - error junit.framework.AssertionFailedError.
Thrown when an assertion failed.
AssertionFailedError() - Constructor for class junit.framework.AssertionFailedError
 
AssertionFailedError(String) - Constructor for class junit.framework.AssertionFailedError
 
addError(Test, Throwable) - Method in interface junit.framework.TestListener
An error occurred.
addError(Test, Throwable) - Method in class junit.framework.TestResult
Adds an error to the list of errors.
addFailure(Test, AssertionFailedError) - Method in interface junit.framework.TestListener
A failure occurred.
addFailure(Test, AssertionFailedError) - Method in class junit.framework.TestResult
Adds a failure to the list of failures.
addListener(TestListener) - Method in class junit.framework.TestResult
Registers a TestListener
addTest(Test) - Method in class junit.framework.TestSuite
Adds a test to the suite.
addTestSuite(Class) - Method in class junit.framework.TestSuite
Adds the tests from the given class to the suite
assertEquals(String, Object, Object) - Static method in class junit.framework.Assert
Asserts that two objects are equal.
assertEquals(Object, Object) - Static method in class junit.framework.Assert
Asserts that two objects are equal.
assertEquals(String, String, String) - Static method in class junit.framework.Assert
Asserts that two Strings are equal.
assertEquals(String, String) - Static method in class junit.framework.Assert
Asserts that two Strings are equal.
assertEquals(String, double, double, double) - Static method in class junit.framework.Assert
Asserts that two doubles are equal concerning a delta.
assertEquals(double, double, double) - Static method in class junit.framework.Assert
Asserts that two doubles are equal concerning a delta.
assertEquals(String, float, float, float) - Static method in class junit.framework.Assert
Asserts that two floats are equal concerning a delta.
assertEquals(float, float, float) - Static method in class junit.framework.Assert
Asserts that two floats are equal concerning a delta.
assertEquals(String, long, long) - Static method in class junit.framework.Assert
Asserts that two longs are equal.
assertEquals(long, long) - Static method in class junit.framework.Assert
Asserts that two longs are equal.
assertEquals(String, boolean, boolean) - Static method in class junit.framework.Assert
Asserts that two booleans are equal.
assertEquals(boolean, boolean) - Static method in class junit.framework.Assert
Asserts that two booleans are equal.
assertEquals(String, byte, byte) - Static method in class junit.framework.Assert
Asserts that two bytes are equal.
assertEquals(byte, byte) - Static method in class junit.framework.Assert
Asserts that two bytes are equal.
assertEquals(String, char, char) - Static method in class junit.framework.Assert
Asserts that two chars are equal.
assertEquals(char, char) - Static method in class junit.framework.Assert
Asserts that two chars are equal.
assertEquals(String, short, short) - Static method in class junit.framework.Assert
Asserts that two shorts are equal.
assertEquals(short, short) - Static method in class junit.framework.Assert
Asserts that two shorts are equal.
assertEquals(String, int, int) - Static method in class junit.framework.Assert
Asserts that two ints are equal.
assertEquals(int, int) - Static method in class junit.framework.Assert
Asserts that two ints are equal.
assertFalse(String, boolean) - Static method in class junit.framework.Assert
Asserts that a condition is false.
assertFalse(boolean) - Static method in class junit.framework.Assert
Asserts that a condition is false.
assertNotNull(Object) - Static method in class junit.framework.Assert
Asserts that an object isn't null.
assertNotNull(String, Object) - Static method in class junit.framework.Assert
Asserts that an object isn't null.
assertNotSame(String, Object, Object) - Static method in class junit.framework.Assert
Asserts that two objects do not refer to the same object.
assertNotSame(Object, Object) - Static method in class junit.framework.Assert
Asserts that two objects do not refer to the same object.
assertNull(Object) - Static method in class junit.framework.Assert
Asserts that an object is null.
assertNull(String, Object) - Static method in class junit.framework.Assert
Asserts that an object is null.
assertSame(String, Object, Object) - Static method in class junit.framework.Assert
Asserts that two objects refer to the same object.
assertSame(Object, Object) - Static method in class junit.framework.Assert
Asserts that two objects refer to the same object.
assertTrue(String, boolean) - Static method in class junit.framework.Assert
Asserts that a condition is true.
assertTrue(boolean) - Static method in class junit.framework.Assert
Asserts that a condition is true.

B

basicRun(TestResult) - Method in class junit.extensions.TestDecorator
The basic run behaviour.

C

ComparisonCompactor - class junit.framework.ComparisonCompactor.
 
ComparisonCompactor(int, String, String) - Constructor for class junit.framework.ComparisonCompactor
 
ComparisonFailure - error junit.framework.ComparisonFailure.
Thrown when an assert equals for Strings failed.
ComparisonFailure(String, String, String) - Constructor for class junit.framework.ComparisonFailure
Constructs a comparison failure.
compact(String) - Method in class junit.framework.ComparisonCompactor
 
countTestCases() - Method in class junit.extensions.RepeatedTest
 
countTestCases() - Method in class junit.extensions.TestDecorator
 
countTestCases() - Method in interface junit.framework.Test
Counts the number of test cases that will be run by this test.
countTestCases() - Method in class junit.framework.TestCase
Counts the number of test cases executed by run(TestResult result).
countTestCases() - Method in class junit.framework.TestSuite
Counts the number of test cases that will be run by this test.
createResult() - Method in class junit.framework.TestCase
Creates a default TestResult object
createTest(Class, String) - Static method in class junit.framework.TestSuite
...as the moon sets over the early morning Merlin, Oregon mountains, our intrepid adventurers type...

E

ExceptionTestCase - class junit.extensions.ExceptionTestCase.
A TestCase that expects an Exception of class fExpected to be thrown.
ExceptionTestCase(String, Class) - Constructor for class junit.extensions.ExceptionTestCase
 
endTest(Test) - Method in interface junit.framework.TestListener
A test ended.
endTest(Test) - Method in class junit.framework.TestResult
Informs the result that a test was completed.
errorCount() - Method in class junit.framework.TestResult
Gets the number of detected errors.
errors() - Method in class junit.framework.TestResult
Returns an Enumeration for the errors
exceptionMessage() - Method in class junit.framework.TestFailure
 

F

fErrors - Variable in class junit.framework.TestResult
 
fFailedTest - Variable in class junit.framework.TestFailure
 
fFailures - Variable in class junit.framework.TestResult
 
fListeners - Variable in class junit.framework.TestResult
 
fRunTests - Variable in class junit.framework.TestResult
 
fTest - Variable in class junit.extensions.TestDecorator
 
fThrownException - Variable in class junit.framework.TestFailure
 
fail(String) - Static method in class junit.framework.Assert
Fails a test with the given message.
fail() - Static method in class junit.framework.Assert
Fails a test with no message.
failNotEquals(String, Object, Object) - Static method in class junit.framework.Assert
 
failNotSame(String, Object, Object) - Static method in class junit.framework.Assert
 
failSame(String) - Static method in class junit.framework.Assert
 
failedTest() - Method in class junit.framework.TestFailure
Gets the failed test.
failureCount() - Method in class junit.framework.TestResult
Gets the number of detected failures.
failures() - Method in class junit.framework.TestResult
Returns an Enumeration for the failures

G

getActual() - Method in class junit.framework.ComparisonFailure
Gets the actual string value
getExpected() - Method in class junit.framework.ComparisonFailure
Gets the expected string value
getMessage() - Method in class junit.framework.ComparisonFailure
Returns "..." in place of common prefix and "..." in place of common suffix between expected and actual.
getName() - Method in class junit.framework.TestCase
Gets the name of a TestCase
getName() - Method in class junit.framework.TestSuite
Returns the name of the suite.
getTest() - Method in class junit.extensions.TestDecorator
 
getTestConstructor(Class) - Static method in class junit.framework.TestSuite
Gets a constructor which takes a single String as its argument or a no arg constructor.

I

isFailure() - Method in class junit.framework.TestFailure
 

J

junit.extensions - package junit.extensions
 
junit.framework - package junit.framework
 

P

Protectable - interface junit.framework.Protectable.
A Protectable can be run and can throw a Throwable.
protect() - Method in interface junit.framework.Protectable
Run the the following method protected.

R

RepeatedTest - class junit.extensions.RepeatedTest.
A Decorator that runs a test repeatedly.
RepeatedTest(Test, int) - Constructor for class junit.extensions.RepeatedTest
 
removeListener(TestListener) - Method in class junit.framework.TestResult
Unregisters a TestListener
run(TestResult) - Method in class junit.extensions.ActiveTestSuite
 
run(TestResult) - Method in class junit.extensions.RepeatedTest
 
run(TestResult) - Method in class junit.extensions.TestDecorator
 
run(TestResult) - Method in class junit.extensions.TestSetup
 
run(TestResult) - Method in interface junit.framework.Test
Runs a test and collects its result in a TestResult instance.
run() - Method in class junit.framework.TestCase
A convenience method to run this test, collecting the results with a default TestResult object.
run(TestResult) - Method in class junit.framework.TestCase
Runs the test case and collects the results in TestResult.
run(TestCase) - Method in class junit.framework.TestResult
Runs a TestCase.
run(TestResult) - Method in class junit.framework.TestSuite
Runs the tests and collects their result in a TestResult.
runBare() - Method in class junit.framework.TestCase
Runs the bare test sequence.
runCount() - Method in class junit.framework.TestResult
Gets the number of run tests.
runFinished() - Method in class junit.extensions.ActiveTestSuite
 
runProtected(Test, Protectable) - Method in class junit.framework.TestResult
Runs a TestCase.
runTest(Test, TestResult) - Method in class junit.extensions.ActiveTestSuite
 
runTest() - Method in class junit.extensions.ExceptionTestCase
Execute the test method expecting that an Exception of class fExpected or one of its subclasses will be thrown
runTest() - Method in class junit.framework.TestCase
Override to run the test and assert its state.
runTest(Test, TestResult) - Method in class junit.framework.TestSuite
 

S

setName(String) - Method in class junit.framework.TestCase
Sets the name of a TestCase
setName(String) - Method in class junit.framework.TestSuite
Sets the name of the suite.
setUp() - Method in class junit.extensions.TestSetup
Sets up the fixture.
setUp() - Method in class junit.framework.TestCase
Sets up the fixture, for example, open a network connection.
shouldStop() - Method in class junit.framework.TestResult
Checks whether the test run should stop
startTest(Test) - Method in interface junit.framework.TestListener
A test started.
startTest(Test) - Method in class junit.framework.TestResult
Informs the result that a test will be started.
stop() - Method in class junit.framework.TestResult
Marks that the test run should stop.

T

Test - interface junit.framework.Test.
A Test can be run and collect its results.
TestCase - class junit.framework.TestCase.
A test case defines the fixture to run multiple tests.
TestCase() - Constructor for class junit.framework.TestCase
No-arg constructor to enable serialization.
TestCase(String) - Constructor for class junit.framework.TestCase
Constructs a test case with the given name.
TestDecorator - class junit.extensions.TestDecorator.
A Decorator for Tests.
TestDecorator(Test) - Constructor for class junit.extensions.TestDecorator
 
TestFailure - class junit.framework.TestFailure.
A TestFailure collects a failed test together with the caught exception.
TestFailure(Test, Throwable) - Constructor for class junit.framework.TestFailure
Constructs a TestFailure with the given test and exception.
TestListener - interface junit.framework.TestListener.
A Listener for test progress
TestResult - class junit.framework.TestResult.
A TestResult collects the results of executing a test case.
TestResult() - Constructor for class junit.framework.TestResult
 
TestSetup - class junit.extensions.TestSetup.
A Decorator to set up and tear down additional fixture state.
TestSetup(Test) - Constructor for class junit.extensions.TestSetup
 
TestSuite - class junit.framework.TestSuite.
A TestSuite is a Composite of Tests.
TestSuite() - Constructor for class junit.framework.TestSuite
Constructs an empty TestSuite.
TestSuite(Class) - Constructor for class junit.framework.TestSuite
Constructs a TestSuite from the given class.
TestSuite(Class, String) - Constructor for class junit.framework.TestSuite
Constructs a TestSuite from the given class with the given name.
TestSuite(String) - Constructor for class junit.framework.TestSuite
Constructs an empty TestSuite.
TestSuite(Class[]) - Constructor for class junit.framework.TestSuite
Constructs a TestSuite from the given array of classes.
TestSuite(Class[], String) - Constructor for class junit.framework.TestSuite
Constructs a TestSuite from the given array of classes with the given name.
tearDown() - Method in class junit.extensions.TestSetup
Tears down the fixture.
tearDown() - Method in class junit.framework.TestCase
Tears down the fixture, for example, close a network connection.
testAt(int) - Method in class junit.framework.TestSuite
Returns the test at the given index
testCount() - Method in class junit.framework.TestSuite
Returns the number of tests in this suite
tests() - Method in class junit.framework.TestSuite
Returns the tests as an enumeration
thrownException() - Method in class junit.framework.TestFailure
Gets the thrown exception.
toString() - Method in class junit.extensions.RepeatedTest
 
toString() - Method in class junit.extensions.TestDecorator
 
toString() - Method in class junit.framework.TestCase
Returns a string representation of the test case
toString() - Method in class junit.framework.TestFailure
Returns a short description of the failure.
toString() - Method in class junit.framework.TestSuite
 
trace() - Method in class junit.framework.TestFailure
 

W

warning(String) - Static method in class junit.framework.TestSuite
Returns a test which will fail and log a warning message.
wasSuccessful() - Method in class junit.framework.TestResult
Returns whether the entire test was successful or not.

A B C E F G I J P R S T W

junit-3.8.2/javadoc/packages.html0000644000175000017500000000152110402050444015704 0ustar mkochmkoch (JUnit API)


The front page has been relocated.Please see:
          Frame version
          Non-frame version.
junit-3.8.2/javadoc/constant-values.html0000644000175000017500000001146010402050444017257 0ustar mkochmkoch Constant Field Values (JUnit API)

Constant Field Values


Contents

junit-3.8.2/javadoc/junit/0000755000175000017500000000000010402050444014372 5ustar mkochmkochjunit-3.8.2/javadoc/junit/framework/0000755000175000017500000000000010402050444016367 5ustar mkochmkochjunit-3.8.2/javadoc/junit/framework/package-tree.html0000644000175000017500000001637210402050444021616 0ustar mkochmkoch junit.framework Class Hierarchy (JUnit API)

Hierarchy For Package junit.framework

Package Hierarchies:
All Packages

Class Hierarchy

Interface Hierarchy



junit-3.8.2/javadoc/junit/framework/TestSuite.html0000644000175000017500000006041310402050444021212 0ustar mkochmkoch TestSuite (JUnit API)

junit.framework
Class TestSuite

java.lang.Object
  extended byjunit.framework.TestSuite
All Implemented Interfaces:
Test
Direct Known Subclasses:
ActiveTestSuite

public class TestSuite
extends java.lang.Object
implements Test

A TestSuite is a Composite of Tests. It runs a collection of test cases. Here is an example using the dynamic test definition.

 TestSuite suite= new TestSuite();
 suite.addTest(new MathTest("testAdd"));
 suite.addTest(new MathTest("testDivideByZero"));
 
Alternatively, a TestSuite can extract the tests to be run automatically. To do so you pass the class of your TestCase class to the TestSuite constructor.
 TestSuite suite= new TestSuite(MathTest.class);
 
This constructor creates a suite with all the methods starting with "test" that take no arguments.

A final option is to do the same for a large array of test classes.

 Class[] testClasses = { MathTest.class, AnotherTest.class }
 TestSuite suite= new TestSuite(testClasses);
 

See Also:
Test

Constructor Summary
TestSuite()
          Constructs an empty TestSuite.
TestSuite(java.lang.Class theClass)
          Constructs a TestSuite from the given class.
TestSuite(java.lang.Class[] classes)
          Constructs a TestSuite from the given array of classes.
TestSuite(java.lang.Class[] classes, java.lang.String name)
          Constructs a TestSuite from the given array of classes with the given name.
TestSuite(java.lang.Class theClass, java.lang.String name)
          Constructs a TestSuite from the given class with the given name.
TestSuite(java.lang.String name)
          Constructs an empty TestSuite.
 
Method Summary
 void addTest(Test test)
          Adds a test to the suite.
 void addTestSuite(java.lang.Class testClass)
          Adds the tests from the given class to the suite
 int countTestCases()
          Counts the number of test cases that will be run by this test.
static Test createTest(java.lang.Class theClass, java.lang.String name)
          ...as the moon sets over the early morning Merlin, Oregon mountains, our intrepid adventurers type...
 java.lang.String getName()
          Returns the name of the suite.
static java.lang.reflect.Constructor getTestConstructor(java.lang.Class theClass)
          Gets a constructor which takes a single String as its argument or a no arg constructor.
 void run(TestResult result)
          Runs the tests and collects their result in a TestResult.
 void runTest(Test test, TestResult result)
           
 void setName(java.lang.String name)
          Sets the name of the suite.
 Test testAt(int index)
          Returns the test at the given index
 int testCount()
          Returns the number of tests in this suite
 java.util.Enumeration tests()
          Returns the tests as an enumeration
 java.lang.String toString()
           
static Test warning(java.lang.String message)
          Returns a test which will fail and log a warning message.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

TestSuite

public TestSuite()
Constructs an empty TestSuite.


TestSuite

public TestSuite(java.lang.Class theClass)
Constructs a TestSuite from the given class. Adds all the methods starting with "test" as test cases to the suite. Parts of this method was written at 2337 meters in the Hueffihuette, Kanton Uri


TestSuite

public TestSuite(java.lang.Class theClass,
                 java.lang.String name)
Constructs a TestSuite from the given class with the given name.

See Also:
TestSuite(Class)

TestSuite

public TestSuite(java.lang.String name)
Constructs an empty TestSuite.


TestSuite

public TestSuite(java.lang.Class[] classes)
Constructs a TestSuite from the given array of classes.

Parameters:
classes -

TestSuite

public TestSuite(java.lang.Class[] classes,
                 java.lang.String name)
Constructs a TestSuite from the given array of classes with the given name.

See Also:
TestSuite(Class[])
Method Detail

createTest

public static Test createTest(java.lang.Class theClass,
                              java.lang.String name)
...as the moon sets over the early morning Merlin, Oregon mountains, our intrepid adventurers type...


getTestConstructor

public static java.lang.reflect.Constructor getTestConstructor(java.lang.Class theClass)
                                                        throws java.lang.NoSuchMethodException
Gets a constructor which takes a single String as its argument or a no arg constructor.

Throws:
java.lang.NoSuchMethodException

warning

public static Test warning(java.lang.String message)
Returns a test which will fail and log a warning message.


addTest

public void addTest(Test test)
Adds a test to the suite.


addTestSuite

public void addTestSuite(java.lang.Class testClass)
Adds the tests from the given class to the suite


countTestCases

public int countTestCases()
Counts the number of test cases that will be run by this test.

Specified by:
countTestCases in interface Test

getName

public java.lang.String getName()
Returns the name of the suite. Not all test suites have a name and this method can return null.


run

public void run(TestResult result)
Runs the tests and collects their result in a TestResult.

Specified by:
run in interface Test

runTest

public void runTest(Test test,
                    TestResult result)

setName

public void setName(java.lang.String name)
Sets the name of the suite.

Parameters:
name - The name to set

testAt

public Test testAt(int index)
Returns the test at the given index


testCount

public int testCount()
Returns the number of tests in this suite


tests

public java.util.Enumeration tests()
Returns the tests as an enumeration


toString

public java.lang.String toString()


junit-3.8.2/javadoc/junit/framework/Protectable.html0000644000175000017500000001737210402050444021533 0ustar mkochmkoch Protectable (JUnit API)

junit.framework
Interface Protectable


public interface Protectable

A Protectable can be run and can throw a Throwable.

See Also:
TestResult

Method Summary
 void protect()
          Run the the following method protected.
 

Method Detail

protect

public void protect()
             throws java.lang.Throwable
Run the the following method protected.

Throws:
java.lang.Throwable


junit-3.8.2/javadoc/junit/framework/ComparisonFailure.html0000644000175000017500000003071510402050444022705 0ustar mkochmkoch ComparisonFailure (JUnit API)

junit.framework
Class ComparisonFailure

java.lang.Object
  extended byjava.lang.Throwable
      extended byjava.lang.Error
          extended byjunit.framework.AssertionFailedError
              extended byjunit.framework.ComparisonFailure
All Implemented Interfaces:
java.io.Serializable

public class ComparisonFailure
extends AssertionFailedError

Thrown when an assert equals for Strings failed. Inspired by a patch from Alex Chaffee mailto:alex@purpletech.com

See Also:
Serialized Form

Constructor Summary
ComparisonFailure(java.lang.String message, java.lang.String expected, java.lang.String actual)
          Constructs a comparison failure.
 
Method Summary
 java.lang.String getActual()
          Gets the actual string value
 java.lang.String getExpected()
          Gets the expected string value
 java.lang.String getMessage()
          Returns "..." in place of common prefix and "..." in place of common suffix between expected and actual.
 
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ComparisonFailure

public ComparisonFailure(java.lang.String message,
                         java.lang.String expected,
                         java.lang.String actual)
Constructs a comparison failure.

Parameters:
message - the identifying message or null
expected - the expected string value
actual - the actual string value
Method Detail

getMessage

public java.lang.String getMessage()
Returns "..." in place of common prefix and "..." in place of common suffix between expected and actual.

See Also:
Throwable.getMessage()

getActual

public java.lang.String getActual()
Gets the actual string value

Returns:
the actual string value

getExpected

public java.lang.String getExpected()
Gets the expected string value

Returns:
the expected string value


junit-3.8.2/javadoc/junit/framework/Assert.html0000644000175000017500000011656410402050444020533 0ustar mkochmkoch Assert (JUnit API)

junit.framework
Class Assert

java.lang.Object
  extended byjunit.framework.Assert
Direct Known Subclasses:
TestCase, TestDecorator

public class Assert
extends java.lang.Object

A set of assert methods. Messages are only displayed when an assert fails.


Constructor Summary
protected Assert()
          Protect constructor since it is a static only class
 
Method Summary
static void assertEquals(boolean expected, boolean actual)
          Asserts that two booleans are equal.
static void assertEquals(byte expected, byte actual)
          Asserts that two bytes are equal.
static void assertEquals(char expected, char actual)
          Asserts that two chars are equal.
static void assertEquals(double expected, double actual, double delta)
          Asserts that two doubles are equal concerning a delta.
static void assertEquals(float expected, float actual, float delta)
          Asserts that two floats are equal concerning a delta.
static void assertEquals(int expected, int actual)
          Asserts that two ints are equal.
static void assertEquals(long expected, long actual)
          Asserts that two longs are equal.
static void assertEquals(java.lang.Object expected, java.lang.Object actual)
          Asserts that two objects are equal.
static void assertEquals(short expected, short actual)
          Asserts that two shorts are equal.
static void assertEquals(java.lang.String message, boolean expected, boolean actual)
          Asserts that two booleans are equal.
static void assertEquals(java.lang.String message, byte expected, byte actual)
          Asserts that two bytes are equal.
static void assertEquals(java.lang.String message, char expected, char actual)
          Asserts that two chars are equal.
static void assertEquals(java.lang.String message, double expected, double actual, double delta)
          Asserts that two doubles are equal concerning a delta.
static void assertEquals(java.lang.String message, float expected, float actual, float delta)
          Asserts that two floats are equal concerning a delta.
static void assertEquals(java.lang.String message, int expected, int actual)
          Asserts that two ints are equal.
static void assertEquals(java.lang.String message, long expected, long actual)
          Asserts that two longs are equal.
static void assertEquals(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
          Asserts that two objects are equal.
static void assertEquals(java.lang.String message, short expected, short actual)
          Asserts that two shorts are equal.
static void assertEquals(java.lang.String expected, java.lang.String actual)
          Asserts that two Strings are equal.
static void assertEquals(java.lang.String message, java.lang.String expected, java.lang.String actual)
          Asserts that two Strings are equal.
static void assertFalse(boolean condition)
          Asserts that a condition is false.
static void assertFalse(java.lang.String message, boolean condition)
          Asserts that a condition is false.
static void assertNotNull(java.lang.Object object)
          Asserts that an object isn't null.
static void assertNotNull(java.lang.String message, java.lang.Object object)
          Asserts that an object isn't null.
static void assertNotSame(java.lang.Object expected, java.lang.Object actual)
          Asserts that two objects do not refer to the same object.
static void assertNotSame(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
          Asserts that two objects do not refer to the same object.
static void assertNull(java.lang.Object object)
          Asserts that an object is null.
static void assertNull(java.lang.String message, java.lang.Object object)
          Asserts that an object is null.
static void assertSame(java.lang.Object expected, java.lang.Object actual)
          Asserts that two objects refer to the same object.
static void assertSame(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
          Asserts that two objects refer to the same object.
static void assertTrue(boolean condition)
          Asserts that a condition is true.
static void assertTrue(java.lang.String message, boolean condition)
          Asserts that a condition is true.
static void fail()
          Fails a test with no message.
static void fail(java.lang.String message)
          Fails a test with the given message.
static void failNotEquals(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
           
static void failNotSame(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
           
static void failSame(java.lang.String message)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Assert

protected Assert()
Protect constructor since it is a static only class

Method Detail

assertTrue

public static void assertTrue(java.lang.String message,
                              boolean condition)
Asserts that a condition is true. If it isn't it throws an AssertionFailedError with the given message.


assertTrue

public static void assertTrue(boolean condition)
Asserts that a condition is true. If it isn't it throws an AssertionFailedError.


assertFalse

public static void assertFalse(java.lang.String message,
                               boolean condition)
Asserts that a condition is false. If it isn't it throws an AssertionFailedError with the given message.


assertFalse

public static void assertFalse(boolean condition)
Asserts that a condition is false. If it isn't it throws an AssertionFailedError.


fail

public static void fail(java.lang.String message)
Fails a test with the given message.


fail

public static void fail()
Fails a test with no message.


assertEquals

public static void assertEquals(java.lang.String message,
                                java.lang.Object expected,
                                java.lang.Object actual)
Asserts that two objects are equal. If they are not an AssertionFailedError is thrown with the given message.


assertEquals

public static void assertEquals(java.lang.Object expected,
                                java.lang.Object actual)
Asserts that two objects are equal. If they are not an AssertionFailedError is thrown.


assertEquals

public static void assertEquals(java.lang.String message,
                                java.lang.String expected,
                                java.lang.String actual)
Asserts that two Strings are equal.


assertEquals

public static void assertEquals(java.lang.String expected,
                                java.lang.String actual)
Asserts that two Strings are equal.


assertEquals

public static void assertEquals(java.lang.String message,
                                double expected,
                                double actual,
                                double delta)
Asserts that two doubles are equal concerning a delta. If they are not an AssertionFailedError is thrown with the given message. If the expected value is infinity then the delta value is ignored.


assertEquals

public static void assertEquals(double expected,
                                double actual,
                                double delta)
Asserts that two doubles are equal concerning a delta. If the expected value is infinity then the delta value is ignored.


assertEquals

public static void assertEquals(java.lang.String message,
                                float expected,
                                float actual,
                                float delta)
Asserts that two floats are equal concerning a delta. If they are not an AssertionFailedError is thrown with the given message. If the expected value is infinity then the delta value is ignored.


assertEquals

public static void assertEquals(float expected,
                                float actual,
                                float delta)
Asserts that two floats are equal concerning a delta. If the expected value is infinity then the delta value is ignored.


assertEquals

public static void assertEquals(java.lang.String message,
                                long expected,
                                long actual)
Asserts that two longs are equal. If they are not an AssertionFailedError is thrown with the given message.


assertEquals

public static void assertEquals(long expected,
                                long actual)
Asserts that two longs are equal.


assertEquals

public static void assertEquals(java.lang.String message,
                                boolean expected,
                                boolean actual)
Asserts that two booleans are equal. If they are not an AssertionFailedError is thrown with the given message.


assertEquals

public static void assertEquals(boolean expected,
                                boolean actual)
Asserts that two booleans are equal.


assertEquals

public static void assertEquals(java.lang.String message,
                                byte expected,
                                byte actual)
Asserts that two bytes are equal. If they are not an AssertionFailedError is thrown with the given message.


assertEquals

public static void assertEquals(byte expected,
                                byte actual)
Asserts that two bytes are equal.


assertEquals

public static void assertEquals(java.lang.String message,
                                char expected,
                                char actual)
Asserts that two chars are equal. If they are not an AssertionFailedError is thrown with the given message.


assertEquals

public static void assertEquals(char expected,
                                char actual)
Asserts that two chars are equal.


assertEquals

public static void assertEquals(java.lang.String message,
                                short expected,
                                short actual)
Asserts that two shorts are equal. If they are not an AssertionFailedError is thrown with the given message.


assertEquals

public static void assertEquals(short expected,
                                short actual)
Asserts that two shorts are equal.


assertEquals

public static void assertEquals(java.lang.String message,
                                int expected,
                                int actual)
Asserts that two ints are equal. If they are not an AssertionFailedError is thrown with the given message.


assertEquals

public static void assertEquals(int expected,
                                int actual)
Asserts that two ints are equal.


assertNotNull

public static void assertNotNull(java.lang.Object object)
Asserts that an object isn't null.


assertNotNull

public static void assertNotNull(java.lang.String message,
                                 java.lang.Object object)
Asserts that an object isn't null. If it is an AssertionFailedError is thrown with the given message.


assertNull

public static void assertNull(java.lang.Object object)
Asserts that an object is null.


assertNull

public static void assertNull(java.lang.String message,
                              java.lang.Object object)
Asserts that an object is null. If it is not an AssertionFailedError is thrown with the given message.


assertSame

public static void assertSame(java.lang.String message,
                              java.lang.Object expected,
                              java.lang.Object actual)
Asserts that two objects refer to the same object. If they are not an AssertionFailedError is thrown with the given message.


assertSame

public static void assertSame(java.lang.Object expected,
                              java.lang.Object actual)
Asserts that two objects refer to the same object. If they are not the same an AssertionFailedError is thrown.


assertNotSame

public static void assertNotSame(java.lang.String message,
                                 java.lang.Object expected,
                                 java.lang.Object actual)
Asserts that two objects do not refer to the same object. If they do refer to the same object an AssertionFailedError is thrown with the given message.


assertNotSame

public static void assertNotSame(java.lang.Object expected,
                                 java.lang.Object actual)
Asserts that two objects do not refer to the same object. If they do refer to the same object an AssertionFailedError is thrown.


failSame

public static void failSame(java.lang.String message)

failNotSame

public static void failNotSame(java.lang.String message,
                               java.lang.Object expected,
                               java.lang.Object actual)

failNotEquals

public static void failNotEquals(java.lang.String message,
                                 java.lang.Object expected,
                                 java.lang.Object actual)


junit-3.8.2/javadoc/junit/framework/TestCase.html0000644000175000017500000006171510402050444021002 0ustar mkochmkoch TestCase (JUnit API)

junit.framework
Class TestCase

java.lang.Object
  extended byjunit.framework.Assert
      extended byjunit.framework.TestCase
All Implemented Interfaces:
Test
Direct Known Subclasses:
ExceptionTestCase

public abstract class TestCase
extends Assert
implements Test

A test case defines the fixture to run multiple tests. To define a test case
1) implement a subclass of TestCase
2) define instance variables that store the state of the fixture
3) initialize the fixture state by overriding setUp
4) clean-up after a test by overriding tearDown.
Each test runs in its own fixture so there can be no side effects among test runs. Here is an example:

 public class MathTest extends TestCase {
     protected double fValue1;
     protected double fValue2;

    protected void setUp() {
         fValue1= 2.0;
         fValue2= 3.0;
     }
 }
 
For each test implement a method which interacts with the fixture. Verify the expected results with assertions specified by calling assertTrue with a boolean.
    public void testAdd() {
        double result= fValue1 + fValue2;
        assertTrue(result == 5.0);
    }
 
Once the methods are defined you can run them. The framework supports both a static type safe and more dynamic way to run a test. In the static way you override the runTest method and define the method to be invoked. A convenient way to do so is with an anonymous inner class.
 TestCase test= new MathTest("add") {
        public void runTest() {
            testAdd();
        }
 };
 test.run();
 
The dynamic way uses reflection to implement runTest. It dynamically finds and invokes a method. In this case the name of the test case has to correspond to the test method to be run.
 TestCase test= new MathTest("testAdd");
 test.run();
 
The tests to be run can be collected into a TestSuite. JUnit provides different test runners which can run a test suite and collect the results. A test runner either expects a static method suite as the entry point to get a test to run or it will extract the suite automatically.
 public static Test suite() {
      suite.addTest(new MathTest("testAdd"));
      suite.addTest(new MathTest("testDivideByZero"));
      return suite;
  }
 

See Also:
TestResult, TestSuite

Constructor Summary
TestCase()
          No-arg constructor to enable serialization.
TestCase(java.lang.String name)
          Constructs a test case with the given name.
 
Method Summary
 int countTestCases()
          Counts the number of test cases executed by run(TestResult result).
protected  TestResult createResult()
          Creates a default TestResult object
 java.lang.String getName()
          Gets the name of a TestCase
 TestResult run()
          A convenience method to run this test, collecting the results with a default TestResult object.
 void run(TestResult result)
          Runs the test case and collects the results in TestResult.
 void runBare()
          Runs the bare test sequence.
protected  void runTest()
          Override to run the test and assert its state.
 void setName(java.lang.String name)
          Sets the name of a TestCase
protected  void setUp()
          Sets up the fixture, for example, open a network connection.
protected  void tearDown()
          Tears down the fixture, for example, close a network connection.
 java.lang.String toString()
          Returns a string representation of the test case
 
Methods inherited from class junit.framework.Assert
assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertFalse, assertFalse, assertNotNull, assertNotNull, assertNotSame, assertNotSame, assertNull, assertNull, assertSame, assertSame, assertTrue, assertTrue, fail, fail, failNotEquals, failNotSame, failSame
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

TestCase

public TestCase()
No-arg constructor to enable serialization. This method is not intended to be used by mere mortals without calling setName().


TestCase

public TestCase(java.lang.String name)
Constructs a test case with the given name.

Method Detail

countTestCases

public int countTestCases()
Counts the number of test cases executed by run(TestResult result).

Specified by:
countTestCases in interface Test

createResult

protected TestResult createResult()
Creates a default TestResult object

See Also:
TestResult

run

public TestResult run()
A convenience method to run this test, collecting the results with a default TestResult object.

See Also:
TestResult

run

public void run(TestResult result)
Runs the test case and collects the results in TestResult.

Specified by:
run in interface Test

runBare

public void runBare()
             throws java.lang.Throwable
Runs the bare test sequence.

Throws:
java.lang.Throwable - if any exception is thrown

runTest

protected void runTest()
                throws java.lang.Throwable
Override to run the test and assert its state.

Throws:
java.lang.Throwable - if any exception is thrown

setUp

protected void setUp()
              throws java.lang.Exception
Sets up the fixture, for example, open a network connection. This method is called before a test is executed.

Throws:
java.lang.Exception

tearDown

protected void tearDown()
                 throws java.lang.Exception
Tears down the fixture, for example, close a network connection. This method is called after a test is executed.

Throws:
java.lang.Exception

toString

public java.lang.String toString()
Returns a string representation of the test case


getName

public java.lang.String getName()
Gets the name of a TestCase

Returns:
returns a String

setName

public void setName(java.lang.String name)
Sets the name of a TestCase

Parameters:
name - The name to set


junit-3.8.2/javadoc/junit/framework/Test.html0000644000175000017500000002204110402050444020173 0ustar mkochmkoch Test (JUnit API)

junit.framework
Interface Test

All Known Implementing Classes:
TestCase, TestDecorator, TestSuite

public interface Test

A Test can be run and collect its results.

See Also:
TestResult

Method Summary
 int countTestCases()
          Counts the number of test cases that will be run by this test.
 void run(TestResult result)
          Runs a test and collects its result in a TestResult instance.
 

Method Detail

countTestCases

public int countTestCases()
Counts the number of test cases that will be run by this test.


run

public void run(TestResult result)
Runs a test and collects its result in a TestResult instance.



junit-3.8.2/javadoc/junit/framework/package-summary.html0000644000175000017500000002043510402050444022347 0ustar mkochmkoch junit.framework (JUnit API)

Package junit.framework

Interface Summary
Protectable A Protectable can be run and can throw a Throwable.
Test A Test can be run and collect its results.
TestListener A Listener for test progress
 

Class Summary
Assert A set of assert methods.
ComparisonCompactor  
TestCase A test case defines the fixture to run multiple tests.
TestFailure A TestFailure collects a failed test together with the caught exception.
TestResult A TestResult collects the results of executing a test case.
TestSuite A TestSuite is a Composite of Tests.
 

Error Summary
AssertionFailedError Thrown when an assertion failed.
ComparisonFailure Thrown when an assert equals for Strings failed.
 



junit-3.8.2/javadoc/junit/framework/TestResult.html0000644000175000017500000005620510402050444021403 0ustar mkochmkoch TestResult (JUnit API)

junit.framework
Class TestResult

java.lang.Object
  extended byjunit.framework.TestResult

public class TestResult
extends java.lang.Object

A TestResult collects the results of executing a test case. It is an instance of the Collecting Parameter pattern. The test framework distinguishes between failures and errors. A failure is anticipated and checked for with assertions. Errors are unanticipated problems like an ArrayIndexOutOfBoundsException.

See Also:
Test

Field Summary
protected  java.util.Vector fErrors
           
protected  java.util.Vector fFailures
           
protected  java.util.Vector fListeners
           
protected  int fRunTests
           
 
Constructor Summary
TestResult()
           
 
Method Summary
 void addError(Test test, java.lang.Throwable t)
          Adds an error to the list of errors.
 void addFailure(Test test, AssertionFailedError t)
          Adds a failure to the list of failures.
 void addListener(TestListener listener)
          Registers a TestListener
 void endTest(Test test)
          Informs the result that a test was completed.
 int errorCount()
          Gets the number of detected errors.
 java.util.Enumeration errors()
          Returns an Enumeration for the errors
 int failureCount()
          Gets the number of detected failures.
 java.util.Enumeration failures()
          Returns an Enumeration for the failures
 void removeListener(TestListener listener)
          Unregisters a TestListener
protected  void run(TestCase test)
          Runs a TestCase.
 int runCount()
          Gets the number of run tests.
 void runProtected(Test test, Protectable p)
          Runs a TestCase.
 boolean shouldStop()
          Checks whether the test run should stop
 void startTest(Test test)
          Informs the result that a test will be started.
 void stop()
          Marks that the test run should stop.
 boolean wasSuccessful()
          Returns whether the entire test was successful or not.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

fFailures

protected java.util.Vector fFailures

fErrors

protected java.util.Vector fErrors

fListeners

protected java.util.Vector fListeners

fRunTests

protected int fRunTests
Constructor Detail

TestResult

public TestResult()
Method Detail

addError

public void addError(Test test,
                     java.lang.Throwable t)
Adds an error to the list of errors. The passed in exception caused the error.


addFailure

public void addFailure(Test test,
                       AssertionFailedError t)
Adds a failure to the list of failures. The passed in exception caused the failure.


addListener

public void addListener(TestListener listener)
Registers a TestListener


removeListener

public void removeListener(TestListener listener)
Unregisters a TestListener


endTest

public void endTest(Test test)
Informs the result that a test was completed.


errorCount

public int errorCount()
Gets the number of detected errors.


errors

public java.util.Enumeration errors()
Returns an Enumeration for the errors


failureCount

public int failureCount()
Gets the number of detected failures.


failures

public java.util.Enumeration failures()
Returns an Enumeration for the failures


run

protected void run(TestCase test)
Runs a TestCase.


runCount

public int runCount()
Gets the number of run tests.


runProtected

public void runProtected(Test test,
                         Protectable p)
Runs a TestCase.


shouldStop

public boolean shouldStop()
Checks whether the test run should stop


startTest

public void startTest(Test test)
Informs the result that a test will be started.


stop

public void stop()
Marks that the test run should stop.


wasSuccessful

public boolean wasSuccessful()
Returns whether the entire test was successful or not.



junit-3.8.2/javadoc/junit/framework/TestFailure.html0000644000175000017500000003467310402050444021521 0ustar mkochmkoch TestFailure (JUnit API)

junit.framework
Class TestFailure

java.lang.Object
  extended byjunit.framework.TestFailure

public class TestFailure
extends java.lang.Object

A TestFailure collects a failed test together with the caught exception.

See Also:
TestResult

Field Summary
protected  Test fFailedTest
           
protected  java.lang.Throwable fThrownException
           
 
Constructor Summary
TestFailure(Test failedTest, java.lang.Throwable thrownException)
          Constructs a TestFailure with the given test and exception.
 
Method Summary
 java.lang.String exceptionMessage()
           
 Test failedTest()
          Gets the failed test.
 boolean isFailure()
           
 java.lang.Throwable thrownException()
          Gets the thrown exception.
 java.lang.String toString()
          Returns a short description of the failure.
 java.lang.String trace()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

fFailedTest

protected Test fFailedTest

fThrownException

protected java.lang.Throwable fThrownException
Constructor Detail

TestFailure

public TestFailure(Test failedTest,
                   java.lang.Throwable thrownException)
Constructs a TestFailure with the given test and exception.

Method Detail

failedTest

public Test failedTest()
Gets the failed test.


thrownException

public java.lang.Throwable thrownException()
Gets the thrown exception.


toString

public java.lang.String toString()
Returns a short description of the failure.


trace

public java.lang.String trace()

exceptionMessage

public java.lang.String exceptionMessage()

isFailure

public boolean isFailure()


junit-3.8.2/javadoc/junit/framework/TestListener.html0000644000175000017500000002453410402050444021712 0ustar mkochmkoch TestListener (JUnit API)

junit.framework
Interface TestListener


public interface TestListener

A Listener for test progress


Method Summary
 void addError(Test test, java.lang.Throwable t)
          An error occurred.
 void addFailure(Test test, AssertionFailedError t)
          A failure occurred.
 void endTest(Test test)
          A test ended.
 void startTest(Test test)
          A test started.
 

Method Detail

addError

public void addError(Test test,
                     java.lang.Throwable t)
An error occurred.


addFailure

public void addFailure(Test test,
                       AssertionFailedError t)
A failure occurred.


endTest

public void endTest(Test test)
A test ended.


startTest

public void startTest(Test test)
A test started.



junit-3.8.2/javadoc/junit/framework/ComparisonCompactor.html0000644000175000017500000002324010402050444023240 0ustar mkochmkoch ComparisonCompactor (JUnit API)

junit.framework
Class ComparisonCompactor

java.lang.Object
  extended byjunit.framework.ComparisonCompactor

public class ComparisonCompactor
extends java.lang.Object


Constructor Summary
ComparisonCompactor(int contextLength, java.lang.String expected, java.lang.String actual)
           
 
Method Summary
 java.lang.String compact(java.lang.String message)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ComparisonCompactor

public ComparisonCompactor(int contextLength,
                           java.lang.String expected,
                           java.lang.String actual)
Method Detail

compact

public java.lang.String compact(java.lang.String message)


junit-3.8.2/javadoc/junit/framework/AssertionFailedError.html0000644000175000017500000002333310402050444023347 0ustar mkochmkoch AssertionFailedError (JUnit API)

junit.framework
Class AssertionFailedError

java.lang.Object
  extended byjava.lang.Throwable
      extended byjava.lang.Error
          extended byjunit.framework.AssertionFailedError
All Implemented Interfaces:
java.io.Serializable
Direct Known Subclasses:
ComparisonFailure

public class AssertionFailedError
extends java.lang.Error

Thrown when an assertion failed.

See Also:
Serialized Form

Constructor Summary
AssertionFailedError()
           
AssertionFailedError(java.lang.String message)
           
 
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

AssertionFailedError

public AssertionFailedError()

AssertionFailedError

public AssertionFailedError(java.lang.String message)


junit-3.8.2/javadoc/junit/framework/package-frame.html0000644000175000017500000000446110402050444021745 0ustar mkochmkoch junit.framework (JUnit API) junit.framework
Interfaces 
Protectable
Test
TestListener
Classes 
Assert
ComparisonCompactor
TestCase
TestFailure
TestResult
TestSuite
Errors 
AssertionFailedError
ComparisonFailure
junit-3.8.2/javadoc/junit/extensions/0000755000175000017500000000000010402050444016571 5ustar mkochmkochjunit-3.8.2/javadoc/junit/extensions/package-tree.html0000644000175000017500000001541210402050444022012 0ustar mkochmkoch junit.extensions Class Hierarchy (JUnit API)

Hierarchy For Package junit.extensions

Package Hierarchies:
All Packages

Class Hierarchy



junit-3.8.2/javadoc/junit/extensions/TestDecorator.html0000644000175000017500000004657610402050444022263 0ustar mkochmkoch TestDecorator (JUnit API)

junit.extensions
Class TestDecorator

java.lang.Object
  extended byjunit.framework.Assert
      extended byjunit.extensions.TestDecorator
All Implemented Interfaces:
Test
Direct Known Subclasses:
RepeatedTest, TestSetup

public class TestDecorator
extends Assert
implements Test

A Decorator for Tests. Use TestDecorator as the base class for defining new test decorators. Test decorator subclasses can be introduced to add behaviour before or after a test is run.


Field Summary
protected  Test fTest
           
 
Constructor Summary
TestDecorator(Test test)
           
 
Method Summary
 void basicRun(TestResult result)
          The basic run behaviour.
 int countTestCases()
          Counts the number of test cases that will be run by this test.
 Test getTest()
           
 void run(TestResult result)
          Runs a test and collects its result in a TestResult instance.
 java.lang.String toString()
           
 
Methods inherited from class junit.framework.Assert
assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertFalse, assertFalse, assertNotNull, assertNotNull, assertNotSame, assertNotSame, assertNull, assertNull, assertSame, assertSame, assertTrue, assertTrue, fail, fail, failNotEquals, failNotSame, failSame
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

fTest

protected Test fTest
Constructor Detail

TestDecorator

public TestDecorator(Test test)
Method Detail

basicRun

public void basicRun(TestResult result)
The basic run behaviour.


countTestCases

public int countTestCases()
Description copied from interface: Test
Counts the number of test cases that will be run by this test.

Specified by:
countTestCases in interface Test

run

public void run(TestResult result)
Description copied from interface: Test
Runs a test and collects its result in a TestResult instance.

Specified by:
run in interface Test

toString

public java.lang.String toString()

getTest

public Test getTest()


junit-3.8.2/javadoc/junit/extensions/ActiveTestSuite.html0000644000175000017500000003641410402050444022554 0ustar mkochmkoch ActiveTestSuite (JUnit API)

junit.extensions
Class ActiveTestSuite

java.lang.Object
  extended byjunit.framework.TestSuite
      extended byjunit.extensions.ActiveTestSuite
All Implemented Interfaces:
Test

public class ActiveTestSuite
extends TestSuite

A TestSuite for active Tests. It runs each test in a separate thread and waits until all threads have terminated. -- Aarhus Radisson Scandinavian Center 11th floor


Constructor Summary
ActiveTestSuite()
           
ActiveTestSuite(java.lang.Class theClass)
           
ActiveTestSuite(java.lang.Class theClass, java.lang.String name)
           
ActiveTestSuite(java.lang.String name)
           
 
Method Summary
 void run(TestResult result)
          Runs the tests and collects their result in a TestResult.
 void runFinished()
           
 void runTest(Test test, TestResult result)
           
 
Methods inherited from class junit.framework.TestSuite
addTest, addTestSuite, countTestCases, createTest, getName, getTestConstructor, setName, testAt, testCount, tests, toString, warning
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ActiveTestSuite

public ActiveTestSuite()

ActiveTestSuite

public ActiveTestSuite(java.lang.Class theClass)

ActiveTestSuite

public ActiveTestSuite(java.lang.String name)

ActiveTestSuite

public ActiveTestSuite(java.lang.Class theClass,
                       java.lang.String name)
Method Detail

run

public void run(TestResult result)
Description copied from class: TestSuite
Runs the tests and collects their result in a TestResult.

Specified by:
run in interface Test
Overrides:
run in class TestSuite

runTest

public void runTest(Test test,
                    TestResult result)
Overrides:
runTest in class TestSuite

runFinished

public void runFinished()


junit-3.8.2/javadoc/junit/extensions/TestSetup.html0000644000175000017500000004414310402050444021425 0ustar mkochmkoch TestSetup (JUnit API)

junit.extensions
Class TestSetup

java.lang.Object
  extended byjunit.framework.Assert
      extended byjunit.extensions.TestDecorator
          extended byjunit.extensions.TestSetup
All Implemented Interfaces:
Test

public class TestSetup
extends TestDecorator

A Decorator to set up and tear down additional fixture state. Subclass TestSetup and insert it into your tests when you want to set up additional state once before the tests are run.


Field Summary
 
Fields inherited from class junit.extensions.TestDecorator
fTest
 
Constructor Summary
TestSetup(Test test)
           
 
Method Summary
 void run(TestResult result)
          Runs a test and collects its result in a TestResult instance.
protected  void setUp()
          Sets up the fixture.
protected  void tearDown()
          Tears down the fixture.
 
Methods inherited from class junit.extensions.TestDecorator
basicRun, countTestCases, getTest, toString
 
Methods inherited from class junit.framework.Assert
assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertFalse, assertFalse, assertNotNull, assertNotNull, assertNotSame, assertNotSame, assertNull, assertNull, assertSame, assertSame, assertTrue, assertTrue, fail, fail, failNotEquals, failNotSame, failSame
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

TestSetup

public TestSetup(Test test)
Method Detail

run

public void run(TestResult result)
Description copied from interface: Test
Runs a test and collects its result in a TestResult instance.

Specified by:
run in interface Test
Overrides:
run in class TestDecorator

setUp

protected void setUp()
              throws java.lang.Exception
Sets up the fixture. Override to set up additional fixture state.

Throws:
java.lang.Exception

tearDown

protected void tearDown()
                 throws java.lang.Exception
Tears down the fixture. Override to tear down the additional fixture state.

Throws:
java.lang.Exception


junit-3.8.2/javadoc/junit/extensions/package-summary.html0000644000175000017500000001470410402050444022553 0ustar mkochmkoch junit.extensions (JUnit API)

Package junit.extensions

Class Summary
ActiveTestSuite A TestSuite for active Tests.
ExceptionTestCase A TestCase that expects an Exception of class fExpected to be thrown.
RepeatedTest A Decorator that runs a test repeatedly.
TestDecorator A Decorator for Tests.
TestSetup A Decorator to set up and tear down additional fixture state.
 



junit-3.8.2/javadoc/junit/extensions/ExceptionTestCase.html0000644000175000017500000004045010402050444023054 0ustar mkochmkoch ExceptionTestCase (JUnit API)

junit.extensions
Class ExceptionTestCase

java.lang.Object
  extended byjunit.framework.Assert
      extended byjunit.framework.TestCase
          extended byjunit.extensions.ExceptionTestCase
All Implemented Interfaces:
Test

public class ExceptionTestCase
extends TestCase

A TestCase that expects an Exception of class fExpected to be thrown. The other way to check that an expected exception is thrown is:

 try {
   shouldThrow();
 }
 catch (SpecialException e) {
   return;
 }
 fail("Expected SpecialException");
 
To use ExceptionTestCase, create a TestCase like:
 new ExceptionTestCase("testShouldThrow", SpecialException.class);
 


Constructor Summary
ExceptionTestCase(java.lang.String name, java.lang.Class exception)
           
 
Method Summary
protected  void runTest()
          Execute the test method expecting that an Exception of class fExpected or one of its subclasses will be thrown
 
Methods inherited from class junit.framework.TestCase
countTestCases, createResult, getName, run, run, runBare, setName, setUp, tearDown, toString
 
Methods inherited from class junit.framework.Assert
assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertFalse, assertFalse, assertNotNull, assertNotNull, assertNotSame, assertNotSame, assertNull, assertNull, assertSame, assertSame, assertTrue, assertTrue, fail, fail, failNotEquals, failNotSame, failSame
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ExceptionTestCase

public ExceptionTestCase(java.lang.String name,
                         java.lang.Class exception)
Method Detail

runTest

protected void runTest()
                throws java.lang.Throwable
Execute the test method expecting that an Exception of class fExpected or one of its subclasses will be thrown

Overrides:
runTest in class TestCase
Throws:
java.lang.Throwable - if any exception is thrown


junit-3.8.2/javadoc/junit/extensions/package-frame.html0000644000175000017500000000247710402050444022154 0ustar mkochmkoch junit.extensions (JUnit API) junit.extensions
Classes 
ActiveTestSuite
ExceptionTestCase
RepeatedTest
TestDecorator
TestSetup
junit-3.8.2/javadoc/junit/extensions/RepeatedTest.html0000644000175000017500000004546410402050444022065 0ustar mkochmkoch RepeatedTest (JUnit API)

junit.extensions
Class RepeatedTest

java.lang.Object
  extended byjunit.framework.Assert
      extended byjunit.extensions.TestDecorator
          extended byjunit.extensions.RepeatedTest
All Implemented Interfaces:
Test

public class RepeatedTest
extends TestDecorator

A Decorator that runs a test repeatedly.


Field Summary
 
Fields inherited from class junit.extensions.TestDecorator
fTest
 
Constructor Summary
RepeatedTest(Test test, int repeat)
           
 
Method Summary
 int countTestCases()
          Counts the number of test cases that will be run by this test.
 void run(TestResult result)
          Runs a test and collects its result in a TestResult instance.
 java.lang.String toString()
           
 
Methods inherited from class junit.extensions.TestDecorator
basicRun, getTest
 
Methods inherited from class junit.framework.Assert
assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertFalse, assertFalse, assertNotNull, assertNotNull, assertNotSame, assertNotSame, assertNull, assertNull, assertSame, assertSame, assertTrue, assertTrue, fail, fail, failNotEquals, failNotSame, failSame
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

RepeatedTest

public RepeatedTest(Test test,
                    int repeat)
Method Detail

countTestCases

public int countTestCases()
Description copied from interface: Test
Counts the number of test cases that will be run by this test.

Specified by:
countTestCases in interface Test
Overrides:
countTestCases in class TestDecorator

run

public void run(TestResult result)
Description copied from interface: Test
Runs a test and collects its result in a TestResult instance.

Specified by:
run in interface Test
Overrides:
run in class TestDecorator

toString

public java.lang.String toString()
Overrides:
toString in class TestDecorator


junit-3.8.2/javadoc/overview-summary.html0000644000175000017500000001230610402050444017472 0ustar mkochmkoch Overview (JUnit API)

Packages
junit.extensions  
junit.framework  

 



junit-3.8.2/javadoc/overview-frame.html0000644000175000017500000000213610402050444017067 0ustar mkochmkoch Overview (JUnit API)
All Classes

Packages
junit.extensions
junit.framework

  junit-3.8.2/javadoc/stylesheet.css0000644000175000017500000000254410402050444016151 0ustar mkochmkoch/* Javadoc style sheet */ /* makes unvisted linkes red (red bad) */ A {color:red;} /* makes visted linkes the same green as the toolbar (green good) */ A:visited {color:#03A35D;} /* Define colors, fonts and other style attributes here to override the defaults */ /* Page background color */ body { background-color: #FFFFFF } /* Table colors */ .TableHeadingColor { background: #03A35D} /* Green */ .TableSubHeadingColor { background: #03A35D } /* Green */ .TableRowColor { background: #FFFFFF } /* White */ /* Font used in left-hand frame lists */ .FrameTitleFont { font-size: normal; font-family: normal } .FrameHeadingFont { font-size: normal; font-family: normal } .FrameItemFont { font-size: normal; font-family: normal } /* Example of smaller, sans-serif font in frames */ /* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */ /* Navigation bar fonts and colors */ .NavBarCell1 { background-color:#03A35D;}/* Green */ .NavBarCell1Rev { background-color:#006400;}/* Dark green */ .NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;} .NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;} .NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} .NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} junit-3.8.2/javadoc/help-doc.html0000644000175000017500000002017310402050444015625 0ustar mkochmkoch API Help (JUnit API)


How This API Document Is Organized

This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

Overview

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

Package

Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

Class/Interface

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

Tree (Class Hierarchy)

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

Deprecated API

The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

Index

The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

Prev/Next

These links take you to the next or previous class, interface, package, or related page.

Frames/No Frames

These links show and hide the HTML frames. All pages are available with or without frames.

Serialized Form

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

This help file applies to API documentation generated using the standard doclet.



junit-3.8.2/javadoc/allclasses-noframe.html0000644000175000017500000000432310402050444017704 0ustar mkochmkoch All Classes (JUnit API) All Classes
ActiveTestSuite
Assert
AssertionFailedError
ComparisonCompactor
ComparisonFailure
ExceptionTestCase
Protectable
RepeatedTest
Test
TestCase
TestDecorator
TestFailure
TestListener
TestResult
TestSetup
TestSuite
junit-3.8.2/javadoc/package-list0000644000175000017500000000004310402050444015525 0ustar mkochmkochjunit.extensions junit.framework junit-3.8.2/javadoc/serialized-form.html0000644000175000017500000001474310402050444017234 0ustar mkochmkoch Serialized Form (JUnit API)

Serialized Form


Package junit.framework

Class junit.framework.AssertionFailedError extends java.lang.Error implements Serializable

serialVersionUID: 1l

Class junit.framework.ComparisonFailure extends AssertionFailedError implements Serializable

serialVersionUID: 1l

Serialized Fields

fExpected

java.lang.String fExpected

fActual

java.lang.String fActual



junit-3.8.2/javadoc/index.html0000644000175000017500000000160110402050444015234 0ustar mkochmkoch JUnit API <H2> Frame Alert</H2> <P> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR> Link to<A HREF="overview-summary.html">Non-frame version.</A> junit-3.8.2/javadoc/resources/0000755000175000017500000000000010402050444015253 5ustar mkochmkochjunit-3.8.2/javadoc/resources/inherit.gif0000644000175000017500000000007110402050444017402 0ustar mkochmkochGIF89a, DrjԐ;߀Q@N;junit-3.8.2/javadoc/overview-tree.html0000644000175000017500000001742510402050444016743 0ustar mkochmkoch Class Hierarchy (JUnit API)

Hierarchy For All Packages

Package Hierarchies:
junit.extensions, junit.framework

Class Hierarchy

Interface Hierarchy



junit-3.8.2/javadoc/deprecated-list.html0000644000175000017500000001127410402050444017205 0ustar mkochmkoch Deprecated List (JUnit API)

Deprecated API



junit-3.8.2/javadoc/allclasses-frame.html0000644000175000017500000000502310402050444017345 0ustar mkochmkoch All Classes (JUnit API) All Classes
ActiveTestSuite
Assert
AssertionFailedError
ComparisonCompactor
ComparisonFailure
ExceptionTestCase
Protectable
RepeatedTest
Test
TestCase
TestDecorator
TestFailure
TestListener
TestResult
TestSetup
TestSuite
junit-3.8.2/junit/0000755000175000017500000000000010402050442012761 5ustar mkochmkochjunit-3.8.2/junit/tests/0000755000175000017500000000000010402050442014123 5ustar mkochmkochjunit-3.8.2/junit/tests/AllTests.class0000644000175000017500000000165110402050442016710 0ustar mkochmkoch.3    !" # $ % & '()()VCodeLineNumberTableLocalVariableTablethisLjunit/tests/AllTests;main([Ljava/lang/String;)Vargs[Ljava/lang/String;suite()Ljunit/framework/Test;Ljunit/framework/TestSuite; SourceFile AllTests.java  * +,junit/framework/TestSuiteFramework Tests -. /012junit/tests/AllTestsjava/lang/Objectjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult;(Ljava/lang/String;)Vjunit/tests/framework/AllTestsaddTest(Ljunit/framework/Test;)Vjunit/tests/runner/AllTestsjunit/tests/extensions/AllTests!  /*   6W    [!YK** * *   junit-3.8.2/junit/tests/framework/0000755000175000017500000000000010402050442016120 5ustar mkochmkochjunit-3.8.2/junit/tests/framework/AssertTest.class0000644000175000017500000000556710402050442021265 0ustar mkochmkoch.Y 6 78 69 6 : ;<=> ? ? @ A B C DE F GHI()VCodeLineNumberTableLocalVariableTablethis"Ljunit/tests/framework/AssertTest;testFaile&Ljunit/framework/AssertionFailedError;testAssertEqualsoLjava/lang/Object;testAssertEqualsNulltestAssertStringEqualstestAssertNullNotEqualsString#Ljunit/framework/ComparisonFailure;testAssertStringNotEqualsNulltestAssertNullNotEqualsNulltestAssertNulltestAssertNotNulltestAssertTruetestAssertFalsetestAssertSametestAssertNotSameobjLjava/lang/Integer;testAssertNotSameFailsNull SourceFileAssertTest.java  J$junit/framework/AssertionFailedErrorjava/lang/Object KL KMafoo!junit/framework/ComparisonFailure NO PQ RQ ST UT VLjava/lang/Integer W XL junit/tests/framework/AssertTestjunit/framework/TestCasefail assertEquals'(Ljava/lang/Object;Ljava/lang/Object;)V'(Ljava/lang/String;Ljava/lang/String;)V getMessage()Ljava/lang/String; assertNull(Ljava/lang/Object;)V assertNotNull assertTrue(Z)V assertFalse assertSame(I)V assertNotSame!/* \LY !"'YL++YYM !" !$!""##%&& " !'#$%4 )* &6   -. 'Z L 23 5 4 6 ()c  L+ W :; > < =?  (*mY L+ W C GDEFHI !+kYLLNQOPRS !,kYL V X[YZ\] !-eL `be c d fg  !.eL jlo m n pq  !/)YL++YYM #"tu w z#x$y%{(| $ !)!#$0BYYYYYL++L+9<*  +49<=>A 412= !B3^L   !45junit-3.8.2/junit/tests/framework/TestCaseTest$10.class0000644000175000017500000000075610402050442021737 0ustar mkochmkoch.  this$0$Ljunit/tests/framework/TestCaseTest; Synthetic'(Ljunit/tests/framework/TestCaseTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/framework/TestCaseTest$10; SourceFileTestCaseTest.java  %junit/tests/framework/TestCaseTest$10junit/framework/TestCase()V   > **+     junit-3.8.2/junit/tests/framework/TestImplementorTest$1.class0000644000175000017500000000201110402050442023261 0ustar mkochmkoch.,     !"#this$0%DoubleTestCase InnerClasses:Ljunit/tests/framework/TestImplementorTest$DoubleTestCase; Synthetic=(Ljunit/tests/framework/TestImplementorTest$DoubleTestCase;)VCodeLineNumberTableLocalVariableTablethis-Ljunit/tests/framework/TestImplementorTest$1; Exceptions&protect()V SourceFileTestImplementorTest.java   '() *+junit/tests/framework/TestImplementorTest$1java/lang/Objectjunit/framework/Protectable+8junit/tests/framework/TestImplementorTest$DoubleTestCasejava/lang/Throwable access$000V(Ljunit/tests/framework/TestImplementorTest$DoubleTestCase;)Ljunit/framework/TestCase;junit/framework/TestCaserunBare)junit/tests/framework/TestImplementorTest   > **+   G**    $ junit-3.8.2/junit/tests/framework/ComparisonFailureTest.java0000644000175000017500000000122310402050442023243 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.ComparisonFailure; import junit.framework.TestCase; public class ComparisonFailureTest extends TestCase { // Most of the tests are in ComparisonCompactorTest public void testConnection() { ComparisonFailure failure= new ComparisonFailure("warning", "Mary had a little lamb", "Mary had the little lamb"); assertEquals("warning expected: but was:", failure.getMessage()); } // This is like an instanceof test. public void testThrowing() { try { assertEquals("a", "b"); } catch (ComparisonFailure e) { return; } fail(); } } junit-3.8.2/junit/tests/framework/AllTests.class0000644000175000017500000000471510402050442020711 0ustar mkochmkoch.q BCDE F G !H I JKLM G NO P Q RI S TU VW XY Z[ \] ^_ `abc(class$junit$tests$framework$TestCaseTestLjava/lang/Class; Synthetic,class$junit$tests$framework$TestListenerTest&class$junit$tests$framework$AssertTest/class$junit$tests$framework$TestImplementorTest-class$junit$tests$framework$NoArgTestCaseTest3class$junit$tests$framework$ComparisonCompactorTest1class$junit$tests$framework$ComparisonFailureTest5class$junit$tests$framework$DoublePrecisionAssertTest()VCodeLineNumberTableLocalVariableTablethis Ljunit/tests/framework/AllTests;main([Ljava/lang/String;)Vargs[Ljava/lang/String;suite()Ljunit/framework/Test;Ljunit/framework/TestSuite;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFile AllTests.javad e; java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError fg ,h ,- 78i jkjunit/framework/TestSuiteFramework Tests "#"junit.tests.framework.TestCaseTest :; lmn op %#&junit.tests.framework.TestListenerTest &# junit.tests.framework.AssertTest '#)junit.tests.framework.TestImplementorTest (#'junit.tests.framework.NoArgTestCaseTest )#-junit.tests.framework.ComparisonCompactorTest *#+junit.tests.framework.ComparisonFailureTest +#/junit.tests.framework.DoublePrecisionAssertTestjunit/tests/framework/AllTestsjava/lang/Objectjava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult; addTestSuite(Ljava/lang/Class;)Vjunit/tests/framework/SuiteTestaddTest(Ljunit/framework/Test;)V! !"#$%#$&#$'#$(#$)#$*#$+#$,-./*/ 0 12 34.6W/  0 56 78.-ۻ Y K*  Y  **Y*Y*Y*Y*Y*Y*Y*/.  #*C\u0  79:;.N*LY+/0 <=>?$@Ajunit-3.8.2/junit/tests/framework/TestCaseTest$2.class0000644000175000017500000000137310402050442021654 0ustar mkochmkoch."    this$0$Ljunit/tests/framework/TestCaseTest; Synthetic'(Ljunit/tests/framework/TestCaseTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$2;tearDown()VrunTest SourceFileTestCaseTest.java   java/lang/Error$junit/tests/framework/TestCaseTest$2!+junit/tests/framework/TestCaseTest$TornDownTornDown"junit/tests/framework/TestCaseTest     > **+0    : *Y -.   2Y1  junit-3.8.2/junit/tests/framework/SuiteTest.class0000644000175000017500000001106710402050442021105 0ustar mkochmkoch. 6nop q r >rs t uvw rxZ r y]a_`^Ybcd z{ | } ~    ~        t   fResultLjunit/framework/TestResult;-class$junit$tests$framework$InheritedTestCaseLjava/lang/Class; Synthetic+class$junit$tests$framework$NoTestCaseClass'class$junit$tests$framework$NoTestCases-class$junit$tests$framework$NotPublicTestCase+class$junit$tests$framework$NotVoidTestCase'class$junit$tests$framework$OneTestCase,class$junit$tests$framework$OverrideTestCase5class$junit$tests$framework$DoublePrecisionAssertTest(Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis!Ljunit/tests/framework/SuiteTest;nameLjava/lang/String;setUp()Vsuite()Ljunit/framework/Test;Ljunit/framework/TestSuite;testInheritedTeststestNoTestCaseClasstLjunit/framework/Test;testNoTestCasestestNotExistingTestCasetestNotPublicTestCasetestNotVoidTestCasetestOneTestCasetestShadowedTeststestAddTestSuitetestCreateSuiteFromArraytestClassArray[Ljava/lang/Class;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0 SourceFileSuiteTest.java h java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError KLjunit/framework/TestResult KU ?@junit/framework/TestSuite Suite Testsjunit/tests/framework/SuiteTest AB'junit.tests.framework.InheritedTestCase gh K DB%junit.tests.framework.NoTestCaseClass EB!junit.tests.framework.NoTestCases notExistingMethod FB'junit.tests.framework.NotPublicTestCase GB%junit.tests.framework.NotVoidTestCase HB!junit.tests.framework.OneTestCase IB&junit.tests.framework.OverrideTestCase java/lang/Class JB/junit.tests.framework.DoublePrecisionAssertTest K junit/framework/TestCaseforName getMessage()Ljava/lang/String;addTest(Ljunit/framework/Test;)V(Ljava/lang/Class;)Vrun(Ljunit/framework/TestResult;)V wasSuccessful()Z assertTrue(Z)VrunCount()I assertEquals(II)Vjunit/framework/Test failureCount errorCountcountTestCases addTestSuite([Ljava/lang/Class;)V testCounttestAt(I)Ljunit/framework/Test;getName'(Ljava/lang/String;Ljava/lang/String;)V! > ?@ABCDBCEBCFBCGBCHBCIBCJBCKLM>*+N OPQRSTUM: *Y N  O  PQ VWM Y K* Y* Y* Y* Y* Y* Y* Y* Y* Y* Y*N2  $1>KXer !#O  VXYUM; YYL+* *  * !"N&'%(/):*O;PQVXZUME Y#$Y##L+* %* !"*  N,-'.2/D0OEPQ([\]UM` Y&'Y&&L+* %* ! * ( *  N23'4:5M6_7O`PQC[\^UMM Y)L+* %* ! * ( * * N9 :;'<:=L>OMPQ C[\_UMb& Y+,Y++L+-"N@B%CO&PQ VX`UMj. Y./Y..L+- NEF-GO.PQVXaUMi Y01Y00L+* %* ! * ( * * *  NIJ'K:LLM^NhOOiPQL[\bUMq1 Y23Y22L+* * !"NQR%S0TO1PQVXcUMy5 Y4L+01Y005+* * !"NVW!X)Y4ZO5PQ-VXdUMg6Y01Y00SY78Y77SL Y+9M,:"8,; <=1,; <=N\5]>^F_V`faO gPQ52ef>)VXghMN*LY+N&O ijkSClmjunit-3.8.2/junit/tests/framework/SuiteTest.java0000644000175000017500000000670010402050442020717 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestResult; import junit.framework.TestSuite; /** * A fixture for testing the "auto" test suite feature. * */ public class SuiteTest extends TestCase { protected TestResult fResult; public SuiteTest(String name) { super(name); } protected void setUp() { fResult= new TestResult(); } public static Test suite() { TestSuite suite= new TestSuite("Suite Tests"); // build the suite manually, because some of the suites are testing // the functionality that automatically builds suites suite.addTest(new SuiteTest("testNoTestCaseClass")); suite.addTest(new SuiteTest("testNoTestCases")); suite.addTest(new SuiteTest("testOneTestCase")); suite.addTest(new SuiteTest("testNotPublicTestCase")); suite.addTest(new SuiteTest("testNotVoidTestCase")); suite.addTest(new SuiteTest("testNotExistingTestCase")); suite.addTest(new SuiteTest("testInheritedTests")); suite.addTest(new SuiteTest("testShadowedTests")); suite.addTest(new SuiteTest("testAddTestSuite")); suite.addTest(new SuiteTest("testCreateSuiteFromArray")); return suite; } public void testInheritedTests() { TestSuite suite= new TestSuite(InheritedTestCase.class); suite.run(fResult); assertTrue(fResult.wasSuccessful()); assertEquals(2, fResult.runCount()); } public void testNoTestCaseClass() { Test t= new TestSuite(NoTestCaseClass.class); t.run(fResult); assertEquals(1, fResult.runCount()); // warning test assertTrue(! fResult.wasSuccessful()); } public void testNoTestCases() { Test t= new TestSuite(NoTestCases.class); t.run(fResult); assertTrue(fResult.runCount() == 1); // warning test assertTrue(fResult.failureCount() == 1); assertTrue(! fResult.wasSuccessful()); } public void testNotExistingTestCase() { Test t= new SuiteTest("notExistingMethod"); t.run(fResult); assertTrue(fResult.runCount() == 1); assertTrue(fResult.failureCount() == 1); assertTrue(fResult.errorCount() == 0); } public void testNotPublicTestCase() { TestSuite suite= new TestSuite(NotPublicTestCase.class); // 1 public test case + 1 warning for the non-public test case assertEquals(2, suite.countTestCases()); } public void testNotVoidTestCase() { TestSuite suite= new TestSuite(NotVoidTestCase.class); assertTrue(suite.countTestCases() == 1); } public void testOneTestCase() { Test t= new TestSuite(OneTestCase.class); t.run(fResult); assertTrue(fResult.runCount() == 1); assertTrue(fResult.failureCount() == 0); assertTrue(fResult.errorCount() == 0); assertTrue(fResult.wasSuccessful()); } public void testShadowedTests() { TestSuite suite= new TestSuite(OverrideTestCase.class); suite.run(fResult); assertEquals(1, fResult.runCount()); } public void testAddTestSuite() { TestSuite suite= new TestSuite(); suite.addTestSuite(OneTestCase.class); suite.run(fResult); assertEquals(1, fResult.runCount()); } public void testCreateSuiteFromArray() { Class[] testClassArray = { OneTestCase.class, DoublePrecisionAssertTest.class }; TestSuite suite = new TestSuite(testClassArray); assertEquals(2, suite.testCount()); assertEquals("junit.tests.framework.DoublePrecisionAssertTest" , ((TestSuite)suite.testAt(1)).getName()); assertEquals("junit.tests.framework.OneTestCase" , ((TestSuite)suite.testAt(0)).getName()); } }junit-3.8.2/junit/tests/framework/Success.class0000644000175000017500000000066410402050442020565 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethisLjunit/tests/framework/Success;runTest testSuccess SourceFile Success.java junit/tests/framework/Successjunit/framework/TestCase!/*    +    +   junit-3.8.2/junit/tests/framework/TestCaseTest$1.class0000644000175000017500000000124410402050442021650 0ustar mkochmkoch.   this$0$Ljunit/tests/framework/TestCaseTest; Synthetic9(Ljunit/tests/framework/TestCaseTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$1;x0Ljava/lang/String;runTest()V SourceFileTestCaseTest.java  java/lang/Error $junit/tests/framework/TestCaseTest$1junit/framework/TestCase(Ljava/lang/String;)V    I *,*+ $     2Y %  junit-3.8.2/junit/tests/framework/TestListenerTest.java0000644000175000017500000000270310402050442022252 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ import junit.framework.AssertionFailedError; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestListener; import junit.framework.TestResult; public class TestListenerTest extends TestCase implements TestListener { private TestResult fResult; private int fStartCount; private int fEndCount; private int fFailureCount; private int fErrorCount; public void addError(Test test, Throwable t) { fErrorCount++; } public void addFailure(Test test, AssertionFailedError t) { fFailureCount++; } public void endTest(Test test) { fEndCount++; } protected void setUp() { fResult= new TestResult(); fResult.addListener(this); fStartCount= 0; fEndCount= 0; fFailureCount= 0; } public void startTest(Test test) { fStartCount++; } public void testError() { TestCase test= new TestCase("noop") { public void runTest() { throw new Error(); } }; test.run(fResult); assertEquals(1, fErrorCount); assertEquals(1, fEndCount); } public void testFailure() { TestCase test= new TestCase("noop") { public void runTest() { fail(); } }; test.run(fResult); assertEquals(1, fFailureCount); assertEquals(1, fEndCount); } public void testStartStop() { TestCase test= new TestCase("noop") { public void runTest() { } }; test.run(fResult); assertEquals(1, fStartCount); assertEquals(1, fEndCount); } }junit-3.8.2/junit/tests/framework/TestImplementorTest.java0000644000175000017500000000231210402050442022754 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.Protectable; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestResult; /** * Test an implementor of junit.framework.Test other than TestCase or TestSuite */ public class TestImplementorTest extends TestCase { public static class DoubleTestCase implements Test { private TestCase fTestCase; public DoubleTestCase(TestCase testCase) { fTestCase= testCase; } public int countTestCases() { return 2; } public void run(TestResult result) { result.startTest(this); Protectable p= new Protectable() { public void protect() throws Throwable { fTestCase.runBare(); fTestCase.runBare(); } }; result.runProtected(this, p); result.endTest(this); } } private DoubleTestCase fTest; public TestImplementorTest() { TestCase testCase= new TestCase() { public void runTest() { } }; fTest= new DoubleTestCase(testCase); } public void testSuccessfulRun() { TestResult result= new TestResult(); fTest.run(result); assertEquals(fTest.countTestCases(), result.runCount()); assertEquals(0, result.errorCount()); assertEquals(0, result.failureCount()); } } junit-3.8.2/junit/tests/framework/NoTestCaseClass.class0000644000175000017500000000060110402050442022142 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis'Ljunit/tests/framework/NoTestCaseClass; testSuccess SourceFileNoTestCaseClass.java %junit/tests/framework/NoTestCaseClassjava/lang/Object!/*   +     junit-3.8.2/junit/tests/framework/NoTestCases.class0000644000175000017500000000057410402050442021350 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis#Ljunit/tests/framework/NoTestCases; noTestCase SourceFileNoTestCases.java !junit/tests/framework/NoTestCasesjunit/framework/TestCase!/*   +     junit-3.8.2/junit/tests/framework/TestImplementorTest$2.class0000644000175000017500000000112210402050442023264 0ustar mkochmkoch.  this$0+Ljunit/tests/framework/TestImplementorTest; Synthetic.(Ljunit/tests/framework/TestImplementorTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses-Ljunit/tests/framework/TestImplementorTest$2;runTest()V SourceFileTestImplementorTest.java  +junit/tests/framework/TestImplementorTest$2junit/framework/TestCase   > **+ (    + )   junit-3.8.2/junit/tests/framework/OneTestCase.java0000644000175000017500000000036710402050442021146 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ import junit.framework.TestCase; public class OneTestCase extends TestCase { public void noTestCase() { } public void testCase() { } public void testCase(int arg) { } }junit-3.8.2/junit/tests/framework/AssertTest.java0000644000175000017500000000541210402050442021066 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.AssertionFailedError; import junit.framework.ComparisonFailure; import junit.framework.TestCase; public class AssertTest extends TestCase { /* In the tests that follow, we can't use standard formatting * for exception tests: * try { * somethingThatShouldThrow(); * fail(); * catch (AssertionFailedError e) { * } * because fail() would never be reported. */ public void testFail() { // Also, we are testing fail, so we can't rely on fail() working. // We have to throw the exception manually, . try { fail(); } catch (AssertionFailedError e) { return; } throw new AssertionFailedError(); } public void testAssertEquals() { Object o= new Object(); assertEquals(o, o); try { assertEquals(new Object(), new Object()); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertEqualsNull() { assertEquals(null, null); } public void testAssertStringEquals() { assertEquals("a", "a"); } public void testAssertNullNotEqualsString() { try { assertEquals(null, "foo"); fail(); } catch (ComparisonFailure e) { } } public void testAssertStringNotEqualsNull() { try { assertEquals("foo", null); fail(); } catch (ComparisonFailure e) { e.getMessage(); // why no assertion? } } public void testAssertNullNotEqualsNull() { try { assertEquals(null, new Object()); } catch (AssertionFailedError e) { e.getMessage(); // why no assertion? return; } fail(); } public void testAssertNull() { assertNull(null); try { assertNull(new Object()); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertNotNull() { assertNotNull(new Object()); try { assertNotNull(null); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertTrue() { assertTrue(true); try { assertTrue(false); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertFalse() { assertFalse(false); try { assertFalse(true); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertSame() { Object o= new Object(); assertSame(o, o); try { assertSame(new Integer(1), new Integer(1)); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertNotSame() { assertNotSame(new Integer(1), null); assertNotSame(null, new Integer(1)); assertNotSame(new Integer(1), new Integer(1)); try { Integer obj= new Integer(1); assertNotSame(obj, obj); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertNotSameFailsNull() { try { assertNotSame(null, null); } catch (AssertionFailedError e) { return; } fail(); } }junit-3.8.2/junit/tests/framework/ComparisonFailureTest.class0000644000175000017500000000202210402050442023425 0ustar mkochmkoch.1  ! "# $ %&' ()*()VCodeLineNumberTableLocalVariableTablethis-Ljunit/tests/framework/ComparisonFailureTest;testConnectionfailure#Ljunit/framework/ComparisonFailure; testThrowinge SourceFileComparisonFailureTest.java !junit/framework/ComparisonFailurewarningMary had a little lambMary had the little lamb +Pwarning expected: but was: ,- ./ab 0+junit/tests/framework/ComparisonFailureTestjunit/framework/TestCase9(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V getMessage()Ljava/lang/String; assertEquals'(Ljava/lang/String;Ljava/lang/String;)Vfail! /* TYL+     `  L      junit-3.8.2/junit/tests/framework/TestCaseTest$9.class0000644000175000017500000000161010402050442021655 0ustar mkochmkoch.*   !"# $%& val$runningLjava/lang/Exception; Syntheticthis$0$Ljunit/tests/framework/TestCaseTest;<(Ljunit/tests/framework/TestCaseTest;Ljava/lang/Exception;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$9; Exceptions'runTest()V(tearDown SourceFileTestCaseTest.java  java/lang/Error Tearing down )$junit/tests/framework/TestCaseTest$9junit/framework/TestCasejava/lang/Exceptionjava/lang/Throwable(Ljava/lang/String;)V     M**+*,   /* 4 Y   junit-3.8.2/junit/tests/framework/InheritedTestCase.class0000644000175000017500000000062210402050442022516 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis)Ljunit/tests/framework/InheritedTestCase;test2 SourceFileInheritedTestCase.java 'junit/tests/framework/InheritedTestCase!junit/tests/framework/OneTestCase!/*   +    junit-3.8.2/junit/tests/framework/TestCaseTest.java0000644000175000017500000001027410402050442021342 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.AssertionFailedError; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestFailure; import junit.framework.TestResult; import junit.framework.TestSuite; import junit.tests.WasRun; /** * A test case testing the testing framework. * */ public class TestCaseTest extends TestCase { static class TornDown extends TestCase { boolean fTornDown= false; protected void tearDown() { fTornDown= true; } protected void runTest() { throw new Error("running"); } } public void testCaseToString() { // This test wins the award for twisted snake tail eating while // writing self tests. And you thought those weird anonymous // inner classes were bad... assertEquals("testCaseToString(junit.tests.framework.TestCaseTest)", toString()); } public void testError() { TestCase error= new TestCase("error") { protected void runTest() { throw new Error(); } }; verifyError(error); } public void testRunAndTearDownFails() { TornDown fails= new TornDown() { protected void tearDown() { super.tearDown(); throw new Error(); } protected void runTest() { throw new Error(); } }; verifyError(fails); assertTrue(fails.fTornDown); } public void testSetupFails() { TestCase fails= new TestCase("success") { protected void setUp() { throw new Error(); } protected void runTest() { } }; verifyError(fails); } public void testSuccess() { TestCase success= new TestCase("success") { protected void runTest() { } }; verifySuccess(success); } public void testFailure() { TestCase failure= new TestCase("failure") { protected void runTest() { fail(); } }; verifyFailure(failure); } public void testTearDownAfterError() { TornDown fails= new TornDown(); verifyError(fails); assertTrue(fails.fTornDown); } public void testTearDownFails() { TestCase fails= new TestCase("success") { protected void tearDown() { throw new Error(); } protected void runTest() { } }; verifyError(fails); } public void testTearDownSetupFails() { TornDown fails= new TornDown() { protected void setUp() { throw new Error(); } }; verifyError(fails); assertTrue(!fails.fTornDown); } public void testWasRun() { WasRun test= new WasRun(); test.run(); assertTrue(test.fWasRun); } public void testExceptionRunningAndTearDown() { // With 1.4, we should // wrap the exception thrown while running with the exception thrown // while tearing down Test t= new TornDown() { public void tearDown() { throw new Error("tearingDown"); } }; TestResult result= new TestResult(); t.run(result); TestFailure failure= (TestFailure) result.errors().nextElement(); assertEquals("running", failure.thrownException().getMessage()); } public void testErrorTearingDownDoesntMaskErrorRunning() { final Exception running= new Exception("Running"); TestCase t= new TestCase() { protected void runTest() throws Throwable { throw running; } protected void tearDown() throws Exception { throw new Error("Tearing down"); } }; try { t.runBare(); } catch (Throwable thrown) { assertSame(running, thrown); } } public void testNoArgTestCasePasses() { Test t= new TestSuite(NoArgTestCaseTest.class); TestResult result= new TestResult(); t.run(result); assertTrue(result.runCount() == 1); assertTrue(result.failureCount() == 0); assertTrue(result.errorCount() == 0); } public void testNamelessTestCase() { TestCase t= new TestCase() {}; try { t.run(); fail(); } catch (AssertionFailedError e) { } } void verifyError(TestCase test) { TestResult result= test.run(); assertTrue(result.runCount() == 1); assertTrue(result.failureCount() == 0); assertTrue(result.errorCount() == 1); } void verifyFailure(TestCase test) { TestResult result= test.run(); assertTrue(result.runCount() == 1); assertTrue(result.failureCount() == 1); assertTrue(result.errorCount() == 0); } void verifySuccess(TestCase test) { TestResult result= test.run(); assertTrue(result.runCount() == 1); assertTrue(result.failureCount() == 0); assertTrue(result.errorCount() == 0); } }junit-3.8.2/junit/tests/framework/TestCaseTest$7.class0000644000175000017500000000123410402050442021655 0ustar mkochmkoch.   this$0$Ljunit/tests/framework/TestCaseTest; Synthetic'(Ljunit/tests/framework/TestCaseTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$7;setUp()V SourceFileTestCaseTest.java  java/lang/Error$junit/tests/framework/TestCaseTest$7+junit/tests/framework/TestCaseTest$TornDownTornDown"junit/tests/framework/TestCaseTest    > **+ c   2Y d junit-3.8.2/junit/tests/framework/ComparisonCompactorTest.class0000644000175000017500000000760710402050442024003 0ustar mkochmkoch.| )HIJK LM NO PQ (RSTU (VWXYZ[\]^_`abcdefghijklmnopq()VCodeLineNumberTableLocalVariableTablethis/Ljunit/tests/framework/ComparisonCompactorTest; testMessagefailureLjava/lang/String; testStartSame testEndSametestSametestNoContextStartAndEndSametestStartAndEndContext"testStartAndEndContextWithEllipses$testComparisonErrorStartSameComplete"testComparisonErrorEndSameComplete)testComparisonErrorEndSameCompleteContext$testComparisonErrorOverlapingMatches+testComparisonErrorOverlapingMatchesContext%testComparisonErrorOverlapingMatches2,testComparisonErrorOverlapingMatches2Context!testComparisonErrorWithActualNull(testComparisonErrorWithActualNullContext#testComparisonErrorWithExpectedNull*testComparisonErrorWithExpectedNullContext testBug609972 SourceFileComparisonCompactorTest.java *+#junit/framework/ComparisonCompactorbc *ra sta expected:<[b]> but was:<[c]>u vw xybabcexpected: but was: z{abcbexpected:<[a]b> but was:<[c]b>expected: but was:abcadc(expected:<...[b]...> but was:<...[d]...> expected: but was:abcdeabfde,expected:<...b[c]d...> but was:<...b[f]d...>expected: but was:!expected:<[]...> but was:<[a]...>expected:<[]bc> but was:<[a]bc>abbc'expected:<...[]...> but was:<...[b]...>!expected: but was:abcdde'expected:<...[d]...> but was:<...[]...>'expected:<...cd[d]e> but was:<...cd[]e>expected: but was:expected: but was:S&P5000!expected:<[S&P50]0> but was:<[]0>-junit/tests/framework/ComparisonCompactorTestjunit/framework/TestCase((ILjava/lang/String;Ljava/lang/String;)Vcompact&(Ljava/lang/String;)Ljava/lang/String;java/lang/Stringequals(Ljava/lang/Object;)Z assertTrue(Z)V assertEquals'(Ljava/lang/String;Ljava/lang/String;)V!()*+,/*-. /01+,XYL+ -   ./0 234+,TY  L +-./0235+,TYL+-./0236+,TYL+-./0237+,TYL+-./0238+,TYL+-"#$./0239+,TYL+-'()./023:+,TYL+-,-../023;+,TY L+-123./023<+,TY L+-678./023=+,TYL+-;<=./023>+,TYL+-@AB./023?+,TY L!+-EFG./023@+,TY L"+-JKL./023A+,SYL#+-OPQ./023B+,SYL#+-TUV./023C+,SYL$+-YZ[./023D+,SYL$+-^_`./023E+,UY %&L'+-cde./023FGjunit-3.8.2/junit/tests/framework/AllTests.java0000644000175000017500000000152410402050442020520 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite that runs all the sample tests * */ public class AllTests { public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Test suite() { TestSuite suite= new TestSuite("Framework Tests"); suite.addTestSuite(TestCaseTest.class); suite.addTest(SuiteTest.suite()); // Tests suite building, so can't use automatic test extraction suite.addTestSuite(TestListenerTest.class); suite.addTestSuite(AssertTest.class); suite.addTestSuite(TestImplementorTest.class); suite.addTestSuite(NoArgTestCaseTest.class); suite.addTestSuite(ComparisonCompactorTest.class); suite.addTestSuite(ComparisonFailureTest.class); suite.addTestSuite(DoublePrecisionAssertTest.class); return suite; } }junit-3.8.2/junit/tests/framework/TestListenerTest$2.class0000644000175000017500000000125210402050442022562 0ustar mkochmkoch.   this$0(Ljunit/tests/framework/TestListenerTest; Synthetic=(Ljunit/tests/framework/TestListenerTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses*Ljunit/tests/framework/TestListenerTest$2;x0Ljava/lang/String;runTest()V SourceFileTestListenerTest.java   (junit/tests/framework/TestListenerTest$2junit/framework/TestCase(Ljava/lang/String;)Vfail   I *,*+ 3     2 45  junit-3.8.2/junit/tests/framework/OneTestCase.class0000644000175000017500000000102410402050442021321 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis#Ljunit/tests/framework/OneTestCase; noTestCasetestCase(I)VargI SourceFileOneTestCase.java !junit/tests/framework/OneTestCasejunit/framework/TestCase!/*   +    +    5 junit-3.8.2/junit/tests/framework/Failure.java0000644000175000017500000000031210402050442020346 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.TestCase; /** * A test case testing the testing framework. * */ public class Failure extends TestCase { public void runTest() { fail(); } }junit-3.8.2/junit/tests/framework/TestCaseTest$4.class0000644000175000017500000000117610402050442021657 0ustar mkochmkoch.  this$0$Ljunit/tests/framework/TestCaseTest; Synthetic9(Ljunit/tests/framework/TestCaseTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$4;x0Ljava/lang/String;runTest()V SourceFileTestCaseTest.java  $junit/tests/framework/TestCaseTest$4junit/framework/TestCase(Ljava/lang/String;)V   I *,*+ C     + D   junit-3.8.2/junit/tests/framework/InheritedTestCase.java0000644000175000017500000000023110402050442022326 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ public class InheritedTestCase extends OneTestCase { public void test2() { } }junit-3.8.2/junit/tests/framework/Failure.class0000644000175000017500000000060510402050442020537 0ustar mkochmkoch.  ()VCodeLineNumberTableLocalVariableTablethisLjunit/tests/framework/Failure;runTest SourceFile Failure.java  junit/tests/framework/Failurejunit/framework/TestCasefail!/*   2     junit-3.8.2/junit/tests/framework/NotPublicTestCase.java0000644000175000017500000000034110402050442022314 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ import junit.framework.TestCase; public class NotPublicTestCase extends TestCase { protected void testNotPublic() { } public void testPublic() { } }junit-3.8.2/junit/tests/framework/NoArgTestCaseTest.java0000644000175000017500000000030510402050442022263 0ustar mkochmkoch package junit.tests.framework; import junit.framework.TestCase; public class NoArgTestCaseTest extends TestCase { public void testNothing() { // If this compiles, the no arg ctor is there } } junit-3.8.2/junit/tests/framework/OverrideTestCase.class0000644000175000017500000000062210402050442022362 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis(Ljunit/tests/framework/OverrideTestCase;testCase SourceFileOverrideTestCase.java &junit/tests/framework/OverrideTestCase!junit/tests/framework/OneTestCase!/*   +    junit-3.8.2/junit/tests/framework/TestCaseTest$TornDown.class0000644000175000017500000000124510402050442023263 0ustar mkochmkoch.!    fTornDownZ()VCodeLineNumberTableLocalVariableTablethisTornDown InnerClasses-Ljunit/tests/framework/TestCaseTest$TornDown;tearDownrunTest SourceFileTestCaseTest.java  java/lang/Errorrunning  +junit/tests/framework/TestCaseTest$TornDownjunit/framework/TestCase(Ljava/lang/String;)V"junit/tests/framework/TestCaseTest    8 **     4*    4 Y    junit-3.8.2/junit/tests/framework/NotVoidTestCase.class0000644000175000017500000000072410402050442022170 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis'Ljunit/tests/framework/NotVoidTestCase; testNotVoid()ItestVoid SourceFileNotVoidTestCase.java %junit/tests/framework/NotVoidTestCasejunit/framework/TestCase!/*   ,    +   junit-3.8.2/junit/tests/framework/TestCaseTest$8.class0000644000175000017500000000131710402050442021660 0ustar mkochmkoch.#   this$0$Ljunit/tests/framework/TestCaseTest; Synthetic'(Ljunit/tests/framework/TestCaseTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$8;tearDown()V SourceFileTestCaseTest.java   java/lang/Error tearingDown !$junit/tests/framework/TestCaseTest$8"+junit/tests/framework/TestCaseTest$TornDownTornDown(Ljava/lang/String;)V"junit/tests/framework/TestCaseTest     > **+t    4 Yu   junit-3.8.2/junit/tests/framework/TestImplementorTest$DoubleTestCase.class0000644000175000017500000000261710402050442026003 0ustar mkochmkoch.; % & '() + ', '-/01 fTestCaseLjunit/framework/TestCase;(Ljunit/framework/TestCase;)VCodeLineNumberTableLocalVariableTablethisDoubleTestCase InnerClasses:Ljunit/tests/framework/TestImplementorTest$DoubleTestCase;testCasecountTestCases()Irun(Ljunit/framework/TestResult;)VresultLjunit/framework/TestResult;pLjunit/framework/Protectable; access$000V(Ljunit/tests/framework/TestImplementorTest$DoubleTestCase;)Ljunit/framework/TestCase;x0 Synthetic SourceFileTestImplementorTest.java 23 45+junit/tests/framework/TestImplementorTest$1 6 78 95:8junit/tests/framework/TestImplementorTest$DoubleTestCasejava/lang/Objectjunit/framework/Test()Vjunit/framework/TestResult startTest(Ljunit/framework/Test;)V=(Ljunit/tests/framework/TestImplementorTest$DoubleTestCase;)V runProtected6(Ljunit/framework/Test;Ljunit/framework/Protectable;)VendTest)junit/tests/framework/TestImplementorTest!    F **+    , h+*Y*M+*,+* !   /*  !"#$. junit-3.8.2/junit/tests/framework/TestListenerTest$3.class0000644000175000017500000000122210402050442022560 0ustar mkochmkoch.  this$0(Ljunit/tests/framework/TestListenerTest; Synthetic=(Ljunit/tests/framework/TestListenerTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses*Ljunit/tests/framework/TestListenerTest$3;x0Ljava/lang/String;runTest()V SourceFileTestListenerTest.java  (junit/tests/framework/TestListenerTest$3junit/framework/TestCase(Ljava/lang/String;)V   I *,*+ =     + >   junit-3.8.2/junit/tests/framework/TestListenerTest$1.class0000644000175000017500000000127010402050442022561 0ustar mkochmkoch.   this$0(Ljunit/tests/framework/TestListenerTest; Synthetic=(Ljunit/tests/framework/TestListenerTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses*Ljunit/tests/framework/TestListenerTest$1;x0Ljava/lang/String;runTest()V SourceFileTestListenerTest.java  java/lang/Error (junit/tests/framework/TestListenerTest$1junit/framework/TestCase(Ljava/lang/String;)V    I *,*+ )     2Y *  junit-3.8.2/junit/tests/framework/Success.java0000644000175000017500000000034410402050442020374 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.TestCase; /** * A test case testing the testing framework. * */ public class Success extends TestCase { public void runTest() { } public void testSuccess() { } }junit-3.8.2/junit/tests/framework/ComparisonCompactorTest.java0000644000175000017500000000721410402050442023611 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.ComparisonCompactor; import junit.framework.TestCase; public class ComparisonCompactorTest extends TestCase { public void testMessage() { String failure= new ComparisonCompactor(0, "b", "c").compact("a"); assertTrue("a expected:<[b]> but was:<[c]>".equals(failure)); } public void testStartSame() { String failure= new ComparisonCompactor(1, "ba", "bc").compact(null); assertEquals("expected: but was:", failure); } public void testEndSame() { String failure= new ComparisonCompactor(1, "ab", "cb").compact(null); assertEquals("expected:<[a]b> but was:<[c]b>", failure); } public void testSame() { String failure= new ComparisonCompactor(1, "ab", "ab").compact(null); assertEquals("expected: but was:", failure); } public void testNoContextStartAndEndSame() { String failure= new ComparisonCompactor(0, "abc", "adc").compact(null); assertEquals("expected:<...[b]...> but was:<...[d]...>", failure); } public void testStartAndEndContext() { String failure= new ComparisonCompactor(1, "abc", "adc").compact(null); assertEquals("expected: but was:", failure); } public void testStartAndEndContextWithEllipses() { String failure= new ComparisonCompactor(1, "abcde", "abfde").compact(null); assertEquals("expected:<...b[c]d...> but was:<...b[f]d...>", failure); } public void testComparisonErrorStartSameComplete() { String failure= new ComparisonCompactor(2, "ab", "abc").compact(null); assertEquals("expected: but was:", failure); } public void testComparisonErrorEndSameComplete() { String failure= new ComparisonCompactor(0, "bc", "abc").compact(null); assertEquals("expected:<[]...> but was:<[a]...>", failure); } public void testComparisonErrorEndSameCompleteContext() { String failure= new ComparisonCompactor(2, "bc", "abc").compact(null); assertEquals("expected:<[]bc> but was:<[a]bc>", failure); } public void testComparisonErrorOverlapingMatches() { String failure= new ComparisonCompactor(0, "abc", "abbc").compact(null); assertEquals("expected:<...[]...> but was:<...[b]...>", failure); } public void testComparisonErrorOverlapingMatchesContext() { String failure= new ComparisonCompactor(2, "abc", "abbc").compact(null); assertEquals("expected: but was:", failure); } public void testComparisonErrorOverlapingMatches2() { String failure= new ComparisonCompactor(0, "abcdde", "abcde").compact(null); assertEquals("expected:<...[d]...> but was:<...[]...>", failure); } public void testComparisonErrorOverlapingMatches2Context() { String failure= new ComparisonCompactor(2, "abcdde", "abcde").compact(null); assertEquals("expected:<...cd[d]e> but was:<...cd[]e>", failure); } public void testComparisonErrorWithActualNull() { String failure= new ComparisonCompactor(0, "a", null).compact(null); assertEquals("expected: but was:", failure); } public void testComparisonErrorWithActualNullContext() { String failure= new ComparisonCompactor(2, "a", null).compact(null); assertEquals("expected: but was:", failure); } public void testComparisonErrorWithExpectedNull() { String failure= new ComparisonCompactor(0, null, "a").compact(null); assertEquals("expected: but was:", failure); } public void testComparisonErrorWithExpectedNullContext() { String failure= new ComparisonCompactor(2, null, "a").compact(null); assertEquals("expected: but was:", failure); } public void testBug609972() { String failure= new ComparisonCompactor(10, "S&P500", "0").compact(null); assertEquals("expected:<[S&P50]0> but was:<[]0>", failure); } } junit-3.8.2/junit/tests/framework/TestCaseTest$3.class0000644000175000017500000000134510402050442021654 0ustar mkochmkoch.!   this$0$Ljunit/tests/framework/TestCaseTest; Synthetic9(Ljunit/tests/framework/TestCaseTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$3;x0Ljava/lang/String;setUp()VrunTest SourceFileTestCaseTest.java java/lang/Error $junit/tests/framework/TestCaseTest$3junit/framework/TestCase(Ljava/lang/String;)V    I *,*+ <     2Y :  + =  junit-3.8.2/junit/tests/framework/NoTestCaseClass.java0000644000175000017500000000023010402050442021754 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ public class NoTestCaseClass extends Object { public void testSuccess() { } }junit-3.8.2/junit/tests/framework/NotVoidTestCase.java0000644000175000017500000000034310402050442022001 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ import junit.framework.TestCase; public class NotVoidTestCase extends TestCase { public int testNotVoid() { return 1; } public void testVoid() { } }junit-3.8.2/junit/tests/framework/NoTestCases.java0000644000175000017500000000026610402050442021162 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ import junit.framework.TestCase; public class NoTestCases extends TestCase { public void noTestCase() { } }junit-3.8.2/junit/tests/framework/DoublePrecisionAssertTest.java0000644000175000017500000000237110402050442024076 0ustar mkochmkochpackage junit.tests.framework; import junit.framework.AssertionFailedError; import junit.framework.TestCase; public class DoublePrecisionAssertTest extends TestCase { /** * Test for the special Double.NaN value. */ public void testAssertEqualsNaNFails() { try { assertEquals(1.234, Double.NaN, 0.0); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertNaNEqualsFails() { try { assertEquals(Double.NaN, 1.234, 0.0); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertNaNEqualsNaN() { assertEquals(Double.NaN, Double.NaN, 0.0); } public void testAssertPosInfinityNotEqualsNegInfinity() { try { assertEquals(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, 0.0); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertPosInfinityNotEquals() { try { assertEquals(Double.POSITIVE_INFINITY, 1.23, 0.0); } catch (AssertionFailedError e) { return; } fail(); } public void testAssertPosInfinityEqualsInfinity() { assertEquals(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, 0.0); } public void testAssertNegInfinityEqualsInfinity() { assertEquals(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, 0.0); } } junit-3.8.2/junit/tests/framework/NotPublicTestCase.class0000644000175000017500000000072710402050442022510 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis)Ljunit/tests/framework/NotPublicTestCase; testNotPublic testPublic SourceFileNotPublicTestCase.java 'junit/tests/framework/NotPublicTestCasejunit/framework/TestCase!/*   +    +    junit-3.8.2/junit/tests/framework/NoArgTestCaseTest.class0000644000175000017500000000061710402050442022455 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis)Ljunit/tests/framework/NoArgTestCaseTest; testNothing SourceFileNoArgTestCaseTest.java 'junit/tests/framework/NoArgTestCaseTestjunit/framework/TestCase!/*   +    junit-3.8.2/junit/tests/framework/TestCaseTest.class0000644000175000017500000001253710402050442021532 0ustar mkochmkoch.    G F FV F   F]   F_  F    " " " & ( ( o - 7 1 4 G F F F 9 ( ( ( A G FTornDown InnerClasses-class$junit$tests$framework$NoArgTestCaseTestLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethis$Ljunit/tests/framework/TestCaseTest;testCaseToString testErrorerrorLjunit/framework/TestCase;testRunAndTearDownFailsfails-Ljunit/tests/framework/TestCaseTest$TornDown;testSetupFails testSuccesssuccess testFailurefailuretestTearDownAfterErrortestTearDownFailstestTearDownSetupFails testWasRuntestLjunit/tests/WasRun;testExceptionRunningAndTearDowntLjunit/framework/Test;resultLjunit/framework/TestResult;Ljunit/framework/TestFailure;*testErrorTearingDownDoesntMaskErrorRunningthrownLjava/lang/Throwable;runningLjava/lang/Exception;testNoArgTestCasePassestestNamelessTestCasee&Ljunit/framework/AssertionFailedError; verifyError(Ljunit/framework/TestCase;)V verifyFailure verifySuccessclass$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFileTestCaseTest.java z java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError M MN4testCaseToString(junit.tests.framework.TestCaseTest) $junit/tests/framework/TestCaseTest$1 M uv$junit/tests/framework/TestCaseTest$2 M $junit/tests/framework/TestCaseTest$3$junit/tests/framework/TestCaseTest$4 xv$junit/tests/framework/TestCaseTest$5 wv+junit/tests/framework/TestCaseTest$TornDown$junit/tests/framework/TestCaseTest$6$junit/tests/framework/TestCaseTest$7junit/tests/WasRun $junit/tests/framework/TestCaseTest$8junit/framework/TestResult  junit/framework/TestFailure java/lang/ExceptionRunning$junit/tests/framework/TestCaseTest$9 M Njava/lang/Throwable junit/framework/TestSuite JK'junit.tests.framework.NoArgTestCaseTest yz M %junit/tests/framework/TestCaseTest$10 N$junit/framework/AssertionFailedError"junit/tests/framework/TestCaseTestjunit/framework/TestCasejava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)VtoString assertEquals'(Ljava/lang/String;Ljava/lang/String;)V9(Ljunit/tests/framework/TestCaseTest;Ljava/lang/String;)V'(Ljunit/tests/framework/TestCaseTest;)V fTornDownZ assertTrue(Z)Vrun()Ljunit/framework/TestResult;fWasRunjunit/framework/Test(Ljunit/framework/TestResult;)Verrors()Ljava/util/Enumeration;java/util/Enumeration nextElement()Ljava/lang/Object;thrownException()Ljava/lang/Throwable;<(Ljunit/tests/framework/TestCaseTest;Ljava/lang/Exception;)VrunBare assertSame'(Ljava/lang/Object;Ljava/lang/Object;)V(Ljava/lang/Class;)VrunCount()I failureCount errorCountfail!FGJKLMNO3*P Q RSTNO8 * P  !Q  RSUNOM Y* L*+ P# ()QRS VWXNOVY*L*+ +P+ 456QRS YZ[NOMY*L*+ P8 ?@QRS YW\NOMY*L*+PB FGQRS ]W^NOMY*L*+PI NOQRS _W`NOUYL*+ +PRS TUQRS YZaNOMY*L*+ PX _`QRS YWbNO^ Y*!L*+ +Pb ghiQRS YZcNOU"Y#L+$W+%Pkl mnQRS defNO2&Y*'L(Y)M+,*,+,-N.-/0 Ps xyz%{1|Q*2RS )gh!ij% _klNO"1Y23L4Y*+5M,6 N+-87P !Q*mn"RS opgWqNO[9Y:;,?,@P%,<KZQ [RS>gh%6ijrNOpAY*BL+CWDM EP Q stRS gWuvO5+CM,>,?,@P$4Q 5RS5dW0ijwvO5+CM,>,?,@P%4Q 5RS5dW0ijxvO4+CM,>,?,@P$3Q 4RS4dW/ijyzON*LY+PQ {|}~LIZ FH  &4Ajunit-3.8.2/junit/tests/framework/TestCaseTest$5.class0000644000175000017500000000122610402050442021654 0ustar mkochmkoch.   this$0$Ljunit/tests/framework/TestCaseTest; Synthetic9(Ljunit/tests/framework/TestCaseTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$5;x0Ljava/lang/String;runTest()V SourceFileTestCaseTest.java   $junit/tests/framework/TestCaseTest$5junit/framework/TestCase(Ljava/lang/String;)Vfail   I *,*+ J     2 KL  junit-3.8.2/junit/tests/framework/TestImplementorTest.class0000644000175000017500000000224610402050442023146 0ustar mkochmkoch.> #$ &' ( )* # + , - . / 012DoubleTestCase InnerClassesfTest:Ljunit/tests/framework/TestImplementorTest$DoubleTestCase;()VCodeLineNumberTableLocalVariableTablethis+Ljunit/tests/framework/TestImplementorTest;testCaseLjunit/framework/TestCase;testSuccessfulRunresultLjunit/framework/TestResult; SourceFileTestImplementorTest.java +junit/tests/framework/TestImplementorTest$2 38junit/tests/framework/TestImplementorTest$DoubleTestCase 4 junit/framework/TestResult 56 78 98 :; <8 =8)junit/tests/framework/TestImplementorTestjunit/framework/TestCase.(Ljunit/tests/framework/TestImplementorTest;)V(Ljunit/framework/TestCase;)Vrun(Ljunit/framework/TestResult;)VcountTestCases()IrunCount assertEquals(II)V errorCount failureCount!Z*Y*L*Y+&' +, w/YL*+ * + + + /012&3.4/' !" junit-3.8.2/junit/tests/framework/TestCaseTest$6.class0000644000175000017500000000135010402050442021653 0ustar mkochmkoch.!   this$0$Ljunit/tests/framework/TestCaseTest; Synthetic9(Ljunit/tests/framework/TestCaseTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses&Ljunit/tests/framework/TestCaseTest$6;x0Ljava/lang/String;tearDown()VrunTest SourceFileTestCaseTest.java java/lang/Error $junit/tests/framework/TestCaseTest$6junit/framework/TestCase(Ljava/lang/String;)V    I *,*+ \     2Y Z  + ]  junit-3.8.2/junit/tests/framework/DoublePrecisionAssertTest.class0000644000175000017500000000263010402050442024260 0ustar mkochmkoch., #?vȴ9X $% &?zG'(()VCodeLineNumberTableLocalVariableTablethis1Ljunit/tests/framework/DoublePrecisionAssertTest;testAssertEqualsNaNFailse&Ljunit/framework/AssertionFailedError;testAssertNaNEqualsFailstestAssertNaNEqualsNaN)testAssertPosInfinityNotEqualsNegInfinitytestAssertPosInfinityNotEquals#testAssertPosInfinityEqualsInfinity#testAssertNegInfinityEqualsInfinity SourceFileDoublePrecisionAssertTest.java  )*$junit/framework/AssertionFailedError +/junit/tests/framework/DoublePrecisionAssertTestjunit/framework/TestCase assertEquals(DDD)Vfail!/* cL   cL   9     c  L # & $%'(c  L , / -.019    4 5   9    8 9  !"junit-3.8.2/junit/tests/framework/TestListenerTest.class0000644000175000017500000000422010402050442022432 0ustar mkochmkoch.R 7 8 9 :; 7 < = >?B C D EF CG CHIJfResultLjunit/framework/TestResult; fStartCountI fEndCount fFailureCount fErrorCount()VCodeLineNumberTableLocalVariableTablethis(Ljunit/tests/framework/TestListenerTest;addError.(Ljunit/framework/Test;Ljava/lang/Throwable;)VtestLjunit/framework/Test;tLjava/lang/Throwable; addFailure?(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V&Ljunit/framework/AssertionFailedError;endTest(Ljunit/framework/Test;)VsetUp startTest testErrorLjunit/framework/TestCase; testFailure testStartStop SourceFileTestListenerTest.java    junit/framework/TestResult  KL (junit/tests/framework/TestListenerTest$1 InnerClassesnoop M NO PQ(junit/tests/framework/TestListenerTest$2(junit/tests/framework/TestListenerTest$3&junit/tests/framework/TestListenerTestjunit/framework/TestCasejunit/framework/TestListener addListener!(Ljunit/framework/TestListener;)V=(Ljunit/tests/framework/TestListenerTest;Ljava/lang/String;)Vrun(Ljunit/framework/TestResult;)V assertEquals(II)V! /*  ! "#$%M *Y`  !  "# &' ()*+M *Y`  !  "# &' (,-.C *Y`  ! "# &'/a#*Y*** **   !""#! #"#0.C *Y `  % &! "# &'1h$ Y* L+* ** ( -./#0!$"# &23h$Y* L+* ** 2 789#:!$"# &24h$Y* L+* * * < @AB#C!$"# &256A junit-3.8.2/junit/tests/framework/OverrideTestCase.java0000644000175000017500000000023210402050442022173 0ustar mkochmkochpackage junit.tests.framework; /** * Test class used in SuiteTest */ public class OverrideTestCase extends OneTestCase { public void testCase() { } }junit-3.8.2/junit/tests/runner/0000755000175000017500000000000010402050442015434 5ustar mkochmkochjunit-3.8.2/junit/tests/runner/SimpleTestCollectorTest.class0000644000175000017500000000145010402050442023263 0ustar mkochmkoch.,       !()VCodeLineNumberTableLocalVariableTablethis,Ljunit/tests/runner/SimpleTestCollectorTest;testMissingDirectory collector"Ljunit/runner/SimpleTestCollector; SourceFileSimpleTestCollectorTest.java  junit/runner/SimpleTestCollectorfoobar "#$ %&' () *+*junit/tests/runner/SimpleTestCollectorTestjunit/framework/TestCasecollectFilesInPath)(Ljava/lang/String;)Ljava/util/Hashtable;java/util/Hashtableelements()Ljava/util/Enumeration;java/util/EnumerationhasMoreElements()Z assertFalse(Z)V!   /*   VYL+   junit-3.8.2/junit/tests/runner/AllTests.class0000644000175000017500000000510710402050442020221 0ustar mkochmkoch. HIJK L M %N $O PQRS M $TU $V W $XY $Z[ $\] $^_ `a $bc $d $ef g hi jkl mnop(class$junit$tests$runner$StackFilterTestLjava/lang/Class; Synthetic#class$junit$tests$runner$SorterTest0class$junit$tests$runner$SimpleTestCollectorTest+class$junit$tests$runner$BaseTestRunnerTest)class$junit$tests$runner$TextFeedbackTest'class$junit$tests$runner$TextRunnerTest0class$junit$tests$runner$TestCaseClassLoaderTest()VCodeLineNumberTableLocalVariableTablethisLjunit/tests/runner/AllTests;main([Ljava/lang/String;)Vargs[Ljava/lang/String;suite()Ljunit/framework/Test;Ljunit/framework/TestSuite;isJDK11()ZversionLjava/lang/String;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0 SourceFile AllTests.javaq rB java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError st /u /0 :;v wxjunit/framework/TestSuiteFramework Tests &'"junit.tests.runner.StackFilterTest AB yz )'junit.tests.runner.SorterTest *'*junit.tests.runner.SimpleTestCollectorTest +'%junit.tests.runner.BaseTestRunnerTest ,'#junit.tests.runner.TextFeedbackTest{ |> -'!junit.tests.runner.TextRunnerTest => .'*junit.tests.runner.TestCaseClassLoaderTest /z }~ java.version 1.1 junit/tests/runner/AllTestsjava/lang/Objectjava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult; addTestSuite(Ljava/lang/Class;)Vjunit/runner/BaseTestRunnerinVAJavaaddTest(Ljunit/framework/Test;)Vjava/lang/System getProperty&(Ljava/lang/String;)Ljava/lang/String;java/lang/String startsWith(Ljava/lang/String;)Z!$%&'()'(*'(+'(,'(-'(.'(/01/*2 3 45 6716W2 3 89 :;1 λ Y K*  Y  *Y*Y*Y*YB*Y#* YY*2.  #<Un3  :<=>1;  !K*"#2 "#3 ?@AB1N*LY+23 CDE@(FGjunit-3.8.2/junit/tests/runner/TextRunnerTest$1.class0000644000175000017500000000116310402050442021567 0ustar mkochmkoch.  this$0#Ljunit/tests/runner/TextRunnerTest; Synthetic&(Ljunit/tests/runner/TextRunnerTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses%Ljunit/tests/runner/TextRunnerTest$1;write(I)Varg0I Exceptions SourceFileTextRunnerTest.java  #junit/tests/runner/TextRunnerTest$1java/io/OutputStreamjava/io/IOException()V   > **+ /    5 0   junit-3.8.2/junit/tests/runner/ClassLoaderTest.class0000644000175000017500000000352510402050442021524 0ustar mkochmkoch.] 3456 7 8 9 : ; <= 3> ?@ A BC 3D E F GH IJKL&class$junit$runner$TestCaseClassLoaderLjava/lang/Class; Syntheticclass$java$lang$Objectclass$junit$framework$TestCase()VCodeLineNumberTableLocalVariableTablethis$Ljunit/tests/runner/ClassLoaderTest;verifyisTestCaseClassLoader(Ljava/lang/ClassLoader;)ZclLjava/lang/ClassLoader;(verifyApplicationClassLoadedByTestLoader&verifySystemClassNotLoadedByTestLoaderclass$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFileClassLoaderTest.javaM N, java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError OP Q  ) *R ST UP  junit.runner.TestCaseClassLoader +,V WX YZ %& [\ java.lang.Object junit.framework.TestCase"junit/tests/runner/ClassLoaderTestjunit/framework/Assertjava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjava/lang/ObjectgetClass()Ljava/lang/Class;getNamejava/lang/Stringequals(Ljava/lang/Object;)ZgetClassLoader()Ljava/lang/ClassLoader; assertTrue(Z)V!3*   ! "#$; **  !  "#%&c/+,+  Y   !/"#/'()=**  ! "#*O* Y* Y 'N! O"#+,N*LY+ ! -./012junit-3.8.2/junit/tests/runner/SorterTest.class0000644000175000017500000000200310402050442020574 0ustar mkochmkoch.<  !  " #$% &' () * +,-Swapper InnerClasses()VCodeLineNumberTableLocalVariableTablethisLjunit/tests/runner/SorterTest;testSortvLjava/util/Vector; Exceptions. SourceFileSorterTest.java java/util/Vectorc /0ba 12%junit/tests/runner/SorterTest$Swapper3 46 78 9:junit/tests/runner/SorterTestjunit/framework/TestCasejava/lang/Exception addElement(Ljava/lang/Object;)Vsize()Ijunit/runner/Sorter sortStrings;4(Ljava/util/Vector;IILjunit/runner/Sorter$Swapper;)V elementAt(I)Ljava/lang/Object; assertEquals'(Ljava/lang/Object;Ljava/lang/Object;)Vjunit/runner/Sorter$Swapper!3*   KYL+++++d Y +  +  +  & ,6@JKC 5( junit-3.8.2/junit/tests/runner/SorterTest$Swapper.class0000644000175000017500000000145510402050442022214 0ustar mkochmkoch.+    !#()VCodeLineNumberTableLocalVariableTablethisSwapper InnerClasses'Ljunit/tests/runner/SorterTest$Swapper;swap(Ljava/util/Vector;II)VvaluesLjava/util/Vector;leftIrighttmpLjava/lang/Object; SourceFileSorterTest.java $ %& '()%junit/tests/runner/SorterTest$Swapperjava/lang/Object*junit/runner/Sorter$Swapperjava/util/Vector elementAt(I)Ljava/lang/Object; setElementAt(Ljava/lang/Object;I)Vjunit/tests/runner/SorterTestjunit/runner/Sorter  /*    w+:+++    4  "  junit-3.8.2/junit/tests/runner/TextFeedbackTest$2.class0000644000175000017500000000106710402050442022006 0ustar mkochmkoch.  this$0%Ljunit/tests/runner/TextFeedbackTest; Synthetic((Ljunit/tests/runner/TextFeedbackTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/runner/TextFeedbackTest$2;runTest()V SourceFileTextFeedbackTest.java  %junit/tests/runner/TextFeedbackTest$2junit/framework/TestCase   > **+ :    + :   junit-3.8.2/junit/tests/runner/TextFeedbackTest$3.class0000644000175000017500000000106710402050442022007 0ustar mkochmkoch.  this$0%Ljunit/tests/runner/TextFeedbackTest; Synthetic((Ljunit/tests/runner/TextFeedbackTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/runner/TextFeedbackTest$3;runTest()V SourceFileTextFeedbackTest.java  %junit/tests/runner/TextFeedbackTest$3junit/framework/TestCase   > **+ ;    + ;   junit-3.8.2/junit/tests/runner/ClassLoaderTest.java0000644000175000017500000000150710402050442021336 0ustar mkochmkochpackage junit.tests.runner; /** * Test class used in TestTestCaseClassLoader */ import junit.framework.Assert; import junit.framework.TestCase; public class ClassLoaderTest extends Assert { public ClassLoaderTest() { } public void verify() { verifyApplicationClassLoadedByTestLoader(); verifySystemClassNotLoadedByTestLoader(); } private boolean isTestCaseClassLoader(ClassLoader cl) { return (cl != null && cl.getClass().getName().equals(junit.runner.TestCaseClassLoader.class.getName())); } private void verifyApplicationClassLoadedByTestLoader() { assertTrue(isTestCaseClassLoader(getClass().getClassLoader())); } private void verifySystemClassNotLoadedByTestLoader() { assertTrue(!isTestCaseClassLoader(Object.class.getClassLoader())); assertTrue(!isTestCaseClassLoader(TestCase.class.getClassLoader())); } }junit-3.8.2/junit/tests/runner/TextFeedbackTest$5.class0000644000175000017500000000115510402050442022007 0ustar mkochmkoch.   this$0%Ljunit/tests/runner/TextFeedbackTest; Synthetic((Ljunit/tests/runner/TextFeedbackTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/runner/TextFeedbackTest$5;runTest()V SourceFileTextFeedbackTest.java  $junit/framework/AssertionFailedError%junit/tests/runner/TextFeedbackTest$5junit/framework/TestCase    > **+ I   2Y I  junit-3.8.2/junit/tests/runner/TextRunnerSingleMethodTest$1.class0000644000175000017500000000040110402050442024064 0ustar mkochmkoch.   SourceFileTextRunnerSingleMethodTest.java Synthetic /junit/tests/runner/TextRunnerSingleMethodTest$1 InnerClassesjava/lang/Object-junit/tests/runner/TextRunnerSingleMethodTest  junit-3.8.2/junit/tests/runner/SimpleTestCollectorTest.java0000644000175000017500000000055510402050442023104 0ustar mkochmkochpackage junit.tests.runner; import junit.framework.TestCase; import junit.runner.SimpleTestCollector; public class SimpleTestCollectorTest extends TestCase { public void testMissingDirectory() { SimpleTestCollector collector= new SimpleTestCollector(); assertFalse(collector.collectFilesInPath("foobar").elements().hasMoreElements()); } } junit-3.8.2/junit/tests/runner/TestCaseClassLoaderTest.java0000644000175000017500000000306110402050442022767 0ustar mkochmkochpackage junit.tests.runner; import java.lang.reflect.Method; import java.net.URL; import junit.framework.TestCase; import junit.runner.TestCaseClassLoader; /** * A TestCase for testing the TestCaseClassLoader * */ public class TestCaseClassLoaderTest extends TestCase { public void testClassLoading() throws Exception { TestCaseClassLoader loader= new TestCaseClassLoader(); Class loadedClass= loader.loadClass("junit.tests.runner.ClassLoaderTest", true); Object o= loadedClass.newInstance(); // // Invoke the assertClassLoaders method via reflection. // We use reflection since the class is loaded by // another class loader and we can't do a successful downcast to // ClassLoaderTestCase. // Method method= loadedClass.getDeclaredMethod("verify", new Class[0]); method.invoke(o, (Object[])new Class[0]); } public void testJarClassLoading() throws Exception { URL url= getClass().getResource("test.jar"); if (url == null) return; // This test only makes sense when run from Ant, so silently ignore String path= url.getFile(); TestCaseClassLoader loader= new TestCaseClassLoader(path); Class loadedClass= loader.loadClass("junit.tests.runner.LoadedFromJar", true); Object o= loadedClass.newInstance(); // // Invoke the assertClassLoaders method via reflection. // We use reflection since the class is loaded by // another class loader and we can't do a successfull downcast to // ClassLoaderTestCase. // Method method= loadedClass.getDeclaredMethod("verify", new Class[0]); method.invoke(o, (Object[])new Class[0]); } }junit-3.8.2/junit/tests/runner/TextRunnerSingleMethodTest$NullResultPrinter.class0000644000175000017500000000606210402050442027412 0ustar mkochmkoch.R I J KMNthis$0/Ljunit/tests/runner/TextRunnerSingleMethodTest; SyntheticG(Ljunit/tests/runner/TextRunnerSingleMethodTest;Ljava/io/PrintStream;)VCodeLineNumberTableLocalVariableTablethisNullResultPrinter InnerClassesALjunit/tests/runner/TextRunnerSingleMethodTest$NullResultPrinter;writerLjava/io/PrintStream;addError.(Ljunit/framework/Test;Ljava/lang/Throwable;)VtestLjunit/framework/Test;tLjava/lang/Throwable; addFailure?(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V&Ljunit/framework/AssertionFailedError;elapsedTimeAsString(J)Ljava/lang/String;runTimeJendTest(Ljunit/framework/Test;)V getWriter()Ljava/io/PrintStream;print (Ljunit/framework/TestResult;J)VresultLjunit/framework/TestResult; printDefect!(Ljunit/framework/TestFailure;I)VfailureLjunit/framework/TestFailure;countIprintDefectHeader printDefects-(Ljava/util/Enumeration;ILjava/lang/String;)VLjava/util/Enumeration;typeLjava/lang/String;printDefectTrace (Ljunit/framework/TestFailure;)V printErrors(Ljunit/framework/TestResult;)V printFailures printFooter printHeader(J)VprintWaitPrompt()V startTestOx(Ljunit/tests/runner/TextRunnerSingleMethodTest;Ljava/io/PrintStream;Ljunit/tests/runner/TextRunnerSingleMethodTest$1;)Vx0x1x21Ljunit/tests/runner/TextRunnerSingleMethodTest$1; SourceFileTextRunnerSingleMethodTest.java P Q?junit/tests/runner/TextRunnerSingleMethodTest$NullResultPrinterjunit/textui/ResultPrinter/junit/tests/runner/TextRunnerSingleMethodTest$1(Ljava/io/PrintStream;)V-junit/tests/runner/TextRunnerSingleMethodTest0  Q *,*+       ?   ?   6   !" 5  #$ ,   %& ?  '( )* ?  +,-./* ? ! +,-.01 I # *+2-.3456 5 % +,78 5 ' '(98 5 ) '(:8 5 + '(;< 5 -  => + / ?" 5 1  B O*+,  *CDEFGHL@Ljunit-3.8.2/junit/tests/runner/TextFeedbackTest$1.class0000644000175000017500000000106710402050442022005 0ustar mkochmkoch.  this$0%Ljunit/tests/runner/TextFeedbackTest; Synthetic((Ljunit/tests/runner/TextFeedbackTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/runner/TextFeedbackTest$1;runTest()V SourceFileTextFeedbackTest.java  %junit/tests/runner/TextFeedbackTest$1junit/framework/TestCase   > **+ 2    + 2   junit-3.8.2/junit/tests/runner/BaseTestRunnerTest.class0000644000175000017500000000145610402050442022235 0ustar mkochmkoch.#    NonStatic InnerClasses MockRunner()VCodeLineNumberTableLocalVariableTablethis'Ljunit/tests/runner/BaseTestRunnerTest;testInvokeNonStaticSuiterunnerLjunit/runner/BaseTestRunner; SourceFileBaseTestRunnerTest.java 0junit/tests/runner/BaseTestRunnerTest$MockRunner/junit.tests.runner.BaseTestRunnerTest$NonStatic !"%junit/tests/runner/BaseTestRunnerTestjunit/framework/TestCase/junit/tests/runner/BaseTestRunnerTest$NonStaticjunit/runner/BaseTestRunnergetTest*(Ljava/lang/String;)Ljunit/framework/Test;! 3*   LYL+W !"   junit-3.8.2/junit/tests/runner/SorterTest.java0000644000175000017500000000131010402050442020410 0ustar mkochmkochpackage junit.tests.runner; import java.util.Vector; import junit.framework.TestCase; import junit.runner.Sorter; public class SorterTest extends TestCase { static class Swapper implements Sorter.Swapper { public void swap(Vector values, int left, int right) { Object tmp= values.elementAt(left); values.setElementAt(values.elementAt(right), left); values.setElementAt(tmp, right); } } public void testSort() throws Exception { Vector v= new Vector(); v.addElement("c"); v.addElement("b"); v.addElement("a"); Sorter.sortStrings(v, 0, v.size()-1, new Swapper()); assertEquals(v.elementAt(0), "a"); assertEquals(v.elementAt(1), "b"); assertEquals(v.elementAt(2), "c"); } }junit-3.8.2/junit/tests/runner/TextRunnerTest.class0000644000175000017500000000523510402050442021446 0ustar mkochmkoch. &HI %JKLM HN OP Q RST9 UVWXY Z[ Z\ ]^ _` ]a %b ]c %d Oefg j k Olm !H no pqrs()VCodeLineNumberTableLocalVariableTablethis#Ljunit/tests/runner/TextRunnerTest; testFailure Exceptionst testSuccess testErrorexecTest(Ljava/lang/String;Z)V testClassLjava/lang/String;successZjavacpcmd[Ljava/lang/String;pLjava/lang/Process;iLjava/io/InputStream;testRunReturnsResultresultLjunit/framework/TestResult;oldOutLjava/io/PrintStream; SourceFileTextRunnerTest.java '(junit.tests.framework.Failure 34junit.tests.framework.Successjunit.tests.BogusDudejava/lang/StringBuffer java.homeu vw xyz {6bin |}java.class.pathjava/lang/String -classpathjunit.textui.TestRunner~    Ejava/io/PrintStream#junit/tests/runner/TextRunnerTest$1 InnerClasses ' ' junit/framework/TestSuite  !junit/tests/runner/TextRunnerTestjunit/framework/TestCasejava/lang/Exceptionjava/lang/System getProperty&(Ljava/lang/String;)Ljava/lang/String;append,(Ljava/lang/String;)Ljava/lang/StringBuffer; java/io/File separatortoString()Ljava/lang/String;java/lang/Runtime getRuntime()Ljava/lang/Runtime;exec(([Ljava/lang/String;)Ljava/lang/Process;java/lang/ProcessgetInputStream()Ljava/io/InputStream;java/io/InputStreamread()IwaitFor assertTrue(Z)V exitValue assertFalseout&(Ljunit/tests/runner/TextRunnerTest;)V(Ljava/io/OutputStream;)VsetOut(Ljava/io/PrintStream;)Vjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult;junit/framework/TestResult wasSuccessful()Z!%&'()/** + ,-.()6** + ,-/01()6** + ,-/02()6** + ,-/034)GY   N :Y-SYSYSYSY+S:::*2 )0M W!^"g#j$%&()+R,-5678)960{:6M^;<WT=>^M?@/0A()7LYY* !Y"#M,$+ N+ -(//0/*",-4!5(7,8/769+ !BC7,-3DEFGi junit-3.8.2/junit/tests/runner/TextFeedbackTest.class0000644000175000017500000000776510402050442021673 0ustar mkochmkoch. jklm n o <p ;qr ;s tu p ;vwxy z { | ;}~ ; p  ; !  & ( .  1 6 8 TestResultPrinter InnerClassesoutputLjava/io/OutputStream;runnerLjunit/textui/TestRunner;)class$junit$tests$runner$TextFeedbackTestLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethis%Ljunit/tests/runner/TextFeedbackTest;main([Ljava/lang/String;)Vargs[Ljava/lang/String;setUptestEmptySuiteexpectedLjava/lang/String; testOneTestsuiteLjunit/framework/TestSuite; testTwoTests testFailureprinterLjunit/textui/ResultPrinter; testError'([Ljava/lang/String;)Ljava/lang/String;iIlinesexpectedWriterLjava/io/PrintStream;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0 SourceFileTextFeedbackTest.java d java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError F FG CD#junit.tests.runner.TextFeedbackTest cd java/io/ByteArrayOutputStream ?@junit/textui/TestRunner5junit/tests/runner/TextFeedbackTest$TestResultPrinterjava/io/PrintStream F F F ABjava/lang/StringTime: 0 OK (0 tests) S]junit/framework/TestSuite  . OK (1 test)%junit/tests/runner/TextFeedbackTest$1 F .. OK (2 tests)%junit/tests/runner/TextFeedbackTest$2%junit/tests/runner/TextFeedbackTest$3.F Failures here FAILURES!!!&Tests run: 1, Failures: 1, Errors: 0%junit/tests/runner/TextFeedbackTest$4 F %junit/tests/runner/TextFeedbackTest$5.E Errors here&Tests run: 1, Failures: 0, Errors: 1%junit/tests/runner/TextFeedbackTest$6%junit/tests/runner/TextFeedbackTest$7 #junit/tests/runner/TextFeedbackTestjunit/framework/TestCasejava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vrun(Ljava/lang/Class;)V(Ljava/io/OutputStream;)V(Ljava/io/PrintStream;)V(Ljunit/textui/ResultPrinter;)VdoRun4(Ljunit/framework/Test;)Ljunit/framework/TestResult;java/lang/ObjecttoString assertEquals'(Ljava/lang/String;Ljava/lang/String;)V((Ljunit/tests/runner/TextFeedbackTest;)VaddTest(Ljunit/framework/Test;)V=(Ljunit/tests/runner/TextFeedbackTest;Ljava/io/PrintStream;)V setPrinterprintln!;<?@ABCDE FGH3*I J KL MNHG Y I  !J OPQGH[)* Y *YYY* I$ %(&J )KLRGH}=*YSYSYSYSYSL*YW+* I)"*1+<,J=KL"STUGHK*YSYSYSY SYSLYM,!Y*"#*,W+* I0"1*263?4J5J KKL")ST*!VWXGHW*Y$SYSYSY%SYSLYM,&Y*'#,(Y*)#*,W+* I8"9*:6;B<K=V>J WKL"5ST*-VWYGHs*Y*SYSY+SYSY,SY-SYSL.Y*Y* /M*,0YN-1Y*2#*-W+* I"A.BBGJHRI^JgKrLJ*sKL.ESTB1Z[R!VW\GHs*Y3SYSY4SYSY,SY5SYSL6Y*Y* 7M*,0YN-8Y*9#*-W+* I"O.PBUJVRW^XgYrZJ*sKL.ESTB1Z[R!VWS]H. Y MY,N6+-+2:,I]^_`#_)aJ4^_.KL.`P&S@abcdHN*LY+I J efgTEhi>B;=!&(.168junit-3.8.2/junit/tests/runner/AllTests.java0000644000175000017500000000203510402050442020032 0ustar mkochmkochpackage junit.tests.runner; import junit.framework.Test; import junit.framework.TestSuite; import junit.runner.BaseTestRunner; /** * TestSuite that runs all the sample tests * */ public class AllTests { public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Test suite() { // Collect tests manually because we have to test class collection code TestSuite suite= new TestSuite("Framework Tests"); suite.addTestSuite(StackFilterTest.class); suite.addTestSuite(SorterTest.class); suite.addTestSuite(SimpleTestCollectorTest.class); suite.addTestSuite(BaseTestRunnerTest.class); suite.addTestSuite(TextFeedbackTest.class); //suite.addTestSuite(TextRunnerSingleMethodTest.class); if (!BaseTestRunner.inVAJava()) { suite.addTestSuite(TextRunnerTest.class); if (!isJDK11()) suite.addTest(new TestSuite(TestCaseClassLoaderTest.class)); } return suite; } static boolean isJDK11() { String version= System.getProperty("java.version"); return version.startsWith("1.1"); } }junit-3.8.2/junit/tests/runner/TestCaseClassLoaderTest.class0000644000175000017500000000333110402050442023153 0ustar mkochmkoch.U -. -/ 0 123 45 67 89: ; <= >?@A()VCodeLineNumberTableLocalVariableTablethis,Ljunit/tests/runner/TestCaseClassLoaderTest;testClassLoadingloader"Ljunit/runner/TestCaseClassLoader; loadedClassLjava/lang/Class;oLjava/lang/Object;methodLjava/lang/reflect/Method; ExceptionsBtestJarClassLoadingurlLjava/net/URL;pathLjava/lang/String; SourceFileTestCaseClassLoaderTest.java  junit/runner/TestCaseClassLoader"junit.tests.runner.ClassLoaderTest CD EFverifyjava/lang/Class GH[Ljava/lang/Object;I JKL MNtest.jar OPQ RS T junit.tests.runner.LoadedFromJar*junit/tests/runner/TestCaseClassLoaderTestjunit/framework/TestCasejava/lang/Exception loadClass&(Ljava/lang/String;Z)Ljava/lang/Class; newInstance()Ljava/lang/Object;getDeclaredMethod@(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;java/lang/reflect/Methodinvoke9(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;java/lang/ObjectgetClass()Ljava/lang/Class; getResource"(Ljava/lang/String;)Ljava/net/URL; java/net/URLgetFile()Ljava/lang/String;(Ljava/lang/String;)V!/*  0YL+M,N, :- W!/40(  !!"#$%&J*  L++MY,N-:: : W*   !"#&$-+:,I-HJ @'(6)*-&$- !:"#$%+,junit-3.8.2/junit/tests/runner/TextRunnerSingleMethodTest$InvocationTest.class0000644000175000017500000000134210402050442026702 0ustar mkochmkoch.   ()VCodeLineNumberTableLocalVariableTablethisInvocationTest InnerClasses>Ljunit/tests/runner/TextRunnerSingleMethodTest$InvocationTest;testWasInvokedtestNotInvoked SourceFileTextRunnerSingleMethodTest.java  Shouldn't get here. ?&class$junit$runner$TestCaseClassLoaderLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethis"Ljunit/tests/runner/LoadedFromJar;verifyisTestCaseClassLoader(Ljava/lang/ClassLoader;)ZclLjava/lang/ClassLoader;(verifyApplicationClassLoadedByTestLoaderclass$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFileLoadedFromJar.java@ A$ java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError BC D  "E FG HC  junit.runner.TestCaseClassLoader #$I JK LM  NO junit/tests/runner/LoadedFromJarjunit/framework/Assertjava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjava/lang/ObjectgetClass()Ljava/lang/Class;getNamejava/lang/Stringequals(Ljava/lang/Object;)ZgetClassLoader()Ljava/lang/ClassLoader; assertTrue(Z)V!/* 3*    c/+,+  Y   // !"=**  #$N*LY+  %&'()*junit-3.8.2/junit/tests/runner/TextFeedbackTest.java0000644000175000017500000000615510402050442021477 0ustar mkochmkoch package junit.tests.runner; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.io.PrintStream; import junit.framework.AssertionFailedError; import junit.framework.TestCase; import junit.framework.TestResult; import junit.framework.TestSuite; import junit.textui.ResultPrinter; import junit.textui.TestRunner; public class TextFeedbackTest extends TestCase { OutputStream output; TestRunner runner; static class TestResultPrinter extends ResultPrinter { TestResultPrinter(PrintStream writer) { super(writer); } /* Spoof printing time so the tests are deterministic */ protected String elapsedTimeAsString(long runTime) { return "0"; } } public static void main(String[] args) { TestRunner.run(TextFeedbackTest.class); } public void setUp() { output= new ByteArrayOutputStream(); runner= new TestRunner(new TestResultPrinter(new PrintStream(output))); } public void testEmptySuite() { String expected= expected(new String[]{"", "Time: 0", "", "OK (0 tests)", ""}); runner.doRun(new TestSuite()); assertEquals(expected, output.toString()); } public void testOneTest() { String expected= expected(new String[]{".", "Time: 0", "", "OK (1 test)", ""}); TestSuite suite = new TestSuite(); suite.addTest(new TestCase() { public void runTest() {}}); runner.doRun(suite); assertEquals(expected, output.toString()); } public void testTwoTests() { String expected= expected(new String[]{"..", "Time: 0", "", "OK (2 tests)", ""}); TestSuite suite = new TestSuite(); suite.addTest(new TestCase() { public void runTest() {}}); suite.addTest(new TestCase() { public void runTest() {}}); runner.doRun(suite); assertEquals(expected, output.toString()); } public void testFailure() { String expected= expected(new String[]{".F", "Time: 0", "Failures here", "", "FAILURES!!!", "Tests run: 1, Failures: 1, Errors: 0", ""}); ResultPrinter printer= new TestResultPrinter(new PrintStream(output)) { public void printFailures(TestResult result) { getWriter().println("Failures here"); } }; runner.setPrinter(printer); TestSuite suite = new TestSuite(); suite.addTest(new TestCase() { public void runTest() {throw new AssertionFailedError();}}); runner.doRun(suite); assertEquals(expected, output.toString()); } public void testError() { String expected= expected(new String[]{".E", "Time: 0", "Errors here", "", "FAILURES!!!", "Tests run: 1, Failures: 0, Errors: 1", ""}); ResultPrinter printer= new TestResultPrinter(new PrintStream(output)) { public void printErrors(TestResult result) { getWriter().println("Errors here"); } }; runner.setPrinter(printer); TestSuite suite = new TestSuite(); suite.addTest(new TestCase() { public void runTest() throws Exception {throw new Exception();}}); runner.doRun(suite); assertEquals(expected, output.toString()); } private String expected(String[] lines) { OutputStream expected= new ByteArrayOutputStream(); PrintStream expectedWriter= new PrintStream(expected); for (int i= 0; i < lines.length; i++) expectedWriter.println(lines[i]); return expected.toString(); } } junit-3.8.2/junit/tests/runner/BaseTestRunnerTest$NonStatic.class0000644000175000017500000000100410402050442024111 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis NonStatic InnerClasses1Ljunit/tests/runner/BaseTestRunnerTest$NonStatic;suite()Ljunit/framework/Test; SourceFileBaseTestRunnerTest.java /junit/tests/runner/BaseTestRunnerTest$NonStaticjava/lang/Object%junit/tests/runner/BaseTestRunnerTest!/*   ,    junit-3.8.2/junit/tests/runner/TextFeedbackTest$4.class0000644000175000017500000000173210402050442022007 0ustar mkochmkoch.-    !"$this$0%Ljunit/tests/runner/TextFeedbackTest; Synthetic=(Ljunit/tests/runner/TextFeedbackTest;Ljava/io/PrintStream;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/runner/TextFeedbackTest$4;x0Ljava/io/PrintStream; printFailures(Ljunit/framework/TestResult;)VresultLjunit/framework/TestResult; SourceFileTextFeedbackTest.java &  '( Failures here) *+%junit/tests/runner/TextFeedbackTest$4,5junit/tests/runner/TextFeedbackTest$TestResultPrinterTestResultPrinter(Ljava/io/PrintStream;)V getWriter()Ljava/io/PrintStream;java/io/PrintStreamprintln(Ljava/lang/String;)V#junit/tests/runner/TextFeedbackTest     I *,*+C      B * D E  #%junit-3.8.2/junit/tests/runner/TextRunnerSingleMethodTest.java0000644000175000017500000000351110402050442023560 0ustar mkochmkochpackage junit.tests.runner; import java.io.PrintStream; import java.util.Enumeration; import junit.framework.*; import junit.textui.*; /** * Test invoking a single test method of a TestCase. */ public class TextRunnerSingleMethodTest extends TestCase { private final class NullResultPrinter extends ResultPrinter { private NullResultPrinter(PrintStream writer) { super(writer); } public void addError(Test test, Throwable t) { } public void addFailure(Test test, AssertionFailedError t) { } protected String elapsedTimeAsString(long runTime) { return null; } public void endTest(Test test) { } public PrintStream getWriter() { return null; } synchronized void print(TestResult result, long runTime) { } public void printDefect(TestFailure failure, int count) { } protected void printDefectHeader(TestFailure failure, int count) { } protected void printDefects(Enumeration failure, int count, String type) { } protected void printDefectTrace(TestFailure failure) { } protected void printErrors(TestResult result) { } protected void printFailures(TestResult result) { } protected void printFooter(TestResult result) { } protected void printHeader(long runTime) { } void printWaitPrompt() { } public void startTest(Test test) { } } public static class InvocationTest extends TestCase { public void testWasInvoked() { TextRunnerSingleMethodTest.fgWasInvoked= true; } public void testNotInvoked() { fail("Shouldn't get here."); } } static boolean fgWasInvoked= false; public void testSingle() throws Exception { TestRunner t= new TestRunner(new NullResultPrinter(null)); String[] args= { "-m", "junit.tests.runner.TextRunnerSingleMethodTest$InvocationTest.testWasInvoked" }; assertFalse(fgWasInvoked); t.start(args); assertTrue(fgWasInvoked); } }junit-3.8.2/junit/tests/runner/BaseTestRunnerTest.java0000644000175000017500000000134310402050442022044 0ustar mkochmkoch package junit.tests.runner; import junit.framework.Test; import junit.framework.TestCase; import junit.runner.BaseTestRunner; public class BaseTestRunnerTest extends TestCase { public static class MockRunner extends BaseTestRunner { protected void runFailed(String message) { } public void testEnded(String testName) { } public void testFailed(int status, Test test, Throwable t) { } public void testStarted(String testName) { } } public static class NonStatic { public Test suite() { return null; } } public void testInvokeNonStaticSuite() { BaseTestRunner runner= new MockRunner(); runner.getTest("junit.tests.runner.BaseTestRunnerTest$NonStatic"); // Used to throw NullPointerException } } junit-3.8.2/junit/tests/runner/StackFilterTest.class0000644000175000017500000000422710402050442021543 0ustar mkochmkoch.Y 23 24 56 789:;<=>?@ABCDEF G H I JK LMN fFilteredLjava/lang/String; fUnfiltered()VCodeLineNumberTableLocalVariableTablethis$Ljunit/tests/runner/StackFilterTest;setUpswinLjava/io/StringWriter;pwinLjava/io/PrintWriter;swoutpwout testFilter SourceFileStackFilterTest.java !"java/io/StringWriterjava/io/PrintWriter !O$junit.framework.AssertionFailedError PQ0 at junit.framework.Assert.fail(Assert.java:144)1 at junit.framework.Assert.assert(Assert.java:19)1 at junit.framework.Assert.assert(Assert.java:26) at MyTest.f(MyTest.java:13)( at MyTest.testStackTrace(MyTest.java:8)2 at java.lang.reflect.Method.invoke(Native Method)7 at junit.framework.TestCase.runTest(TestCase.java:156)7 at junit.framework.TestCase.runBare(TestCase.java:130)= at junit.framework.TestResult$1.protect(TestResult.java:100)@ at junit.framework.TestResult.runProtected(TestResult.java:118)7 at junit.framework.TestResult.run(TestResult.java:103)3 at junit.framework.TestCase.run(TestCase.java:121)9 at junit.framework.TestSuite.runTest(TestSuite.java:157)@ at junit.framework.TestSuite.run(TestSuite.java, Compiled Code)8 at junit.swingui.TestRunner$17.run(TestRunner.java:669) RS  T UV WX"junit/tests/runner/StackFilterTestjunit/framework/TestCase(Ljava/io/Writer;)Vprintln(Ljava/lang/String;)VtoString()Ljava/lang/String;junit/runner/BaseTestRunnergetFilteredTrace&(Ljava/lang/String;)Ljava/lang/String; assertEquals'(Ljava/lang/String;Ljava/lang/String;)V! !"#/*$ % &'("#_YLY+M,,, , , , , ,,,,,,,,,*+YNY-:  *-$j#)/5;AGMSY_ekq y"#$%&'(%4&')*+,(-*.,/"#=**$ +,% &'01junit-3.8.2/junit/tests/runner/TextFeedbackTest$7.class0000644000175000017500000000117510402050442022013 0ustar mkochmkoch.   this$0%Ljunit/tests/runner/TextFeedbackTest; Synthetic((Ljunit/tests/runner/TextFeedbackTest;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/runner/TextFeedbackTest$7; ExceptionsrunTest()V SourceFileTextFeedbackTest.java  java/lang/Exception%junit/tests/runner/TextFeedbackTest$7junit/framework/TestCase    > **+ W   2Y W  junit-3.8.2/junit/tests/runner/TextFeedbackTest$6.class0000644000175000017500000000172610402050442022014 0ustar mkochmkoch.-    !"$this$0%Ljunit/tests/runner/TextFeedbackTest; Synthetic=(Ljunit/tests/runner/TextFeedbackTest;Ljava/io/PrintStream;)VCodeLineNumberTableLocalVariableTablethis InnerClasses'Ljunit/tests/runner/TextFeedbackTest$6;x0Ljava/io/PrintStream; printErrors(Ljunit/framework/TestResult;)VresultLjunit/framework/TestResult; SourceFileTextFeedbackTest.java &  '( Errors here) *+%junit/tests/runner/TextFeedbackTest$6,5junit/tests/runner/TextFeedbackTest$TestResultPrinterTestResultPrinter(Ljava/io/PrintStream;)V getWriter()Ljava/io/PrintStream;java/io/PrintStreamprintln(Ljava/lang/String;)V#junit/tests/runner/TextFeedbackTest     I *,*+Q      B * R S  #%junit-3.8.2/junit/tests/runner/TextRunnerTest.java0000644000175000017500000000310410402050442021253 0ustar mkochmkochpackage junit.tests.runner; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import junit.framework.TestCase; import junit.framework.TestResult; import junit.framework.TestSuite; public class TextRunnerTest extends TestCase { public void testFailure() throws Exception { execTest("junit.tests.framework.Failure", false); } public void testSuccess() throws Exception { execTest("junit.tests.framework.Success", true); } public void testError() throws Exception { execTest("junit.tests.BogusDude", false); } void execTest(String testClass, boolean success) throws Exception { String java= System.getProperty("java.home")+File.separator+"bin"+File.separator+"java"; String cp= System.getProperty("java.class.path"); //use -classpath for JDK 1.1.7 compatibility String [] cmd= { java, "-classpath", cp, "junit.textui.TestRunner", testClass}; Process p= Runtime.getRuntime().exec(cmd); InputStream i= p.getInputStream(); while((i.read()) != -1) ; //System.out.write(b); assertTrue((p.waitFor() == 0) == success); if (success) assertTrue(p.exitValue() == 0); else assertFalse(p.exitValue() == 0); } public void testRunReturnsResult() { PrintStream oldOut= System.out; System.setOut(new PrintStream ( new OutputStream() { public void write(int arg0) throws IOException { } } )); try { TestResult result= junit.textui.TestRunner.run(new TestSuite()); assertTrue(result.wasSuccessful()); } finally { System.setOut(oldOut); } } }junit-3.8.2/junit/tests/runner/TextRunnerSingleMethodTest.class0000644000175000017500000000262610402050442023752 0ustar mkochmkoch.@ ()* + ,-./ 0 1 2 3456 InnerClasses7InvocationTestNullResultPrinter fgWasInvokedZ()VCodeLineNumberTableLocalVariableTablethis/Ljunit/tests/runner/TextRunnerSingleMethodTest; testSingletLjunit/textui/TestRunner;args[Ljava/lang/String; Exceptions8 SourceFileTextRunnerSingleMethodTest.java junit/textui/TestRunner?junit/tests/runner/TextRunnerSingleMethodTest$NullResultPrinter 9 :java/lang/String-mKjunit.tests.runner.TextRunnerSingleMethodTest$InvocationTest.testWasInvoked  ;< => ?<-junit/tests/runner/TextRunnerSingleMethodTestjunit/framework/TestCase/junit/tests/runner/TextRunnerSingleMethodTest$1&'    junit-3.8.2/junit/tests/runner/LoadedFromJar.java0000644000175000017500000000102110402050442020742 0ustar mkochmkochpackage junit.tests.runner; /** * Test class used in TestTestCaseClassLoader */ import junit.framework.Assert; public class LoadedFromJar extends Assert { public void verify() { verifyApplicationClassLoadedByTestLoader(); } private boolean isTestCaseClassLoader(ClassLoader cl) { return (cl != null && cl.getClass().getName().equals(junit.runner.TestCaseClassLoader.class.getName())); } private void verifyApplicationClassLoadedByTestLoader() { assertTrue(isTestCaseClassLoader(getClass().getClassLoader())); } }junit-3.8.2/junit/tests/runner/StackFilterTest.java0000644000175000017500000000360410402050442021355 0ustar mkochmkochpackage junit.tests.runner; import java.io.PrintWriter; import java.io.StringWriter; import junit.framework.TestCase; import junit.runner.BaseTestRunner; public class StackFilterTest extends TestCase { String fFiltered; String fUnfiltered; protected void setUp() { StringWriter swin= new StringWriter(); PrintWriter pwin= new PrintWriter(swin); pwin.println("junit.framework.AssertionFailedError"); pwin.println(" at junit.framework.Assert.fail(Assert.java:144)"); pwin.println(" at junit.framework.Assert.assert(Assert.java:19)"); pwin.println(" at junit.framework.Assert.assert(Assert.java:26)"); pwin.println(" at MyTest.f(MyTest.java:13)"); pwin.println(" at MyTest.testStackTrace(MyTest.java:8)"); pwin.println(" at java.lang.reflect.Method.invoke(Native Method)"); pwin.println(" at junit.framework.TestCase.runTest(TestCase.java:156)"); pwin.println(" at junit.framework.TestCase.runBare(TestCase.java:130)"); pwin.println(" at junit.framework.TestResult$1.protect(TestResult.java:100)"); pwin.println(" at junit.framework.TestResult.runProtected(TestResult.java:118)"); pwin.println(" at junit.framework.TestResult.run(TestResult.java:103)"); pwin.println(" at junit.framework.TestCase.run(TestCase.java:121)"); pwin.println(" at junit.framework.TestSuite.runTest(TestSuite.java:157)"); pwin.println(" at junit.framework.TestSuite.run(TestSuite.java, Compiled Code)"); pwin.println(" at junit.swingui.TestRunner$17.run(TestRunner.java:669)"); fUnfiltered= swin.toString(); StringWriter swout= new StringWriter(); PrintWriter pwout= new PrintWriter(swout); pwout.println("junit.framework.AssertionFailedError"); pwout.println(" at MyTest.f(MyTest.java:13)"); pwout.println(" at MyTest.testStackTrace(MyTest.java:8)"); fFiltered= swout.toString(); } public void testFilter() { assertEquals(fFiltered, BaseTestRunner.getFilteredTrace(fUnfiltered)); } }junit-3.8.2/junit/tests/runner/TextFeedbackTest$TestResultPrinter.class0000644000175000017500000000121610402050442025323 0ustar mkochmkoch. (Ljava/io/PrintStream;)VCodeLineNumberTableLocalVariableTablethisTestResultPrinter InnerClasses7Ljunit/tests/runner/TextFeedbackTest$TestResultPrinter;writerLjava/io/PrintStream;elapsedTimeAsString(J)Ljava/lang/String;runTimeJ SourceFileTextFeedbackTest.java 05junit/tests/runner/TextFeedbackTest$TestResultPrinterjunit/textui/ResultPrinter#junit/tests/runner/TextFeedbackTest >*+   7    junit-3.8.2/junit/tests/runner/BaseTestRunnerTest$MockRunner.class0000644000175000017500000000170510402050442024302 0ustar mkochmkoch.#  !()VCodeLineNumberTableLocalVariableTablethis MockRunner InnerClasses2Ljunit/tests/runner/BaseTestRunnerTest$MockRunner; runFailed(Ljava/lang/String;)VmessageLjava/lang/String; testEndedtestName testFailed/(ILjunit/framework/Test;Ljava/lang/Throwable;)VstatusItestLjunit/framework/Test;tLjava/lang/Throwable; testStarted SourceFileBaseTestRunnerTest.java "0junit/tests/runner/BaseTestRunnerTest$MockRunnerjunit/runner/BaseTestRunner%junit/tests/runner/BaseTestRunnerTest!/*    5  5 I* 5   junit-3.8.2/junit/tests/runner/test.jar0000644000175000017500000000302310402050442017107 0ustar mkochmkochPK zc4 META-INF/PK zc4K^jMETA-INF/MANIFEST.MFMLK-. K-*ϳR03rCq,HLHU%LyRKRSt*AM t 4K|3+KRs<4yxPK zc4junit/PK zc4 junit/tests/PK zc4junit/tests/runner/PK zc44&junit/tests/runner/LoadedFromJar.classT]S@=[JSBPۂ |(Pg`., nR/?f}ݤP,U={{_R RV*Qь*FqGb^ex$cr:.  3 umsѷ]/c<#炡9mz7uang q(&jpsXֲyŲ^HCG#O~zE(~P‡׼˴T%CI#۴$8A3#JjLj{){eiT-!$U=:{U:A=a:q/6#ۏ?M$T!{IPK zc4 AMETA-INF/PK zc4K^j+META-INF/MANIFEST.MFPK zc4Ajunit/PK zc4 Ajunit/tests/PK zc4A junit/tests/runner/PK zc44&:junit/tests/runner/LoadedFromJar.classPK}junit-3.8.2/junit/tests/WasRun.java0000644000175000017500000000040310402050442016202 0ustar mkochmkochpackage junit.tests; import junit.framework.TestCase; /** * A helper test case for testing whether the testing method * is run. */ public class WasRun extends TestCase { public boolean fWasRun= false; protected void runTest() { fWasRun= true; } }junit-3.8.2/junit/tests/AllTests.java0000644000175000017500000000101410402050442016515 0ustar mkochmkochpackage junit.tests; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite that runs all the JUnit tests * */ public class AllTests { public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Test suite() { TestSuite suite= new TestSuite("Framework Tests"); suite.addTest(junit.tests.framework.AllTests.suite()); suite.addTest(junit.tests.runner.AllTests.suite()); suite.addTest(junit.tests.extensions.AllTests.suite()); return suite; } }junit-3.8.2/junit/tests/extensions/0000755000175000017500000000000010402050442016322 5ustar mkochmkochjunit-3.8.2/junit/tests/extensions/AllTests.class0000644000175000017500000000342410402050442021107 0ustar mkochmkoch.V 4567 8 9 : ; <=>? 9 @A B C DE FG HIJK*class$junit$tests$extensions$ExtensionTestLjava/lang/Class; Synthetic2class$junit$tests$extensions$ExceptionTestCaseTest+class$junit$tests$extensions$ActiveTestTest-class$junit$tests$extensions$RepeatedTestTest()VCodeLineNumberTableLocalVariableTablethis!Ljunit/tests/extensions/AllTests;main([Ljava/lang/String;)Vargs[Ljava/lang/String;suite()Ljunit/framework/Test;Ljunit/framework/TestSuite;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFile AllTests.javaL M- java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError NO P  )*Q RSjunit/framework/TestSuiteFramework Tests $junit.tests.extensions.ExtensionTest ,- TU ,junit.tests.extensions.ExceptionTestCaseTest %junit.tests.extensions.ActiveTestTest 'junit.tests.extensions.RepeatedTestTestjunit/tests/extensions/AllTestsjava/lang/Objectjava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult; addTestSuite(Ljava/lang/Class;)V! /*! " #$ %& 6W!  " '( )* p Y K*  Y  *Y*Y*Y*! #<Un"  f)+,- N*LY+!" ./0123junit-3.8.2/junit/tests/extensions/ExceptionTestCaseTest.java0000644000175000017500000000404610402050442023423 0ustar mkochmkochpackage junit.tests.extensions; import junit.extensions.ExceptionTestCase; import junit.framework.TestResult; public class ExceptionTestCaseTest extends junit.framework.TestCase { static public class ThrowExceptionTestCase extends ExceptionTestCase { public ThrowExceptionTestCase(String name, Class exception) { super(name, exception); } public void test() { throw new IndexOutOfBoundsException(); } } static public class ThrowRuntimeExceptionTestCase extends ExceptionTestCase { public ThrowRuntimeExceptionTestCase(String name, Class exception) { super(name, exception); } public void test() { throw new RuntimeException(); } } static public class ThrowNoExceptionTestCase extends ExceptionTestCase { public ThrowNoExceptionTestCase(String name, Class exception) { super(name, exception); } public void test() { } } public void testExceptionSubclass() { ExceptionTestCase test= new ThrowExceptionTestCase("test", IndexOutOfBoundsException.class); TestResult result= test.run(); assertEquals(1, result.runCount()); assertTrue(result.wasSuccessful()); } public void testExceptionTest() { ExceptionTestCase test= new ThrowExceptionTestCase("test", IndexOutOfBoundsException.class); TestResult result= test.run(); assertEquals(1, result.runCount()); assertTrue(result.wasSuccessful()); } public void testFailure() { ExceptionTestCase test= new ThrowRuntimeExceptionTestCase("test", IndexOutOfBoundsException.class); TestResult result= test.run(); assertEquals(1, result.runCount()); assertEquals(1, result.errorCount()); } public void testNoException() { ExceptionTestCase test= new ThrowNoExceptionTestCase("test", Exception.class); TestResult result= test.run(); assertEquals(1, result.runCount()); assertEquals(1, result.failureCount()); } public void testWrongException() { ExceptionTestCase test= new ThrowRuntimeExceptionTestCase("test", IndexOutOfBoundsException.class); TestResult result= test.run(); assertEquals(1, result.runCount()); assertEquals(1, result.errorCount()); } }junit-3.8.2/junit/tests/extensions/ExtensionTest$3.class0000644000175000017500000000125510402050442022317 0ustar mkochmkoch.   this$0&Ljunit/tests/extensions/ExtensionTest; Synthetic;(Ljunit/tests/extensions/ExtensionTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses(Ljunit/tests/extensions/ExtensionTest$3;x0Ljava/lang/String;runTest()V SourceFileExtensionTest.java  java/lang/Error &junit/tests/extensions/ExtensionTest$3junit/framework/TestCase(Ljava/lang/String;)V    I *,*+ .     2Y /  junit-3.8.2/junit/tests/extensions/ActiveTestTest$SuccessTest.class0000644000175000017500000000076410402050442024530 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis SuccessTest InnerClasses3Ljunit/tests/extensions/ActiveTestTest$SuccessTest;runTest SourceFileActiveTestTest.java 1junit/tests/extensions/ActiveTestTest$SuccessTestjunit/framework/TestCase%junit/tests/extensions/ActiveTestTest!/*   +    junit-3.8.2/junit/tests/extensions/ExtensionTest$TornDown.class0000644000175000017500000000115110402050442023722 0ustar mkochmkoch.   fTornDownZ(Ljunit/framework/Test;)VCodeLineNumberTableLocalVariableTablethisTornDown InnerClasses/Ljunit/tests/extensions/ExtensionTest$TornDown;testLjunit/framework/Test;tearDown()V SourceFileExtensionTest.java  -junit/tests/extensions/ExtensionTest$TornDownjunit/extensions/TestSetup$junit/tests/extensions/ExtensionTest  G *+*      4*     junit-3.8.2/junit/tests/extensions/ExtensionTest$2.class0000644000175000017500000000123710402050442022316 0ustar mkochmkoch.   this$0&Ljunit/tests/extensions/ExtensionTest; Synthetic;(Ljunit/tests/extensions/ExtensionTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses(Ljunit/tests/extensions/ExtensionTest$2;x0Ljava/lang/String;runTest()V SourceFileExtensionTest.java   &junit/tests/extensions/ExtensionTest$2junit/framework/TestCase(Ljava/lang/String;)Vfail   I *,*+ (     2 )*  junit-3.8.2/junit/tests/extensions/AllTests.java0000644000175000017500000000116210402050442020720 0ustar mkochmkochpackage junit.tests.extensions; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite that runs all the extension tests * */ public class AllTests { public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Test suite() { // Collect tests manually because we have to test class collection code TestSuite suite= new TestSuite("Framework Tests"); suite.addTestSuite(ExtensionTest.class); suite.addTestSuite(ExceptionTestCaseTest.class); suite.addTestSuite(ActiveTestTest.class); suite.addTestSuite(RepeatedTestTest.class); return suite; } }junit-3.8.2/junit/tests/extensions/RepeatedTestTest$SuccessTest.class0000644000175000017500000000077410402050442025047 0ustar mkochmkoch. ()VCodeLineNumberTableLocalVariableTablethis SuccessTest InnerClasses5Ljunit/tests/extensions/RepeatedTestTest$SuccessTest;runTest SourceFileRepeatedTestTest.java 3junit/tests/extensions/RepeatedTestTest$SuccessTestjunit/framework/TestCase'junit/tests/extensions/RepeatedTestTest!/*   +    junit-3.8.2/junit/tests/extensions/ExtensionTest$4.class0000644000175000017500000000137310402050442022321 0ustar mkochmkoch."   this$0&Ljunit/tests/extensions/ExtensionTest; Synthetic?(Ljunit/tests/extensions/ExtensionTest;Ljunit/framework/Test;)VCodeLineNumberTableLocalVariableTablethis InnerClasses(Ljunit/tests/extensions/ExtensionTest$4;x0Ljunit/framework/Test;setUp()V SourceFileExtensionTest.java   &junit/tests/extensions/ExtensionTest$4!-junit/tests/extensions/ExtensionTest$TornDownTornDown(Ljunit/framework/Test;)Vfail$junit/tests/extensions/ExtensionTest   I *,*+ C     2 DE junit-3.8.2/junit/tests/extensions/ActiveTestTest.class0000644000175000017500000000346310402050442022272 0ustar mkochmkoch.H , -. , /0 1 2 3 45 67 ,8 , 9:; SuccessTest InnerClasses()VCodeLineNumberTableLocalVariableTablethis'Ljunit/tests/extensions/ActiveTestTest;testActiveTesttestLjunit/framework/Test;resultLjunit/framework/TestResult;testActiveRepeatedTesttestActiveRepeatedTest0testActiveRepeatedTest1createActiveTestSuite$()Ljunit/extensions/ActiveTestSuite;iIsuite"Ljunit/extensions/ActiveTestSuite; SourceFileActiveTestTest.java  $%junit/framework/TestResult< => ?@ AB C@ D@junit/extensions/RepeatedTest E junit/extensions/ActiveTestSuite1junit/tests/extensions/ActiveTestTest$SuccessTest FG%junit/tests/extensions/ActiveTestTestjunit/framework/TestCasejunit/framework/Testrun(Ljunit/framework/TestResult;)VrunCount()I assertEquals(II)V failureCount errorCount(Ljunit/framework/Test;I)VaddTest(Ljunit/framework/Test;)V!3*   .*LYM+,d,,,  %- .) ! !7 Y* LYM+,,,,   !&".#6$ 7 *" "5 Y* LYM+,,,, ' ()*$+,,4- 5 (  #6 Y* LYM+,d,,, 0 123%4-556 6 )! $%q# Y L=d+Y+9:;:!<  &'#()*+  junit-3.8.2/junit/tests/extensions/ExtensionTest.java0000644000175000017500000000355110402050442022005 0ustar mkochmkochpackage junit.tests.extensions; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestResult; import junit.framework.TestSuite; import junit.tests.WasRun; /** * A test case testing the extensions to the testing framework. * */ public class ExtensionTest extends TestCase { static class TornDown extends TestSetup { boolean fTornDown= false; TornDown(Test test) { super(test); } protected void tearDown() { fTornDown= true; } } public void testRunningErrorInTestSetup() { TestCase test= new TestCase("failure") { public void runTest() { fail(); } }; TestSetup wrapper= new TestSetup(test); TestResult result= new TestResult(); wrapper.run(result); assertTrue(!result.wasSuccessful()); } public void testRunningErrorsInTestSetup() { TestCase failure= new TestCase("failure") { public void runTest() { fail(); } }; TestCase error= new TestCase("error") { public void runTest() { throw new Error(); } }; TestSuite suite= new TestSuite(); suite.addTest(failure); suite.addTest(error); TestSetup wrapper= new TestSetup(suite); TestResult result= new TestResult(); wrapper.run(result); assertEquals(1, result.failureCount()); assertEquals(1, result.errorCount()); } public void testSetupErrorDontTearDown() { WasRun test= new WasRun(); TornDown wrapper= new TornDown(test) { public void setUp() { fail(); } }; TestResult result= new TestResult(); wrapper.run(result); assertTrue(!wrapper.fTornDown); } public void testSetupErrorInTestSetup() { WasRun test= new WasRun(); TestSetup wrapper= new TestSetup(test) { public void setUp() { fail(); } }; TestResult result= new TestResult(); wrapper.run(result); assertTrue(!test.fWasRun); assertTrue(!result.wasSuccessful()); } }junit-3.8.2/junit/tests/extensions/ActiveTestTest.java0000644000175000017500000000323410402050442022102 0ustar mkochmkochpackage junit.tests.extensions; import junit.extensions.ActiveTestSuite; import junit.extensions.RepeatedTest; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestResult; /** * Testing the ActiveTest support */ public class ActiveTestTest extends TestCase { public static class SuccessTest extends TestCase { public void runTest() { } } public void testActiveTest() { Test test= createActiveTestSuite(); TestResult result= new TestResult(); test.run(result); assertEquals(100, result.runCount()); assertEquals(0, result.failureCount()); assertEquals(0, result.errorCount()); } public void testActiveRepeatedTest() { Test test= new RepeatedTest(createActiveTestSuite(), 5); TestResult result= new TestResult(); test.run(result); assertEquals(500, result.runCount()); assertEquals(0, result.failureCount()); assertEquals(0, result.errorCount()); } public void testActiveRepeatedTest0() { Test test= new RepeatedTest(createActiveTestSuite(), 0); TestResult result= new TestResult(); test.run(result); assertEquals(0, result.runCount()); assertEquals(0, result.failureCount()); assertEquals(0, result.errorCount()); } public void testActiveRepeatedTest1() { Test test= new RepeatedTest(createActiveTestSuite(), 1); TestResult result= new TestResult(); test.run(result); assertEquals(100, result.runCount()); assertEquals(0, result.failureCount()); assertEquals(0, result.errorCount()); } ActiveTestSuite createActiveTestSuite() { ActiveTestSuite suite= new ActiveTestSuite(); for (int i= 0; i < 100; i++) suite.addTest(new SuccessTest()); return suite; } }junit-3.8.2/junit/tests/extensions/ExtensionTest.class0000644000175000017500000000447410402050442022176 0ustar mkochmkoch.j !>?4 AB CD > E F GH AI5 AJ > K L M NO >P Q "E "RS Q TUVWTornDown InnerClasses()VCodeLineNumberTableLocalVariableTablethis&Ljunit/tests/extensions/ExtensionTest;testRunningErrorInTestSetuptestLjunit/framework/TestCase;wrapperLjunit/extensions/TestSetup;resultLjunit/framework/TestResult;testRunningErrorsInTestSetupfailureerrorsuiteLjunit/framework/TestSuite;testSetupErrorDontTearDownLjunit/tests/WasRun;/Ljunit/tests/extensions/ExtensionTest$TornDown;testSetupErrorInTestSetup SourceFileExtensionTest.java %&&junit/tests/extensions/ExtensionTest$1 %Xjunit/extensions/TestSetup %Yjunit/framework/TestResult Z[ \] ^_&junit/tests/extensions/ExtensionTest$2&junit/tests/extensions/ExtensionTest$3junit/framework/TestSuite `Y ab cd ebjunit/tests/WasRun&junit/tests/extensions/ExtensionTest$4 %f gh&junit/tests/extensions/ExtensionTest$5 ih$junit/tests/extensions/ExtensionTestjunit/framework/TestCase-junit/tests/extensions/ExtensionTest$TornDown;(Ljunit/tests/extensions/ExtensionTest;Ljava/lang/String;)V(Ljunit/framework/Test;)Vrun(Ljunit/framework/TestResult;)V wasSuccessful()Z assertTrue(Z)VaddTest failureCount()I assertEquals(II)V errorCount?(Ljunit/tests/extensions/ExtensionTest;Ljunit/framework/Test;)V fTornDownZfWasRun! !%&'3*( ) *+,&'1Y*LY+MYN,- -  ( "#!$0%)*1*+ &-./0123&'U Y* LY*MYN-+-,Y-:Y: (. ' -34#5(729;:B<K=T>)>U*+ J4.?5.7672#/0;128&'/YLY*+MYN,-, (@BHIK.L)*/*+'-9/:12;&'>YLY*+MYN,- + -  (NPVWY.Z=[)*>*+6-9,/0$12<=$2" # junit-3.8.2/junit/tests/extensions/RepeatedTestTest.class0000644000175000017500000000344310402050442022606 0ustar mkochmkoch.N /0 1 23 1 45 6 78 9: 1 7; <=> ?@A SuccessTest InnerClassesfSuiteLjunit/framework/TestSuite;(Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis)Ljunit/tests/extensions/RepeatedTestTest;nameLjava/lang/String;testRepeatedOnce()VtestLjunit/framework/Test;resultLjunit/framework/TestResult;testRepeatedMoreThanOncetestRepeatedZerotestRepeatedNegativee$Ljava/lang/IllegalArgumentException; SourceFileRepeatedTestTest.java junit/framework/TestSuite # 3junit/tests/extensions/RepeatedTestTest$SuccessTest BCjunit/extensions/RepeatedTest DE FG HIjunit/framework/TestResult JK LG"java/lang/IllegalArgumentException(Should throw an IllegalArgumentException M'junit/tests/extensions/RepeatedTestTestjunit/framework/TestCaseaddTest(Ljunit/framework/Test;)V(Ljunit/framework/Test;I)Vjunit/framework/TestcountTestCases()I assertEquals(II)Vrun(Ljunit/framework/TestResult;)VrunCountfail!q-*+*Y*Y*Y,-- !"#/Y* L+  Y M+,,   !&".# / "$%&'(#1Y* L+  Y M+,, & '( )'*0+ 1 $$% &')#/Y* L+  Y M+,, . /01&2.3 / "$%&'*#hY* WL 7 :89;<+,-.  junit-3.8.2/junit/tests/extensions/ExceptionTestCaseTest$ThrowRuntimeExceptionTestCase.class0000644000175000017500000000137510402050442031560 0ustar mkochmkoch.  &(Ljava/lang/String;Ljava/lang/Class;)VCodeLineNumberTableLocalVariableTablethisThrowRuntimeExceptionTestCase InnerClassesLLjunit/tests/extensions/ExceptionTestCaseTest$ThrowRuntimeExceptionTestCase;nameLjava/lang/String; exceptionLjava/lang/Class;test()V SourceFileExceptionTestCaseTest.java java/lang/RuntimeException Jjunit/tests/extensions/ExceptionTestCaseTest$ThrowRuntimeExceptionTestCase"junit/extensions/ExceptionTestCase,junit/tests/extensions/ExceptionTestCaseTest!I*+,   2Y     junit-3.8.2/junit/tests/extensions/ExtensionTest$1.class0000644000175000017500000000123710402050442022315 0ustar mkochmkoch.   this$0&Ljunit/tests/extensions/ExtensionTest; Synthetic;(Ljunit/tests/extensions/ExtensionTest;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis InnerClasses(Ljunit/tests/extensions/ExtensionTest$1;x0Ljava/lang/String;runTest()V SourceFileExtensionTest.java   &junit/tests/extensions/ExtensionTest$1junit/framework/TestCase(Ljava/lang/String;)Vfail   I *,*+      2   junit-3.8.2/junit/tests/extensions/RepeatedTestTest.java0000644000175000017500000000263510402050442022424 0ustar mkochmkochpackage junit.tests.extensions; import junit.extensions.RepeatedTest; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestResult; import junit.framework.TestSuite; /** * Testing the RepeatedTest support. */ public class RepeatedTestTest extends TestCase { private TestSuite fSuite; public static class SuccessTest extends TestCase { public void runTest() { } } public RepeatedTestTest(String name) { super(name); fSuite= new TestSuite(); fSuite.addTest(new SuccessTest()); fSuite.addTest(new SuccessTest()); } public void testRepeatedOnce() { Test test= new RepeatedTest(fSuite, 1); assertEquals(2, test.countTestCases()); TestResult result= new TestResult(); test.run(result); assertEquals(2, result.runCount()); } public void testRepeatedMoreThanOnce() { Test test= new RepeatedTest(fSuite, 3); assertEquals(6, test.countTestCases()); TestResult result= new TestResult(); test.run(result); assertEquals(6, result.runCount()); } public void testRepeatedZero() { Test test= new RepeatedTest(fSuite, 0); assertEquals(0, test.countTestCases()); TestResult result= new TestResult(); test.run(result); assertEquals(0, result.runCount()); } public void testRepeatedNegative() { try { new RepeatedTest(fSuite, -1); } catch (IllegalArgumentException e) { return; } fail("Should throw an IllegalArgumentException"); } }junit-3.8.2/junit/tests/extensions/ExtensionTest$5.class0000644000175000017500000000125310402050442022317 0ustar mkochmkoch.   this$0&Ljunit/tests/extensions/ExtensionTest; Synthetic?(Ljunit/tests/extensions/ExtensionTest;Ljunit/framework/Test;)VCodeLineNumberTableLocalVariableTablethis InnerClasses(Ljunit/tests/extensions/ExtensionTest$5;x0Ljunit/framework/Test;setUp()V SourceFileExtensionTest.java   &junit/tests/extensions/ExtensionTest$5junit/extensions/TestSetup(Ljunit/framework/Test;)Vfail   I *,*+ Q     2 RS  junit-3.8.2/junit/tests/extensions/ExceptionTestCaseTest.class0000644000175000017500000000505410402050442023607 0ustar mkochmkoch.k <=>? @ A BC, DE F G HI JK L JM NO G JPQ RS G JTUVThrowNoExceptionTestCase InnerClassesThrowRuntimeExceptionTestCaseThrowExceptionTestCase)class$java$lang$IndexOutOfBoundsExceptionLjava/lang/Class; Syntheticclass$java$lang$Exception()VCodeLineNumberTableLocalVariableTablethis.Ljunit/tests/extensions/ExceptionTestCaseTest;testExceptionSubclasstest$Ljunit/extensions/ExceptionTestCase;resultLjunit/framework/TestResult;testExceptionTest testFailuretestNoExceptiontestWrongExceptionclass$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFileExceptionTestCaseTest.javaW X5 java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError YZ $[ $%Cjunit/tests/extensions/ExceptionTestCaseTest$ThrowExceptionTestCase !#java.lang.IndexOutOfBoundsException 45 $\] ^_` ab cd ef ghJjunit/tests/extensions/ExceptionTestCaseTest$ThrowRuntimeExceptionTestCase ibEjunit/tests/extensions/ExceptionTestCaseTest$ThrowNoExceptionTestCase #!java.lang.Exception jb,junit/tests/extensions/ExceptionTestCaseTestjunit/framework/TestCasejava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)V&(Ljava/lang/String;Ljava/lang/Class;)V"junit/extensions/ExceptionTestCaserun()Ljunit/framework/TestResult;junit/framework/TestResultrunCount()I assertEquals(II)V wasSuccessful()Z assertTrue(Z)V errorCount failureCount! !"#!"$%&3*' ( )*+%&4Y  Y  L+ M,,'#$$%,&3'( 4)*,-$./0%&4Y  Y  L+ M,,')*$+,,3-( 4)*,-$./1%&5Y  Y  L+ M,,'/0$1,243( 5)*,-$./2%&5Y YL+ M,,'56$7,849( 5)*,-$./3%&5Y  Y  L+ M,,';<$=,>4?( 5)*,-$./45&N*LY+'#( 6789":;   junit-3.8.2/junit/tests/extensions/ExceptionTestCaseTest$ThrowExceptionTestCase.class0000644000175000017500000000136110402050442030207 0ustar mkochmkoch.  &(Ljava/lang/String;Ljava/lang/Class;)VCodeLineNumberTableLocalVariableTablethisThrowExceptionTestCase InnerClassesELjunit/tests/extensions/ExceptionTestCaseTest$ThrowExceptionTestCase;nameLjava/lang/String; exceptionLjava/lang/Class;test()V SourceFileExceptionTestCaseTest.java #java/lang/IndexOutOfBoundsException Cjunit/tests/extensions/ExceptionTestCaseTest$ThrowExceptionTestCase"junit/extensions/ExceptionTestCase,junit/tests/extensions/ExceptionTestCaseTest!I*+,    2Y     junit-3.8.2/junit/tests/extensions/ExceptionTestCaseTest$ThrowNoExceptionTestCase.class0000644000175000017500000000127510402050442030510 0ustar mkochmkoch. &(Ljava/lang/String;Ljava/lang/Class;)VCodeLineNumberTableLocalVariableTablethisThrowNoExceptionTestCase InnerClassesGLjunit/tests/extensions/ExceptionTestCaseTest$ThrowNoExceptionTestCase;nameLjava/lang/String; exceptionLjava/lang/Class;test()V SourceFileExceptionTestCaseTest.java Ejunit/tests/extensions/ExceptionTestCaseTest$ThrowNoExceptionTestCase"junit/extensions/ExceptionTestCase,junit/tests/extensions/ExceptionTestCaseTest!I*+,    +    junit-3.8.2/junit/tests/WasRun.class0000644000175000017500000000061010402050442016366 0ustar mkochmkoch.  fWasRunZ()VCodeLineNumberTableLocalVariableTablethisLjunit/tests/WasRun;runTest SourceFile WasRun.java  junit/tests/WasRunjunit/framework/TestCase! 8 **     4*    junit-3.8.2/junit/samples/0000755000175000017500000000000010402050442014425 5ustar mkochmkochjunit-3.8.2/junit/samples/VectorTest.class0000644000175000017500000000555310402050442017566 0ustar mkochmkoch. LMNO P Q "R !S TUV R !W !XY Z [\ !]^ !_ ` a !b c d e fgh !i j k lmnfEmptyLjava/util/Vector;fFullclass$junit$samples$VectorTestLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethisLjunit/samples/VectorTest;main([Ljava/lang/String;)Vargs[Ljava/lang/String;setUpsuite()Ljunit/framework/Test; testCapacityiIsize testCloneclone testContains testElementAte*Ljava/lang/ArrayIndexOutOfBoundsException;Ljava/lang/Integer; testRemoveAlltestRemoveElementclass$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFileVectorTest.javao pE java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError qr )s )* 56t uvjava/util/Vector #$ %$java/lang/Integer )w xyjunit/framework/TestSuite &'junit.samples.VectorTest DE )z :{ |} <~  {(java/lang/ArrayIndexOutOfBoundsException.Should raise an ArrayIndexOutOfBoundsException s * junit/samples/VectorTestjunit/framework/TestCasejava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult;(I)V addElement(Ljava/lang/Object;)V(Ljava/lang/Class;)V()I assertTrue(Z)V()Ljava/lang/Object;contains(Ljava/lang/Object;)Z elementAt(I)Ljava/lang/Object;intValuefailremoveAllElementsisEmpty()Z removeElement!!"#$%$&'( )*+/*, - ./ 01+6W, - 234*+D* Y * Y * Y* Y* Y, %4C- D./ 56+5YY,7*+<* <=d* Y* d`, ! %";#-  89<./4:9;*+q1*  L+* + Y,% &!'0(-1./ &<$=*+_-* Y* Y,*+,,- -./>*+6*  L+* * WM+.,". /2+5.3/40657- /?@6./ *8AB*+]#* * * * ,9:;<"=- #./C*+]+* Y W* Y,?@*A- +./DE+N*LY+,- FGHI(JKjunit-3.8.2/junit/samples/AllTests.class0000644000175000017500000000267010402050442017214 0ustar mkochmkoch.P ./01 2 3 4 5 6789 3 :5 ; <= > ? @5AB#class$junit$samples$money$MoneyTestLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethisLjunit/samples/AllTests;main([Ljava/lang/String;)Vargs[Ljava/lang/String;suite()Ljunit/framework/Test;Ljunit/framework/TestSuite;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFile AllTests.javaC D' java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError EF G  #$H IJjunit/framework/TestSuiteAll JUnit TestsK LM junit.samples.money.MoneyTest &' NOjunit/samples/AllTestsjava/lang/Objectjava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult;junit/samples/VectorTestaddTest(Ljunit/framework/Test;)V(Ljava/lang/Class;)Vjunit/tests/AllTests!/*    6W   !" #$t: Y K* * YY * * 18  0#%&'N*LY+ ()*+,-junit-3.8.2/junit/samples/SimpleTest.java0000644000175000017500000000235510402050442017366 0ustar mkochmkochpackage junit.samples; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Some simple tests. * */ public class SimpleTest extends TestCase { protected int fValue1; protected int fValue2; protected void setUp() { fValue1= 2; fValue2= 3; } public static Test suite() { /* * the type safe way * TestSuite suite= new TestSuite(); suite.addTest( new SimpleTest("add") { protected void runTest() { testAdd(); } } ); suite.addTest( new SimpleTest("testDivideByZero") { protected void runTest() { testDivideByZero(); } } ); return suite; */ /* * the dynamic way */ return new TestSuite(SimpleTest.class); } public void testAdd() { double result= fValue1 + fValue2; // forced failure result == 5 assertTrue(result == 6); } public void testDivideByZero() { int zero= 0; int result= 8/zero; result++; // avoid warning for not using result } public void testEquals() { assertEquals(12, 12); assertEquals(12L, 12L); assertEquals(new Long(12), new Long(12)); assertEquals("Size", 12, 13); assertEquals("Capacity", 12.0, 11.99, 0.0); } public static void main (String[] args) { junit.textui.TestRunner.run(suite()); } }junit-3.8.2/junit/samples/AllTests.java0000644000175000017500000000100410402050442017016 0ustar mkochmkochpackage junit.samples; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite that runs all the sample tests * */ public class AllTests { public static void main (String[] args) { junit.textui.TestRunner.run (suite()); } public static Test suite ( ) { TestSuite suite= new TestSuite("All JUnit Tests"); suite.addTest(VectorTest.suite()); suite.addTest(new TestSuite(junit.samples.money.MoneyTest.class)); suite.addTest(junit.tests.AllTests.suite()); return suite; } }junit-3.8.2/junit/samples/SimpleTest.class0000644000175000017500000000404110402050442017544 0ustar mkochmkoch.u FGHI J K #L "M "NO "PQ "R S@ "T "U "VW X "YZ "[\@(@'G{ "] "^ _`abfValue1IfValue2class$junit$samples$SimpleTestLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethisLjunit/samples/SimpleTest;setUpsuite()Ljunit/framework/Test;testAddresultDtestDivideByZerozero testEqualsmain([Ljava/lang/String;)Vargs[Ljava/lang/String;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFileSimpleTest.javac d? java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError ef *g *+ $% &%junit/framework/TestSuite '(junit.samples.SimpleTest >? *h ij kl kmjava/lang/Long *n koSize kpCapacity kq 23r stjunit/samples/SimpleTestjunit/framework/TestCasejava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)V(Ljava/lang/Class;)V assertTrue(Z)V assertEquals(II)V(JJ)V(J)V'(Ljava/lang/Object;Ljava/lang/Object;)V(Ljava/lang/String;II)V(Ljava/lang/String;DDD)Vjunit/textui/TestRunnerrun4(Ljunit/framework/Test;)Ljunit/framework/TestResult;!"#$%&%'()*+,/*- . /01+,= **- .  /0 23,5 Y  Y  -*4+,X**`H'-- /0./0 567+,U <l=-234 5.  /0 8%5%9+,{=  YY  -789';0<<=. =/0 :;,6 !W- ?@. <=>?,N*LY+-*. @ABC)DEjunit-3.8.2/junit/samples/VectorTest.java0000644000175000017500000000321310402050442017371 0ustar mkochmkochpackage junit.samples; import java.util.Vector; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * A sample test case, testing java.util.Vector. * */ public class VectorTest extends TestCase { protected Vector fEmpty; protected Vector fFull; public static void main (String[] args) { junit.textui.TestRunner.run (suite()); } protected void setUp() { fEmpty= new Vector(); fFull= new Vector(); fFull.addElement(new Integer(1)); fFull.addElement(new Integer(2)); fFull.addElement(new Integer(3)); } public static Test suite() { return new TestSuite(VectorTest.class); } public void testCapacity() { int size= fFull.size(); for (int i= 0; i < 100; i++) fFull.addElement(new Integer(i)); assertTrue(fFull.size() == 100+size); } public void testClone() { Vector clone= (Vector)fFull.clone(); assertTrue(clone.size() == fFull.size()); assertTrue(clone.contains(new Integer(1))); } public void testContains() { assertTrue(fFull.contains(new Integer(1))); assertTrue(!fEmpty.contains(new Integer(1))); } public void testElementAt() { Integer i= (Integer)fFull.elementAt(0); assertTrue(i.intValue() == 1); try { fFull.elementAt(fFull.size()); } catch (ArrayIndexOutOfBoundsException e) { return; } fail("Should raise an ArrayIndexOutOfBoundsException"); } public void testRemoveAll() { fFull.removeAllElements(); fEmpty.removeAllElements(); assertTrue(fFull.isEmpty()); assertTrue(fEmpty.isEmpty()); } public void testRemoveElement() { fFull.removeElement(new Integer(3)); assertTrue(!fFull.contains(new Integer(3)) ); } }junit-3.8.2/junit/samples/money/0000755000175000017500000000000010402050442015554 5ustar mkochmkochjunit-3.8.2/junit/samples/money/Money.class0000644000175000017500000000524310402050442017676 0ustar mkochmkoch.n J K L M N OPQ R S TU TM VW V OX Y Z[ J\ ] ^_` a TbcfAmountI fCurrencyLjava/lang/String;(ILjava/lang/String;)VCodeLineNumberTableLocalVariableTablethisLjunit/samples/money/Money;amountcurrencyadd:(Ljunit/samples/money/IMoney;)Ljunit/samples/money/IMoney;mLjunit/samples/money/IMoney;addMoney9(Ljunit/samples/money/Money;)Ljunit/samples/money/IMoney; addMoneyBag<(Ljunit/samples/money/MoneyBag;)Ljunit/samples/money/IMoney;sLjunit/samples/money/MoneyBag;()I()Ljava/lang/String;equals(Ljava/lang/Object;)ZaMoneyanObjectLjava/lang/Object;hashCodeisZero()Zmultiply(I)Ljunit/samples/money/IMoney;factornegate()Ljunit/samples/money/IMoney;subtracttoStringbufferLjava/lang/StringBuffer;appendTo!(Ljunit/samples/money/MoneyBag;)V SourceFile Money.java d   -. (4e 56junit/samples/money/Money '3 !f gh ;<junit/samples/money/IMoney :3 @A )*java/lang/StringBuffer[ ij ik ] C4 lmjava/lang/Object()Vjava/lang/Stringjunit/samples/money/MoneyBagcreateV(Ljunit/samples/money/IMoney;Ljunit/samples/money/IMoney;)Ljunit/samples/money/IMoney;append,(Ljava/lang/String;)Ljava/lang/StringBuffer;(I)Ljava/lang/StringBuffer; appendMoney(Ljunit/samples/money/Money;)V!  !"Y***,# $ %&'()*"<+*#$%&+,-."e)+*Y*+`* *+ ##$)%&)+&/0":+* #$%&12'3"/*#"$ %&(4"/*#%$ %&56"E* + + +'+M,**,#()*+,$-C0$ $7&E%&E89:3"7 **`#3$  %&;<"7 *#6$  %&=>"FY*h* #9$%&?@A";Y*t* #<$ %&B*"? *+#?$ %& +,C4"u9YL+Y**W+#BC4D$9%&1DEFG">+*# GH$%&+2HIjunit-3.8.2/junit/samples/money/MoneyTest.java0000644000175000017500000001142410402050442020350 0ustar mkochmkochpackage junit.samples.money; import junit.framework.TestCase; public class MoneyTest extends TestCase { private Money f12CHF; private Money f14CHF; private Money f7USD; private Money f21USD; private IMoney fMB1; private IMoney fMB2; public static void main(String args[]) { junit.textui.TestRunner.run(MoneyTest.class); } protected void setUp() { f12CHF= new Money(12, "CHF"); f14CHF= new Money(14, "CHF"); f7USD= new Money( 7, "USD"); f21USD= new Money(21, "USD"); fMB1= MoneyBag.create(f12CHF, f7USD); fMB2= MoneyBag.create(f14CHF, f21USD); } public void testBagMultiply() { // {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]} IMoney expected= MoneyBag.create(new Money(24, "CHF"), new Money(14, "USD")); assertEquals(expected, fMB1.multiply(2)); assertEquals(fMB1, fMB1.multiply(1)); assertTrue(fMB1.multiply(0).isZero()); } public void testBagNegate() { // {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]} IMoney expected= MoneyBag.create(new Money(-12, "CHF"), new Money(-7, "USD")); assertEquals(expected, fMB1.negate()); } public void testBagSimpleAdd() { // {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]} IMoney expected= MoneyBag.create(new Money(26, "CHF"), new Money(7, "USD")); assertEquals(expected, fMB1.add(f14CHF)); } public void testBagSubtract() { // {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]} IMoney expected= MoneyBag.create(new Money(-2, "CHF"), new Money(-14, "USD")); assertEquals(expected, fMB1.subtract(fMB2)); } public void testBagSumAdd() { // {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]} IMoney expected= MoneyBag.create(new Money(26, "CHF"), new Money(28, "USD")); assertEquals(expected, fMB1.add(fMB2)); } public void testIsZero() { assertTrue(fMB1.subtract(fMB1).isZero()); assertTrue(MoneyBag.create(new Money (0, "CHF"), new Money (0, "USD")).isZero()); } public void testMixedSimpleAdd() { // [12 CHF] + [7 USD] == {[12 CHF][7 USD]} IMoney expected= MoneyBag.create(f12CHF, f7USD); assertEquals(expected, f12CHF.add(f7USD)); } public void testBagNotEquals() { IMoney bag= MoneyBag.create(f12CHF, f7USD); assertFalse(bag.equals(new Money(12, "DEM").add(f7USD))); } public void testMoneyBagEquals() { assertTrue(!fMB1.equals(null)); assertEquals(fMB1, fMB1); IMoney equal= MoneyBag.create(new Money(12, "CHF"), new Money(7, "USD")); assertTrue(fMB1.equals(equal)); assertTrue(!fMB1.equals(f12CHF)); assertTrue(!f12CHF.equals(fMB1)); assertTrue(!fMB1.equals(fMB2)); } public void testMoneyBagHash() { IMoney equal= MoneyBag.create(new Money(12, "CHF"), new Money(7, "USD")); assertEquals(fMB1.hashCode(), equal.hashCode()); } public void testMoneyEquals() { assertTrue(!f12CHF.equals(null)); Money equalMoney= new Money(12, "CHF"); assertEquals(f12CHF, f12CHF); assertEquals(f12CHF, equalMoney); assertEquals(f12CHF.hashCode(), equalMoney.hashCode()); assertTrue(!f12CHF.equals(f14CHF)); } public void testMoneyHash() { assertTrue(!f12CHF.equals(null)); Money equal= new Money(12, "CHF"); assertEquals(f12CHF.hashCode(), equal.hashCode()); } public void testSimplify() { IMoney money= MoneyBag.create(new Money(26, "CHF"), new Money(28, "CHF")); assertEquals(new Money(54, "CHF"), money); } public void testNormalize2() { // {[12 CHF][7 USD]} - [12 CHF] == [7 USD] Money expected= new Money(7, "USD"); assertEquals(expected, fMB1.subtract(f12CHF)); } public void testNormalize3() { // {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD] IMoney ms1= MoneyBag.create(new Money(12, "CHF"), new Money(3, "USD")); Money expected= new Money(4, "USD"); assertEquals(expected, fMB1.subtract(ms1)); } public void testNormalize4() { // [12 CHF] - {[12 CHF][3 USD]} == [-3 USD] IMoney ms1= MoneyBag.create(new Money(12, "CHF"), new Money(3, "USD")); Money expected= new Money(-3, "USD"); assertEquals(expected, f12CHF.subtract(ms1)); } public void testPrint() { assertEquals("[12 CHF]", f12CHF.toString()); } public void testSimpleAdd() { // [12 CHF] + [14 CHF] == [26 CHF] Money expected= new Money(26, "CHF"); assertEquals(expected, f12CHF.add(f14CHF)); } public void testSimpleBagAdd() { // [14 CHF] + {[12 CHF][7 USD]} == {[26 CHF][7 USD]} IMoney expected= MoneyBag.create(new Money(26, "CHF"), new Money(7, "USD")); assertEquals(expected, f14CHF.add(fMB1)); } public void testSimpleMultiply() { // [14 CHF] *2 == [28 CHF] Money expected= new Money(28, "CHF"); assertEquals(expected, f14CHF.multiply(2)); } public void testSimpleNegate() { // [14 CHF] negate == [-14 CHF] Money expected= new Money(-14, "CHF"); assertEquals(expected, f14CHF.negate()); } public void testSimpleSubtract() { // [14 CHF] - [12 CHF] == [2 CHF] Money expected= new Money(2, "CHF"); assertEquals(expected, f14CHF.subtract(f12CHF)); } }junit-3.8.2/junit/samples/money/Money.java0000644000175000017500000000323310402050442017507 0ustar mkochmkochpackage junit.samples.money; /** * A simple Money. * */ public class Money implements IMoney { private int fAmount; private String fCurrency; /** * Constructs a money from the given amount and currency. */ public Money(int amount, String currency) { fAmount= amount; fCurrency= currency; } /** * Adds a money to this money. Forwards the request to the addMoney helper. */ public IMoney add(IMoney m) { return m.addMoney(this); } public IMoney addMoney(Money m) { if (m.currency().equals(currency()) ) return new Money(amount()+m.amount(), currency()); return MoneyBag.create(this, m); } public IMoney addMoneyBag(MoneyBag s) { return s.addMoney(this); } public int amount() { return fAmount; } public String currency() { return fCurrency; } public boolean equals(Object anObject) { if (isZero()) if (anObject instanceof IMoney) return ((IMoney)anObject).isZero(); if (anObject instanceof Money) { Money aMoney= (Money)anObject; return aMoney.currency().equals(currency()) && amount() == aMoney.amount(); } return false; } public int hashCode() { return fCurrency.hashCode()+fAmount; } public boolean isZero() { return amount() == 0; } public IMoney multiply(int factor) { return new Money(amount()*factor, currency()); } public IMoney negate() { return new Money(-amount(), currency()); } public IMoney subtract(IMoney m) { return add(m.negate()); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("["+amount()+" "+currency()+"]"); return buffer.toString(); } public /*this makes no sense*/ void appendTo(MoneyBag m) { m.appendMoney(this); } }junit-3.8.2/junit/samples/money/MoneyBag.java0000644000175000017500000000704510402050442020126 0ustar mkochmkochpackage junit.samples.money; import java.util.Enumeration; import java.util.Vector; /** * A MoneyBag defers exchange rate conversions. For example adding * 12 Swiss Francs to 14 US Dollars is represented as a bag * containing the two Monies 12 CHF and 14 USD. Adding another * 10 Swiss francs gives a bag with 22 CHF and 14 USD. Due to * the deferred exchange rate conversion we can later value a * MoneyBag with different exchange rates. * * A MoneyBag is represented as a list of Monies and provides * different constructors to create a MoneyBag. */ class MoneyBag implements IMoney { private Vector fMonies= new Vector(5); static IMoney create(IMoney m1, IMoney m2) { MoneyBag result= new MoneyBag(); m1.appendTo(result); m2.appendTo(result); return result.simplify(); } public IMoney add(IMoney m) { return m.addMoneyBag(this); } public IMoney addMoney(Money m) { return MoneyBag.create(m, this); } public IMoney addMoneyBag(MoneyBag s) { return MoneyBag.create(s, this); } void appendBag(MoneyBag aBag) { for (Enumeration e= aBag.fMonies.elements(); e.hasMoreElements(); ) appendMoney((Money)e.nextElement()); } void appendMoney(Money aMoney) { if (aMoney.isZero()) return; IMoney old= findMoney(aMoney.currency()); if (old == null) { fMonies.addElement(aMoney); return; } fMonies.removeElement(old); IMoney sum= old.add(aMoney); if (sum.isZero()) return; fMonies.addElement(sum); } public boolean equals(Object anObject) { if (isZero()) if (anObject instanceof IMoney) return ((IMoney)anObject).isZero(); if (anObject instanceof MoneyBag) { MoneyBag aMoneyBag= (MoneyBag)anObject; if (aMoneyBag.fMonies.size() != fMonies.size()) return false; for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) { Money m= (Money) e.nextElement(); if (!aMoneyBag.contains(m)) return false; } return true; } return false; } private Money findMoney(String currency) { for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) { Money m= (Money) e.nextElement(); if (m.currency().equals(currency)) return m; } return null; } private boolean contains(Money m) { Money found= findMoney(m.currency()); if (found == null) return false; return found.amount() == m.amount(); } public int hashCode() { int hash= 0; for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) { Object m= e.nextElement(); hash^= m.hashCode(); } return hash; } public boolean isZero() { return fMonies.size() == 0; } public IMoney multiply(int factor) { MoneyBag result= new MoneyBag(); if (factor != 0) { for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) { Money m= (Money) e.nextElement(); result.appendMoney((Money)m.multiply(factor)); } } return result; } public IMoney negate() { MoneyBag result= new MoneyBag(); for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) { Money m= (Money) e.nextElement(); result.appendMoney((Money)m.negate()); } return result; } private IMoney simplify() { if (fMonies.size() == 1) return (IMoney)fMonies.elements().nextElement(); return this; } public IMoney subtract(IMoney m) { return add(m.negate()); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("{"); for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) buffer.append(e.nextElement()); buffer.append("}"); return buffer.toString(); } public void appendTo(MoneyBag m) { m.appendBag(this); } }junit-3.8.2/junit/samples/money/MoneyTest.class0000644000175000017500000001247010402050442020536 0ustar mkochmkoch. hijk l m ,n +op +q rstu v +w +xy +z +{ |} +~ + + +  + +  + f12CHFLjunit/samples/money/Money;f14CHFf7USDf21USDfMB1Ljunit/samples/money/IMoney;fMB2#class$junit$samples$money$MoneyTestLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethisLjunit/samples/money/MoneyTest;main([Ljava/lang/String;)Vargs[Ljava/lang/String;setUptestBagMultiplyexpected testBagNegatetestBagSimpleAddtestBagSubtract testBagSumAdd testIsZerotestMixedSimpleAddtestBagNotEqualsbagtestMoneyBagEqualsequaltestMoneyBagHashtestMoneyEquals equalMoney testMoneyHash testSimplifymoneytestNormalize2testNormalize3ms1testNormalize4 testPrint testSimpleAddtestSimpleBagAddtestSimpleMultiplytestSimpleNegatetestSimpleSubtractclass$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0Ljava/lang/String; SourceFileMoneyTest.java a java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError 8 89 56junit.samples.money.MoneyTest `a junit/samples/money/MoneyCHF 8 -. /.USD 0. 1. 23 43 DEM [12 CHF] junit/samples/money/MoneyTestjunit/framework/TestCasejava/lang/ClassforName getMessage()Ljava/lang/String;(Ljava/lang/String;)Vjunit/textui/TestRunnerrun(Ljava/lang/Class;)V(ILjava/lang/String;)Vjunit/samples/money/MoneyBagcreateV(Ljunit/samples/money/IMoney;Ljunit/samples/money/IMoney;)Ljunit/samples/money/IMoney;junit/samples/money/IMoneymultiply(I)Ljunit/samples/money/IMoney; assertEquals'(Ljava/lang/Object;Ljava/lang/Object;)VisZero()Z assertTrue(Z)Vnegate()Ljunit/samples/money/IMoney;add:(Ljunit/samples/money/IMoney;)Ljunit/samples/money/IMoney;subtractjava/lang/Objectequals(Ljava/lang/Object;)Z assertFalsehashCode()I(II)VtoString'(Ljava/lang/String;Ljava/lang/String;)V!+,-./.0.1.234356789:/*;< => ?@:G Y ; < ABC9:[* Y  * Y * Y * Y ******;-<KZ< [=>D9:L Y Y L+****;(9K <L=>2E3F9:d( Y Y L+*;#$'%<(=>E3G9:h, Y Y L+**;()+*<,=>E3H9:h, Y Y L+**;-.+/<,=>E3I9:h, Y Y L+**;23+4<,=>E3J9:g5** Y Y ;6748< 5=>K9:X**L+**;; <=<=> E3L9:b&**L+ Y  * ;? @%A<&=> M3N9:*** Y  Y L*+****!**;"CEF8GCHYIoJK<=>8NO3P9:e) Y  Y L*"+"#;MN(O<)=>O3Q9:W*! Y  L***+*$+$#**!;QRS*T2U@VVW<W=>8R.S9:n.*! Y  L*$+$#;YZ[-\<.=>O.T9:f* Y Y L Y6 +;^_)`<*=>U3V9:Z Y L+**;c de<=> E.W9:}3 Y  Y L Y M,*+;hi$j2k< 3=>X3$E.Y9:|2 Y  Y L Y M,*+%;no%p1q< 2=>X3% E.Z9:; &*'(; s t<  =>[9:X Y L+**;w xy<=> E.\9:f* Y Y L+**;|})~<*=>E3]9:U Y L+*); <=> E.^9:T Y L+**; <=> E._9:W Y L+**%; <=> E.`a:N*LY+;< bcde7fgjunit-3.8.2/junit/samples/money/IMoney.java0000644000175000017500000000165710402050442017630 0ustar mkochmkochpackage junit.samples.money; /** * The common interface for simple Monies and MoneyBags * */ public interface IMoney { /** * Adds a money to this money. */ public abstract IMoney add(IMoney m); /** * Adds a simple Money to this money. This is a helper method for * implementing double dispatch */ public abstract IMoney addMoney(Money m); /** * Adds a MoneyBag to this money. This is a helper method for * implementing double dispatch */ public abstract IMoney addMoneyBag(MoneyBag s); /** * Tests whether this money is zero */ public abstract boolean isZero(); /** * Multiplies a money by the given factor. */ public abstract IMoney multiply(int factor); /** * Negates this money. */ public abstract IMoney negate(); /** * Subtracts a money from this money. */ public abstract IMoney subtract(IMoney m); /** * Append this to a MoneyBag m. */ public abstract void appendTo(MoneyBag m); }junit-3.8.2/junit/samples/money/MoneyBag.class0000644000175000017500000001015410402050442020305 0ustar mkochmkoch. *mn o pq m r s t u v wx wyz { | } ~    | |    *     "m " " " fMoniesLjava/util/Vector;()VCodeLineNumberTableLocalVariableTablethisLjunit/samples/money/MoneyBag;createV(Ljunit/samples/money/IMoney;Ljunit/samples/money/IMoney;)Ljunit/samples/money/IMoney;m1Ljunit/samples/money/IMoney;m2resultadd:(Ljunit/samples/money/IMoney;)Ljunit/samples/money/IMoney;maddMoney9(Ljunit/samples/money/Money;)Ljunit/samples/money/IMoney;Ljunit/samples/money/Money; addMoneyBag<(Ljunit/samples/money/MoneyBag;)Ljunit/samples/money/IMoney;s appendBag!(Ljunit/samples/money/MoneyBag;)VeLjava/util/Enumeration;aBag appendMoney(Ljunit/samples/money/Money;)VaMoneyoldsumequals(Ljava/lang/Object;)Z aMoneyBaganObjectLjava/lang/Object; findMoney/(Ljava/lang/String;)Ljunit/samples/money/Money;currencyLjava/lang/String;contains(Ljunit/samples/money/Money;)ZfoundhashCode()IhashIisZero()Zmultiply(I)Ljunit/samples/money/IMoney;factornegate()Ljunit/samples/money/IMoney;simplifysubtracttoString()Ljava/lang/String;bufferLjava/lang/StringBuffer;appendTo SourceFile MoneyBag.java -.java/util/Vector - +,junit/samples/money/MoneyBag jD dc @A 45  ^ junit/samples/money/Money HI ]^ Tg RS N :;junit/samples/money/IMoney Z VW MN Z YZ _` bcjava/lang/StringBuffer{ } fg CDjava/lang/Object(I)Velements()Ljava/util/Enumeration;java/util/EnumerationhasMoreElements nextElement()Ljava/lang/Object; addElement(Ljava/lang/Object;)V removeElementsizejava/lang/Stringamountappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;,(Ljava/lang/Object;)Ljava/lang/StringBuffer; *+,-./?**Y0 1 2345/eYM*,+,,01 678793:;/<+* 0123<7=>/:+* 0123<?@A/:+* 0!123B3CD/h"+ M, *, 0$%!&1 EF"23"G3HI/B+*+M, *+*,W,+N-*-0. ()*+,.'//08192A31*B23BJ?1K7/L7MN/e*+ ++G+M,** N- - :,06 5679:$;5<7>H?S@\AaCcE14S <??"EF$?O3e23ePQRS/-* M, , N-+-0HIJ&K+M1* <?#EF-23-TUVW/f *+M,,+0P QR1  23 <? X?YZ/~&<* M, , N-<0UVWX$Z1*<Q EF&23$[\]^/:*0]1 23_`/:YM/* N- - :,,0`a bc(d8g14( <?$EF:23:a\293bc/3YL* M, , N+-+0jkl#m1o1*# <?!EF323+93dc/O** *0r st1 23e;/? *+ !0w1 23 <7fg/:"Y#L+$%W* M, +, &W+'%W+(0z{| }.~51 EF:232hijD/>+*)0 123<3kljunit-3.8.2/junit/samples/money/IMoney.class0000644000175000017500000000105010402050442017777 0ustar mkochmkoch.add:(Ljunit/samples/money/IMoney;)Ljunit/samples/money/IMoney;addMoney9(Ljunit/samples/money/Money;)Ljunit/samples/money/IMoney; addMoneyBag<(Ljunit/samples/money/MoneyBag;)Ljunit/samples/money/IMoney;isZero()Zmultiply(I)Ljunit/samples/money/IMoney;negate()Ljunit/samples/money/IMoney;subtractappendTo!(Ljunit/samples/money/MoneyBag;)V SourceFile IMoney.javajunit/samples/money/IMoneyjava/lang/Object   junit-3.8.2/cpl-v10.html0000644000175000017500000003531010402050446013706 0ustar mkochmkoch Common Public License - v 1.0

Common Public License - v 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

    a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
    b) in the case of each subsequent Contributor:
    i) changes to the Program, and
    ii) additions to the Program;
    where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

    a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
    b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
    c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
    d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

    a) it complies with the terms and conditions of this Agreement; and
    b) its license agreement:
    i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
    ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
    iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
    iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

    a) it must be made available under this Agreement; and
    b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

junit-3.8.2/junit.jar0000644000175000017500000035350010402050442013465 0ustar mkochmkochPK zc4 META-INF/PK zc4K^jMETA-INF/MANIFEST.MFMLK-. K-*ϳR03rCq,HLHU%LyRKRSt*AM t 4K|3+KRs<4yxPK zc4junit/PK zc4 junit3.8.2/PK zc4 junit/awtui/PK zc4junit/extensions/PK zc4junit/framework/PK zc4 junit/runner/PK zc4junit/swingui/PK {[4junit/swingui/icons/PK zc4 junit/textui/PK zc4`J;junit/awtui/AboutDialog$1.class}Q[K0=٦tޯ`Y CigkM', G_P$_N9i`+0GPPh0eRdkܤT.St(UQ{!߼յP'$.Cib!wC!Cqv<_p/ d<1P8 C'67Xv0YcD"C)Ica}2x?ͤ׍t_ bJGmIJ.c`"_0e(Ny7NxTi `pOPĭ'BIceGV%2dS&~w"L 8PgY?seqOJr]\ب(4Qw]nF2k緩+*L6J*ʜv jhpժ4_kO(#㒊ݨfV"Ștز-)Œq^k̚=SќS16,<Ӝ-9T'MZ^RF 3M"e-9Meԝji{h<YUY7Jf}*ȉ(@=enxa^ĵ}kµ*cF5 HtAtTHHN:Ml83PO <k BqE'ѰT5)\ilE=J0@A@۶Fa6䚆%֓H`JTM os \ˮ5M>GR;xW{di!y!9f/% wr-9aR>dP|m%ާf>>aqŧ,>c9n _lXF0F#̆uuf.uXh/(1&ng֝6lj 9i]%T>4,97-mKvQ=˱ V3m.Pe*If57컋 (3D!o(ss][wmrfLaqwYD՛ӐL 攱*u_/Py*^'kUq7vP&"=c9ǦdCϖfrp:*AZ~m ~+ҾAHkAr?u 2TR:mttb=d r JbBmӃhtZXb"FϙH|6N/'nH13y=׻4NJ8%1umᴌLi9# q OxO1i>='Udd4Sr&/Cnj6<+Ä4' ^晶 aQY5 4fy_]p=Y7/ ˻Cu=v45gPuqqG:ߚ$k!Ӈt>,&I+KS S=NDjLQпŌ6INn^wXσ'9+hY] Ұl)%=*'c4 !gz4E:m*C Dz[fqF9U7p\^84hawJ9躛%ΊHjӾm[B"/!iࠂfaY%/ns(b SOom (x)H`&[ ㄂|:ʨtnuNVaO!$%|s|!K𕂯o`~'Lũe?I՜W%J%<ȖRi8^DcVPWueҚLt=NH. PKt T}s\ UүJ)Gi\c.I|e/i`D Xjp˴rGp j4 w+w?It5]S3Z5JRz֭z(-Y[](ܷ Kj޲fa)e( ۢڵjIa{\ \ULʎqEVS ~o4KEM,ʁ&M_m%ҷ:P{{C<Do ;/}g7G"B7 y(kRuE("Bgx7дt^wh70)*"۱"4:m$d6 n:qNQ؊)M]=J%~ۑ~ RH&H{-\ChBhP;z'6JZ\! e1^Fcj'%^'|% 8%h|:JV*0d ;N`:dE,RU (E\&{(+{=0mn1/'CewgI:YĽ RDum[Z e?A>,ڵ}f$E3|gs:å8m1ż#fNcW,kq,aYǻxOу|(kْ %"GMLWŔT4imV\ʲL*UdZA|[)v@oSv EJV5K`(q{J<\TÀ{gndjS;`{ժ*%֝i[=+f9eOA*ܻZkE'W^JAA{r nVӗ({svγʅM9â3{ 2V,caT'Tl2Uf=cViSpCA;m_QK0c^CeYի\u[qKܜ}DKIG$// cxC9,I UjŜQ8aljk#|l|jL8k 9򥌾Fٲk) o1Yi+846`-$:e elqb@7v7Y𜖫=Ҧfv2 #$3;AkBSVi.=꠭h;"оJaropS!7ON_͵ëA&VԫDYK ֝P~ EÑ"a5F;YQ63+"bbT113'1XG#:E`BMJG:a ]nRFFGb +{]cD~6wDjH1xoK0" ]䩈def눋F :Ja(qӉFп柼BGYǮl4z1:# |nNd֥e8:XnR7I,">v7nNSFY'Hv/eFU&8eYFْJ:HfU/F~&nDk'ހc c!J$G#q%4j:b ToJ;v[ $^ea4z!9#&IQ'  di2vS}  /oŋ>5de=H?ءI64UZ& r}y Q6MWg^;57u^~FT,E!=E!lW~!fסocod7uM#qsyץ3dk^HGg>ٿ:i6R,A.iyxCIdl7H-2 gƏ:/PK zc4U'junit/awtui/TestRunner$1.class}RJ1Զn^[PTl{F]*#QI,CBٙ9CϷwXLIژü EQ0]}\~b6ENb&Cq G-I\`Ő NS8"lvzNR`R`C@[vx Bf(mP,{JςJ2)k+wPtmr 0nq}9}׵*yXXXc9:~9Mݣ{g󺌔 @YgI版nZ"]j.McTg5 %hCF{T^*kH< Z aɮ!7ۓa ]mZ5+SyBNI-aZ=e41*z?PK zc4rO&"junit/awtui/TestRunner$10.class}U[SEz2tXEQsØ,K,k3fp-SURKӳKdVM|ӧO~{od^mI-_ Bxg=J6ˏLRȕg"PXXFiӅ-Oe nc@Zxz}i 1'iS÷Om#1<[1 ߱! FbTXK:`Q/4 WA6U*hjM wdEZwhGmJ&W嬑3s1XtpZGHNwPQ"fv/c l'vгWgKnF#*\cTFIjt8M6:M?S4d9PK zc4˛tjunit/awtui/TestRunner$2.class}Q[/A=]KZ+^D& ˏo ăGoF&s;s~`ERH" y 6mե ؗ7*I"fH5|u)#Uaȗ Md58 aiڄdMJ}I 隶y Br}j(V{Jσ# _sMwŵg(zorYf48ā2Z4l XNcԽ~9L6/ܣ֕Ÿ2RD Kظ5JJ'KrKlFVǡ5 p0I 'Yk{ձZ*H BImDJgN3tEEr7'xSD4z'ISϚec &<uhTQ:&i.!F8w"&Bx^ܺb?Ol(v-5lUT]lxM6""O#~E`Q2#(0ZilMz.=҃eUUCꀲT;3X9C)zt.^! ˴7/DxR3b+9~EшG8Pvʜn7bnW.>Vq˲{qG=oPK zc4ˌjunit/awtui/TestRunner$4.class}QN@1nB @  UqߘmYd֒YH@mvHI-̼ۻ_6@ 5 %xX!Tͱ'V&PQ_[>j mQ1:ōIw^z$ sq:Y_ Ffi,C){eBx`-璑8V]F̾٩<"p&q&,=gRhQmrw["'eG=*DVkh&e$pD_'26ͻ*7E 1ޓgH9+<*W`ڎ jo^t8xZ7W=zfjçe+n05r 5q|f̪f/PK zc4!-+@junit/awtui/TestRunner$5.classuRn@=q m)IyWJ T)TYsiL${\ϰeTĂ`kw@6 m |[{NBOV֬x d9p4,Ts)DsjC#Vj,X1iq e&-渃pXx*;*#Q}Q6@ aۺ3R3Đ*՗T^3tU']F&>0'!C&3s9ܹu ` oTPCXፇB|=a{Rhe"qn enZ#ֻX3[1CXܘ$xwH(GP*-? ad"9!X! b/y.iNcElT{# gg#y&ve.qA/-X~R6Y}s˪Bh{X OnRF )Gep"cCXۼr#YDڰ9= ~V^D#򚱉~%^8!ퟠ5Jw~9npգ'a^;|Z߾BS#X7kƬziҩ<PK zc4w}junit/awtui/TestRunner$7.classuQJAN~?\ox$n`wVĞ10;=5UE;\9X%V]lFޤ:\Q>PLn @ 됰OuEU-&j:j׺M^Xs֢$aAؓXm(նnEXPNY~wT8Ƕrg? wӸ'*6ܱ"|Z2~%JᦑӺ"!d7m%εasC12AY6/#ǐTrvHT~Fqo ˆ=]IoO&{^G[V N)?nyL f3N31wPK zc4*׀junit/awtui/TestRunner$8.class}QJ1S[]W~((PTT|Oרl~%Ģ>X9N?^bG%1cS=x%tk.7V&w&SLIL6{mQ7Kn|! 0mL4Tq$"Q6Z6EJF&:X\Xec\ɭ r&ʖ&q=[\ݦ#8K"lOU C\yTyr2]WQFF0gJdkۓPHdiT- ;Gں2U_A ybgt8xr+~1̘U:_PK zc4Hejunit/awtui/TestRunner$9.class}QJ@=&j}U ƭX~GiH&>>˅(.?J3ua LΙs=yx}y819<Z T&ĝTp.S}ELCV!v nُ/$XS\U7v+ m*x?OT!r0}?zvP2x8wp>'yO3*pexy^{/* C1A ^Ͽ^PM[| zGpe1U?އ*1}ŸO3?*L/UݯT;^? QRa / W4wo]ROE8TX,yVת#,Uڢrf"BfF}e F@,T,0hͳ|TG4ϋz؂-ºI"dyz$"Y |\[("Jjs}רO=QQ}_4!Yr2Mih4%op%G"&xB(0"Ș"0͗d7k ;'\j ImHxgZp(Izo \ 38TNPQ\'zKyG#R̟&+~ -ECnkj:<'F';$Bue(ߌj>WA4R-jkcs3_q;'3q|-Ұ>0ʦ÷rl2aJm\2F"QV@'i)r){Oq%lEf$(ġK-č`9I;P{IgOÌ]-7r עpeʭ2daq1ţtֈ4Of43/F5z\Ց0\P*UϨdj H"hDY dْ9gpo.#L,#(mn험Sn0`gKD?" Ck Y*Z*)E< 59baHԣ հ92Y|yy9k+U@UgjM)bj=|sf;?<G{)&N5\m$6SN*0ݫ5D?KdO[5!Ohq&]tw34s5 εb9Hz}QaJC7*x쫉GvMw쟰1_:D;ţvI5Ѓxdjq !Q#"}^]fă. {cM<{$9$N_+yFEW 6%*r}ț qxJfh]Yf3Or3vI$jg n^gZE< xQl0@TL`{Vjىe  z!sؗ\\Vi،+Ij5l`PWQM*@, t%gyjɩM{DZ}EPyYGo,zB))t)J85oH즕b&}wĻd8BMH9( EFBS4@&>*3M|.,or6_(fsLG2 ,|-c\d&e(L/vKhj":Iĵ\#ɸ<М&%a/.KW"~`-?I?qg"~oLMEVɧ5p!.p=_R~ l2faUU-#[o_0&2ԌJz{w/ݒ&iYg29m 5U\-Df#~6dHWѐ1c̷ى3I427Œ_\],M$J1e̓ ;J7ʺRM_$I"NfViOwѡ90YrGd*q:ȗ.gMъTÁ|]fH3+}a &ב2ޥڣQK2hY- S  Р5Z:"e`BFá|J1(W9NĀaQ|U<bb±HrϊOXT7㗼P#RlFJhX+f~}H[f9H c\*%fͥWc.z$-ı 8$$O7ij^-bIJM`e~`^sk߰YJ2$KT$>KPT(/'ɇL~#tLK|Wc#S"5z4nMiix:ĸh2t#4Myr: )͋yqd;gqb߁g dH'4 ҥ=棊|E/*K`>0*_Xo ҥ{7. GR(ĸߌWހS3mo\6/qEIXs|aiS<5^*ڻ,aL"aP7N<ݥoWCXL zɮNpIt" +䃓VW)~AFlZQ$[beKťlU̔=dKls0W^iy|er~\S П 7z h butBfa(}U!jq4b 3BCd+dvVSC\,$^ҘCHB.̃BEP/e 3 *a#G)邜Nzг ;7mνX.WXO#NjJ|ޝtXCN3}PXF.{t# oO8a0\v^l8 p228ʤf +SaRf 6%ޢ0hlX"גRlEK4R! aT4TXJ1c$ܠ 7xk %U R ppbj\0()P(PJ#w廝 #2 QvAyC*PtOt*:`diYQI!Ȁ$?aDHQ`Ւf2"b'`d'$j+J;d09eo2\7znٛӤx[Ȁ&34ATgwLfcV҇g4Yu͈8r8w@;!)pnאxj'Ж*j'8Lr^uВ8]P'C8T50N 3ɇ" 99$[ ~i`.V*Y3[lJc]0;tNQ[3(,͊j~~$7Y /i<̙ZJEF:6T q`Xf.#Iwcs:Up킹RjI(g2zӂaQ8: eUN^PRcpl,Ïrp|O_wi'4V)65t#z'4w@ RK-<+SwCqH7 XEk,۸vYH SO5Ikhx~ffIYN8C~s8QGRvn i8'M8WPd2h N{ B&qŴv]aI v.tСve"(/" WoWvzZULR%pM\KsZNΘ "D@7t|M,.PtlmLCfIAfpsrp; Y{g*Q5a(pSr;Y9Dǡhhd8<9nӚ)P]9#;r@ĒI*+;)dUfy#yӽt[oz3E(_ e v;(1Iyt?AʓiK`7Ŗi^xބ] #>o>K꾢koÉ=] ?P~m : 7)S4+C'~}7,.+z` F0,L,r G8J܀b ;pxljq'88 '90HCGhi;ZF}Q  v,}.X" {1x `>>Z͠.9ŬOzP73RG׽[SR*nrN";8mp88Vt=%NZ̃{i%s<DPRPG?_B8nXdX1\ eC gl-Ŋ[L'pQHɲ dJedYFJI}YFJ'LӲ5J zIWVJUDI d@) &i0)3`6)? n:\f&^u7:9XuLa82㟈eU?lN` &{+D:7faEBX4nxL1s+NHŴ๐Xb7ėkcq''w^x QhEP :k' {6x>ض4Ã=#jqR'k KH=Rr IB IHVBy" <%˩T ;e3xUr227WҺ`'t>-Hlx4<#9 6qLj!xAhvͯ)OtWݍ&R6ɥHwI9QMJT(fN vxNԗMX۠Yx'w%E8j aKe&D*赢V8bF^T\%8|>}Ln{Y.MlǙq%RC9}wP#2AYbF]Iф*"m5s˒[tצ qrR\m)$}>!qe-_ "=DoW􅡢0+0&80^c1dj92zH fAO 1biNbRJ n1̦nRuMP;-!jKڲP[i>"n. I,mmI :d OqS 4<2J10Db1F0JTTViSiޠn+Pt ^7\Ì1)|ocm{KsSMK<ȝN 8d%87-x 6e-Ops46[X c;,C,y/e]SgG /V)wʳoo>›(]lflB]k7F?PK zc4T(junit/extensions/ActiveTestSuite$1.classSMo@}q84PhH M*UB8\lڒ?"ΕΏB.VP-y>μ?}` Taᮂ]gc0Tbd*$3bzsp`Fs9xxO4ь<σE0I"(s@8 =x&*=:KktPA¾m-8СMwfhz~SSua[ԐFsѻKb.}fKh1hy5ˣ9<$ &=[0o=\ W0/4a>Z>n▮ʫ+Ki0(N)K +6 a|Fм:ڄmҾұ cD!ch \wiKoPK zc4A<:E&junit/extensions/ActiveTestSuite.classUNA=hQ~a)jE/(ZjRXfw :7Ba-X$ɝ3{o?>pl09mksILhM60ic δaכf,,+[2T3DIs=5-ύ>H@a ݅w[{~6G [%Ыaa+\SrR +/+n/ 357 'u.UIoҷGͩ_6v Ԟ$4|ùHR@zu?a 30D{2% l͉?k]Aߪ'jgXAmd4(xmEQC{z+Ȟ7|-c< ~mjuЇ~GpҼ݈pJ/3$jfdឃпpP֨niڵ6:{&`S3pzɗ² K_Wһb^'?{xS7^}6ç\bt7 0Hks Ka L ZҌMTĠ6y;q[k/\p8F\%ة $ZɆtАe7aM2+=M>$&OluvamgA6zqld3MǍ_0JG:-^#v='9Üߌi2p9S@݁Q5J?u{ymǞ(~v %_e 馚0NH~~,R0{ΜLs7ݽߝ`YJT_PK zc4􃭖o(junit/extensions/ExceptionTestCase.classSmSQ~...ًEF,(e/~bjgۂ\]fwIC_gg sTeÞ{γ=S=aed,+АU#'#@JB/ dx0U=mcQhVPj[d4-bhCcZb ?{ C+iUS1M$vh)APL!]> kږ[=Gf^p9,#Myt2&81*J]`Sr2ow3U" 3E12x2(bFitu4q>MR*cK*^b[6,~RݡʑcG3aѼ11d4O옵t]lXg{bӂ VhEG(8gg#H0Ol[0C%FG'";Ys!?L:z`z+Bg~Rt& 1O^X|QʌS$H:Dz]!XP.&?A:mT8"څ W|P޼449f[&JQщDkX)S~mc}@61 -ɻPK zc4_Ty#junit/extensions/RepeatedTest.class}S[OA-Zʥ EkEԄ|[iY6O />h4D! v[69{Ι333 `OG>B82y;N%Fp'`NzQܓGAiTwxk2tSK |e%԰goJUja!b9C_E7+eP&UjٺdHløw72R3{Ȳ Cw&r4Q\Sp D>h&9w\C%}{X2f]Vֺuɐ*;[dhfRE|rKɓfdtދxpz?u {+iUVL`SsFRJ}s>K T$4e2C8᱕F}E~e_bOȕ}(^2H|9%g서#97[PK zc4zP:XI߇ ö)0|̓Xi,dg$ X1OijͰy[&C-(pStߐ+ORFcF;ԏ$_% Hjrһф)vyX`RhR$.w}z?PF^ dk(Ku"bi:Cq2wi5МF h0Tf|A .nQ|:Ä{`ޣZ z6PK zc4'  junit/extensions/TestSetup.classROAzy  ŗ^@j`˱q /he^mهٙofv :Ƀ*>o!N>8a x[հ i$>\ 7VZ< ?ǟOs*>g2,T|QC=3*ihe_ЄrY5l|s Ns<ɷ|4le϶E^ewxчy2l|XP=WP3Y 168T#zq]6[4t%i㸙JCҁdkQ+KQi#0K,ј3 !6 za=b1=WP1m\6}ÓƈR> |\iA!G,EAKZ%)}[/[zXB!qK'l>vîWl.{Y , عEwf+e#z.{YE*Vv*V0tܽrfe$Dij}b٘-˹1e^j[*׻~Ԣf:9bc|{} w1}~Ǐأt&Zctw2i&+zUݻǜc(ewO' z;PPŏ1~`U=db+ly؏)sYp-6~QP57騊7xp]IK KD3&gBO`ofR0M*XIXƸ-: R~X䈥99Q~=y1x%o;e@kHVCJN׷>l8nNR Ekn%v\'M!׭c;DwLjXoW:"ysW&jӇS|kZCv/$#nvL[9SmqCKHic_iC[DZݶVEL'̌uY-i'4}ڀl[!A4sׂb޺dv ~P"VRr[~Po!ݔ)g۲PȊT5$>T w!"hЋ>`~)y+p Pu!T(^*Ll[d (.Pڄ ze*Jj7U[TtB:.P2H.숔9!bj_hg%6dN47i<_%+_:G`[{#ISut҄I\ zQATTZ!|Y32(sk vWNU!Q: dYIq'{AflDk h|2jd=itЅ(#vJ]^Γ!*K{C/&Ҥ^wRA5`b vbBP6P@ؘ|u9wJ|H?PK zc4S C *junit/framework/AssertionFailedError.classJ@ƿiFbYm "BsX)H/޷Z l}.O>%&A=37ov?>v`i¾-B-Z "u@70 XD, [D(@Bs2!Xp. UO6YMS+u/1V0?p-ZK܋LjyP_i>Y8*X􍫽Q$/ɑ2=UmvGVp<& ([[9rƙ8kk*)st8h§R&BʳmVm{F'=T9ձ=/PK zc4{'E )junit/framework/ComparisonCompactor.classV[SSWN!DD%x[j Uk吜`.x(?Їvv>S}N<8 k^[} 8n ⺐BR|p3Bfa.-0[k?]pO}C?E6D^!CN*NeR /xn+ {JnT Faj6O7ps/ i,V@ /h$9bI+ldZRɔRY`XE\i8^i0x2ӪhR>(#1 97gqL^<< u>c|aq%1LUQXЄZz/(%vyr@OҠ yX>'l"ԟi[[ƜB-C|o$}?'٭9rvp>Iou,]69תî\GW MK-ڃoݫB]R0t;%t'sntؚ^tT2 wcmGr^0'8;F[t@r<%)EoMD~Uu'kkPK zc4{-T'junit/framework/ComparisonFailure.classRmoA~\B(oVјHf{,x{Q&$Qك3?}GR@EQ Vb!{P9:njGF ڼ81d|ټoΛs¾J`c nәѡ̍S}[Om1<.) f88^w-S䏃J6!I]G{oVA}v?t | &=%z'K@Xk0.jC7,o˪ 3eLGeY,awՑe'I{X{ kmasSí=N\!?gNrbRQ [͆F7EoKMhXN^ K_CzgOWٹhW,P\=cl Č ĿDf( }1ޭgpȺCV,(XJ$j;qN0H~y"둜>"h&,!Lȉ y}.96MޛKވPPK zc4_!junit/framework/Protectable.class;o>=vNv.FFf 0F.׊Ԃbvn ?8(9-3'A 81)'U/+,A:4/D?(17<([I PH~Nb^RaPHFQ~9H!##0]y فl&PK zc4!`~junit/framework/Test.classmM; @cb"md`) oSwJb|7 Y0k쉍]KÆ0*ʭgaY:Z+.Z9Uy&7mτ,U'7$C*zb_w؄@1u;4PK zc4  junit/framework/TestCase.classVksU~6Mi"(UJT.DӀP.*nMvI@.;:_plUt`8?&,iZ{J|Dj@}AT!dhz!Eh mNK蓑 b.^ %!<DCA C਌Xq,gaƔa(&+ @f?*ㄌ2ޕKգؐz\m@{2ҙ әIBUeog-;ڧ=jn+g_5b,z)aql(GsFp{fZ'elf'U7m;$(ICS-mftK³ᖊgyJÑ_:L:x[UC+244"Deipk[v6Tk'ڈr^ q.x6Kvk`A6t-iwe3BG54-um@շ$iiF(;qS(Qgj>= a-$Q|iUpYٜvkj^)MAQ3}VFѼ`DyҢ &?)aj9)PW\*GA4Ԥ<. ML ~݈+kd)u2.)+4)dfszO teWf}sۼoWqMBCuP1nH=$ v#NHX4]qmm1M Wy"S6TFXڨzٍD)_evb$`k! asj*eZf:2eZ֛T )5PO QOҚ! .N{Fy]-hWfW]L]b|Si]$,59cI-|"K7* -V^:՞{W8^qc9Pu.\7K;oHX$?z̟pv.`+A'hI fccÙ}#X_56e &;ܚ5z_o|<ϳDóE_or2(عJiP,Q*q<Rs{ڗȼ rѸnai^)c3G>㷇5 [UcYYy܁;5b"=<sIyy{jɣ2s4V[X.R<<zQݚDz^6I1lme8Hz,e8$ɿEџb(~F/(5dbzv|K3qb?2?17bo-CQC GO}^ 4;U]%*Em{BqU!^g{:!$`;ű)f'Ls" ϋ0y,BN zuNsw۝'r[ȥ+))m- uunwPK zc4y/!junit/framework/TestFailure.class}UYOQ. 8 nqkj Do8 ڤmR1IG5=wf:*N}rl~@;"G1/Q؇~? )kIr x@_rUk^1t7$*7k-kҩ|j'Yn_b GzV[T뺢G)[jᔊUB Q3L@Q7ь%f0{񊑗qr; K&K7u$&P4,BwnO8i/-ptѝ -8q ~zs?ERQk>$05Y-EYけhL8޽KtDAݛBӳ5sC,Jed|?CbD ѤIgSBI1&1BDdYq]*ך賛1: /mG5PK zc4wV"junit/framework/TestListener.classuOn@y()#@(Be)EP/`cs7 > (B; c*W#tW.]u࣑}dy>UV+͖;1Gy: $޻Pef7ع,4:XYBxTC딸.y7ysρKXf还_ ۪"B=[1hq+;PK zc4!"junit/framework/TestResult$1.class}QN0vM2(t$ŪMB*ъ{7xKHxIcH\<8Vid;(`xm%˨xc㭍%jZĚaOB?W:kte(CZ ݓqmac'&LaOO ;k]?a7Sd(%]:P܊|p%}Pk `pPfXPeiuŅQۨ1*§֌%_>.Qq1E%.ޡB0i?~/(ozTtU瞛 =C%g 4$*oqLP(;on`? +mPStVV"IɌW2K{6LW?ٝNL [q0d0b2E1zlPK zc4Bx junit/framework/TestResult.classUWe~fYeA"J(!Z9,̮X#˲~/×>9+ ús;s>}{~܍bTģa+1,s\̈dQ>Il ibU|X.#&+˓2MT|"ŧbN ΪLs*˔8>%ˋb. z2 [Ae~RofF7"8"6+ssbʫ 6qwEA(ҍDӈ6y[q1"`¢aglF*cH̱ra ЮBg#Pi̴$Fw_mJ[8'z1갂6z[|1Ё E^+s#+tu Ga^_C+N*<ևXP!Q,W9t8Hb#6 QY'6;:]i* ~qZZIkHi͡-Y8VI ̄:/:!zBG;CF{pQnBNۜ2i{^G^&x9T=Ay-Oe"΃dKV/խ~:<=Cٳ He9$|%BɧQzwG=":̡y#/xs?0~8 xI$1 ZP7ҚbyX?Vpv%?j,q?]d` `Dc{I[- z;Q2080Dr2oV!ۈ.z%Cq.E=t:'P `a(T#q,(ںJIW|$n#u]8i2{4u`4i̦vQzXjԇl(3`(Um y Z|Xt{jR!U;O '#pI/0kh5 d(w:sQ" ϙY &ٸQsjs8awiڴɔٝߵw icӉЖx&)by"2yNaKNmcxf;ݓO vt= s8LD6 ;<%r͠C%4Az㙝fM_thZH٬(Dgh@`ʊ:0,"J4xAQLJL,5wRJ7]F7LzHm'3Ó\jd$5Y2m%Iv3$ȍ,OҌ h$m'C<3wUIvj$̄P͌ESRQ /k؃›W0oz]BU3Y(qmD:":"nKw}*18=5L> f6?di] GIgap$HR0[PTX4Teu grNMBMaUt8<{[*ݜ1L9판dM LΘ|&{ gu%kфRVgIqz"ZJLa=|&aOJm7T-(DNKahEɤ3-^y\(=Abn7vM~`k1,UocEaed0ґa팈oF XE4F>#*^7lCQs*FCSZ6"'눧R\$ Hl)$5بZLn ډ|XC^̌5b{f\c c,Z8#Z1),LrZ$=BGjd7M^7>h&T͆jQ̊HR+gG~ QU7T:PKR u:Pf1H0_G'@n2 APgvC/J0J[qV ZC5p02ujӴ*`#& NT uNPu\0| yUvJf5ʝƬ>s;qͅ(0;V2w[0wy{mdϖgfQwu^SIX)^ 8yO!Qgv6soXb'O\ԛ QO{¼tr ,eu-"]&wD.pZ,cwF9žVP̉ kpzu;6yD$!s)3CрX cJgL5ma'p-5 $`:?ߓKs1-VBCdؐ%=Oʷ-wL3dnp|nI')۷y޼8b>+Y)ﬦs/~[ʤ}'RJF(B}QVEyloUSx#vyf߃emmyPF1}~nzd{lx֐O0Kjni}1(fzSyhmAD `_Y~/AҬ'@id"t3 ˰<\lrYQ @\QN>>\Ƚ.*6ZOG#wh|kKғO9z\Qۜ_KLz\q '>!Ӫ¾{0\#v biDx`!7phyڸ7.&[9n!K=H8YaG(e (?c"Tom \f0)Z,?(cqQ+mE-c,-:*y PП,ӕ:Q6*)ȵUԷ5vm}8>,9H9 /"]FTt+4t\{uGqq61/`qW̝MsGp~,$>K݇LL+(XF 3unXF`i ^~U@{+F=KFr?"DŽɥuU'bqr_I0Jԯ:ze=r1}!9"y9Q07 b݀nF~#^ۑV{|{iB 9-9Fl|L?DmmJHQHM~g$^KoZk_KQbJs!޹#3)sG=?>jcfOЄ2)@ &5;73>Mչv(~C ƻesWhn!;IJh$J;JcMR''GEU6/C”CF=g7f0,'Rۉ!:=ӿ\~ 9~q(8Aadt?N6`4Hg*CParJ'>Ao3v8A,y?(Eh{>W굚&ϭȨڢčkPP*0MUBUVU#cj&֪Zt:꩖:6j7QYTC,dImڪWR-l35ZGn-D`so]n^[87Wb>TQn@\T5a`,toUy埨XqAN!=vsG w:GxX'P])4,3~Z/PK zc4^_$!junit/runner/BaseTestRunner.classX |O4qljs@e[&!\NDǎY(N( hK Mu\݋=nwvwݲ[ڲn73%y4y{~D4:̾J2R4TTX>TeXrQVs5怌\'e^fcFc EXxgiXX/wPFy[7)|hĊ*\|!Bܬq[4n6# Pxht>BVHU`%u#'_!r.Srvk{]% *oxoVyP^V!&.eOOv]z٧pFWO&q;5ޥGThVvQ!VFS:K(*SyH`3fރKe:/4ճgD!&ͦF6g2 S ,bؿ7Y<绮Bl'rfgbTR`Q?)#0 }]PmN &c S{4Mv;L!%7st D":5yo%}f>ft1ӿ J~&"Hqz )] >a$]+ç}1YH:=OH-yO*yaZ tV,5FrF#f*F6\:ʘ:%F3"5kOIStt~tX7b:7\Og,Tn,ZH8h#0#*gg5?Nˎ\<23n&+"NۈE U/oox\l`Z]iX;T35mкk@X2]MggOCMuKkf~@ (ܬMq-cjPdWZL{kf5fu;@Ǒ}³)U鮲}N:qt\ʊ'U4DEttFK̗ |;OZ4vhΞM17EٲhZݥxq>`IY]a)2^ -_d6Cːqw =Zu.fԇ:CS l:!ĵ粀,*Ib+dQ`+nXf8;}0m4E7֏u5[4L,:ie* 'V彍tFq>MDsIcUZx~_`˯Sa9nW&ZL^j/a۔eFpYJ "Or&AŤ&t;.o_$Y@"y|c; bv|)"PyvɰN l`EdzV+i9j !0:z#"=ETslp`n<'K-/aՁXtv)V/ZHk~ZWв z^\A}78hrzTnT~?q+~3F}a"C԰5O˹m#,nAMu:F}s_+^!~<^!lr1޸Y,ֽ { _^]fiˋӞ+yZ}a4l˭)$ ef5ť=O X:Apn~uF|={}6z(`1?z \ OEA;–1E,/(?AAhj{. (1OZ(EwrW [ն <]92m%$9p~脅ҟ[PIQ8a 8Ȩz W3O[(٩-\~wi.bQ4S#r+?Xuz)RkUḮC1Z U.9 xYhZ,l2fo3$NDZ 0oQ?@RW~(m0NRut$s8y+OE|_M~su67p$6EAh KUa5a4TV2[kI{}>:IJƩ+ )-/6%esN$x? ?G?6~ /д_a/ʼ[(+3YYv>#L"eDž]Ve{E&TBoTkZ_%c4uxA51q&x*=T^ eW] g_4wZY qR~r5I2v[11k&GzQus-Ur iy(yƀ<{~F Λdޮ)}aT5gO7Ng\^F܈T0H!b~CB-:j/ @#xcUEm:+`$%=%pHLm(#R);{|d=v4?AA'Ӂ ъr[!(a0tjZnPS+_@*Zҕ|)m㋩/^tV!4~ | s ZtZ7joK& + I~cV#U3pSy=@2?t] 46P87 n>7nPnS Uq-KPoy|c=(?-B6;6Ep7mڄVWDI5, ɿ&VEMVj\~$uz5>B5IxAπpvяi$a5i>Y{5pB@a2'({vF@dT*7BfӼVB̢Xki[DΔy􃲦<"ӺJ)]_lfU2a_MvI rr~]^uIW/yAj]%6EGxO_ĝ1"va.EF E|s&$>4<|":L7zxS8!bq _ hlW"7Vi0U@u7ySw A Љ1x#2G0/Nf5TѺ ܰvag]9D<19ch+c^_N2nL??r̤LmHc!!A7Iaj ULATe9Na+ُJTlvTdgDc!{zKnGvڑM7_ 1' /7Dj -Ac7x_UkYG4SinH_wlV:i|͔Վ=t!Vc]BoRI2R{"#$G#4%±2'9]!巣ihu+QrQjc Uk<2R=IJmSGT8]Ʋԥ(MM-"Geෑg۫J5V1sM7P5탶AJDiSsaGM" ߿Rzqb[:38lm:.{PK zc4Ń14 'junit/runner/LoadingTestCollector.classUksV=6 Nx$4WibS(-4))4Зb˶$Cc#3@_!Sv?ӳWBiJwٻ.1\qIǻY,~\~:d0R,A|(GPl?iܐ'yIY§b,u|!/uY,QנKY< KێL{mDZk,2}?0Vay+}׻sX5(6-iL0d*ivUCjfY ɩ n0Xkly-[5[Mϖ}dLMp"ZV5p6W&!adJ1`v&}]F[5%Dwnpm;Un`f`4_tUFx3ddEJ&D(vqj/ڽ$Vqal̑5L-eoo~mV . õ:_m/s^[pJ u³o,Hⶽ7ګyEkSv>hh6peyMRnq Ar/*:hh-2:f 1.20+C`#*w170/xt }g1ߗ>p^*h_jآҖQW͠^w5lٰM:=?UΩ7#>g3Cfm5LF+^c4d|n8r my. |Yuh˱i5yY]2Jp{pz d9+>d WS#TطI=3i9|8q<4>O?_Qe⺝@I c#sg1((IV1ĿPe7m { a0tkГL?B̗rb]QOs B胤Ac95Bk>U)G9N xS{߄vB{\n/Adb@&60X{k"j@)*Ze"PT qo}8%Hjs/9߱O&F~FR5c&v_(.2H!Μ3")MĘؑÅhwm` Su庍.Sz}8CIfc97p ;Þa| @a݀e_<Zp'0Q1@+=j:hf~S$(g TIbE)e)8稫Ny|i%PK zc46r+junit/runner/ReloadingTestSuiteLoader.classRn@=8vj-l-MfKUB}DJ6qFkW^/G!&d1̽93?~~thhc_Sh8# Nԗ~ 5˾bPP04]?z K>(Fx˸L*?a8q8q"vފ C?]$g~*\E|F r#w~S=8F4h&"`j ʶ3O`&keISH7XHŮU27W#HW2#`01-ُⱰ23j~PK zc46!junit/runner/Sorter$Swapper.classm= @Ř5?`aakM,װH’ݬx(1) b0c ڞjq,VlWJIB:u,CBX׶zmHͿM>TvR/%J# a1)\Rs埦@D>aH  1 a~PK zc4z[ejunit/runner/Sorter.class}S]oP~v& lD*b3FWZؑ?+5ڛqx/̏M}@*氮 F ITTpAi3h5c | ?];x/Z Ҏw~MP%]:Ӳ|[E)8#[DRCA]mx~mԐFn=kdUv- <V-Ln ErB4}N *``5ow)W'KN/Br,[SBwm1w*> .( i*h{aX!?vcQ $wxcgR4'͑x'zNZ"'% Vja>9+&Ƨ"6(2 3اyZUbeZԄKHSL W"fPB) S7^&#ľ#%z#Ho|ϼlQ}Z.+ʺa|wH_ لQwIHkL*3t%la䱏xM9V%{XGHv/KFMCn͈xt:-! It8sRm\!n:W' G'LVoPK zc4zd2*junit/runner/StandardTestSuiteLoader.classRN0mMA H@\*8EPmLq:I'>BӊG g3ko/"EKXv`}"O2+l=CѓJ4^KK 2m\q-M>(f1x݄Lj:QJZ3ڿQLd,B? İ]:Ruw""NCܳe"t"-m#uyʿl0mq.qW8فaqPcj+a(}huE;.?#А0>! sjs4[^CDVe5Z'G)iцK1'`O@,#>2{ϰxO *Def)130<Znon֧YtO PK zc48 &junit/runner/TestCaseClassLoader.classWi`TlofB@#D';:"JBdP؀ fYlk7JYlmZlC5 vVݶV{Ks0 CG=s߹g97#ZTԏA| b=q6i?>Ǩ<|,qB/?x@qYo#|!/($˗ey1ٿ<-WeycA,/&ߔߒ۲<.a3 Mq!0 0&?~"OzR(Sr됁A\'d9 ~įPO IoГۖi )5OL:+gdڈ*wi#$XX#6 ]ύ5F=ǰPrvC8aцư)oͣT2<⺉1z9Ѻ 3\ȗfjm w;cz)]2|vb_0n«4z.8. j}x-:]Jǟy&hR=s:녚k!B{n,*\ D aO{QE"CCLnib@FwOHæ|DBzfgȾڣ#qcGy,܃ei\r|ly:<aYj_d~}FǨ+W1j_׹|#d|b ){.g?5,^(ΪlRTbwE=enw3aҧACWE]'8; Je?E'8/8 ~x ,9Bׄo5xN8+d*(j(CFSLDͧ>=eiN-9'dV_?[Gt$PK zc4 junit/runner/TestCollector.classU1 1DFBl`)Z z$&x(qS 0o^@:xot:.uj}pdN盉*rfo! !!,]fd&ʿaxq}& PaPK zc45 "junit/runner/TestRunListener.classmQN@mj[c<@!iWBC2ĚLf`; S 3~,UE2b`๐Ry^3aAT.؁a>~͜~G3<x$kdՈ(Z6ETrڱ歰$ Njes swԼ-^ٺKǫfyktJ)z poC-W˳ V}TYprEn P~L]Q)AuJHd\W5dPdgJ;+T!]hL30lRlak-SUW%r=l`epXr[rٛO;Bg V99;~UKf`LiON +-(&XPK zc4f!junit/swingui/AboutDialog$1.class}RJ1=ӎjVR Ji1#3\?obQ$7g9f?^԰91bs,8(1dW6fWڋ$mޗ<;[ {/>Q%%*=8M^ T8n蜷BAGҜ`XaCH)<!Y$skS]ѵh3ӞJ{6sܳ0|q(_EkrXBz'IjWu%|M7@CZP* N[7a,Peh-s0#Eŀ+Eu:[V]{B j@CNtyR4F1ڡdeH=Gɵqeղ'̰'-g #EOPK zc4%3A,|3ot1%]`ƚu.j6 SQ$}d$5byfjD]0ݔ8K">퀐|3R0; C7$c$ݨ %"T!)(nmmEi'RWjEY6J6PђLwyOa{-k`weҋAa.@sj׈[y<#h8Y-LXfa xj!͚>ɘOIc=Lge|_>/ /+,+yPP4 .nwi}B/8c@KvQK53g^tH N$}R`g\H =3hkzolRoetaiݞЦ %lW1:jӹY۶lr䌂@[uݳX4sVsz 4V'2Y>M#䓌^w7dϢH-ؚa:Ey'1d>-ۿ[Gԅjp3JIۺIh~$9ԵwC/5wlI|mHAhfcWJn[E;暔u1^'y9+{ke:xL\(*⚊>|7T|RmzZLT'o^cZH9\-1Z `xL8eu 44bީhvIL׵"Vt3#2^༶HLv 㦔fih49od5sXt䣰 ƥs(^Qx n~ouO/7zWUUiTFr覍wnأ$"uWF ]AѠh\3Hc;JIJP~2A3P]Anp+З|{W; F(H` QLe6Bk>0UC+ D/*qJ4Oli C+0,㬘BR`D8'y8ApC<0p,y%hCF8s2}w7H^tD tɇxNA4-W[ES8Bw-8~„zћ;XƉVqeІ׸wXlL[7芥5NJ})j U#=3;zkL07aPK zc4]n junit/swingui/CounterPanel.classVi[~!$ #F(ĩqm-!B[H+4d42.IӦIt=]44ަ=w"s=gk}G:48:`Icp(P`XqE'Ywyg :ZxOh{Dɦs:п:{e}a<xZGEa|D yVq>'u‰|Jȧ|Fg|N|A|I_ k:N_7fߒB#8 {!<53Q\̈:nACgy\/,l֊7j[i犮Ehub1Ϲ765Ķi5}0_)3xfN6;o{g5}3E#Sva͹%jy37c+ނM zRWTC!,rļk5Ygc}7v;l_:b}MX\7=-.9y+  WPNSNz ޕʸJ0+/XvvZV E'c&[A]hhf ky8PPm[lc-BI+IkdS+2a(g*ӕy+"2\eQ|2SNѝFmI{:v:2Wg` ~?0CmAƷh΄c? ,qD a8& g r6SA*ۑY~CWP߼d+ sK((c!6s+~_ko g$ƈ!o!dB&B ظj`#ϙssi`1^5'f 毲7?4r[3-w︙7Y[͐ɹּmrf'_x_@-;0moS+JúhTi8ߥ!z#[Pw(.Cxݪh-Z kB3l/Z[XslE_rUJM ;}ߛy{6^ -5<82:91-]4^~X|ǦX d$m{$][0i5=]%obOoOZ lDTzS'kc=Ϩ}϶DK_ZJ֩';6!7^L -E̩6#8ߧ&4H# MO+#[*#rI41rZfа@"QFc,B$&D"MH$"RAl5@Ml}6o 2$/!Ƚݠm W EkܦdN DK&Z 6Fz7=hF:vzp>y<Ni-LX&L/|ywQReIt+S]%ĻK,!da!\B,sh.hW(?2Bz-܃)܆i0󡻇9>s|qIyq]z13br|]8> y)f\"83Tћ2&%ZGa4m (#Y1U5m2QJ8QsC_Gx0Q2)fJXI[+*]ĈSMmtNKi𥪁i⺤WC2^p'7t2"2)e ?QBVU >S_XܢOӫ3[nA*L*$rg .w=FqʼnTEvfESJN3rzPK zc4ČD,?junit/swingui/DefaultFailureDetailView$StackEntryRenderer.classR]OA=ӯBV@QYMjcPhB }dwֿ䓾@eD)&n:s{Ϲsv1 Edpϼ,aa,U Hr^x ƛ2}}ED340ɘr-/}D`7@Dq,$$]&oy*ĦI]3 ݔR`/<:hjOx2r'~Ghk}w{O9E 0OJR GdjH= @-()h> Ob?Z:"="c>[abKޚ1"C颀Uܷ1Ink\ aXݱA/`EXqFz^[л5p1SjW mnӅeO E.s9M۴RpWi5ڙ1o hiR)̕srS)Y ӹ41OIfwRŝ>@DS(S8w== F7!Fc[4 q;=|]h7ǷPOPK zc4&@junit/swingui/DefaultFailureDetailView$StackTraceListModel.classTYOQ-]akYDڲ͍EX-Pަi2s /M$14,Лson6Tc< >"h$[S|LtcBx*9̇sݬa GA4{멊4T^eٞaD^A ]. \rT^0m3 ^<ܲ S,aMqBBRΉaUԊ+\ b!d0 j#ae3I1uk/Y8(ɰJTQN=ryCqNDioxjES6MuK! ;%nE]yj\be4Ch@(bЯai +\s# 63ƪ5kxxBVKBpZqjdC<@J#B5l.[Nz,J W͸8*e(xճQv%NRO\'J^KGчm'Nϛa5 ҏD'OYKDgPmuN~mZzpECHI~AOu[tՒ<Qz>Ajڽa"`p yDĒg%~d-9&<r:RomZg 4WQ0F+o`My'D9-*ߣ#dTϋF]T LR);MZpZ'b.j#PK zc4g,junit/swingui/DefaultFailureDetailView.classTkSP= (DX,m/-C$՟?-8~s7 @e={dwx!ЇH*#K2&z7dH)p[ dtxn2ޑ12ᾈCBX$<09jñg-n1()VBWm =ORK݇Q"E5E{Id_5 h-} W@pfORD{b8FsVDyRi>PK zc4_A$junit/swingui/FailureRunView$1.classRJAI;jgE #y$Y'G%x~%lkkz@60A 6ha²r:*tWrO"."]UTtؤPՙu8P`u?m**$0ZV΢1-ҫJ_!8Z_d#{liK/RS+jl9ٖ]Kmҡ[VAX!jc&_]iE~N1t_ЯL N;Q>w70t2/{ssݿI8IQH3:$&(QT=s_\I}l<Ō@ϖi7Il%B% ,Y< G[n2Q8: !0&uzm@y]k6T;IT ಁ1\ְj[|'pRt0&kVUkxj F"jIƐz d?♁LqjUzL x l`ӀM uM=Y5?h4̌=KTD(s} yIaR2',LdEO֩ndցNNY6u5ŠIȼ ɜSfM_ _xP6:OvU[A3bi~D@*s)/RFp]{jDo"\+?\ s7lUAd[=T±7TC=#2@xz`hl(K+yx~u8bzmZƌL) v'FRTk$ZZkL F^WD:z 8/1H/He@|#Y5\8$*b:!<>!-y8>.ULAaAwYbj5 ]̆ zQ"w>d#zwnA#ubF8.|bSdaנ PK zc4٣pM "junit/swingui/FailureRunView.classVkWWB&Qb,o`SֶREX@ \`p3~?O]5ԺVW?Guuߙ$aq{Ϲ{>@#*^(%Pʘq\H@ExIU\I@ð\b<$rr"0)jLP1@%gMiq=%ǜ6/=d"7T* 3>zi +'(в%Sw]r:Y`kߌ>/dyÚʜGTO}v- |FfDފn Z*9ϰ@~v\8#ɕT=cy w} a 58 WehK%[OԶ߱}`ojGWgjg-+Rifg6:ږIlqe5 Ɏ\Oz"5SS./#H& jQHsP:ܽA>5φ+!QYW*]ѕWq iDF6*k= C4aPoqD;q&.#L twC_bgqRN`D2(7赚`OƦEbIB&r\MȕuGqn>hΐ!jRcG{]8be PK zc4S[uoPjunit/swingui/ProgressBar.classuRNQ]v(B ʥzG1QS ކr(CJ~E?23}Y{}_s&ǔI0G5 >0aN|, m-)+KㅯښoJBT܍6=tk9qT;IiE^[JW[2\ 0 n[;[wzcV2 BW'ۦPU]YCn;3MvۊgG{n(9ifjeO-^P6%X(haaܰxd1XxaB',lᙆF;=.8ᲯdKQgS`zuz.7$eG G޵?ː{ۍv1KX?NH?&8VrA8H9N.zS( MGUzy kZ+8_)2ǧ;>&!~:-%" =]d*]U8 TX!?)GQ.2Ek:.4OMqMLýIUCOymʲяP;d&Ss3TW{Xze,̘MCȤBgƢg܅uq'μPK zc4xk+junit/swingui/StatusLine.class}TksD=;yO(JyBMƤP:uT#M#0L;b8+q㫽=+ IT{9 Z}'Y|sUEKXVʬ(+u 0u jfS`zbUðZpI XO#˶k+i>ǚזj֞H,gm'toD՝ [/Jߗ;v;uatsY ú4r;Dj2NTS/ i12Bf$vߒ5[546uT0c:7:긡[ Ա-۸ᶎ\w:0aW|.:~T} @`ĥPg۶~RƩꍦ|l8@1VxUy7v\qO+z~[5z/-_Z\O.rHًe8(R^p?;;c(N*pk89jD3Q'3dԗ'%!߃n0:.DЈZ nk*{5' ~G(L@P& Tc * J^**tqq}ai.R)UԟrN!/"\$p"#FPK zc4ݜ*junit/swingui/TestHierarchyRunView$1.classR]kA=c66i&&6-R(%lF؝5gUrg0_g9;[M(`j<<8DL)\Hx>svn#:*5mX9>;fK5~3G xxbw->; 'r]S-b ϰȫ*5~ wJZ^-,ĆcKrqPK zc4c$[ (junit/swingui/TestHierarchyRunView.classVWV0De\j֩ZU,ZRc`LtHl{n_sؖ0lO7/&:s1R񸊳  ŘT!D8.'h3)L+ a$uxB-)qULI` JkryRB=xF.J|%*^Pm|mM;VR4ܴ3m#=$7S0\qF7Eӧ2]1PДZ]eXA k S*L {HSRoa6s 9Q#!l]aCL3ul.昞BfO3i"+3J .GdB5) fD^"+RАj I1mٗ%>SK)[L =߫-#I9za:8=zwmNjϰ3¦EyrB䡬\0WJ#"mɒQ$;W%iRe@K)? k ӲafŌZwʸPPp y|QG9gd,TDA}VX{LrJa)ЎZFw]; )hx /s<;v)3MapWT5 R'30UmJB7يh6,T^ e:*UP>G Jc|S|6g`~5|/4\Ǘ,s+WZ7rT|{nQO8`+=y^+FKe2s$/2sp\aJn_LgMzqFM'!/'d iz$I}F]2k%#7@ R!#:&X&sd%)>ZnQqJ' ~NrFk!EO|YWEM0z}9#'jJ_h[StT9_Æcx/]YsYƕYl ҢŤ5%Bxq,?/׌2~9!Ȳ\㔷k'.#4ނve(MD[C,NjeHs]('QAguDqwAbv{"Q _}Dh-"Q[;5emUk=Uyz;!?6KzhmK}n7S ``'2֚^,Az@6J+(+h/6֝Ek]h(bmlHFh^G'#ƮX2)]jHݜŖdvۓ6omxxՈ3j"nPunYγr9o.ɝc]Z1j5zcG1^cG8[XDw?N4 (ewkdڊhj}H!|.R5B xd"ki[pE "~|s[yva)IvTe^ᢧK|?PK zc4jy["junit/swingui/TestRunContext.classU@Wj#$yKIWЋ1MlC+gss_!ax&ռ&`9%q挲X+"<H* .=93y(ʜDJS B8p4F`27+;!7:%SB˺x:B^P6:CPK zc4 /junit/swingui/TestRunView.classuN0.%)C H<@4{"QKrHl < CO:w>lpbBacrŅ2*\E뇽_ sߘxxSPauGNVaacҕ3Rn@eQp#uws.f)o͚Ԓ8ߜXGzЋLLƙ:&pɤN~EL8Mg5p[}ߴso' =oWVU|J-p,{Qw_6H?/ }*5s,ئSu sVdw-/WDV8rk"ۢ@9٭|2 o $JJ U4Rҕzմ7Mb9R&d˕li z yV-Nj;N1DaJ\D?Jy j{Xp_bKH<IJD $V$ehwl4t[~f:%jUy^nHC;eLz}n:ʞo)k?ǺtRu7ΠE%)C6M;"3)Xsiف")҄qlm\ y)O4oD;[F$'1BMČlqc1h"9%(J5`qB1C$~QOdaaL!Z?aNN:sy̫4>>uҠ'[;Xxv([cȅ:z[PK zc4gE!junit/swingui/TestRunner$10.class}R]/A=ʶw*<!B"i k0RϒH<~3<Ηu>;,>!8]|Z)jW}y1ݲrGd[/ܷ[Yӌשop PK zc4iƵ!junit/swingui/TestRunner$11.class}RnAE,B*T)MZM !S8i逻my_DkCl51$;{QD>]ᑇDŽ;Ia|8c>1ba섭 ⅖CB ="仳=m]rv@OR͆jz"e1@8T1K:8o,<"l#uBuaC>gc÷xzfϒhȯSw%4`MOe;VɈԑԱ睍ٜ+=4 t͛[Vyhx^`^u#'B}XN PX"RBcg&?-ʿQcd-ӇJ$#юo\66Q:u= [=+/^w!]瞄{{ŹWyrD5ti!9U3BL zQa1^ 8),#w|PK zc4q!junit/swingui/TestRunner$14.class}J@Mkchz b*7 T[ƥSAE4 L| `EL²XQױPz}/C5sQ 1CG}Ieh7A IK#&}IN񲿣og;2b/:%ֆ.ny U6 =x ꬌk\H=WKE22h%&&QԱabS 0Lg]whQw]D@[PQ>(7NEY4zʘڢXcZcD8MQ!]bHJe`XHGI  |5 %:a8fְ%&ZF%PK zc4c!junit/swingui/TestRunner$15.class}J@Mkcc4Z<Bz!7 T+.q-1FEٴ  `Ì 0ocF"#_iSP5"uvX2d(;*tRD ΅gi(IgVzZ`nW8I"9HkG<4#=R:s=[013ҩ$rt1 p]hc2f0]-#l/0ًBx jes҆AsJoe3!=ʎ۫U^aU_{΄ %F(/P^l23Т|NVn全/Ƚ#:ƈu:c9nma2SʹPK zc4mM!junit/swingui/TestRunner$16.classUSU݅dCR5 (hcZĖ\eCnj_Wg_ggJH{|G9 $jfry9$13]Y^΅qBL\ƛaa>,F7BX-6UVK.k_]{O*Vf̕ W 6=pS붾%W;9g-,](tˆK 5~gYҦ' ]Xm[k{9QmId*Eݼ c'vS-Hj&9Gi=ya y #"N(h JL&5Ī[nC ch*>ӠcR,i(b<o}]ڜm'NYf(k R:6B,V C&h0E%2,T4lQPAlK$?ZN.`+ bqbԍj^" L1Rk C?t\I8^l[Z~F=&xS+Lg}ͼ#v1ۡ~b+YQ >T 34CjYCEtOHSv杺= E^H_iD.ތ l~g;3+N]k4#\x샞IO ߓg0hQ( ӗBAN{ c_S?IU;iMLB$N@IL[?2Fk"UXqR}^?wY'0Y"JGDŽ5t Acj=A\EzH 7y>}kǢ=UO@$GTqV ?:P ,op38Fbe} *OWY+?aIYU~oR_)k-ѓHQxi|F2da;8a e?PK zc47$!junit/swingui/TestRunner$17.class}Rn@}k i" P @jJ'$@(BE '.밢Gץ|V$|MDHٙ7ތɷ!z\esFfN[ѾJ;Ii$hj_O&{̥ T3Jt*p^=9bLѹ/Y􆺰o,9{*{:l97w{-PL.?&:$լq2R d _2NBSfT1I'˔`R#p%hKGMHB\wX@}1dGX8buzBۡ>VwٮA Gő<@qwt6)xk ?7EpЫd+M-\ryS2sGt(Q#_pf_Xa,֜Kq7PK zc4 %/!!junit/swingui/TestRunner$18.classSmoP~nxqET?Huqd/ʊ]e?2[P3ؤy}ι?աB ;򸽂;(鸋{:,QEG4N)AȐL"|~*=}}H}7<m1$;(53vǑ\Wd{*/vr̐yo9]*: Gi1m)ϔ YLsxl/.5;TG.eIz!wXA?"nΣj~ `Ě4 4@ 4<6m<> +*aXwףhJ:N;ݸV-/rC{&L͈ulF8~ܸ0PK zc4ib!>!junit/swingui/TestRunner$19.class}JAƿmݶ4-+EBܺ! qtuSX]DECEgosf7p>p`f# N,d.C}J&^",XcѫJ">34ۛOI0Rt1јOCR*å sЍ0ӈAXKz+F_:eVjbiQuabhd(kr5y-i4Kޢh.Ы@aázN}t>:w2K$gإsm335#.sDY>D9ј20~PK zc4w 0@ junit/swingui/TestRunner$2.classSn@=q$[ m) II[J ID$HTC6f:6o"~ G(4Hv왝9_,dcQE,IsIe\QU^u%5T4,k-Xc(cUh9Ъ ?x: '8eREâr!tlr'=޳)o&ܳSRhE'HZ %ɨw3Kflj+ȡ``'44gU5jX3[6 Ʀ-1pu ۠&+`I͝~Qo ̀8ɼs@H77Mj45:hS8sN ]~|?0LSUz0 Iv(\j9:ץй}*sy+g }K3Rk_CV^^ zg!N8C蕏`HS9Ȧ)xdFY89ǘ GRUlW# ɯ؈Rq`ґc_#dyȾ"X4VI1"XJ9%&PK zc4P> junit/swingui/TestRunner$3.class}TnP=7 qJ BRR[77478䥅>/ | 0 MXx̙'9#АKR\ VAV rҜW1k Ft#r&+Mne?0tuN0A;LFx]C1;]*[{D(Z&vdUnt[s=ˆ8,}s'D2h{&ɤzkQJS?+鵸2ٶ<7$&4aA94ETU\WpCn*u A-B]pKciu:5I\sPAz'RYL1u'5Jeocoqӥ$S}9A=mNղIݎa_Sd1k鱓[ G٤v|a5{HTeA1B^1"'ciU:MKgHg|'I |xiR c%%~L%s0+,0|P5K`2|Hꦏ!D+E|2~PY8OHCq,Tz\E3B>'PK zc4)6%f%+ B0R!3hR>oP{̘ `"ALbE+p_@2oCr6xG{-v,e66q}i~{V*y8:Xc}4 W+۾.#-HĐ^6I'\)!}EZ i{ht&9'EE+U[tHԝnh [}{2 cMae+H=!Z4ܲ?nYfV3!PK zc4F; junit/swingui/TestRunner$5.classuR]/A=SmE!4}l;K, !G &3s9+XpdiLƌYe^}!jay+FXz'"GR"\g*}!I!`(-&KNA[0R%2 |94.6AP3E.UV侖:Y^6Crkke);2D8C_JwŨ pQ)A\ 2 ^ν֥MiA"Ev"ɕrQT]Qϛ2<)Z.fT5n#Xm;h7> dHkNzBϯkw|qe1JQ[~_PK zc4 junit/swingui/TestRunner$6.classuRJ@]&jzyO(9>H&%x?J3=&0=+kؓWXP¯2 s=,͕JW6L+J_f*<9δ|r͕4*bŶb̗$TJˣבɩtHtDm?b+T22eeUEdT"Nzčŭ &s[d%;|"!8$~] 4*{X` a~R¨2۹ؾR#YDhڴ3y|/F&=hxzj6eا+,W;|vHZ{Dqm #\OuUv>= {nY~' |;'s|L2fN31}PK zc42u junit/swingui/TestRunner$7.classuQJ@=֦j}B+4\(Ev#m"ɤ| ?E]d9ÝϷw l9 6QPPaȪؗʋ&ҿ}_ vWdGx d5CC%}q"B+5>OB[4<!.m~0ij'c+tmr1aLI N;Þ8:YcC\ب²Ps*M/9#5i+2wt$>FJP RA=hpq:P ^Pڝ`!P?uݱ2dkPՉEN%TEjf#щ|pOFmIiָyTuh`d~) KXc+{}OgEDXhkEr'Ӊ62Zr2%{ ) MUc9{s @<ӂNDgs]CνXwnp:#n;* Ͻf ^%PK zc4[ junit/swingui/TestRunner$9.classuRJ@SIczy WQDX}W]H6%x?J<6{v23g8ُϷwkX Ѝ 0hs-XM]Η{$TJˣ%3j32Ԉ#>XA ^[dd&GȨX2NnʹĝŽ &u}[d$m>4,䁲*=׬2<X@痟0z [722<7Tj$]6D+O2̔x/>^zPCꯠ3 o뱎npշ'a#-˯?_t N?n>FqSpPK zc4h[,bjunit/swingui/TestRunner.class<|TE̼ۼtZe! ^@ $!ƒl`!ٍgolXvSvrzg9S7o&꟟Λo>`vv: XKu>P*."*H4*v]Ժ? L r ¯5 Zs5zqح o16n~=TawN_;y4w}OnjCŽTG3w~fE0?lS*o'xROe<Ogu7*i)y n*B2^?hkn:q Z:Kow]? XG?p 89G:?1`=JH@#:Ҁ.e@ MĿֿο1H?DT K?Q1nW7upH3`ЩE[*2¤ZȤV. 89r\C. >3b_Hn%;@*E.p9+ /Џ#Pmz7d%\th uXtlbk>o+ZhuA*nE-"h7Hު6]lQ4hec fc8{N\GZ[ܠnqM3Z6q.=[H] Bq.*NEEfuQ/CwSnD_w19IO8i[<#Q= /Pu"d Afe0x5ޖvX1ZZ GT-_J.i͋CV~5[Ʋe޼=e-^\)6z_8no0R=5`hKYU[7 LD({ḼƐ/4 /TvYlBo7/[ڱ|^D_GjMj n Xrw\lD|ހ%fWO= E[?+}@'r$⍴k$Do4SpƆtԷE6hAܧ  ľ &Zm^M)&dl5ni =@öfG-ek|(.Y_JԺ#W5$ЪHT׬^YkZG4xre^ nIc`% 'UX=QqSXKvDʪ[iabI8hjF>W7ZA4-L& o 8w[^ʉB1gM0cQ!6Ќ 3j LbG7Hf pe<)M^&:cLlĀ 6q6rgTCbl#xnT,>ЩFk;1&LZ-[e@5:/YGjܴ=>6;w&$Vi9"Uw$_n"r䩭޸RasC4ez$mGdt椦?"ۚF'.CU R(؈Q%_+̕~u4*_ `,<+"8zܰ=x:jƙ9Z{;|-1܄F풀) moiGT(Tr-%S|26,҆$F59.B/#ƻg̏fe䰙 ˦E&=4j3cEngOzq2l~o-f_״GUf(}u"d H!)sΉъp䦠ۂHuMQoШsJT͐53W'tY˜87liixҞ +q@&&Ǽcrl7Unf7[Y!0H6MvFػ5O|CG* W)xs x!WFZK..#!A },Gj8|܄A͘]a+ѫRAZ)UXlQ- f:c q̞;_ ` =+ϲ&|+kȑȴgj-Aᆷ5uI,nW06)loK3,m00&L#0!6{:53hpuz`LNbW,F79OY0~L"$xqm59Tɿ'W1RjòNJ6P7مl\%x'Xw&Mb6@S0*l+` Lv ;d~N61kn1 <%Cr"_5( L2h]-Eo\!Mq+&F kCeAHxU0kuܡ%zo=xCi_Oo BMv;owt)S|(>2S|*>3 S|-%Fw:1WkǎGgG"7ſÿ,;S|kM&c_KJK:LjL 65d{aB&; uW$~iEScGqKI# 5aj-X81RoLa*)%z|Og=ywZueji`l} 2r{v`̖Dq3'N S eKTmG<},W| jjijYZIya0-h-GrM-d;31]h jbɏ&$%8qMܗLL) wfIyBaG@dmgسĔSk?SdeĞF˅xp ]yv4VkG&!O$uOd 9hCP}k>FϷra$ZlAN{MdI0 >d]aj#Q&g-HOSLm6^p1iӊ0>IAlvJѫk!U>lK :4ٛ-SB?rr}0|I6I& ǻ=3K0iI6:TQ!aCaǽɾaߚgOLvV_6ݩ4هv*zxN`'I 5G2op[ ;J#LmVnjhsp]6Mm`5@#ZEg\i8? ˃n.=m-:։VG;6 Ձޏ{REф=ʓw%)3mi$e >5i=|T$X&bQ閶K tңkkLm&0tA&JQ,aTӿL|>` o֙|붽wsL'LW1յLp][oj^m5Z|Kٞ/ܶ4Zلrz o:31y5F*6ahf ltQ V&@ܢ'v$b ڪHO̠vksDE0$6LmYI[])nH%$H!S {h AL&?6Yxu6Q(.hS;xsv~`wV_g uS;xXv2Rqyl \S;8杦njg䂵ސiGHLGzrsf8Dgٔ+M~0$G:66"SX}l贈Nո;Gtl nx t놞A鯜87t Z=OpuUM Xe}H":+C" CcuS?E-s=(Ny;:D;G+WR'; d9.^N@LjEGVh%U & oSSUUiaQt:Q,O&o6UP26ċ0I{})^/Kvn$2Bf.msrxN:>Kve҈O9r҈^B j*J45Cxxb3f(N˜T䉃ܜ=\hz^t[{)dpljޯ xUT|&C[mczR_|7kiC)eV^7Xz`R3n6nEO'ڈmkP;M^O*n4+8 +Qy`kS_F;E=$8'~{0 x2eeӍvzz cŖh9|pUkIPfWZl3F9ܢ wSzY+O*;mO2axE\|P/O*<+#=J8h+.)֦ПTT7F9xzR[η$(w ($*Qus+õE#lTfdMԙJj 8wwukw#R/?с'%(zJ!IzI LZ7ꘈYf %C2C&\’ebwH }H QRb-PsH&Da.~Q]"0XO޻ݿ<ޣ<%ND+K? F0p%9p T[ס\/iH.P*VNm-;*&Muis kQ Қ)ԚBv_vEacy#7rތí0 pM oS4QQ8% EpIF 0 fFal*ptAy<{fB!܁# #r3"F QEDQ-s삁ؘW75 {r 1pmd{ؽHcm*4:2Vt bq2N:c~/wiiqA-6-#lZmZكشT)  SQ8&i|=@NQ B~ԭ itۧ柉P &\] ֠[n[;9T&UKu7ԑ790 +s5Q8hmI` "K4/C3-o;ֵPQe1WK!{Nmi{ڼ~z#Qk!#qq#9D~_?BY~#>A"?Q-^cOj <2æ Х^%U;fE٭ɮ:m`{ÝбҰ'}p4Qtv&;!.8$kO8NmNJV`6 XơX"uLȰV(ʧ ǿސ޲)+p%kNrafH{#ĉQ9pjCi]pzmiQ8s ܥhg&/n*>0OlLtb`{>!HP\ +P!E8C6<\sq-C4QjP"ڨ1P}>SWITHTy…"T" \l\ KkJ3\vL\Ywgؾ+qn؉*KRJY.c WDJ 8W8w u^JkLVB:"߄!g3Fg,ۊVtGA;V2}\\E߸5þUߢee7\ߐ7`$MHa%MHp J.>M6$vs8`{HB=̹0 u:& +cÑ 9}K(B(3yjeD7 wDNj0ARRW8@,9o~b? (h2\2BNg}AWm7C 늑{wb-==˵bro'NqQ7`σ.Nx;}.{=s78y';eSt'Lg:a/Vϖѯus<yn?>e@ ^;%_WlUDM+;' ^ß2״xGK4.Ǖc WpB0EZ"W\i#+^Gn,7" o@Ӊt8iȋzD8/rcK(-pGջW/ 9ͨG~ZnԿ1Fbf^n6QrvbwB 0׬ -^m}p%f!SMJ_}8|˞`{|h,{,b) ;{Wu5ܢ Ʈ7;e&7[oز6. 9)0jH-saViHlq/}nv:wszzf}?ˍch'|P`:C\Vq1HOWZ'|?M]Fv'|V`t Kc[Cc-]G _Q*i>D_1}٧Z?C}CFqFAN-Ƈ+Po#shOQWIo!~\Prv~ \iQϞ:ܟa(_\&kb) U3P8T܄<ʹĀY@FAG&c=.}\QA5P`‹u 3q?b/൘S?L7S{( c`,ik]~Hc(`$j(8>JQT\PGa璓y /v4'"3SIE.ϸ unLs5t4d2qo78q=#[3H䣑1(q0Y0OV Xp^Y)w"LǭMK,}Kyo!θc &N3p.}YI\ \}fEb],VCe7k*Af9;C@L ?E{a X&VtGl$YV%|.y0/Y|!T`WJ!iC3Y$*[CTBS,FX'r[pj SPzػ\,o˯fJY.6 Gi|1xL>O1~9 /ǩ+S T $)@Frsu&oǏ@oOo鯅)PGk"e 䶾 #@74`(oFcߘb*-/Gޜ޵{ &}}AQrx; lx۽68<PhFcjw`r@F.21 \8%'4fvUAEAnmm/*aVB?f-ȹPyf0TX#C# M|Ώ1p2?xxop19]^J$Eo1/)"e G򥸛hKBuŧ"(2::5q~V3d6!2l >ci0^ tq _fOrhS,&N`Isyw@?{ u!pg)eGYn(+F9)&M)gSQ9k:YF& 2IzD.Aىm痢L嗡ltZnd]}ckE|+ g]*/ Y@(ݼ51y:8<@A獊ÓןCE,q7op+.68>fpu< }!&G"lvnVހ|@tsPcs;!v*l^|t3ʈѐ!J KJm,Ʉ {2mCa!vx>;"֋}K(ujwS@LD;Π9_REX-1ZW8,36$" 2ӧ"oJoڜQs)h^ ! TzJŀ#9Y%el>֌ʟt?YFiJ!_oRrlB$m䣍7A/(@Yw+]WFf|/F9XvbO/3k2C<u[}\}&瓄h5xE^%'+;^8wHDn]" \aS^ࢉSb5Cu+Is,YcLz s [: Ј|y,u=- E$'>x3Dz%I{}剞wegl1ay{Z߶4+>Ve8,me#h4tv &}}ogA3G,R nñV8j^>QOqu;c*ʭ-("! aKŊiqnW`t ku_ؔE5ӎ2nhdt95#V_NЮXIsqJQE2QjT"m~ѱf'tl(H@cbHƹOt?Ҥn{Iu]+kg¡$NT#mg?6.ZU #.~I!b]b;c]|6qPWƞ 6΂>om=|`U~9i~I cq~)8<(璳}SDa4c:CaՐzkk-R%gܹAQSl™C6a cp^PK zc4騅QR0junit/swingui/TestSelector$ParallelSwapper.classRmOP~ڭlVEZ*&H d !˼l%]"MG`@b{s?4& OȠ&98r\@t#?hw a~8 O;־p/yDNs6fnVn[> gA:EoB{`<_\R?ځá4=Oۮ ;Ԯ%?aڸݖj3'+"99pz}J4^;< ){0\#:~t{GZ))tLq,rVtbMK`)B 넹Q :~6H11Eqh/fWEsE7I4g0uR,o0<$^Krb|wwY?GlC9Kńa*"K%L7IR0JR2@inb%-2Jsqo d~)Of&PK zc4*tl1junit/swingui/TestSelector$TestCellRenderer.classU[S#E\&mEwddp!d7 ]p&d̄be/U(|eyzf`*ӧؗя2Y}Xs1/2-PÒX,aE,KBF'bUXk1b],6D|*c[I!^)rRЭCkYQ \Yk.#9f3 tf!ʜhr풶mrd隹نXΰk8 ]%ynV6B9^h| #+qe߹|$ph\tjݪ0C:干F=*lme|͞'I'zZ0D5OwWt 0?^&EYt*:ʆS75&FWVq]T{Y{XH.wCT |T3ڦgH\ApkV!EN3 nMJds>a(kโ Rwyi9, aPHS/]&V!>b͚ shV`:u\R{ I ><>,U5X cFAI0SgWym KZM~8hL˧븚:O w[Sd*x"k0(zhB%]wNЫIr¨VS cokYh sћnMjˤy&UݵIJEh׍agm!~9&aZ-Qz &Na5[4&>Ha oG6Fhf!Jw %1؟ >)I qCUA %څ&S퓚߂D%<1c iY-@(v+F-YY="%z3.^pQ]kQ~G1ԁ&H$zhPCMDRwX!Ǟ򔏋JOkr ZD%T&n _"zuF.MU Ti_ߏVQ (נ)m-%#$32>%~xHxfPK zc4 P o junit/swingui/TestSelector.classX |\gqғÖmٱ-'&Y$+>r#ȖdGrȐ'Y]eI @Z6mB(m$h WhC#i6jw7oGM7qoţJfd i;_~>fxL 0QOrS0ф'uOX>WϛX/TgL_Wr|M?iJi[gM|߭?_=x]EA /lԽ)uX\=:NH$jġ2ꭈ3N3:%S ۍyXU 7ߞ(Z zTɸ)yp)Ox Ol sGRkqN ǧrN@r}33ɏZrQݛ+,ή *“0¦鑌5%CPL8ҨXZ..VZ씣xipx(A#[\SKO; ;;$79 t"@MaMXx\hEŒWŖ\ /cު,-˒l5$dIti6|ВKe;w^tHYSv _>b,Θ\&Ir6 ie*tՒfp+eihKM:mޱGN4]A j r!ݖ얫-!C^ik5ϐ]m!}+V0,a*{`ym,y,9(ep ^g%Ɉ%r`/ND~2zK 9,,QSrLɫFMJn[,y(k%JXے$"%2aɤűm n䄺D ˝0$fI\f,UMRi9i) O+9#,Mu^ސS^j9ߨnk?⦔%4{hz҉g!SfE~Kf.%e#7ut4Ϲ2XNyl)H:j+nAݽ\3xLJ':Z74ܒWv7/{\\,[qK ^DW#SRH<rSEregwhOj.*e*r#)Փ;1I"l .W顚X P_X ~Q_-SۼD[A1&΂Ц%BE˞l wpYAhr-]0r"9%+̷FBY?r!;fOd7`?mYjcS{Q|'5.SE7?OHծىdSD&_.*ѡ'k>7>i(]8jG0iqO2C~8k͖ T+dքM@p]'1)e-lqϾPJKi (kd]*~>=veYv|4a{;_U tFɣn^Bߨr5~Q}N+W ^i)| ׁ]d#񽃲1=xo@{RKSj|ao4IyދI. 8x[TE b7s6S%#Ϧ6_-m.`PgԢVH-c@wfM_@/:ܑNKep?BWfp[3`FwO}y& ?a\1 F/}_$V/0Eun̹a h%wl|*Ȳ=fKb]W5%SFYAd8p?nV4 xs N9稠j;6!1<8c>*nrSt/eѭsm:%I7 QOSWN=ײ2i3ٴ] 'vj2UׅL~x'dg~*®MpolߡthKٹ˦+fb4fHKsU=_"EgmݱM'.6Ll.Jrȓ|:FtLB&;YV1i&ME:I>GY| |S-?3;_0;)Es9'%,JV*1 x>G㔩p:yЫPK zc4e~`jr 7junit/swingui/TestSuitePanel$TestTreeCellRenderer.classVWe rqEP,a]J5EP]v]!Xiݳ<>uTk:_l9<3؋:vbD(4tLbJŴ !3mV-/shXPW*,ӫr!f{KH؏%" іY{g윊 7 <.Xv%Òra ]%ox+zqX{Us^+ `,1{:esic#!LȻ@K͚Zjr9AOqgf5%J[ ̪t9m;"m&\rZmHINfoeO? *5ٴ#f7K8 =jfq4Wf6[0TJd}~e*Hax$jVm?+EgXI*eV)Hyvu1%j %Wv7jvNh v˝-x&Tu?i DL# q<%L%Q^ࢅxpiLJaqH2Wu*AD" t(8CD0'W nv;D,QPobcF6ē;h\m4hihn1z$S?A )9c|+z"! ZI*|Mm;mmng8' .e(3J M0LMtr ܁#LQdyǐE?qp6NӸ93CN1O #ԉz}h eb4ܢ p N'3N Nx,mNISiڂhYm-S/h^)!PK zc42 "junit/swingui/TestSuitePanel.classVWW$ #;"hb DkkKbR:$/d d"vExG8$_޼yn_Onpq?&ᴂ8Y8T / b"H0ŇI?t fRl;Lr-i~dć~\V1GqՏkMQ2F\ZPG CZ)-i4KnLD$fTNP'' ֬L52%><1t;zYqN}et.P y,3;)6R'5KwNtgHF%;$-?hY&t6+MkQpbKiI4iL0xdX`mq3A T"gd^v:Hl4Tw\z>U?7ZҶf9)iGdJlZ v bN`SY$f/3)͌UtҜj4ٗnI>NRBe\DF<%&8㱘L7o߾]`op~Fo.HUdcKEBV"fƊC:ocI/a>EVڼ7dZtaڂUc/ZxYiX򡊏@ T|OU|~| |+|MYwĽ)x{4T|-%.;RzbXT|*vcHEGUw|;~GD#XQW & U  jn i[t|i@M:# #Ft.х∭asv4/ty"ǭ=u2h-l M4Vu~n qh t=1rXMFJhnQ֒Bz kifT/vWk9a~ƀZe4Cmu9#Ú䗈f_N!! x_Fj0u'=@Dc/|g*)!z@,YהkxE ?j겨'q~_DC4ж9?^ țqc>M^8AvN.@B.p+kn'(2z/EKOXDUX A0Ɯ ǻ1Pb Ekq (i?o8r)r*D*+Bq(,ڧ9.RUx!<AAVg?h =)5Yt=~@^5tzWCx:y5!q[VZks< c N۵z,^ᛄ| -!݂ywy2qr|u9GLcl u,b#lYV;X?ڢìڢp6=÷<ms#hQjڕ+2Z‡]Uΐ.ɑPK zc41o!junit/swingui/TestTreeModel.classW{W~&; YȅKH\XhKZHI2!03h7Jkm^ZE+U5RZa[mGXsf2Y$3y=?w#[424(fh8F8-)÷mq;in|W KcΈٳb| b^L/G~r+O3 ?4j IKu!)4Jï'ٶ`UB1eAv(\zft\U}Ǎ#[\vlf=+8& 2% w3Fs&mDZDjP!/pi.-6)PId05j:TnjܐX9XTIk.ũEq?5g̼NSr 6ޗՎ9eϘV~\pT{T,>6qD4Os.-3c&7Լ̧:mx4s H)+r<=i䏙 ߙ"1ɘuGL,ҳDɔaŘ=i3`[ev4.Hcq.PO0e:gy& NAsݾz7GOL$Pl.L 901F [ZniL,∂r XA6jɢH#W0؎ݰF.U#X4ɼyjH`)H7a:끄0Sˇ%䈨578R`1[ -{,)0wAXǃ8`¶с-Cbmbx@ mh6Fuu#fu::.]{s>K:fqT+hWGqk|8>Ke\Q{:}&|P3Ons in*22j^553pKG񉎿Ԛ%^A]d1;V+wHװB"%̓#'^fD)F7R:2/8-WEjxӦ^O%3\O&͞Xbݏ#+[ɺ"͋i&rOn%4>yGxzl\%ky7B}iY.Jj)V/A{fL;kZ< Jۤ-Ʀ#'QR/M p ^@A+?ʄsLmw%C b:[Bi᫈]ih4v$n'u䨒OV_[~0wW>Y9HaUzj[寣<ޖ5 hf<-%!z5]!t- yubLJg;9l/gern[ QEpĺ-dcL5ERofVڮ{u]5+8z1[PviZm֕gFc^c> +a{yD5 tlPf}<}16l_etxN*_Hu0Kʥkü'Ò[2dTŽaɨ*`.3* #^)}FE~668JoTl.+ pTEIA\pN"/]Ly[urOI5I,lxO_k4B:Bvb%Ŋ4i, R] sI78 Izܳ-Q^HN hi] eBS/@-IL&, .gAkj!16\*9o,_Diܟa>KgP癟»eSH)<(>6iʽKzHR!\*/qXZ[ۢ;x[IژUV\ʐ> |oD$`*<߹`Q)hH[Yts/Aߦؗ@X\"ׄv$#kK!_4NOȖc{G~J u}d1*ưy?PK  l,s(djunit/swingui/icons/error.gifSkqB *[ɂ.:Q%T "f.e .B萩Ctҩ'E|;Hݽ}Z߰=m?yuPK  l,0v%^junit/swingui/icons/failure.gifS?kTq|%*PW+IH!J- )BH#+rS\!b% 6}#:[{ewvgfߍ[kNtg]~C{ ףWWW777wvvvwwd2Nl>/ JDMM$M.b.."! IAXDJQ& XD8@J+ S""5 aHxG:$ H@2 YК'" ᤢNE\ xQ& J ꪡM2ȔifK\5\JlPlB,S#5(+(`BʹxӺ{]~X2XPK zc4l? junit/textui/ResultPrinter.classVi\, *+ƅ$teF"5UYY`T{InL^nlu5IڻM/o3{~{<}?><Ѐ]xSB"B&ƃ:xG?*ѻ"x7#1B>:>$l8F|0>!GrVS:>A>%>-?#Fp/K:+:iu|Mu\" 쒎:lυ0!>d\:1gg&2vn's\2cs1 ;3Kx ! a{Ұz"-'iNgSfdd/L^C\ :2I+_Ⱥ rEf݂iiǜmDʻ޹qѣQ v +-t dfhT[ 8lf(ݞ_ڸ59#jDZڰeEI񏚙li0|R.|L61+[f5st&w\ij?mCmRvAr_Pq d`S|Ɣ=6ȫ 5UkILYˆSm\Xkeͅ5#{0 )ˤn̨xj g <9؋^ְ.li -pDz#ARX>Vn&ްPkȻz|)बь*jf`Ic`C␁x#B2ByBRCɑbK97+Xw\ɡB:-! |10{ | ~~ķLG/Od9.y:+hO~#DCM?9^4 Rær4RBcǻ +Zd>\1[w~?#^$ׁHbqRǼ|bykTjtplTGG|*6mJE捜{?Ɵ 57P#Fiظ|eV`zNu '2yʩ (+:\m6'ͅA W-yY ڥo{2Z~P:>#i롼 xJ 3kَ5歜sA1.R ~iU^yWеL3F81d-A5e0]wBH MB*eB^ ߍ^KV&7Ĩ̛hQNDm,y*Ny43=wݨJظH>Q;9;@Ys ZOE^Dy.`/i!ҵh@ Vc\Y8R1A1)Ԫӭ="B=E X:M|m&uEe1nUTJL! \{ЋhhƊU a\5A 1CupJ Ws0\BStU^R Rzq#VylJ2\!;9AEZܴLfn?n|B ۩'::jlSڋ6~ΡuUוYCz g#v+h y:?+FtB'JF^밓81n;91^j\B&zKa:Y!?q )Ez;8ؓU>`2ĜGo;r5GCxխ?奼}KTAlCTa6Gi%oT?PK zc4BEqc {junit/textui/TestRunner.classXy|T=/!@4@IBjE% Le%%μ1PZjZ\.NXjnZﭭL#wwwo?8xW*?fjq'aG%GnQ;S?`/17rnYv 쭲pnw1;u%w="Ga{xf}}xD01?Ç/q?><%OAl.= h¶RdQŶٙh+joγ5h]fw$iLXrѻܚS6t*94Tuѹk]oaB( .ۨݑXtGVo&>d͡gja3LEۙtۣѴ!H( [ ͖hEg,3.㩨2#@cyǹRi鈙II}jSfO*#ڗhfR^DdЌR@Hԓ%fN$NyR9pOv$/֘ј* D4f41}EImhbDADj%pҙFuQikXf8e̡QI|q+6GB{%3&*gt,e:^4 7pz5v!gt_}9bD@5,8@3Ǡ<cf'+$1S"-+ [3M|/ |30m/Wc&G2|OS? B|K5cϣ,Euo4T4 QğgZՙaʻvV 7ǫΰv`Ghx4p!BWg+f()0>j@@4GqrX@XZoe?%L,H$@(6 RPݷMM5>#_ܞܱ=m[qVV2cKDQbGoRyUsÙT>t>3ޢ#lM#ErpLrQrJO%cT!ixJeye٭(r97}pԮt76? [s[+}\bA!z2 }j6>ŸKA8+^RW#M#%{pab,D#/RMǸX[2u;ޓ3~/ {ȯxv:48#qj+rr^B oixraBS*"ږeD\Ӕpًg(g-+"^ 2SZhu Rbm~>jU zbBB 52>'螚{]nW.X9,܈Jw{j&xGwVTKJ[@ciSp\pO G#IK$RoD [L(g*JZ7>+ɋ|..U BYMЮjunit/runner/Version.classPK q/J3+a& junit/runner/excluded.propertiesPK 2m,XWYjunit/runner/logo.gifPK 2m,#Gsjunit/runner/smalllogo.gifPK zc4f!junit/swingui/AboutDialog$1.classPK zc4!!junit/swingui/TestRunner$19.classPK zc4w 0@ ]#junit/swingui/TestRunner$2.classPK zc4P> %junit/swingui/TestRunner$3.classPK zc48}NJ3㭪l4bBH,|_E_WW ] ^*We/gw|K+0}\T1f1eJE9}ߌ\l{U]V\GQY2(qY|+ %ԟFAQrI :p*D52Ӏ%{ūZ4En@o4n?+EiY3#:Vu&Px:3ǘC*h6,l)T>hV:-imT?zm@nWEP>"Wz˦Nvv9`y5eZYFgӵ_.nwO7 ryNW'wXrN$Ǫ$Cq7x}֝{w+fJԐiPrv E9nuA}Ұno뼒{kύ[R8͏Nmws^l- !3/PK )1 #junit/awtui/Logo.javauTn0<_͉ "5q@ Yj%1I\N {QJ/Fx".ԩLZ^D pqm w,غ :yFpk~QtPQ* p%A?OR3inCRJ{x<CΊ֩ VJj.&4Q[AkzdQbK\l? ?ޅB:s/kxSi!#[1M[N=??H't2ב}xCN KXGDi@عaǠsz +&ksYK}8ΙQKaUral: ;8}̅ {JhEXJ6>P } P;ۙIƨc5/8\V\a\o1~G M^\OթΚWJ5Jbcl)LPK )1%Yz)junit/awtui/ProgressBar.javaT=o0_,Ī;(@tHĄ=(0`>޽{cCWZ2$3-O o2%_h}:ڥjjhSl& KǓ6lM,xF2A&?,zGaG\D.",`&Wڒ ez7 )~KCŖGmϓs P"6 Ω=2a}O>鼈 U5I AVO #%|EV՘([+p`礡>@Jw Ttte- }CL2Y%+2̝dҨW\bSIsSCxY6TAWr\;5j_KfDWq!U ZX|'g^z?wdߦ5`\n}8kч7?Lxȝ5]%m2PȞa^U=V 6kn& *aCFA<{:PѲ`iB>U 5UG+Kx!1{NLz4 :)C,ALLG"a_eV`7W8P 1MifT*Z1ݝqm jP[r32 ި=:r<6sPK )1Ez<junit/awtui/TestRunner.javaks6+}PNħ(ܸ:9Ig."$HABv4͜&)r_X,:]F )~ MU';;j5p,|,к;~ˋӼ @&3;ZD+H ʪ*l `G+g8+qt!SpRzh$?"X G\u!-?դr4-(P%Jvmק/m$sٳM)ٳx}yx}<9:XdrCA?N4_5$*鐂 ~ď=8q0@71o_I, ب֛ĖYk8`GzSGiPuk8e<~I\Rxk&p YpV`M:A$n7G<!C4щFi-Ǔ}0GҨf"ϒ߀rLJ&뮕B:Imi^ޭ_rNsI8%GRl {J$ %<;9ezz9bZkg ?8doT9QE"ncR&{xk'r,r. T]'%` >L9c-z.f3?zEBc|z(tJ.fV5_5Ot(ƹ(<*/xҺ)Bu.r=o@6I\-b#kxF&e6gULǢF<$$d^_EXԐ$Fu)!+%$5qg磻 BP+@4v@a@xCKۄ1)| Bl2᫇j2X5@&dV M$r~q2OP&l 8OT/ \V0 Čxv5LRmb aȈM}҅0w>v45yY=AG UmzUCâzL@szKP0>P^U]d4̮ auq=3i8#e %Zʆud3ysԄ:o|D4 ]:dgc)8& PZ%a@ }@ƩQ_DE*sGͪSdCj·(M OP@YH8H}AgxqRRgt#pO98¬ PbZDǏ(`)% 3 =2z %OjinOTONi`b'(>IӠ*kLCY]v$[YƇQ2x:@a5sgѳ,1 <ƾҢ8>A*@2 6[4ô"l Tfj \?x,v&|SR_QZJ3q穌2sO.wk T>t͡yA>{Pq7Bk>&hfo'?FWl2kc=aAYlInV$CC=9qaPG?T+o?owQ;{n Q)2B-Xmה!˂IuQ-;\%݀Άs:[9zoLro {TABDTJ`G*_ߍ4lk1("wD dGOPjiҔ7o乧"e^jnٯcv:7e3H~NԞ'Aq,ÞH!U:ȉ`!c{uĜ?, > {X( ^_% OnliVJ=i͇t\"C+h~6ݧ|uzPvÑٹ}u@@@=b{?ӓ驗I{nWϨ҉͓c7t5m' Tm5ɫ^w!y{ v7vBg|{Y;b6FxYI|4<C?2Pǧ* :+=C#5of-#e`_";֍ Gr_ H{/_/ޓUspZl<3b I" ~a ?v}r߾׭wfEw?vއK*v ʒ*7 zz]ddƍfC;MiA#)Q8VE߲6 ړyei6w0wVBweB0&=Oe;9 L%. ,q'H\ox*(B!gHX Y˸ΦYb GZ}[ 6a%Rܫ(h]JzkRh Wfxomg\̴^vR rc5ݺPS`1gl@\M+f~41IL2J↳i^G%ۡ iq:1!UuL iT6Nƛz%0I0 >LVslE K}|ѳSҼH٥Ĵ>_+"8nbDgNhfj _j륿^⛶\[i{o1 f7]>m]P7LNIvddo4j[s'7 Yi.VEPK X1$%^%junit/extensions/ActiveTestSuite.javaSr0 8nޥcvg%dC:)يU9]l {xxQ-¯(xe_5pS;ýu/3zZwlZE%E (:%cHZE)C6qH:S^(Ro=Hn r_Qٝ$BqZU)3#ޮFjSGd>& i$}e陝ڂ( A}CXEN:C')UA.jZ1aUK[˳ym`cT0UBC_pC&BkmLpDS?"?j 7Y ПR1kCzG#5>YcW$Ę61 X-P #r1.蹁W'Sؗi60=ePK )1gף8junit/extensions/TestSetup.java}RN0<;_P$8h'R`[;!j"%>v-YC m4eUw&w]5Ov0kocR,,sA @"$@n{l̞R@ !Xt +mlD`3"¸E+g%a8&pChqXX4B"SSSC|3WUU$Bk8TLC=:&|8Ӌl1bpn&铳,ptUgJmpc}^ڐk1OEͷ2{UAiu ju1}M[d 7rr lJ/d"h9Xs 1/EN d2Y/s.9|PK Ĉq1fh4S$junit/framework/Assert.javaYr6}bTTsw&i4NfHPbB*Yt$ %S?9gwAZ;r%JW47 `Zse`LzkK50Al q[V3.|QL0ܸ_,'YA=QᑁH m22RNE!5b2І `3(n-J/)Ǩ )ԤRP\G4'C+ȸtxI)ĶJ 8LgQc5(s_v&C PMKWf5fv.xrSvY*~x?Z6TX"^H;iĕ at#WY8IovkrϢ8LTX[Q( N&-kE=pCgj_33bw>Ketɋ5kGY+ӹMQ$$3a?:sU!6z1̘2kSwˉQqY[#jJere3sOHF~wnmdC7+s{a!:L-֩c o&ַ~K*e3w;-9r !*`|rKGv~$5oep8^)[ϵ.&ԹJ.w2Mǵxv$%;a>Zь7X-Ub/~;zs,[y#xSjpTo(Ǣpq{"f圱6q%\@.l8y9DUaBWa0|9j1hh6ʆ4dot[a5?Ȧ{[ /?sjEq~Yϱ8$Wo$unPO ~ъ'\9l3?H0Q~$>X} ӹ]q*gK@:6.ctޛNA7զy{+D}E[-rK\loK3`0sD{*SgqzPT'{`_3AG un+f?dvh@?V 5u~[n;Y.%PK $N+1 ~)junit/framework/AssertionFailedError.java?@ gStT3q0Q7 ww[!l&&]{-f5*שRI+R-Y@v Ԇ0jdFda$̎^laJE-'0 gKFs#r=6>*T`hkih{zDkI~SPK 8X1Ю(junit/framework/ComparisonCompactor.javaUMo@=ïQr-!ɭ:dIh.@^0̛ء=cՒ%E[YM]PԈ1i;D+֐70 q #.eEP kN+ ~}a,;]?n(}@E87 xW<M?MoQ ).кn*J ",z *ucm=>E&uf@ɄקH?n1cb TުRCi>>2 Q(pEq,yK ,T,UCG:GkX  ? Ѷ QZGqY:/7 ){_ FZԖp~XȆȚZ_m5]s LYa>%Fbu?23D pǢ2 [}h>VѸ2Z:Wz«.`"Ft[~VA֢vF,\Ix~{/.,O:5 U&;m.K*Gd/j,vЬA~]0\AVG:SNO(i!>:N/#a6GЗߠ@.+|[ב\8:o/8ĽũN%IdQR\MO6MScDw},}CPK 8X1v+&junit/framework/ComparisonFailure.javaQo0ǟɧ8u/P8bvƦUƹPM|]$V@r.w# >f0a.k;lwl@ Y8m>Mk9OtQ.8Qm0{Z<[Ui[h0C ,۲X2?l݄jO@֟+L|cGU55yP=ظ[epi6jOZc_կ,xc3;^zDF1 2SӾQAB@l) PS+U|,bt/=KE+nF[i`ZfWGin˿IJ:R?NG:c;9" `P Hَ'S<Ƿ.+poOZc$ײh*, xצ^})_Khw/M-SZETxp^ҁVK፰m]!.M2+8Zt.ЃV=nQ69ajq/IK]XKa?r]sd_M"J6_n-¬ZU)}%JS=:IsQ6 `S|) +QG"e9tL(otvʐHZ,@h#@@]c+z-W3-Z?nEJ>~Ip]{d鯵ƣ1De*^6<=G D,6 lm_T{,Oo<;_;:ї_#;,,*Y (VC!ރUu఼]FR9ڥ"UXl xi;*bB*daNjr8& aO,ȋccd7[v@ Ȧt\('Oa (pW߶XβF"ЕXQV[-WxD׺o(Ccon+)$G |@*+^VTxeT-zޮLGmWƩ|>6}/ͦ =߭>at~(F"9dXdPыDKO  蹾r4 9^7ϋtd4+5E>PЫ95ߏl$ji&7RIE<pXu 5+aNbu%uH t1T(@&`Mq~[(tJ4 [wP$/b!9bD4D͂7+E'!Vot岏kTܑAe'J/5u|0qn^J.\"LľDbI;XZ(E 5n`U[(7to*GY 0^]ߙUG,?w z8fY Md45jLy-`^$ CBe4CaDKAob|AP㤽1uT@2r; 4qwk&s1P UV%.{Ɖg>GOd2|5ѧ 5PwqXEP+h:W]KHk!OEGeU'(ܛFARh%ɔ#fŌO8\t2?8Y&Tl0>b<@kHJ{~)!Ncom*dk[q3 ao)h '{_cwCEk}ew}ڹ;aJ6e }mП׵}̆M?^ niwPK ,8ۅl junit/framework/TestFailure.javaTMo0 =ۿI>7úiYi[+\GI`tr$>=G|-vʗ/8\zTihyS|\氄[OOPhfO@Gh(5x7--Lw6 v+!?{OG|7 {tգl))ɳOKpGa];k&w{,HWc23D^Q'BLg;n}`jE1kv @oG;ߐm.eI(gяV*z;)x=Ou4,Cwq]*4TԒiqL_ƦFĿ5hNŢJ(0P ,Wz.L=(9Bb6\o:dr'^:{rGOf:/SfK 2(uZmQhPn?fE/D[ІwPK )*4D!junit/framework/TestListener.javam=r Z╎&c@ J X) h]drw0isa?{'/ZVB}`Ea`1博nt q aN?Uʔ1'$33]FUvV){p8n$G{/n^H<_ὺX\9e5IJP~Lf LG,W_gAPK )1:Pjunit/framework/TestResult.javaWS6~N}:”Lo`+#~8v0cӮy/nZ|b[cSip'DzUݠ^}roXMD O7ڟ ؁_#ذQR(}<9K J;/D6g|Z0v.92 ̠RZ`~D[s2WYZcÛ2&"ݰ rWV52]EscͲƍZ#;V<] ZhZ]G Ll2,C~̧MYU(HAjyG PDbLct/5*MߴA@IҘ)gozO+m1c4nv옗"ZF_oFt p*. )rPkغ kҜ+H{v %w'-h=E2Rp DH̺dc j_p쒨*ń |; RؑTJ\ X轌{O-{ΰԤ c6+ 2F5h~ηD+B<.VJ3ɘ.}u\lJG$mHK' `;%HxU4&D3m2}տ]{zd8VM{͸Oòc.j?Rxbtxbx;E; +P_٠|!Ha<eTuG9_lH'#\.[ zl^k4 ;=?5$Y@T,xF'$ V.֩Eid I{i{h^ ݮX;h_!QY gJέ#m[;goO2Öoa8yPK W1?e/ junit/framework/TestSuite.javaYo1 GK8CJ *ncv KMzX[vwO2k|"=UY-4|jʹS+}o糣#Z[S{g3AUžZ5yP^V>F 6-txkț:,1;3s3Ԯ ._7J;+oѢ˗G.༲3õEO7*]Z;;%qx QW&P0QJyKI;_j]kh=އ٦Q+Sɛ aklUOBbrFD|Uٌ. x’l6#B XM̤x0UBi=c=uPPS5!6]Ï7Lq)0з."\wO]u85ӣu{[c 󎯡`7!|=:QyAYJae^#ӎr/\C^~]mmʶMPA(^kv{(OF3LL:n:楸Lx.4q4 n$| YOVSPWm`B(D#њīD9Pbr<%z/E#S9X3,E-O*z9y%5:kb:WтJ RMDW77*2):aQQlXI#4FXy7_CdGJt(TE*`EZǟ1$Vuum%>pN{4܃*tmMہbW' U_T>QL8V$%*^twիA /vX+C"t`y *Þ tg؎=aW9"䢉lt9=4=gŲCRDg ?Sr:\poP\gcP[84CwJ(i1M=1nkg# 7\]vp0m+H/C@d)Xd3wіn_S~[L {d)?m뚭pQfE·rMWd5Qwѣ2$+0-$U:1X]͏?t͚sHJř'& OͲHsŒ-kDap!Pp;3pщ.J- G;A5iG7R’Hdx̼[o&ߤ!Ck]$V /慀1(,Bad;Li&Q#+gBE҈6 xg`<'nE$hnNĒMČ}Wl `Iyw6.s\fTj5 Gg`CwHf l%~jC`{ Jd ^s;y˶+nnWk*H#RP{yHY04[iљ~(/g0izvXraz GA}:[C#}U#׶\Ӯnqb}O;<]iD3^ERq^PbL;iuh [tt&FX:~ 에.X%p,lS|}`tg'*eRvhVbR{w'zA}60-}HLz[dBr>ǁLͶӊDo|lJ8K~a./7*aUmUk4m"ף['7*Dwt  |á\ȑo3O'H86)N ?L3_v1)/"e89—/31W=$3P :^S[v}Ayr#LwS~'Yܕ)W$,Hs[oSCGEV'O'{,{6/?E2 H>i(#n7erEiO\F#Q5koILɺ ŤX)ɫZ5J:;]V}HbI+"&u#K86:蘗?} kyPK X1&*: J" junit/runner/BaseTestRunner.javao6g`Nn<%9p:H.CmюZY~)KY%!|XWT]UB=?:*6[ w<+d^9wR^W̌|{[aˇؚBVwO ~ )<)t:SbU;֜0\FonS2/VE&{]oB]I&MQr+)fR|#R}.FY]qz~ (uB'/_ڈJ3 p !9RRwrl5Tc>/og_M- Z!J̷suqC\m9e0A9 k(QO=" 'N4r5xk8 r mm#Ƃ/RBoe[ެARQ,}=hAf;T XGEjD&x\'%QZ%4I4>J[ 8eg.F04}*Ä볛Ead6Mr 0\ng)Ks%!I0rҁ>2Ԯ;VQF{T<1erB2U*T2m8m$:+f4JP|զF0k"}{qK'"Ƽ0@}K3 #tl۸[.g>h/b씎H I $oEJY5//PSǟHl4C=BmuV,6Y!K,zVoGҌϞmp}74\nly8F}̠j iiaRj\Z/?1,h]'sM֍379S{y⡍35='F%ѠlaL#VPetH{Ae(@ӱ4k/o!2K]r3Y}\)- 9K>}mk*ӑ0%6:>N|a6ڨ()^T7:ߌ]*; 1MjŦ4]`Q֙~4ǝ#g}1Ot[VF-nI &csKd2x}'4VOk>=dMo =\Yv7×Yv໿_% [сMaa,RU>fܶn}̙nHz;WfPK )1K| (junit/runner/ClassPathTestCollector.java}UQo6~~9h7AڢɺE1fKI%({/Ȋ_KcV 2MŮFH\~NHvVG::sFͽJKy|i2??O^)>w\z Ѻ+-e l-_HBrkn1.ecD >w Yht ޼`C ~9+pljXDExMt3)MڄW8Uµa3KE&ibIBqqp~9LX>amP-)cngp:ܱ FWhܷl&!0jDŽ$q .MU/Ơj [qBe4r# xȸ!ZiAy,Ia]+G-:3 rX,A1VEQOyA/bis I|'!To59qc{-%28~ Lxû}k%Ɇh\,]A;2W`F-L_8 Ui^‹G*:;lfN;M􋟯gW&i9M"|0{ՠl)[ l~݂Y2f|g,d5r2 d\^k/I$ݧPK )1g#junit/runner/FailureDetailView.javaeAr0 E),Zp0;#ɢӻW!ӥLpMI{1R.:gy!n̸s̠oSdrO>\3HM~3<Wbt32l׏/ ̡qCprnVg5{#/YPK )1 5&junit/runner/LoadingTestCollector.javaTMO@=ۿblLZIQCCUU=6PUI,{+Q>c/l5ڋ4˕ų(ЋbTL`V,qmSq_w8oG⟟p Wp /SF^Iʈ1E(Ρ_X ߀xb;X7Hg)҃t@A!,C+keE8Qc$ !Et>(_Iԋt|+ #i&p0-ϻ,cC$4a$\SMe'&V`BAwl-e~nu2/oH`?o"QU鲋Lg0 KEZ ٖGdU*-"2^*/R*(qL``R4CsN`-þQx-}cͺ8>9w ]9ƠB*r װ}-޶;qv]eDл!;H@,'"v7lО*5FݛDkʞr?3v3N>ү%@35ۛH =tsm5C w:gfޖM{$oWPK e-u*junit/runner/ReloadingTestSuiteLoader.javaN0 SV{'Lj@T!;M29Eq~Il@DQ+p }A Bn)k|cPK Ȋ*-R%junit/runner/SimpleTestCollector.javauj0DW,$N)%c[H絽+#i+)қfvo<|Mv3RRP3FCh`OA^j:Z^w|!PIOO!3S(B!9y`䉖[tƩ1]p;JU9䎽(#qMfAc! |bcpq| ɛ9)*ZZZ"Z4wty;u Jv_PK )1ejunit/runner/Sorter.javauMs0V:fps`锳e dߑvphcϻx{ ϾEW߶ҔYMg~w')'<9<~z/`duzPo `7E|çCޒ6X| T uYBqk G&]7wEW_e*dMNl([ 0AGQsиKtApK.Prep_;Vf>X FH8(Zfp(R2 ֐B*=<X XCvf< +D$0ƊtF>K%+Y;:2& m$}APPxM.H̐\rԃ"=_]o#t~tuqXWJ;OL8ʡ|↬' VBǤNڲ,jA eNZ#woRuClXqy19/#I-xn|2-gm ܔdUΦ`” pd4b+x,c_^jחW8G܌Z`KprSsP(G)UMF'~$Ŝb6kB3M(p6:Tsx:O}I)ӲfqԊf†.=͌LH`J@vg0M\ 2+N}-8/ /9y*B7L5#]%o04 t1 ct'ycd5UhDCCAݟ˝95N̩΍'^NZ卂/Z`)A|)9]o]Ӡhr c<W?=QԃRQq<2(DV`ƎCK0a7*DTe7BPtT\f|p,B8< VajxotdEQ*<38 CS*o BchחODUu n(Դ+/(^`K^sN{t.mxR>9aON̏g~4I=7 8fpEh5G 2ǂka8J֯%egҚz!^'۟R^o)3۝=23'l'?$#?X0Vx!,~3HE¾&Aޞd[>,I{R<Șۙ.,װ=!S' U述&j-q5*V.g+L@myoŊzJKh+BBs&;Ӭfc1w74Y!S瀎gdd}lg_A4OvcppEygI= 6A 8RH}~Qm3?\+B"F s/69&SFJ,ԓJGKVpc">T'*f*{Gt(xj!Xmj`ZH?Tc𘂃0y?_* ؛fdC0\wJ2gϔ=wq$$8vb^=+Ҧ- ow^%6 ϖG4ε餠gn26~UJEb:.V7b*AĘQI_%i2pnQh6xlaE'WFڎx.Yw}xQ0}PK X1Ojunit/runner/TestCollector.javaUPKN0]ǧxK"9@6H P.0q'1zwbZAؾBSb].1ryIpOI^b9I/ѳCv[ o[)TLQy@4FƒY9xۨxR`2՞'7Ž0e\\SG4䨠i_q;PIxZz6UV}x}PK Tm,B!junit/runner/TestRunListener.javaQK0+eC6B=KnwK E޴S8yi8='I !` ,i)@g 0FUu`݁xщX&k63l +iP"bv\)fɷR+X_;SjqӢtg,enjah+ԪXm#K}syH;uxH~ NW8o;PK L)Uۨ!junit/runner/TestSuiteLoader.java10 g С}@'`B]mũGEB6e`AL5GfRE)``Yȷ ā2A&@ !Z!`ph\16_lԋp^(O&G-*Zni{7\ds|h:.=`S7PK zc4Wjunit/runner/Version.java]0 F),JT.H+? b)TS !ޝ.LsUw "Z(kcʢ0PJօ5^1^(У }R.[&0-^&z\8c41ۤIT٪7@ jٟ]l=(ٯ{>IG3֖!PK q/J3+a& junit/runner/excluded.properties]0 >En P~L]Q)AuJHd\W5dPdgJ;+T!]hL30lRlak-SUW%r=l`epXr[rٛO;Bg V99;~UKf`LiON +-(&XPK )1aFz_ junit/swingui/AboutDialog.javaVQo8 ~N~'3<]6tE{VlH,7GIn.^H);}Z T{!ZLC)m3 ߛ佒fڑ~"ō\HSbꀋ[Ya P*3Bɹ}9d!*u!s9y$ӐumL*ºo1Z58\t-)W,i7JؘCjMU%$f%+h].EF19&F4j%1]hJb*4KW.= gD6JII밑3!ăl2yxE\G. //S Ē~p@Tdy"[6" }p M~o@lN=O4ϵVS2Ez3t!jelD 4dp6FĢ+99u= nxߓ9pGsֺbǨ\T;:SmlKZ5{.M }Ci&+'bǿU}R^mد{rjQ&ۻ&F}pѫ$"gW&z2T|`s 5L#7w i_JȾ/ZuxRf0v}9偔m"77(q. ,sr3[͗KN|gӕ]鑮nz+izBWJKWz]Z^ aڈ^^@0nI%}e}@g5&]_זG]=wI$qP =,8agmA9wy3N>·]@cר TT3d[VV"yRG?04Z~}$PK $N+1 djunit/swingui/CounterPanel.javaVߏF~bē Cz; U;ԇT{]^({fv\Hmeͷݱ>„^u.])m={d!ۛpP 4W-Z$7l=V23 i63vT'ĭ8&Q:zbgq+U1c<1yN3bz5p\õXXbj K[g6,qHF'}9!6Xs.w|%”B$Y*f zko͆ Ǔrr ziQ8rC(jOބm%;ިew{k1_^Σ|]47"17G6G% z#\.@m8I <ԎS0 أ 8 X N͝MGb o|{/> q|'V\'vJ7J\b-+5[i0g3!yxעi6Ia)Baiƛ:wr Эd3Bjnr-Jϙ#NbxDtchWzpttI8GkB^L]HSp=2FBa!]_mKA0D$tGVUlQSƯ?GYTPw%#K>k]iFܔ'n9o}+p^\7zl_6"y`کH1NJ~%=ucF*cϓF;(<^@oûKcv21M `kV7c\sMn2Ys,D>PK W1 F +junit/swingui/DefaultFailureDetailView.javaUKo6>KbK@P d:N"-b#-m&hvCO+{iy}3olZdmŧq #dsI%fzfp-d+%Ո3F~w!Q,7\o@1 sOXj?ר( e(lIl1.*ӾUhOHp~ 5gW~\r&z?aT=K_lya1_?si.+mw :[ݖ S \e ֤Y<~DGa,{l%yDž!| O<ܮSYCepݝ9Q.IWN<mPK $N+1:! !junit/swingui/FailureRunView.javaVQo6 ~v~'{Y\.eCt^ VRT+>q X&H~v"&\T-M^vp,"L .2w7g[CW|Qj7WM gM,5yW2,hU[. 7I}QZN1ɭzr;|G^dNɫ 6xS|KVP,: iZ*E䓰u]_] ưWBZ7ICUx~@&ʵV)ZX !0}  "Yx^\MĈWQ؋(UT*Ǩt{k/ 4>Zo4j/u'y[8- ST"\p/l]6ʠ!Ḣf,#8g֐,RWqN3٪ME+$À~#;hNG-353 . ^@kc9(KfCRE[Sc08ɻQXBNOqBgqcutqT)'+323^Ӣ2xۣ|M{GAPUQA^j=E?aHd6A}p*Wʆ=̬GdyÐv҉ iͪUZqHC 7.ZA^Ԯ%(+ $K6.nS}16zըb&1>jcζU`ɘfku> d '/>rv|Χ3Ʊ\jnʪ s7jDuNJ [auj,&O",> +[Uơb|/zo2(@-2PԝXK6"8kh4HL0sB1j$p&&_Y oqq*; 1Q7?[0]fq9YƋn/ٟw LF: yW%e\G޽hـ?~Hp+^6qi =/T֦ƹtpҖap+&kT*W Y/ 8*pʫvM3ͣV:NPK J0|]A!junit/swingui/MacProgressBar.javamj0DW A5=4B Ti*Ю@w4$vFof0c~8T O9G3ev8ӳX]'(k֨l:ih;FoMx,m;6^Ӣ"୴ JK nMѡ} 'C ;I)B~/̿?yM4zTWyNSN RHXyG CI5vz#CK,f PK J0Wjunit/swingui/ProgressBar.javaAk0 P/% #=찍0 K maϱ5 =շlN+.A֩R 1l^ų ]׏Q^}i }brx~,Z؍_E"dg|%NzxdԵ)~D6Cy!2,"I֝4:z3!l8]-g0YA"X7n`. \@md/!dG:6>g]B8bwoT /HK\_KFg]_s_,Ox~ĩ lXvQ.h0L >0ä;8o޺m܅]Y \bɅ7C7}`l=aOPK )12Ejunit/swingui/StatusLine.javaAO0 믰v&i6 41mG5^ dI+NNmmy_;n!<J8jKBDrm<=tZKmFTPYU75ʵANh,u]㫛 dzt{  c BH?P9sI^lH!ZXźE(j.':c+|y2I &u?4֜` i\Ls)-Ap4{ѐ ޳" Dg\8HLZlDIhj92q. ";| Ja28s^hG;4ׂ}jrƯZuu{:`ft8M7M6>iH?ΌѦvsGԷ֒)MHkLK* ncy )+'PK )1ۿ2w;+aÊ6eAX#GJrj'"[Q<5CNu#/Tn8x' PυVc/ \by-Aop\-*k -OkUZ ͨ#Ko~-\+`ew< x#MM&Y g*F4*gE@ m#`+Sl(,8WmeE-){iǢTkx\^|&,rE +.;J%'HKrH&1XȷS+^AQUFb6EY:#cjCJIWLe Zc sJxDAI>$٧(ie[҇\xelϼ qK7Ky6Dƞw,{r50tCN fsѳ99.ƃQ],ftQpdzڎ: 7洛GlcZ-:SM<:xG#B|`ϋu#}#6J*i+>)"F0-=ίH3\{U+k\Nv3@PK )*R!junit/swingui/TestRunContext.javamKn LȲREIr c{vw/qnffRsreX Bufu[eF!{vcVꊋ =;%Q6krE^r6'Apf x$xZ+1| QG>/l꾢 gZ(R Rm7 68A:&@320tk=)A4r&IA4GqchVMF"Agah\gtЛmm+ǖr?]Ir,m:g[.GO7Vy?/rca3L3v!pGIGr;`x K] h(%{;||vlղ$}g2+ŅyoqޟBgx;WK'z ;&';Nl0_PK X1 nr(Wjunit/swingui/TestRunner.java(6Q4Tox~]fiQQE+Lvn;[=i!}3Xdx<+,xl⢔۠Jډ>;ywn[z4k}G+EӖM~#M{Iw"{4Eize=Y%Iб\GpY˺$.GOT[wx4bƨ. |{`øo.l`W踀/܉T i26˯É,[ T"mp{4gϚCQ rCi 0ů{uD@(&Xĸ.8WgG÷N^ :+kpYNd U*ba_ ( CZU.X?yNdQJD|ӪW]j,OOx =l! ˀZ |a,cR{?4RWx%˷p`mC 'YrT7 n+BR 4,lMKjV&#x@/C`^nMw@ ^iip<9^\_ F@<}qC ʄL89yh\<=Կ{(`_'HMY/]"y-#^ˁ2%!ҙ Vt53E;ఞp5Oj'~O㮌~2aVS`;&* *sݮH=(ŴTyN%8 ivcvy,qpAna/ـ?RɂFP1f;<~D@Nrã]6:LnF:8U,(-DJL-1QkqGasU\2N{k*[ۉZ;.;MDDt! ]fOQCS}=g-Y mr*ヲky'4mcl%k h^iF*[yޭ'L5q9G&]d圩p]SK&{p2A5*8(<~̀a! @ڔB;I^Lg;;ƃy:2ZdFCYhĚ'|{I5IhJEQ@y9`;Ë|4:9x{&&8ew& D5$jB|8_McvՐDf? 3> ޞ_Pr3-9mgsVz 7 'DrYW?2RYwGKܾMNIbh,W 'yFq@v}6u2F5g߿3֥py-{oͮm#ٌCoȉ6eߎ[uǿk'@y2nnS̘=v ngϱ:g-<@m[ -7*Vmxg[]_bs*x˜^>Yp9rvC@YQNΕ*}UbR ])k+SN^eU}e3 s(W_;t1zXåg5Ɯh ip>ՙF-RuK= sͮMjNB:z0,-ᇟb_ +=Gp o5 tӭAVX0aF:[ȜXí5p 05 tm pDms|M:L %t_m0#g?>fO;KB [H^h\*:n ;装CK Ne*t<srX3sCxr +qsq99.e9fE9p];U{W?LCb%jNʋ*l3!d j\!0N XRg=t{_`+ b,$u ZtK) 4aGz~'A#wͩ3QuF,$ZnT]Nز6qϢA(6^]૝^ 1n0(~7 >!ɆSտGՁJ)|U m˴1PIYsNUy?05AʕOBobk `MȨ֪}KW+G_Qq6`V[ g,yO̘%WRʜu&E`PlR N ;OeM]) +4Uo섮GG~TN49r][^Y,Y3GP{Z1 xWﰮwn |8B\wݦ_T{2Ca{1ӕvrbH1[Ɩ'{7Y8*{z^%,낞Yt] *]=8wU@ ҧkXC^s[׆ֵajz:mlka }LBt7uAUNvyvgd6PmK]:z<4Si%y~ ŵ?=gkN*Ѻ+qs:],s&7Sck,k7[o{\3s-܆[\^`S2&rּxVU3‡j3U*>*eH4isŨ[Ty;<#e8"OǞ^QS#StlaK]?SʟQ=x< }9o~ զ:5Ӣv:vKa>JsȂWB} ޑRJ$sne#=w4 L0Й9VT`p@sP"wۙЗ:_Y2=<_YnͱW^oCQP6[ c T+>&4$>Q\ '0Ey 8bRSz<駿Myiwqv|>Y&Ԗw:oL{ ĊXdh~+OW YF$#D;(fjS}FKSp!!K4DNM :_DIzJNM䉕4S}QL-+?D9D(c?v)$֌9\K--snUʧF ޿PK X1*{ F junit/swingui/TestSelector.javar6Y /b;YW;Jƶ2Y<ɫ +DPCD'L-iI1˲;laqIӬxî=@0dE}9 Mૠs1!ѾLohvcՍ Mf*x+d`(0߆͛>yC.I2* 1, `1 Y-ODɡI$IE%I[g<1̔aH bJ%QɈ ;µ(- |qNW2Ynt|v1!dPJ 4,{]9zS+#XP Q4v|zz2^Lg>)(9 hԴX 6-[t$ƩN,:BuWٺs(S&J_]QH@?@gLGhںz)K 200mTAިԂp cd.HNEQC?TZ889iJ6X hhki;m&1{TZ˦jϬ\\aTi6|*jΑ&uY&%*%Ǡ--K'G9`mv^wp`Y6xd6@3Jބ"ʣíBcΰ~ik_(lsgk0JKod|SLYnO]LT?j:4h{tG-,ysWl{ }UAo"Hu<\3/t.R/ra?pGvm(0_”~$[EBǓ.D d??/8m؝?b<Etj=HєbEP0'X[>e?z諨J!D?^ |w]^?Ƨa.._l]s9nn`~`@~gAInׂ,ݑyTW`#L&f,P3UOC.@׫g8ud(ePfʗs5V8IC]u[ƨN~E!NNiC̥_<RF܌Z@*vGbx`.mOg#oD0$4S .1UK0;hsgl 1M@HV[#s}s2-0#q8qKFj|Ѩ#A;c|C0CL|wQ)W+*nHXg M';h=\NSXѨofd=֫կbH-"On|E۳vgY}6*e]#ܤ®ݒhEH%Ibr&Wm>ۢ NP ?5;Qq7P_kRR߉y'!7ۑY]g`:xH^aCąDcϫpLruxPK )1NY!junit/swingui/TestSuitePanel.javaWKs6>S!VڣΤN2MN4K&%4@nARLX/;ɽ0PB>Ɵ= ԪaӷvCVu}Q7vhAd#-qcYܚBqڪq dr"kc]iGE<ީR6GS窪T q}J^OQd)I[7&{뜲nԕ*[kz&gyU#WJva )< ht =tN|W 2dz`kQ;IvVIPK%J](Ae$q^zEGE+@s*>ߌZ&aIhM$q g;%BX6.竦0gvilR}qI3qQƒF'ԏ27zzAQe%[Wbf:-*];!aB@^yKڋq 4\2}쉔"x3miU5=Zkgh$u"2S ɪQ3t1^d-fwL;V&o\P A= 1"FYgd1ZĀBU{7DĴ`seat {K֜oIGSm-IdfڅNW$yBMUMD8b]$hU,w/rJs@S(Am^xj~ a4 7gELtӴGͧ } U->c^> '-dJͨ-f>gaLvTkB=_Jo>eNᦓ-xZ| 1MUֽr']ӳ$5ж5ր{!=!HYk:~`23n91YiOt6Zv Lq'J]Jpc&a -I^WUbpHqǃ(XUx|+*RVm'ۮp6#B[BmlتH*K#1 6&!#a S # Ԝ*!CPl‡9 & ]vQxBSwc._|@UX,pq:z/󨲫2RQ)]x49^^]W=UQ~Crurj\(kY*ɕ( ^!(ns;iP bjyom d[pfu?uCr÷gBݼ/jFW#vɮg[40hUpkrBlبG=w,_h fTw3! !o,J#81F/JG Cs ߙr&Y6m{̡2 8gx B$DH]b˝ $܌4hB/ڊZڃVx2gE'6J+ǥi1&FCb†TzVC`n/1Rmǀi"f8J9}P(P7 /[,Nl%l u<7ŠI,4f2g "p9/xC>½sfRA6=Hf$=d^lڝ~bYO" 9xOHUAlt5XîXwm56c\h^4ulJzxo:M=HW1V$Ne<0=sKW Yr+hdiE`9F-QGY t.us^0BY{^"_48dKqg$V/3-R,ibZ}'f#Z:x _o3] *}Ul ~CQ`C܌,p/olW\;K:і/KuMA4F˔#<83 G{3!/=D=)]U IW/Z B6t6b(*3b^ ) a[wİ,zġerݙyGǿPK  l,s(djunit/swingui/icons/error.gifSkqB *[ɂ.:Q%T "f.e .B萩Ctҩ'E|;Hݽ}Z߰=m?yuPK  l,0v%^junit/swingui/icons/failure.gifS?kTq|%*PW+IH!J- )BH#+rS\!b% 6}#:[{ewvgfߍ[kNtg]~C{ ףWWW777wvvvwwd2Nl>/ JDMM$M.b.."! IAXDJQ& XD8@J+ S""5 aHxG:$ H@2 YК'" ᤢNE\ xQ& J ꪡM2ȔifK\5\JlPlB,S#5(+(`BʹxӺ{]~X2XPK -;:|junit/textui/ResultPrinter.javaWmo6lE %^"Iϴ|HARI!}w$eӱ 3+Q݉[tӵr2f^R_TdK嗶Цn[:YS6hZ%} >hsW[U.q>5FI ZwPNZu>KP(Why,*+ ^?VTO TB⻑} h t6 Nia87. z:}KXhE=B(yp'>jiÊc围?cʍl0N@^^k`KK_5y#y"h߅f]HC^^V9d]Mo]}yNCŬH2wWR-tZU::MDA,;F~~W691ئѮM!E::b`MRy ӪFn X/zwhc"z.OYIE7?wgs`|H/ݗ^. F8K:oe`&`4wg鋌w"?PK *l1 Jjunit/textui/TestRunner.javaWmo8 ^]3wǥ١w{C AFc$9i~$%r^(Z")!ZVHQʦVZZ,+mXTUJ;ZŨ]d mz!=x.M]<.2.KwH¯eVycC%}OKj>zjmPk*[UTfMJK-؁8m/B+OhưQЏRfրK(9f ]Hz!KˎP^z"`*[CP3,W9( VETn1\ֺq 0>^+F铬hhOmUyF9Xѧj$sH2_dcX7AQ+kAP@]ZU`b/x%>e$AKdvQɬ*j Ȉ?/UdQY_F' t+Љ ӈ 30P) eazyz:N|;~'g.'^#o/g?yxziUAkHi.$a 4+iUV1T8˺adh>Z@k>6Xk<:r.q~n cWi;7CMu:TbX\Zak.Ȑ't˪R9Ƅى˟@H5 *;GL'&6:u1LC\%t4 :}UN vgƑ1=u#[UBE^}"2q4m0 Gnmd4镭;qg pVF7ӮI 'B YˆIE+`+>"1!m-7C9)ސ>g%Vyut" p#{䱦l_cB2O0 7>uה!"Ĕ mOW^񈫐p*OT8\ğϹ.Qӕ^kWg[i|3Q4;q>TQ;pS6'*@^T4хZ1Z8B>􄭄&g5)XWz?:B o4 Jԫ{KiNQʹI5WR ͽ:+.U|ӸZHCUens˄.K7xvyf|C{uBj܊kc륌s4\:] 3L3 l@k!:yDVN5^g4쁠QۢLd7NjD]i-ӌi '89bmh1tHsv|WF,Q6h82S0n.;j'6cV4c3-dycK ewU*B2LSb%n;z/᡺:sZz"D Y,}\" M^[}/ 6RpwQ?.^ کB*ݤ;;rMrmDۻ: VG\rM%K:Io!>уxpսwap>9h)nY b~ n7^y'i/6p`贪.ΩfƁBo򝜱qICl70@{ 3K;'&kSGhdsSK#?PK zc4 AMETA-INF/PK zc4K^j+META-INF/MANIFEST.MFPK zc4Ajunit/PK zc4 Ajunit3.8.2/PK zc4 Ajunit/awtui/PK zc4A2junit/extensions/PK zc4Aajunit/framework/PK zc4 Ajunit/runner/PK zc4Ajunit/swingui/PK {[4Ajunit/swingui/icons/PK zc4 Ajunit/textui/PK )165 Cjunit/awtui/AboutDialog.javaPK )1 #junit/awtui/Logo.javaPK )1%Yz)]junit/awtui/ProgressBar.javaPK )1Ez< junit/awtui/TestRunner.javaPK X1$%^%-junit/extensions/ActiveTestSuite.javaPK )1,q-'junit/extensions/ExceptionTestCase.javaPK )1e"junit/extensions/RepeatedTest.javaPK )1X<Z'#N junit/extensions/TestDecorator.javaPK )1gף8!junit/extensions/TestSetup.javaPK Ĉq1fh4S$#junit/framework/Assert.javaPK $N+1 ~))junit/framework/AssertionFailedError.javaPK 8X1Ю(*junit/framework/ComparisonCompactor.javaPK 8X1v+& -junit/framework/ComparisonFailure.javaPK L) y/junit/framework/Protectable.javaPK X+i6ve0junit/framework/Test.javaPK X1ןu1junit/framework/TestCase.javaPK ,8ۅl |9junit/framework/TestFailure.javaPK )*4D!;junit/framework/TestListener.javaPK )1:P<junit/framework/TestResult.javaPK W1?e/ Ajunit/framework/TestSuite.javaPK X1&*: J" Kjunit/runner/BaseTestRunner.javaPK )1K| (/Vjunit/runner/ClassPathTestCollector.javaPK )1g#Zjunit/runner/FailureDetailView.javaPK )1 5&4[junit/runner/LoadingTestCollector.javaPK e-u*^junit/runner/ReloadingTestSuiteLoader.javaPK Ȋ*-R%A_junit/runner/SimpleTestCollector.javaPK )1e`junit/runner/Sorter.javaPK L)w)bjunit/runner/StandardTestSuiteLoader.javaPK )1@PXqf %cjunit/runner/TestCaseClassLoader.javaPK X1OVkjunit/runner/TestCollector.javaPK Tm,B!]ljunit/runner/TestRunListener.javaPK L)Uۨ!mjunit/runner/TestSuiteLoader.javaPK zc4Wnjunit/runner/Version.javaPK q/J3+a& ojunit/runner/excluded.propertiesPK 2m,XWYpjunit/runner/logo.gifPK 2m,#Gsqjunit/runner/smalllogo.gifPK )1aFz_ rjunit/swingui/AboutDialog.javaPK $N+1 dKvjunit/swingui/CounterPanel.javaPK W1 F +mzjunit/swingui/DefaultFailureDetailView.javaPK $N+1:! !\~junit/swingui/FailureRunView.javaPK J0|]A!junit/swingui/MacProgressBar.javaPK J0WQjunit/swingui/ProgressBar.javaPK )12Ejunit/swingui/StatusLine.javaPK )1 JUnit 3

    Summary of Changes between 3.3 and 3.4

    • Eliminated code in ActiveTestSuite that could not compile in VA/Java.
    • Fixed bug related to incorrect error progress feedback when running a single test.

    Summary of Changes between 3.2 and 3.3

    Framework

    • Fixed Assert.assertEquals(double,double,double) when the actual value is a Double.NaN.

    Extensions

    • Fixed ActiveTest support. Replaced ActiveTest with an ActiveTestSuite, the ActiveTestSuite waits until the tests running in separate threads have finished.
    • Added an example that illustrates how to launch a new VM for running a Test - see TextRunnerTest.java.

    TestRunner

    • Refactored the TestRunner classes, they now all descend from junit.runner.BaseTestRunner.
    • Eliminated the non-loading/loading TestRunner flavors. All TestRunners are now loading by default except when the TestRunners detect that they run inside VA/Java (BaseTestRunner.getLoader()).
    • Added a junit.properties file for preference settings. It is stored in the folder referred to by the "user.home" property. The supported setting is loading, it can be set to true or false to enable or disable the loading behavior.
    • Renamed junit.ui to junit.awtui (with backward compatibility).
    • Renamed junit.utils to junit.runner.
    • You can now put test cases that should be reloaded into a JAR file. The TestCaseClassLoader now supports a simple version of class loading from a JAR file.
    • Simplified  invoking the TestRunners programmatically. They now all support a static method run(Class test).
    • Clarified the exit behavior of junit.textui.TestRunner:
      • TestRunner only exits the VM when it is invoked by main, when the TestRunner is invoked by run() it will not explicitly exit and terminate the VM.
      • TestRunner exits with 0 when the tests passed.

    Release

    • Removed VA/Java specific installation support

    Summary of Changes between 3.1 and 3.2

    • Fixed bug in the handling of inherited test methods.
    • The junit.swing.TestRunner support selective test execution. A Test Browser shows the contents of the entered test suite as a tree and you can select the test case to be run. The Test Browser can be launched from JUnit menu.
    • The history file of junit.swingui.TestRunner is stored in .junit on non Windows platforms.
    • Support for rerunning a failed test was previously only available inside VisualAge for Java. It is now generally available when using the LoadingTestRunners.
    • The junit.textui.TestRunner exits with -1 when the test run fails.

    Summary of Changes between 2.1 and 3.1

    JUnit Framework

    • TestSuite now extracts inherited test methods. The test extraction stops at the first class that doesn't implement Test.
    • Added support for TestListeners. A TestListeners observes changes to the TestResult. It enables to have multiple observers on the same result and allowed us to delete the TestResult subclasses (parallel class hierarchy) as the TestRunners now implement TestListener. It also allows clients to generate additional kinds of test run feedback.
    • Added an ExceptionTestCase class. A TestCase that expects a particular exception to be thrown.
    • Fixed TestSetup so that errors in setUp are caught and reported correctly.
    • Assertion checks where moved from TestCase into a separate Assert class. This enables programming by contract.
    • Added support for protected blocks. A protected block has to implement the Protectable interface. We used it to factor out a common template method to run tests. To implement your own protected block that logs thrown exceptions, pass a Protectable to TestResult.runProtected().
    • Clarified and deprecated method names in TestResult: testErrors, testFailures and runTests are now called errorCount, failureCount and runCount.
    • TestCase.getResult got removed you can add access to the current TestResult in your own TestCase subclasses.
    • TestCase.setUp() and tearDown() now throw a Throwable, so you can allow exceptions in setUp() to propagate.

    TestRunner

    • There is a new version of a Swing based graphical TestRunner. It supports a combo box with a persistent history of ran test suites. You can start it with:

    •     java junit.swingui.TestRunner
      There is also a LoadingTestRunner for Swing. The Swing TestRunner requires Swing 1.1 (javax.swing package structure) or jdk 1.2.
    • Some common code among the TestRunners was moved into the package junit.util.
    • The batch TestRunner unit.textui.TestRunner can now be given a PrintStream to output the results to.
    • The batch TestRunner can be given a class to run directly. To start the batch runner from your main you can write:

    • public static void main(String args[]) {
        junit.textui.TestRunner.run(MoneyTest.class);
      }

    Documentation

    • There is a new article: JUnit a cook's tour included.

    Release

    • We no longer provide a .dat file for VAJ users. You install JUnit into VAJ by importing the resources from the junit.jar and the sources from the src.zip files.

junit-3.8.2/doc/faq/0000755000175000017500000000000010402050446013150 5ustar mkochmkochjunit-3.8.2/doc/faq/faq.htm0000644000175000017500000024315510402050446014443 0ustar mkochmkoch JUnit FAQ

JUnit FAQ


JUnit is an open source Java testing framework used to write and run automated test.
It is an instance of the xUnit architecture for unit testing frameworks.


Editor: Mike Clark, Clarkware Consulting

Last modified on December 28, 2004


Table of Contents
  1. FAQ Info

    1. Who is responsible for this FAQ?
    2. How can I contribute to this FAQ?
    3. Where do I get the latest version of this FAQ?
  2. Overview

    1. What is JUnit?
    2. Where is the JUnit home page?
    3. Where are the JUnit mailing lists and forums?
    4. Where is the JUnit documentation?
    5. Where can I find articles on JUnit?
    6. What's the latest news on JUnit?
    7. How is JUnit licensed?
    8. What awards has JUnit won?
  3. Getting Started

    1. Where do I download JUnit?
    2. How do I install JUnit?
    3. How do I uninstall JUnit?
    4. How do I ask questions?
    5. How do I submit bugs, patches, or feature requests?
  4. Writing Tests

    1. How do I write and run a simple test?
    2. How do I use a test fixture?
    3. Why isn't my test fixture being run?
    4. How do I test a method that doesn't return anything?
    5. Under what conditions should I test get() and set() methods?
    6. Under what conditions should I not test get() and set() methods?
    7. How do I write a test that passes when an expected exception is thrown?
    8. How do I write a test that fails when an unexpected exception is thrown?
    9. What's the difference between a failure and an error?
    10. How do I test protected methods?
    11. How do I test private methods?
    12. Why does JUnit only report the first failure in a single test?
    13. In Java 1.4, 'assert' is a keyword. Won't this conflict with JUnit's assert() method?
    14. How do I test things that must be run in a J2EE container (e.g. servlets, EJBs)?
    15. Do I need to write a TestCase class for every class I need to test?
    16. Is there a basic template I can use to create a test?
    17. How do I write a test for an abstract class?
    18. When are tests garbage collected?
  5. Organizing Tests

    1. Where should I put my test files?
    2. How do I write a test suite for all of my tests?
    3. How can I run setUp() and tearDown() code once for all of my tests?
  6. Running Tests

    1. What CLASSPATH settings are needed to run JUnit?
    2. Why do I get a NoClassDefFoundError when trying to test JUnit or run the samples?
    3. How do I run the JUnit GUI test runner?
    4. How do I run JUnit from my command window?
    5. How do I run JUnit using Ant?
    6. How do I use Ant to create HTML test reports?
    7. How do I pass command-line arguments to a test execution?
    8. Why do I get an error (ClassCastException or LinkageError) using the GUI TestRunners?
    9. Why do I get a LinkageError when using XML interfaces in my TestCase?
    10. Why do I get a ClassCastException when I use narrow() in an EJB client TestCase?
    11. Why do I get the warning "AssertionFailedError: No tests found in XXX" when I run my test?
    12. Why do I see "Unknown Source" in the stack trace of a test failure, rather than the source file's line number?
    13. Why does the "excluded.properties" trick not work when running JUnit's GUI from inside my favorite IDE?
    14. How do I get one test suite to invoke another?
    15. How do I organize all test classes in a TestSuite automatically and not use or manage a TestSuite explicitly?
  7. Best Practices

    1. When should tests be written?
    2. Do I have to write a test for everything?
    3. How simple is 'too simple to break'?
    4. How often should I run my tests?
    5. What do I do when a defect is reported?
    6. Why not just use System.out.println()?
    7. Why not just use a debugger?
  8. Extending JUnit

    1. How do I extend JUnit?
    2. What kinds of extensions are available?
  9. Miscellaneous

    1. How do I integrate JUnit with my IDE?
    2. How do I launch a debugger when a test fails?
    3. Where can I find unit testing frameworks similar to JUnit for other languages?
  1. Who is responsible for this FAQ?

    The current version of this FAQ is maintained by Mike Clark.

    Most of the wisdom contained in this FAQ comes from the collective insights and hard-won experiences of the many good folks who participate on the JUnit mailing list and the JUnit community at large.

    If you see your genius represented anywhere in this FAQ without due credit to you, please send me an email and I'll make things right.

  2. How can I contribute to this FAQ?

    Your contributions to this FAQ are greatly appreciated! The JUnit community thanks you in advance.

    To contribute to this FAQ, simply write a JUnit-related question and answer, then send the unformatted text to Mike Clark. Corrections to this FAQ are always appreciated, as well.

    No reasonable contribution will be denied. Your name will always appear along with any contribution you make.

  3. Where do I get the latest version of this FAQ?

    The master copy of this FAQ is available at http://junit.sourceforge.net/doc/faq/faq.htm.

    The JUnit distribution also includes this FAQ in the doc directory.

  1. What is JUnit?

    JUnit is an open source Java testing framework used to write and run repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks.

    JUnit features include:

    • Assertions for testing expected results
    • Test fixtures for sharing common test data
    • Test suites for easily organizing and running tests
    • Graphical and textual test runners

    JUnit was originally written by Erich Gamma and Kent Beck.

  2. Where is the JUnit home page?

    The official JUnit home page is http://junit.org.

  3. Where are the JUnit mailing lists and forums?

    There are 3 mailing lists dedicated to everything JUnit:

    You can search the JUnit user list archives for answers to frequently asked questions not included here.

    There is also a jGuru discussion forum dedicated to everything JUnit.

  4. Where is the JUnit documentation?

    The following documents are included in the JUnit distribution in the doc directory:

  5. Where can I find articles on JUnit?

    The JUnit home page maintains a list of JUnit articles.

  6. What's the latest news on JUnit?

    The JUnit home page publishes the latest JUnit news.

  7. How is JUnit licensed?

    JUnit is Open Source Software, released under IBM's Common Public License Version 0.5 and hosted on SourceForge.

  8. What awards has JUnit won?

  1. Where do I download JUnit?

    The latest version of JUnit is available on SourceForge.

  2. How do I install JUnit?

    1. First, download the latest version of JUnit, referred to below as junit.zip.

    2. Then install JUnit on your platform of choice:

      Windows

      To install JUnit on Windows, follow these steps:

      1. Unzip the junit.zip distribution file to a directory referred to as %JUNIT_HOME%.

      2. Add JUnit to the classpath:

        set CLASSPATH=%CLASSPATH%;%JUNIT_HOME%\junit.jar

      Unix (bash)

      To install JUnit on Unix, follow these steps:

      1. Unzip the junit.zip distribution file to a directory referred to as $JUNIT_HOME.

      2. Add JUnit to the classpath:

        export CLASSPATH=$CLASSPATH:$JUNIT_HOME/junit.jar

    3. (Optional) Unzip the $JUNIT_HOME/src.jar file.

    4. Test the installation by using either the textual or graphical test runner to run the sample tests distributed with JUnit.

      Note: The sample tests are not contained in the junit.jar, but in the installation directory directly. Therefore, make sure that the JUnit installation directory is in the CLASSPATH.

      For the textual TestRunner, type:

      java junit.textui.TestRunner junit.samples.AllTests

      For the graphical TestRunner, type:

      java junit.swingui.TestRunner junit.samples.AllTests

      All the tests should pass with an "OK" (textual) or a green bar (graphical).

      If the tests don't pass, verify that junit.jar is in the CLASSPATH.

    5. Finally, read the documentation.

  3. How do I uninstall JUnit?

    1. Delete the directory structure where you unzipped the JUnit distribution.

    2. Remove junit.jar from the classpath

    JUnit does not modify the registry so simply removing all the files will fully uninstall it.

  4. How do I ask questions?

    Questions that are not answered in the FAQ or in the documentation should be posted to the jGuru discussion forum or the JUnit user mailing list.

    Please stick to technical issues on the discussion forum and mailing lists. Keep in mind that these are public, so do not include any confidental information in your questions!

    You should also read "How to ask questions the smart way" by Eric Raymond before participating in the discussion forum and mailing lists.

    NOTE:
    Please do NOT submit bugs, patches, or feature requests to the discussion forum or mailing lists.
    Refer instead to "How do I submit bugs, patches, or feature requests?".

  5. How do I submit bugs, patches, or feature requests?

    JUnit celebrates programmers testing their own software. In this spirit, bugs, patches, and feature requests that include JUnit tests have a better chance of being addressed than those without.

    JUnit is forged on SourceForge. Please use the tools provided by SourceForge for your submissions.

  1. How do I write and run a simple test?

    1. Create a subclass of TestCase:

      
      	      
        package junitfaq;
      	      
        import java.util.*;
        import junit.framework.*;
        
        public class SimpleTest extends TestCase {
      	  
    2. Write a test method to assert expected results on the object under test:

      
      
          public void testEmptyCollection() {
              Collection collection = new ArrayList();
              assertTrue(collection.isEmpty());
          }
      	  
    3. Write a suite() method that uses reflection to dynamically create a test suite containing all the testXXX() methods:

      
      
          public static Test suite() {
              return new TestSuite(SimpleTest.class);
          }
      	  
    4. Write a main() method to conveniently run the test with the textual test runner:

      
      
              public static void main(String args[]) {
                  junit.textui.TestRunner.run(suite());
              }
          }
      	  
    5. Run the test:

      • To run the test with the textual test runner used in main(), type:

        java junitfaq.SimpleTest

        The passing test results in the following textual output:

        
        .
        Time: 0
        
        OK (1 tests)
        		
      • To run the test with the graphical test runner, type:

        java junit.swingui.TestRunner junitfaq.SimpleTest

        The passing test results in a green bar displayed in the graphical UI.

  2. How do I use a test fixture?

    A test fixture is useful if you have two or more tests for a common set of objects. Using a test fixture avoids duplicating the test code necessary to initialize and cleanup those common objects for each test.

    Tests can use the objects (variables) in a test fixture, with each test invoking different methods on objects in the fixture and asserting different expected results. Each test runs in its own test fixture to isolate tests from the changes made by other tests. That is, tests don't share the state of objects in the test fixture. Because the tests are isolated, they can be run in any order.

    To create a test fixture, define a setUp() method that initializes common objects and a tearDown() method to cleanup those objects. The JUnit framework automatically invokes the setUp() method before each test is run and the tearDown() method after each test is run.

    The following test uses a test fixture to initialize and cleanup a common Collection object such that both tests are isolated from changes made by the other:

    
    
        package junitfaq;
    
        import junit.framework.*;
        import java.util.*;
        
        public class SimpleTest extends TestCase {
        
            private Collection collection;
    	
            protected void setUp() {
                collection = new ArrayList();
            }
    	
            protected void tearDown() {
                collection.clear();
            }
    
            public void testEmptyCollection() {
                assertTrue(collection.isEmpty());
            }
    	
            public void testOneItemCollection() {
                collection.add("itemA");
                assertEquals(1, collection.size());
            }
        }
          

    Given this test, the methods might execute in the following order:

    
    setUp()
    testOneItemCollection()
    tearDown()
    setUp()
    testEmptyCollection()
    tearDown()
    	

    The ordering of test-method invocations is not guaranteed, so testEmptyCollection() might be executed before testOneItemCollection(). This is why the test methods themselves must be written to be independent of one another. What is guaranteed is that setUp() will execute before each test method and tearDown() will execute after each test method.

  3. Why isn't my test fixture being run?

    Make sure the test fixture methods are defined as follows, noting that both method names are case sensitive:

    protected void setUp() {
        // initialization code
    }
    
    protected void tearDown() {
        // cleanup code
    }
          
  4. How do I test a method that doesn't return anything?

    (Submitted by: Dave Astels)

    Often if a method doesn't return a value, it will have some side effect. Actually, if it doesn't return a value AND doesn't have a side effect, it isn't doing anything.

    There may be a way to verify that the side effect actually occurred as expected. For example, consider the add() method in the Collection classes. There are ways of verifying that the side effect happened (i.e. the object was added). You can check the size and assert that it is what is expected:

    
    
        public void testCollectionAdd() {
            Collection collection = new ArrayList();
            assertEquals(0, collection.size());
            collection.add("itemA");
            assertEquals(1, collection.size());
            collection.add("itemB");
            assertEquals(2, collection.size());
        }
          

    Another approach is to make use of MockObjects.

    A related issue is to design for testing. For example, if you have a method that is meant to output to a file, don't pass in a filename, or even a FileWriter. Instead, pass in a Writer. That way you can pass in a StringWriter to capture the output for testing purposes. Then you can add a method (e.g. writeToFileNamed(String filename)) to encapsulate the FileWriter creation.

  5. Under what conditions should I test get() and set() methods?

    Unit tests are intended to alleviate fear that something might break. If you think a get() or set() method could reasonably break, or has in fact contributed to a defect, then by all means write a test.

    In short, test until you're confident. What you choose to test is subjective, based on your experiences and confidence level. Remember to be practical and maximize your testing investment.

    Refer also to "How simple is 'too simple to break'?".

  6. Under what conditions should I not test get() and set() methods?

    (Submitted by: J. B. Rainsberger)

    Most of the time, get/set methods just can't break, and if they can't break, then why test them? While it is usually better to test more, there is a definite curve of diminishing returns on test effort versus "code coverage". Remember the maxim: "Test until fear turns to boredom."

    Assume that the getX() method only does "return x;" and that the setX() method only does "this.x = x;". If you write this test:

    testGetSetX() {
        setX(23);
        assertEquals(23, getX());
    }
          

    then you are testing the equivalent of the following:

    testGetSetX() {
        x = 23;
        assertEquals(23, x);
    }
    

    or, if you prefer,

    testGetSetX() {
        assertEquals(23, 23);
    }
    

    At this point, you are testing the Java compiler, or possibly the interpreter, and not your component or application. There is generally no need for you to do Java's testing for them.

    If you are concerned about whether a property has already been set at the point you wish to call getX(), then you want to test the constructor, and not the getX() method. This kind of test is especially useful if you have multiple constructors:

    testCreate() {
        assertEquals(23, new MyClass(23).getX());
    }
          
  7. How do I write a test that passes when an expected exception is thrown?

    Catch the exception within the test method. If it isn't thrown, call the fail() method to signal the failure of the test.

    The following is an example test that passes when the expected IndexOutOfBoundsException is raised:

    
    
        public void testIndexOutOfBoundsException() {
    		
            ArrayList emptyList = new ArrayList();
    		
            try {
    	
                Object o = emptyList.get(0);
    	
                fail("Should raise an IndexOutOfBoundsException");
    	
            } catch (IndexOutOfBoundsException expected) {
                assertTrue(true);
            }
        }
          
  8. How do I write a test that fails when an unexpected exception is thrown?

    Declare the exception in the throws clause of the test method and don't catch the exception within the test method. Uncaught exceptions will cause the test to fail with an error.

    The following is an example test that fails when the IndexOutOfBoundsException is raised:

    
    
        public void testIndexOutOfBoundsExceptionNotRaised() 
            throws IndexOutOfBoundsException {
        
            ArrayList emptyList = new ArrayList();
            Object o = emptyList.get(0);
        }
          
  9. What's the difference between a failure and an error?

    Assertions are used to check for the possibility of failures, therefore failures are anticipated. Errors are unanticipated problems resulting in uncaught exceptions being propagated from a JUnit test method.

    In the following example, the FileNotFoundException is expected and checked with an assertion. If the expected exception is not raised, then a failure is produced. If any other unexpected IOException or unchecked exception (e.g. NullPointerException) is raised, the JUnit framework catches the exception and signals an error.

    
    
        public void testNonexistentFileRead() throws IOException {
            try {
    
                File file = new File("doesNotExist.txt");
                FileReader reader = new FileReader(file);
                assertEquals('a', (char)reader.read());
    			
                fail("Read from a nonexistent file?!");
    	
            } catch (FileNotFoundException expected) {
                assertTrue(true);
            }
        } 
          

    In the following example, an IOException is not expected. The JUnit framework will signal an error if an IOException (e.g. FileNotFoundException) or any unchecked exception (e.g. NullPointerException) is raised.

    
    
        public void testExistingFileRead() throws IOException {
    
            // exists.txt created in setup(), perhaps
    
            File file = new File("exists.txt");  
            FileReader reader = new FileReader(file);
    			
            assertEquals('a', (char)reader.read());
        } 
          

    Both failures and errors will cause the test to fail. However, it is useful to differentiate between failures and errors because the debugging process is slightly different.

    In the first example, the use of fail() will not generate a complete stack trace including the method that raised the exception. In this case that's sufficient since we anticipate that the exception will be raised. If it's not raised, then it's a problem with the test itself.

    In the second example, the JUnit framework catches the exception and generates an error with a complete stack trace for the exception. Since we don't expect this exception to be raised, a complete stack trace is useful in debugging why it was raised.

  10. How do I test protected methods?

    Place your tests in the same package as the classes under test.

    Refer to "Where should I put my test files?" for examples of how to organize tests for protected method access.

  11. How do I test private methods?

    Testing private methods may be an indication that those methods should be moved into another class to promote reusability.

    But if you must...

    You can use reflection to subvert the access control mechanism. If you are using JDK 1.3 or higher you can use the PrivilegedAccessor class. Examples of how to use this class are available in PrivilegedAccessorTest.

  12. Why does JUnit only report the first failure in a single test?

    (Submitted by: J. B. Rainsberger)

    Reporting multiple failures in a single test is generally a sign that the test does too much, compared to what a unit test ought to do. Usually this means either that the test is really a functional/acceptance/customer test or, if it is a unit test, then it is too big a unit test.

    JUnit is designed to work best with a number of small tests. It executes each test within a separate instance of the test class. It reports failure on each test. Shared setup code is most natural when sharing between tests. This is a design decision that permeates JUnit, and when you decide to report multiple failures per test, you begin to fight against JUnit. This is not recommended.

    Long tests are a design smell and indicate the likelihood of a design problem. Kent Beck is fond of saying in this case that "there is an opportunity to learn something about your design." We would like to see a pattern language develop around these problems, but it has not yet been written down.

    Finally, note that a single test with multiple assertions is isomorphic to a test case with multiple tests:

    One test method, three assertions:

    
    public class MyTestCase extends TestCase {
        public void testSomething() {
            // Set up for the test, manipulating local variables
            assertTrue(condition1);
            assertTrue(condition2);
            assertTrue(condition3);
        }
    }
          

    Three test methods, one assertion each:

    
    public class MyTestCase extends TestCase {
        // Locale variables become instance variables
    
        protected void setUp() {
            // Set up for the test, manipulating instance variables
        }
        
        public void testCondition1() {
            assertTrue(condition1);
        }
    
        public void testCondition2() {
            assertTrue(condition2);
        }
    
        public void testCondition3() {
            assertTrue(condition3);
        }
    }
          

    The resulting tests use JUnit's natural execution and reporting mechanism and, failure in one test does not affect the execution of the other tests. You generally want exactly one test to fail for any given bug, if you can manage it.

  13. In Java 1.4, 'assert' is a keyword. Won't this conflict with JUnit's assert() method?

    (Submitted by: David Stagner)

    JUnit 3.7 deprecated assert() and replaced it with assertTrue(), which works exactly the same way.

    Simply upgrade your JUnit to version 3.7 or higher and change all assert() calls in your existing tests to assertTrue().

  14. How do I test things that must be run in a J2EE container (e.g. servlets, EJBs)?

    Refactoring J2EE components to delegate functionality to other objects that don't have to be run in a J2EE container will improve the design and testability of the software.

    Cactus is an open source JUnit extension that can be used to test J2EE components in their natural environment.

  15. Do I need to write a TestCase class for every class I need to test?

    (Submitted by: J. B. Rainsberger)

    No. It is a convention to start with one TestCase class per class under test, but it is not necessary.

    TestCase classes only provide a way to organize tests, nothing more. Generally you will start with one TestCase class per class under test, but then you may find that a small group of tests belong together with their own common test fixture.[1] In this case, you may move those tests to a new TestCase object. This is a simple object-oriented refactoring: separating responsibilities of an object that does too much.

    Another point to consider is that the TestSuite is the smallest execution unit in JUnit: you cannot execute anything smaller than a TestSuite at one time without changing source code. In this case, you probably do not want to put tests in the same TestCase class unless they somehow "belong together". If you have two groups of tests that you think you'd like to execute separately from one another, it is wise to place them in separate TestCase classes.

    [1] A test fixture is a common set of test data and collaborating objects shared by many tests. Generally they are implemented as instance variables in the TestCase class.

  16. Is there a basic template I can use to create a test?

    (Submitted by: Eric Armstrong)

    The following templates are a good starting point. Copy/paste and edit these templates to suit your coding style.

    SampleTest is a basic test template:

    
    import junit.framework.TestCase;
    
    public class SampleTest extends TestCase {
    
        private java.util.List emptyList;
    
        /**
         * Sets up the test fixture. 
         * (Called before every test case method.)
         */
        protected void setUp() {
            emptyList = new java.util.ArrayList();
        }
    
        /**
         * Tears down the test fixture. 
         * (Called after every test case method.)
         */
        protected void tearDown() {
            emptyList = null;
        }
        
        public void testSomeBehavior() {
            assertEquals("Empty list should have 0 elements", 0, emptyList.size());
        }
    
        public void testForException() {
    
            try {
    
                Object o = emptyList.get(0);
    
                fail("Should raise an IndexOutOfBoundsException");
    
            } catch (IndexOutOfBoundsException success) {
            }
        }
    
        public static void main(String args[]) {
            junit.textui.TestRunner.run(SampleTest.class);
        }
    }
          

    SampleTestSuite is a template for a suite of tests:

    
    import junit.framework.Test;
    import junit.framework.TestSuite;
    
    public class SampleTestSuite {
    
        public static Test suite() {
    
            TestSuite suite = new TestSuite("Sample Tests");
            
            //
            // Add one entry for each test class
            // or test suite.
            //
            suite.addTestSuite(SampleTest.class);
            
            //
            // For a master test suite, use this pattern.
            // (Note that here, it's recursive!)
            //
            suite.addTest(AnotherTestSuite.suite());
    
            return suite;
        }
    
        public static void main(String args[]) {
            junit.textui.TestRunner.run(suite());
        }
    }
          
  17. How do I write a test for an abstract class?

    Refer to http://c2.com/cgi/wiki?AbstractTestCases.

  18. When are tests garbage collected?

    (Submitted by: Timothy Wall and Kent Beck)

    By design, the tree of Test instances is built in one pass, then the tests are executed in a second pass. The test runner holds strong references to all Test instances for the duration of the test execution. This means that for a very long test run with many Test instances, none of the tests may be garbage collected until the end of the entire test run.

    Therefore, if you allocate external or limited resources in a test, you are responsible for freeing those resources. Explicitly setting an object to null in the tearDown() method, for example, allows it to be garbage collected before the end of the entire test run.

  1. Where should I put my test files?

    You can place your tests in the same package and directory as the classes under test.

    For example:

    src
       com
          xyz
             SomeClass.java
             SomeClassTest.java	 
          

    While adequate for small projects, many developers feel that this approach clutters the source directory, and makes it hard to package up client deliverables without also including unwanted test code, or writing unnecessarily complex packaging tasks.

    An arguably better way is to place the tests in a separate parallel directory structure with package alignment.

    For example:

    src
       com
          xyz
             SomeClass.java
    test
       com
          xyz
             SomeClassTest.java	 
          

    These approaches allow the tests to access to all the public and package visible methods of the classes under test.

    Some developers have argued in favor of putting the tests in a sub-package of the classes under test (e.g. com.xyz.test). The author of this FAQ sees no clear advantage to adopting this approach and believes that said developers also put their curly braces on the wrong line. :-)

  2. How do I write a test suite for all of my tests?

    Write a suite() method that creates a TestSuite containing all your tests.

    For example:

    
    
        import junit.framework.*;
    
        public class AllTests {
    
            public static Test suite() {
    
                TestSuite suite = new TestSuite();
    
                suite.addTest(SomeTest.suite());
                suite.addTest(AnotherTest.suite());
    		
                return suite;
            }
    
            public static void main(String[] args) {
                junit.textui.TestRunner.run(suite());
            }
        }
          

    Running AllTests will automatically run all of its contained tests in one fell swoop.

    You can arbitrarily group any tests into test suites as appropriate by package, logical layers, test type, etc.

  3. How can I run setUp() and tearDown() code once for all of my tests?

    The desire to do this is usually a symptom of excessive coupling in your design. If two or more tests must share the same test fixture state, then the tests may be trying to tell you that the classes under test have some undesirable dependencies.

    Refactoring the design to further decouple the classes under test and eliminate code duplication is usually a better investment than setting up a shared test fixture.

    But if you must...

    You can wrap the test suite containing all your tests in a subclass of TestSetup which invokes setUp() exactly once before all the tests are run and invokes tearDown() exactly once after all the tests have been run.

    The following is an example suite() method that uses a TestSetup for one-time initialization and cleanup:

    
    
        import junit.framework.*;
        import junit.extensions.TestSetup;
    
        public class AllTestsOneTimeSetup {
    
            public static Test suite() {
      
                TestSuite suite = new TestSuite();
    
                suite.addTest(SomeTest.suite());
                suite.addTest(AnotherTest.suite());
    
                TestSetup wrapper = new TestSetup(suite) {
    
                    protected void setUp() {
                        oneTimeSetUp();
                    }
    
                    protected void tearDown() {
                        oneTimeTearDown();
                    }
                };
    
                return wrapper;
            }
    
            public static void oneTimeSetUp() {
                // one-time initialization code
            }
    
            public static void oneTimeTearDown() {
                // one-time cleanup code
            } 
        }
          
  1. What CLASSPATH settings are needed to run JUnit?

    (Submitted by: Eric Armstrong)

    To run your JUnit tests, you'll need the following elemements in your CLASSPATH:

    • JUnit class files
    • Your class files, including your JUnit test classes
    • Libraries your class files depend on

    If attempting to run your tests results in a NoClassDefFoundError, then something is missing from your CLASSPATH.

    Windows Example:

    set CLASSPATH=%JUNIT_HOME%\junit.jar;c:\myproject\classes;c:\myproject\lib\something.jar

    Unix (bash) Example:

    export CLASSPATH=$JUNIT_HOME/junit.jar:/myproject/classes:/myproject/lib/something.jar

  2. Why do I get a NoClassDefFoundError when trying to test JUnit or run the samples?

    (Submitted by: J.B. Rainsberger and Jason Rogers)

    Most likely your CLASSPATH doesn't include the JUnit installation directory.

    Refer to "What CLASSPATH settings are needed to run JUnit?" for more guidance.

    Also consider running WhichJunit to print the absolute location of the JUnit class files required to run and test JUnit and its samples.

    If the CLASSPATH seems mysterious, read this!

  3. How do I run the JUnit GUI test runner?

    (Submitted by: Eric Armstrong)

    1. Set your CLASSPATH

    2. Invoke the runner:

      java junit.swingui.TestRunner <test class name>

  4. How do I run JUnit from my command window?

    (Submitted by: Eric Armstrong)

    1. Set your CLASSPATH

    2. Invoke the runner:

      java junit.textui.TestRunner <test class name>

  5. How do I run JUnit using Ant?

    (Submitted by: Eric Armstrong)

    1. Define any necessary Ant properties:

      
      <property name="src" value="./src" />
      <property name="lib" value="./lib" />
      <property name="classes" value="./classes" />
      <property name="test.class.name" value="com.xyz.MyTestSuite" />
      	  
    2. Set up the CLASSPATH to be used by JUnit:

      
      <path id="test.classpath">
        <pathelement location="${classes}" />
        <pathelement location="/path/to/junit.jar" />
        <fileset dir="${lib}">
          <include name="**/*.jar"/>
        </fileset>
      </path>
      	  
    3. Define the Ant task for running JUnit:

      
      <target name="test">
        <junit fork="yes" haltonfailure="yes">
          <test name="${test.class.name}" />
          <formatter type="plain" usefile="false" />
          <classpath refid="test.classpath" />
        </junit>
      </target>
      	  
    4. Run the test:

      ant test

    Refer to the JUnit Ant Task for more information.

  6. How do I use Ant to create HTML test reports?

    (Submitted by: Eric Armstrong and Steffen Gemkow)

    1. Ensure that Ant's optional.jar file is either in your CLASSPATH or exists in your $ANT_HOME/lib directory.

    2. Add an ANT property for the directory containing the HTML reports:

      <property name="test.reports" value="./reports" />
    3. Define the Ant task for running JUnit and generating reports:

      
      <target name="test-html">
        <junit fork="yes" printsummary="no" haltonfailure="no">
          <batchtest fork="yes" todir="${test.reports}" >
            <fileset dir="${classes}">
              <include name="**/*Test.class" />
            </fileset>
          </batchtest>
          <formatter type="xml" />
          <classpath refid="test.classpath" />
        </junit>
      
        <junitreport todir="${test.reports}">
          <fileset dir="${test.reports}">
            <include name="TEST-*.xml" />
          </fileset>
          <report todir="${test.reports}" />
        </junitreport>
      </target>
      	  
    4. Run the test:

      ant test-html

    Refer to the JUnit Ant Task for more information.

  7. How do I pass command-line arguments to a test execution?

    Use the -D JVM command-line options, as in:

    -DparameterName=parameterValue

    If the number of parameters on the command line gets unweildy, pass in the location of a property file that defines a set of parameters. Alternatively, the JUnit-addons package contains the XMLPropertyManager and PropertyManager classes that allow you to define a property file (or XML file) containing test parameters.

  8. Why do I get an error (ClassCastException or LinkageError) using the GUI TestRunners?

    (Submitted by: Scott Stirling)

    JUnit's GUI TestRunners use a custom class loader (junit.runner.TestCaseClassLoader) to dynamically reload your code every time you press the "Run" button so you don't have to restart the GUI to reload your classes if you recompile them. The default classloaders of the Java Virtual Machine do not dynamically reload changed classes. But JUnit's custom class loader finds and loads classes from the same CLASSPATH used by the JVM's system classloader. So, by design, it "sits in front of" the system loader and applies a filter to determine whether it should load a given class or delegate the loading of a class to the system classloader. This filter is configured with a list of String patterns in a properties file called excluded.properties.

    The excluded.properties file contains a numbered list (excluded.0, excluded.1, excluded.2, etc.) of properties whose values are patterns for packages. This file is packaged in junit.jar as junit/runner/excluded.properties. As of JUnit 3.7 and Java 1.4, its contents are:

    #
    # The list of excluded package paths for the TestCaseClassLoader
    #
    excluded.0=sun.*
    excluded.1=com.sun.*
    excluded.2=org.omg.*
    excluded.3=javax.*
    excluded.4=sunw.*
    excluded.5=java.*
          

    There are some conditions, discussed below, where the default exclusions are insufficient and you will want to add some more to this list and then either update the junit.jar file with your customized version or place your customized version in the CLASSPATH before junit.jar.

  9. Why do I get a LinkageError when using XML interfaces in my TestCase?

    (Submitted by: Scott Stirling)

    The workaround as of JUnit 3.7 is to add org.w3c.dom.* and org.xml.sax.* to your excluded.properties.

    It's just a matter of time before this fix becomes incorporated into the released version of JUnit's excluded.properties, since JAXP is a standard part of JDK 1.4. It will be just like excluding org.omg.*. By the way, if you download the JUnit source from its Sourceforge CVS, you will find that these patterns have already been added to the default excluded.properties and so has a pattern for JINI. In fact, here is the current version in CVS, which demonstrates how to add exclusions to the list too:

    #
    # The list of excluded package paths for the TestCaseClassLoader
    #
    excluded.0=sun.*
    excluded.1=com.sun.*
    excluded.2=org.omg.*
    excluded.3=javax.*
    excluded.4=sunw.*
    excluded.5=java.*
    excluded.6=org.w3c.dom.*
    excluded.7=org.xml.sax.*
    excluded.8=net.jini.*
          

    This is the most common case where the default excluded.properties list needs modification. The cause of the LinkageError is related to using JAXP in your test cases. By JAXP I mean the whole set of javax.xml.* classes and the supporting org.w3c.dom.* and org.xml.sax.* classes.

    As stated above, the JUnit GUI TestRunners' classloader relies on the excluded.properties for classes it should delegate to the system classloader. JAXP is an unusual case because it is a standard Java extension library dependent on classes whose package names (org.w3c.dom.* and org.xml.sax.*) do not begin with a standard Java or Sun prefix. This is similar to the relationship between javax.rmi.* and the org.omg.* classes, which have been excluded by default in JUnit'ss excluded.properties for a while.

    What can happen, and frequently does when using the JUnit Swing or AWT UI with test cases that reference, use or depend on JAXP classes, such as Log4J, Apache SOAP, Axis, Cocoon, etc., is that the JUnit class loader (properly) delegates javax.xml.* classes it "sees" to the system loader. But then the system loader, in the process of initializing and loading that JAXP class, links and loads up a bunch of org.w3c.dom/org.xml.sax classes. When it does so, the JUnit custom classloader is not involved at all because the system classloader never delegates "down" or checks with custom classloaders to see if a class is already loaded. At any point after this, if the JUnit loader is asked to load an org.w3c.dom/org.xml.sax class that it's never seen before, it will try to load it because the class' name doesn't match any of the patterns in the default exclude list. That's when a LinkageError occurs. This is really a flaw in the JUnit classloader design, but there is the workaround given above.

    Java 2 JVMs keep classes (remember, classes and objects, though related, are different entities to the JVM - I'm talking about classes here, not object instances) in namespaces, identifying them by their fully qualified classname plus the instance of their defining (not initiating) loader. The JVM will attempt to assign all unloaded classes referenced by an already defined and loaded class to that class's defining loader. The JVM's classresolver routine (implemented as a C function in the JVM source code) keeps track of all these class loading events and "sees" if another classloader (such as the JUnit custom loader) attempts to define a class that has already been defined by the system loader. According to the rules of Java 2 loader constraints, in case a class has already been defined by the system loader, any attempts to load a class should first be delegated to the system loader. A "proper" way for JUnit to handle this feature would be to load classes from a repository other than the CLASSPATH that the system classloader knows nothing about. And then the JUnit custom classloader could follow the standard Java 2 delegation model, which is to always delegate class loading to the system loader, and only attempt to load if that fails. Since they both load from the CLASSPATH in the current model, if the JUnit loader delegated like it's supposed to, it would never get to load any classes since the system loader would always find them.

    You could try to hack around this in the JUnit source by catching the LinkageError in TestCaseClassLoader's loadClass() method and then making a recovery call to findSystemClass() -- thereby delegating to the system loader after the violation has been caught. But this hack only works some of the time, because now you can have the reverse problem where the JUnit loader will load a host of org.w3c.dom/org.xml.sax classes, and then the system loader violates the loader contraints at some point when it tries to do exactly what I described above with JAXP because it doesn't ever delegate to its logical child (the JUnit loader). Inevitably, if your test cases use many JAXP and related XML classes, one or the other classloader will end up violating the constraints whatever you do.

  10. Why do I get a ClassCastException when I use narrow() in an EJB client TestCase?

    (Submitted by: Scott Stirling)

    The solution is to prevent your EJB's interface classes from being loaded by the JUnit custom class loader by adding them to excluded.properties.

    This is another problem inherent to JUnit's dynamically reloading TestCaseClassLoader. Similar to the LinkageErrors with JAXP and the org.xml.sax and org.w3c.dom classes, but with a different result.

    Here's some example code:

    Point point;
    PointHome pointHome;
    
    // The next line works in textui, but throws
    // ClassCastException in swingui
    
    pointHome = (PointHome)PortableRemoteObject.
        narrow(ctx.lookup("base/PointHome"), PointHome.class);
          

    When you call InitialContext.lookup(), it returns an object that was loaded and defined by the JVM's system classloader (sun.misc.Launcher$AppClassLoader), but the PointEJBHome.class type is loaded by JUnit's TestCaseClassLoader. In the narrow(), the two fully qualified class names are the same, but the defining classloaders for the two are different so you get the exception during the narrow because the JVM doesn't see them as being the same runtime class type.

    Recall that in Java 2 an object's class (a.k.a. "runtime type") is identified in the JVM as the pair of <fully-qualified-classname;definingClassLoaderInstance> or (in shorter form) <C;L>. That is, the defining loader's identity is part of the runtime name identifying that class in the JVM. Also recall that the JVM will expect a class's defining loader to load all unloaded classes referenced by the classes it loads.

    If interested for debugging purposes, you can find out more about which loader loaded which class by doing something like this:

    System.out.println(ctx.lookup("base/PointEJBHome").getClass().getClassLoader());
    System.out.println(PointEJBHome.class.getClassLoader());
          

    You'll find when using the GUI TestRunners that the PointEJBHome type is defined by the JUnit TestCaseClassLoader and the object returned from InitialContext.lookup() was defined through the JVM's system class loader. When using the tex-based TestRunner they'll both have been loaded through the system loader.

    If you use Ant's <batchtest> task to run your test cases and you have this problem, you can work around it by setting fork="true" on <batchtest>, which causes it to run each test in its own Java Virtual Machine separate from Ant's launching JVM.

    For further reading about the principles of Java dynamic classloading, the best resource is the short paper by Sheng Liang, the architect of the Java 2 classloader architecture: Dynamic Class Loading in the Java Virtual Machine, OOPSLA 1998.

  11. Why do I get the warning "AssertionFailedError: No tests found in XXX" when I run my test?

    Make sure the test contains one or more methods with names beginning with "test".

    For example:

    public void testSomething() {
    }
          

    This error also commonly occurs when using the addTestSuite() in an attempt to create a hiearchy of test suites. For more information, see "How do I get one test suite to invoke another?".

  12. Why do I see "Unknown Source" in the stack trace of a test failure, rather than the source file's line number?

    The debug option for the Java compiler must be enabled in order to see source file and line number information in a stack trace.

    When invoking the Java compiler from the command line, use the -g option to generate all debugging info.

    When invoking the Java compiler from an Ant task, use the debug="on" attribute. For example:

    <javac srcdir="${src}" destdir="${build}" debug="on" />

    When using older JVMs pre-Hotspot (JDK 1.1 and most/all 1.2), run JUnit with the -DJAVA_COMPILER=none JMV command line argument to prevent runtime JIT compilation from obscuring line number info.

    Compiling the test source with debug enabled will show the line where the assertion failed. Compiling the non-test source with debug enabled will show the line where an exception was raised in the class under test.

  13. Why does the "excluded.properties" trick not work when running JUnit's GUI from inside my favorite IDE?

    (Submitted by: William Pietri)

    Some IDEs come with a copy of JUnit, so your copy of JUnit in the project classpath isn't the one being used. Replace the junit.jar file used by the IDE with a junit.jar file containing a custom excluded.properties and your bar will once again be green.

  14. How do I get one test suite to invoke another?

    (Submitted by: Eric Armstrong)

    To add a suite to a suite, use:

    suite.addTest(someOtherSuite.suite());
  15. How do I organize all test classes in a TestSuite automatically and not use or manage a TestSuite explicitly?

    (Submitted by: Bill de hora)

    There are a number of ways to do this:

    1. In Ant, use the junit task and the batchtest element:

      
      <junit printsummary="yes" haltonfailure="yes">
        ...
        <batchtest fork="yes">
          <fileset dir="${src.dir}">
             <include name="**/*Test.java" />
             <include name="**/Test*.java" />
          </fileset>
        </batchtest>
      </junit> 
      	  

      Idiomatic naming patterns for unit tests are Test*.java and *Test.java. Documentation and examples are at http://ant.apache.org/manual/OptionalTasks/junit.html.

    2. Use the DirectorySuiteBuilder and ArchiveSuiteBuilder (for jar/zip files) classes provided by JUnit-addons project:

      DirectorySuiteBuilder builder = new DirectorySuiteBuilder();
      builder.setSuffix("Test");
      Test suite = builer.suite("/home/project/myproject/tests"); 
      	  

      Documentation and examples are at http://junit-addons.sourceforge.net.

    3. Write your own custom suite builder.

      Have your test classes implement an interface and write a treewalker to load each class in a directory, inspect the class, and add any classes that implement the interface to a TestSuite.

      You might only want to do this if you are very uncomfortable with using a naming convention for test classes. Aside from being slow for larger suites, ultimately it's arguable whether it's more effort to follow a naming convention that have test classes implement an interface!

      An example of this approach is at http://www.javaworld.com/javaworld/jw-12-2000/jw-1221-junit_p.html.

  1. When should tests be written?

    Tests should be written before the code. Test-first programming is practiced by only writing new code when an automated test is failing.

    Good tests tell you how to best design the system for its intended use. They effectively communicate in an executable format how to use the software. They also prevent tendencies to over-build the system based on speculation. When all the tests pass, you know you're done!

    Whenever a customer test fails or a bug is reported, first write the necessary unit test(s) to expose the bug(s), then fix them. This makes it almost impossible for that particular bug to resurface later.

    Test-driven development is a lot more fun than writing tests after the code seems to be working. Give it a try!

  2. Do I have to write a test for everything?

    No, just test everything that could reasonably break.

    Be practical and maximize your testing investment. Remember that investments in testing are equal investments in design. If defects aren't being reported and your design responds well to change, then you're probably testing enough. If you're spending a lot of time fixing defects and your design is difficult to grow, you should write more tests.

    If something is difficult to test, it's usually an opportunity for a design improvement. Look to improve the design so that it's easier to test, and by doing so a better design will usually emerge.

  3. How simple is 'too simple to break'?

    (Submitted by: J. B. Rainsberger)

    The general philosophy is this: if it can't break on its own, it's too simple to break.

    First example is the getX() method. Suppose the getX() method only answers the value of an instance variable. In that case, getX() cannot break unless either the compiler or the interpreter is also broken. For that reason, don't test getX(); there is no benefit. The same is true of the setX() method, although if your setX() method does any parameter validation or has any side effects, you likely need to test it.

    Next example: suppose you have written a method that does nothing but forward parameters into a method called on another object. That method is too simple to break.

    public void myMethod(final int a, final String b) {
        myCollaborator.anotherMethod(a, b);
    }
          

    myMethod cannot possibly break because it does nothing: it forwards its input to another object and that's all.

    The only precondition for this method is "myCollaborator != null", but that is generally the responsibility of the constructor, and not of myMethod. If you are concerned, add a test to verify that myCollaborator is always set to something non-null by every constructor.

    The only way myMethod could break would be if myCollaborator.anotherMethod() were broken. In that case, test myCollaborator, and not the current class.

    It is true that adding tests for even these simple methods guards against the possibility that someone refactors and makes the methods "not-so-simple" anymore. In that case, though, the refactorer needs to be aware that the method is now complex enough to break, and should write tests for it -- and preferably before the refactoring.

    Another example: suppose you have a JSP and, like a good programmer, you have removed all business logic from it. All it does is provide a layout for a number of JavaBeans and never does anything that could change the value of any object. That JSP is too simple to break, and since JSPs are notoriously annoying to test, you should strive to make all your JSPs too simple to break.

    Here's the way testing goes:

    becomeTimidAndTestEverything
    while writingTheSameThingOverAndOverAgain
        becomeMoreAggressive
        writeFewerTests
        writeTestsForMoreInterestingCases
        if getBurnedByStupidDefect
            feelStupid
            becomeTimidAndTestEverything
        end
    end
          

    The loop, as you can see, never terminates.

  4. How often should I run my tests?

    Run all your unit tests as often as possible, ideally every time the code is changed. Make sure all your unit tests always run at 100%. Frequent testing gives you confidence that your changes didn't break anything and generally lowers the stress of programming in the dark.

    For larger systems, you may just run specific test suites that are relevant to the code you're working on.

    Run all your acceptance, integration, stress, and unit tests at least once per day (or night).

  5. What do I do when a defect is reported?

    Test-driven development generally lowers the defect density of software. But we're all fallible, so sometimes a defect will slip through. When this happens, write a failing test that exposes the defect. When the test passes, you know the defect is fixed!

    Don't forget to use this as a learning opportunity. Perhaps the defect could have been prevented by being more aggressive about testing everything that could reasonably break.

  6. Why not just use System.out.println()?

    Inserting debug statements into code is a low-tech method for debugging it. It usually requires that output be scanned manually every time the program is run to ensure that the code is doing what's expected.

    It generally takes less time in the long run to codify expectations in the form of an automated JUnit test that retains its value over time. If it's difficult to write a test to assert expectations, the tests may be telling you that shorter and more cohesive methods would improve your design.

  7. Why not just use a debugger?

    Debuggers are commonly used to step through code and inspect that the variables along the way contain the expected values. But stepping through a program in a debugger is a manual process that requires tedious visual inspections. In essence, the debugging session is nothing more than a manual check of expected vs. actual results. Moreover, every time the program changes we must manually step back through the program in the debugger to ensure that nothing broke.

    It generally takes less time to codify expectations in the form of an automated JUnit test that retains its value over time. If it's difficult to write a test to assert expected values, the tests may be telling you that shorter and more cohesive methods would improve your design.

  1. How do I extend JUnit?

    JUnit is a testing framework intended to be customized for specialized use. Browsing the JUnit source code is an excellent way to learn its design and discover how it can be extended.

    Examples of JUnit extensions can be found in the junit.extensions package:

    • TestDecorator

      A decorator for Tests. You can use it as the base class for implementing new test decorators that add behavior before or after a test is run.

    • ActiveTestSuite

      A TestSuite that runs each test in a separate thread and waits until all threads have terminated.

    • TestSetup

      A TestDecorator to initialize and cleanup test fixture state once before the test is run.

    • RepeatedTest

      A TestDecorator that runs a test repeatedly.

    • ExceptionTestCase

      A TestCase that expects a particular Exception to be thrown.

      Kent Beck has mentioned that ExceptionTestCase likely does not provide enough to be useful; it is just as easy to write the "exception test" yourself. Refer to the "Writing Tests" section for guidance.

  2. What kinds of extensions are available?

    The JUnit home page has a complete list of available JUnit extensions.

  1. How do I integrate JUnit with my IDE?

    The JUnit home page maintains a list of IDE integration instructions.

  2. How do I launch a debugger when a test fails?

    Start the TestRunner under the debugger and configure the debugger so that it catches the junit.framework.AssertionFailedError.

    How you configure this depends on the debugger you prefer to use. Most Java debuggers provide support to stop the program when a specific exception is raised.

    Notice that this will only launch the debugger when an expected failure occurs.

  3. Where can I find unit testing frameworks similar to JUnit for other languages?

    XProgramming.com maintains a complete list of available xUnit testing frameworks.


junit-3.8.2/doc/cookstour/0000755000175000017500000000000010402050446014431 5ustar mkochmkochjunit-3.8.2/doc/cookstour/Image4.gif0000644000175000017500000000715610402050446016237 0ustar mkochmkochGIF89a,@H*\ȰÇ#JHŋ3jȱǏ CIɓ(E"Hɒʖ0c|M6s9Ц@uSh˛2*tӠOJMtӪV&ŪU&׮`O~gO Ylƅ[-\aWl߿&}[Pr. EƎgF!v3Vʠ1zq4o\˚nWv}3IӨO-q7oʇ Nȓ \uX$H }uձS>=s~]uc'>|o\pkK|zy@ؠ 8{=!o-gb(b,_4&c8&X4GT!"z&=9VZ9Eݕ @.FYeEHQ7am"ݑ THbb Ng{g|I栂B)|*YC馜v駠*ꨤ(t5P?jawĥ{i5W뮼+찢;+1VDCױ;,ZDmsV;Qq-Dоljne.acy.KFf1kB%gEpiY&/(-S\qCY7ށeRL,CY˔{il؟>见Ik. 2j(](&э(A~zi0Gs[g.uc-vY \JͶU6r E*|7~Zƃ5b!'Rx^;q7+3H3Z84 Q+hLt+b> {}n{*ҬY+ƀ4V0][w 3G/Wog/U?,_k,b8*?[6ER ӟmVr$ ׺כfc*٥)*޹b.2@PX S~?!6dzx+( aZVbģ8i! wFiQ+L!A1 NUXƫq߳ƙbfVFb H5Bыȳ ^2 c%PTS\&dgZT串l"bN f/u[%&]Mu,ӆ UKM?Kʖb*4!yhi{iuNSB<'t'HOgLO A:։D;OlM>f:Ohs ysW_A/Iґg2C%Rt=0MZL[:ӗ4ũMsӝ4GdT*T?R]Yȥ 9Nm]T8;VժW#VzT3FM*19Ӭg,GUj f[KJWɕEϫISH5>O39m ,7ω.gšǚXr:rJk-28r +YlwVŭXoKzթ5$><_jAw7Uz,ͪvz xKMz^ ZVE}qY)߰ ׽e@IR14DtC&14p`S\ r!77ʴnf*8ʥN5j:5]Z֢Ng̲ xε98zIftb'^԰6[wej'rT{ޯ6 ]mf| dl `Y?wcK6r;-%JDK5x3X wvy2GW P9@Gι=+ZyKdՓџuHC,/ȋ,MƄ|.9yהTؓwT]x_(nw2E\iYʛ]B(Ϲ˪RΘ9z?Uҷ\yEwy|Dy#;De_'>b368Mh%v]|3LUcY?謉YűWP{ =y?O58E%nmhLx\"3)MM8Drryxbc#F9aefKUŠCv3ӨS^} Y˞z#lȣs}tߨ-N&㪅#_q9sУ-kb7],cn]矦W^׷)_{y׭O_u }iV\ w w`LV\b U!_RR`V!Z!U`#bT'/6(4h8<@)Di$O $J6L2٤QNieNVQV%mcfif\gIR \zeWjʄ&eI%li'~Z'S'N6ꨞWbBt* \@&Ijڪ VdZyj`j*I쯻1[ҚQ6e^:ezK-_j[jZroVluz,{&;yC 2> ?gCGM(SVWuR/[dmhlpqqm4(RxzS7F%NG&CG^my8ބƉ霑謓:{[c6{onGW.VCY3>=pav N~Oͷ@4|sP>MP@Iy GHYڵH0lBÈ V)m N"D%J`_HDbE ؕʉSC,6 f:˰-bYZ(ç]Y$@|gLUp Hr3-dio|W˺s*hstIt=~!רdiܙ΂/ʍq!(Ƥ}4$I-Rߢb"kh2R f K%򈋼#\%3"`,<st[!qStxGJ e#Y6FPᐓg1 J)k:ui6k?C:9=r(1s>ifc٩w-hJъZͨF7юz HGJҒ& JWR񩴥0-)R4w/Mw Қ@OԢnt3R+-#TǑBK^UY56[XUfcMhʠբiJo[\srsukRz½1KX&`el_*X6bVm%kA~l,IK?Ȟ=hMRvHl #z |[ք kFmY.\Aׁ]qGx]ݪVBw\VFr^ƼQ/Y սzdJ_<6\k>kEr PA/¡y  4X;1HTUA1ad] ĭ\@L"HNy7Q*Qґ 9e-ybXlMU~&5bVH:5gMϵ$fL3vΐLÆ QRh6عϓFfMPOT^9K7rVNzd575ć1|Ƶ^O4YY3Le:_oly{[j]H]YΘ >9I/THjU՚=opvRd6ݬpW.00[xi|zӀhO|ݥd ͎Lq ,O^xO6by3Zi{,De]I/ol\0GS{޸>A]gx?J?gz]zVc4wj+a\wB#t̨9=@<';|}jn}=۩jN{OGZA|7O^cǖ5E7nT5o{_>/ͪ9%^ͮxeKgCi%JoG?YUr3thO џZg_y3y[-=7JrD/:g~(wtk7KZgx(owo X|˧|ȁ'| X$x=~&؁+8,h|284X6x8:<؃>@B8DXFxH0Lxc6քPKTXcS^QZaO7[cd`E`e؃KiXm\\rX/!_lhEz؇*~\X^aޕb؈X%y5eemȉ艛U(dhiHcA f\́#a_!Յ 3`SRhWƈ8>X3Q?XxUWwh؎%(EXWaH > yht(Dc9hƑ(9XS `_+Y9\.2IT-)($yI69; A4 [GaE= PQoxV1Cؔ^`Od99Y*r5#lɒiIr9ab9sx1vz) kA[Xi]iu Qpi6ًYyb9c\ycH?YZ2J)m)`4ٙ_ ^Vٗ9Rُy~9x$51ɗ&q ҩW)ə5`9[Y\I i剞bY)i)^ɓX[@9ՙ JjI٩j a Jb YJʞʠ'JJ) !*#1aX/7 3 =z`ߩ=C*AڝJLڤNPR:TZVzXZ\ڥ^`ڝO/ e.ZB0j:k:fpڦiJxgPtʀ}&rq:wlgCwq~x!qӦC)f[nڨƤ:P@䩑:B*Qrjvǩw&1AfC0h*hb)TB L*wrA(5lsyؤ*Rdpj}{zgfʬ tJj ÚZ:I0"0vǭ{Jj111W/ u'rg/ʮRDs3~l]G)g;sb(C-+kZ_NRMy+ y kwF0ۧlZHgj:tBw|MG2G3iOP+1qm227'm+t-)8v˱o]dHFOo{;tlg3_gt}B~۵.1ktCF~;rv1Kf$[|rbm [۸po}a,[&Jlj;pu}{o_W$C~gf<˹wp[[vu'ku~K;xt K;g GpkSðKIz&Kokt컹ڹEѫ ̽zEeGmK},+J{ow9,E:'>B,yJFܰë-QsfMf<簥gX Z%q1$+Aw+(e*ÎjGPL@,Ċh|\mS CZUɣ*'gQdww!g6ʣFʫ71ǤToZі˲&ۂ 㶨 b Nȓ+_μУ-"aճk%uOzGАJo/ZW.ǸU\* FsIN'Ao$E4bUK5Uf̤ _`FGIweP/ Cq\ ;\91_GWWVbr7t̯ 2EhD6zэpcz&:Fk<񏀤BRt ! "EāV2'>IF+KqM &&Ld3 L#)VNV^n#2bcU0s!%44MTș6nz 8IrJ4:d4s`$I$==u;ZԠNA)\!Wc B;/T^cX.Q_ }?Fzʕ.sҕڒ#-) ӚhSaZ,s@ PJTڴ@Ȅ2PfK&@浗G%ȉլzUq]*ºM|g]ZggVouw\ JWEuv+^( `D1pM &֧tl"Z͢綃Z/W˜SNB\Оt\ ?10a(jjv8$̲U.S3\$t)DR(|Knƥ])πbH?h^z6=k_OgD['ٕ%H}-7T`d00Qyw9eigzJ׸ID(%JVmaFB"z0`gR5jE&3-16\Dn<gա -`ꦼ)*KXe.[>RLޡ+fA^&wmtT{iE~$t)q; A5xVOLa.3'tcS ʰ.Tr U8G'@;ȸRWI\6A>DgG)pDżoEVRj(yfkTeVJKm;ޅ-_z6&=`سI{pX3iTm2J]v* |߻oVnӒؤ-*]2 ,`8CRZ ׸3q)[,Y\[xM]Ο.ثЇkr_"h(Y>u1)C`GNŖr:nPsC܍]pGpm3^SH)<w=B5 ujV*bUj|= Ƴ{WE(x1L{hG-wOO4nn{1{kO A81:|I?L n_HJGEUDkG$s?Xzg>Bz.s0fb26pUs:Er(<\61}J^=t+!'BzXyBq5uRet(vH(waׄN+DXtVx!l&pZXv*zv]#zrcdR6b2q2SUmV~${h\ako&{\{fVcxk7b6NtX88 xY\刈vd(8g(||EP8*G؊䊸f5|E(vu勿8ShMh^}mا}co~F"\HfFRYRjxwuErH>ܷ3suZpGEj1TtKvfAv'X] "moeji>ŦJ1Q+VHI8ҕ\ʥJTwFiiz"Uǵ,dpP-D?ɖy)'z1Hq*qoX\WsL(kD`⧒5]׉'pI+QJu;5 /fIºh9>>9teȘ';t+&JM#gTUǹMMv5VgG{ŁQPJ`M[hjlnprICNF,H[哌9X'\晥Rp̪p> r> ~ zZwnt.n~߷nNyLP.Մ_.͖^rc:{ZmuJdk^njʕEy֯nE, C^訬ߜ.]-aWua.^{.B1^r>Bn&~yj.N='B)) XY]΢6j8d]SRڂel'oҘ{amBNyu;T_r*XM*:O>GP FE w=Bt)/{2؜>!?,fV x ߒdb^B\MW_(O3]z?mȟis榿4ٵ|ݘ.̺oH6M}>_ƿpd vGRAb|.Oh9@Ik˜d@H I@@ DPB "P@C-^(bF= d H$E<92ʕ*KTR̖"]e͚8}DPE 51Rj| ԦQ^u$˟!s 5fL $ tٵceU ؟m5h#D}'b#Ry,ܑo%PƇ-YV# 9mسm~+: Z{VM0hE̲mKVܛ 7$^49߀6,5_Ǟ}sKgi=t絨Ǘwgwޫ  J]υmKh9#@s? 4@-ʺ.DL`#-EpK\­4XoF n!>LjB r#,2B* (G38Sgc6R---M3Qt +1AT5,TP;PI#K2CG,),QLOB+TDROkTUQMUVMպ$Sc4)[CUW,,XwYeevYgFu5vQrZZV@6ܢ%YsE\8]3znAWbK"__&68aX>9sJ^+NZw+B~y矿 zj^9{76d~|8}g}O[''4ٶ|vFD(=+E_ȤVu? "ɫҵAuq'Y*x1O/kVrժ b:b!Nbݰ/!a<)f9#lV %mUf.w ;+Ұ. sXj'H$YK\!WF2ΰT\,aYdR8"vqrg0.2VZDR'7Dc8#ፎYb+2ٳ뜣yDqb"HTTpeOr'[e&i9Ζlc-iY:6-v{g2 UY)gL(jb `44Ac HlX p5i5QR8)Jәq AOZ4t*K CTժW*+Uvի_H Ք&F)XպVխ\XCW-[W.uU XnE yΰlaZC~lf5Eֳ'B'VTGXe *4he*ˌ%#>VMjK%еgmjUZ7%n?O1\-m[Ҷb.Ke䣬MdO:˶w;UD!K_޷hziREa sMԍmE95NpthƤ%IVR]׃ OҹTtQi=6K7gB=el,B6MLY2FLL,5m;%MP6Ӛ9ю|QgܧZe=;t@̞[=]ܨ72 x$Md3)ɑgRdM}㌬2́&AQUM:3CmuڸqEdZIdkTըJUXNySVF)PdXU鷋r{k\L?'GMbI4zz {bf2Nٚ_NS~{+uE>*Ӊ;Bz nA"E>r.Bvqw'RUrW+֗9o>tN(/Cv5O_z!&uSGzYw]zY,golѾvTm{vcRx~3|!._0!?y ~|Өyw^}-zҗ{G}Izַ>z}%{~ǽ=~?|?L'~5Eq7w~/Q_[_>ܭz[>kLj Wݗ_Oxmoqzu3f$Bs1 @jzO[ /谜1l@ Os@?2} |˴YKDcCE|6F L$9JĿNECbPDE++ULWc JѣHo]`iDIB@AUVb*`f Kvزhn5 YZ];jݵQ9`SMJ <K*ЮW!/dɔ/[Jgg<6iϛQk^}:t֬Mfo\  N|x]ȓԭ"УK>9ũt!СOӫ_Ͼ㗧N_9sݯWaw!w5PwF&Xᅈav!"X(zHb,>b0b4XG:R=*ȣaBIdHLP86H%V^颖3ee^~Pb^DfhyTWŵipŔJxCwBp%Z[rmYWɒpqFjDq7ގNyynwJy2Ȕ9ؗ)K}1V*무@+d)RYWX}"ZYnu,Eqb-т+~+Wv-rGgnm9/_tv ɟ:i?Z߿&pB'6 GHKg2oGY{ Ǭ)\1O@-DmH'L7PG-TWmu \7]_ܴd%mؒ]Mc]u[UMXyA|Fm[o8Vnef)ކo9;j_Kys .;q~oGp/K,ꦯ]춭}|qCk]؃܇|}O=~;}~'z=1GzYӊ pe*)c ۪s e~ϒmJIrIrW@#-5$HqP13]Nw, Q@1sʡwHX[4"惱I[gbU7d4z^h~ɢE j[HrUч%jD?w95nJx.SdF$!u*fce^ÚGڈdFG2/RHjAЀILSkĩDKzɴSbDu ʚ.R-*zԞ!g@תֶvj\Ň(ʫWկ}k`*X%bX•&Id+ɞY{EB́a %i֜X< Jf4-{#*n70|]n>qNb1oHJ(O'2 S%7y/ejyU›SX_c^3*T1zLq 5LʍX13V'&XwZT:gn&A:h~WG4<mrUf xGHArA 2ϦOm&ѽre UQ. Wņ1.V\BК7=#?ܪ&8iK1x]}otHP D]@M`a:#M`[ek6O8*p|י^酴!l}Ǚ?p1uM\/uiJ+I8˃[bG/Ϲma~Z$րo`AwXAk;B縇D#7T7]#"H]qk;f#l,uEYwd[cxn9GWɬ_l|5IShGOқOWֻgOϽweu!b:2vU\_q:gumM{k:Oߝ~qqE&1~XBV5{q*q2l}rlb,0(X}XׇPm#i{")6,G%h,.y%XSW(.XX^b{X$LrH!#U-JdI&mHgugKVsVCETM(CI!fmf=@\hSfnMHIhU7h7&SiXIk8g؅>BrvvxRRM$SBt8X*xn{|phhрGX9hX&hȇgcצ~(wa7N(xƘȌ5h&׈`ָӍ4ٸqaH3Ĥi4@F);v`W^"7rqr,Grڵt2G/CsBv_;bYPw['Vt@;ut!)s Ci-x\ yĒɇsw呫8b$qweP䤔OÔCc &RYezh 7_mij 7ۄc8^ v^z9!|UCb'5NYzE3ebf<%Y%9zy%9uId|LXƕSfo BUfn՚ qI׉gaCP "Q}cSUAbٗ٣wVril|Ne8JAU-fٕSG/f)?xB?#W؈(Qew蝹@ e0hiҟf@(%k#(Ƞ8yTY h6eh# %Aw7r@"Cgvz+ZP:(t1ZiM7ש]ȣ+iuyɡf f!zy urZoҏ:I49Tp˷Eg:4HwuJZ50kJxuK:9t6;{-sx 1jsag6=tjJ&ɺ1v7:7[VkSg;[KX[${u h=F*ktIv߫cM4m59yic+Gt%k[(G;鋿 c!aKʽ>(ZIW:zZ?fxKL x˕,nteZ׹)x" [v! qn[,|¹e[}kywE|{@\v,JlI<~JOZ&i*`1\|5RfgzdT%gjh`1&AFk) hD>*^@*^U_i ^vږ\W*5]vUd'[zJ봓V/[fa;fjg-נfJEj+k,lK 7f* qGVx1gb1pQnHOM_OLi.K 5yh&lYcs8 %9L2+=͝QeU\]}X͗VUi_ s~MN:ob6pznoM]}o}hZ51{*ޅ*k-Qއ+8k(ު@2+( bVbGu.W妋Ny7KTۏ79tY_A?k 6^cϵ}F]}wDqi FS(Ëɞߴ$vctnNjS#A.9ˁ+!BH `H8̡w@H@;junit-3.8.2/doc/cookstour/cookstour.htm0000644000175000017500000011255610402050446017205 0ustar mkochmkoch JUnit: A Cooks Tour

JUnit A Cook's Tour


1. Introduction

In an earlier article (see Test Infected: Programmers Love Writing Tests, Java Report, July 1998, Volume 3, Number 7), we described how to use a simple framework to write repeatable tests. In this article, we will take a peek under the covers and show you how the framework itself is constructed.

We carefully studied the JUnit framework and reflected on how we constructed it. We found lessons at many different levels. In this article we will try communicate them all at once, a hopeless task, but at least we will do it in the context of showing you the design and construction of a piece of software with proven value.

We open with a discussion of the goals of the framework. The goals will reappear in many small details during the presentation of the framework itself. Following this, we present the design and implementation of the framework. The design will be described in terms of patterns (surprise, surprise), the implementation as a literate program. We conclude with a few choice thoughts about framework development.

2. Goals

What are the goals of JUnit?

First, we have to get back to the assumptions of development. If a program feature lacks an automated test, we assume it doesnt work. This seems much safer than the prevailing assumption, that if a developer assures us a program feature works, then it works now and forever.

From this perspective, developers arent done when they write and debug the code, they must also write tests that demonstrate that the program works. However, everybody is too busy, they have too much to do, they dont have enough time, to screw around with testing. I have too much code to write already, how am I supposed write test code, too? Answer me that, Mr. Hard-case Project Manager.

So, the number one goal is to write a framework within which we have some glimmer of hope that developers will actually write tests. The framework has to use familiar tools, so there is little new to learn. It has to require no more work than absolutely necessary to write a new test. It has to eliminate duplicated effort.

If this was all tests had to do, you would be done just by writing expressions in a debugger. However, this isnt sufficient for testing. Telling me that your program works now doesnt help me, because it doesnt assure me that your program will work one minute from now after I integrate, and it doesnt assure me that your program will still work in five years, when you are long gone.

So, the second goal of testing is creating tests that retain their value over time. Someone other than the original author has to be able to execute the tests and interpret the results. It should be possible to combine tests from various authors and run them together without fear of interference.

Finally, it has to be possible to leverage existing tests to create new ones. Creating a setup or fixture is expensive and a framework has to enable reusing fixtures to run different tests. Oh, is that all?

3. The Design of JUnit

The design of JUnit will be presented in a style first used in (see "Patterns Generate Architectures", Kent Beck and Ralph Johnson, ECOOP 94). The idea is to explain the design of a system by starting with nothing and applying patterns, one after another, until you have the architecture of the system. We will present the architectural problem to be solved, summarize the pattern that solves it, and then show how the pattern was applied to JUnit.

3.1 Getting started- TestCase

First we have to make an object to represent our basic concept, the TestCase. Developers often have tests cases in mind, but they realize them in many different ways-

  • print statements,
  • debugger expressions,
  • test scripts.
If we want to make manipulating tests easy, we have to make them objects. This takes a test that was only implicit in the developers mind and makes it concrete, supporting our goal of creating tests that retain their value over time. At the same time, object developers are used to, well, developing with objects, so the decision to make tests into objects supports our goal of making test writing more inviting (or at least less imposing).

The Command pattern (see Gamma, E., et al. Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, Reading, MA, 1995) fits our needs quite nicely. Quoting from the intent, "Encapsulate a request as an object, thereby letting you queue or log requests" Command tells us to create an object for an operation and give it a method "execute". Here is the code for the class definition of TestCase:

public abstract class TestCase implements Test {
   
}
Because we expect this class to be reused through inheritance, we declare it "public abstract". For now, ignore the fact that it implements the Test interface. For the purposes of our current design, you can think of TestCase as a lone class.

Every TestCase is created with a name, so if a test fails, you can identify which test failed.

public abstract class TestCase implements Test {
    private final String fName;

    public TestCase(String name) {
        fName= name;
    }

    public abstract void run();
       
}

To illustrate the evolution of JUnit, we use diagrams that show snapshots of the architecture. The notation we use is simple. It annotates classes with shaded boxes containing the associated pattern. When the role of the class in the pattern is obvious then only the pattern name is shown. If the role isnt clear then the shaded box is augmented by the name of the participant this class corresponds to. This notation minimizes the clutter in diagrams and was first shown in (see Gamma, E., Applying Design Patterns in Java, in Java Gems, SIGS Reference Library, 1997) Figure 1 shows this notation applied to TestCase. Since we are dealing with a single class and there can be no ambiguities just the pattern name is shown.

Figure 1 TestCase applies Command

3.2 Blanks to fill in- run()

The next problem to solve is giving the developer a convenient "place" to put their fixture code and their test code. The declaration of TestCase as abstract says that the developer is expected to reuse TestCase by subclassing. However, if all we could do was provide a superclass with one variable and no behavior, we wouldnt be doing much to satisfy our first goal, making tests easier to write.

Fortunately, there is a common structure to all tests- they set up a test fixture, run some code against the fixture, check some results, and then clean up the fixture. This means that each test will run with a fresh fixture and the results of one test cant influence the result of another. This supports the goal of maximizing the value of the tests.

Template Method addresses our problem quite nicely. Quoting from the intent, "Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure." This is exactly right. We want the developer to be able to separately consider how to write the fixture (set up and tear down) code and how to write the testing code. The execution of this sequence, however, will remain the same for all tests, no matter how the fixture code is written or how the testing code is written.

Here is the template method:

public void run() {
    setUp();
    runTest();
    tearDown();
}
The default implementations of these methods do nothing: protected void runTest() {
}

protected void setUp() {
}

protected void tearDown() {
}

Since setUp and tearDown are intended to be overridden but will be called by the framework we declare them as protected. The second snapshot of our tour is depicted in Figure 2.

Figure 2 TestCase.run() applies Template Method

3.3 Reporting results- TestResult

If a TestCase runs in a forest, does anyone care about the result? Sure- you run tests to make sure they run. After the test has run, you want a record, a summary of what did and didnt work.

If tests had equal chances of succeeding or failing, or if we only ever ran one test, we could just set a flag in the TestCase object and go look at the flag when the test completed. However, tests are (intended to be) highly asymmetric- they usually work. Therefore, we only want to record the failures and a highly condensed summary of the successes.

The Smalltalk Best Practice Patterns (see Beck, K. Smalltalk Best Practice Patterns, Prentice Hall, 1996) has a pattern that is applicable. It is called Collecting Parameter. It suggests that when you need to collect results over several methods, you should add a parameter to the method and pass an object that will collect the results for you. We create a new object, TestResult, to collect the results of running tests.

public class TestResult extends Object {
    protected int fRunTests;

    public TestResult() {
       fRunTests= 0;
    }
}

This simple version of TestResult only counts the number of tests run. To use it, we have to add a parameter to the TestCase.run() method and notify the TestResult that the test is running: public void run(TestResult result) {
    result.startTest(this);
    setUp();
    runTest();
    tearDown();
}
And the TestResult has to keep track of the number of tests run: public synchronized void startTest(Test test) {
    fRunTests++;
}
We declare the TestResult method startTest as synchronized so that a single TestResult can collect the results safely when the tests are run in different threads. Finally, we want to retain the simple external interface of TestCase, so we create a no-parameter version of run() that creates its own TestResult: public TestResult run() {
    TestResult result= createResult();
    run(result);
    return result;
}

protected TestResult createResult() {
    return new TestResult();
}

Figure 3 shows our next design snapshot.

Figure 3: TestResult applies Collecting Parameter

If tests always ran correctly, then we wouldnt have to write them. Tests are interesting when they fail, especially if we didnt expect them to fail. Whats more, tests can fail in ways that we expect, for example by computing an incorrect result, or they can fail in more spectacular ways, for example by writing outside the bounds of an array. No matter how the test fails we want to execute the following tests.

JUnit distinguishes between failures and errors. The possibility of a failure is anticipated and checked for with assertions. Errors are unanticipated problems like an ArrayIndexOutOfBoundsException. Failures are signaled with an AssertionFailedError error. To distinguish an unanticipated error from a failure, failures are caught in an extra catch clause (1). The second clause (2) catches all other exceptions and ensures that our test run continues..

public void run(TestResult result) {
    result.startTest(this);
    setUp();
    try {
        runTest();
    }
    catch (AssertionFailedError e) { //1
        result.addFailure(this, e);
    }

    catch (Throwable e) { // 2
        result.addError(this, e);
    }
    finally {
        tearDown();
    }
}

An AssertionFailedError is triggered by the assert methods provided by TestCase. JUnit provides a set of assert methods for different purposes. Here is the simplest one: protected void assertTrue(boolean condition) {
    if (!condition)
        throw new AssertionFailedError();
}
The AssertionFailedError is not meant to be caught by the client (a testing method inside a TestCase) but inside the Template Method TestCase.run(). We therefore derive AssertionFailedError from Error. public class AssertionFailedError extends Error {
    public AssertionFailedError () {}
}
The methods to collect the errors in TestResult are shown below: public synchronized void addError(Test test, Throwable t) {
    fErrors.addElement(new TestFailure(test, t));
}

public synchronized void addFailure(Test test, Throwable t) {
    fFailures.addElement(new TestFailure(test, t));
}

TestFailure is a little framework internal helper class to bind together the failed test and the signaled exception for later reporting. public class TestFailure extends Object {
    protected Test fFailedTest;
    protected Throwable fThrownException;
}
The canonical form of collecting parameter requires us to pass the collecting parameter to each method. If we followed this advice, each of the testing methods would require a parameter for the TestResult. This results in a "pollution" of these method signatures. As a benevolent side effect of using exceptions to signal failures we can avoid this signature pollution. A test case method, or a helper method called from it, can throw an exception without having to know about the TestResult. As a refresher here is a sample test method from our MoneyTest suite. It illustrates how a testing method doesnt have to know anything about a TestResult: public void testMoneyEquals() {
    assertTrue(!f12CHF.equals(null));
    assertEquals(f12CHF, f12CHF);
    assertEquals(f12CHF, new Money(12, "CHF"));
    assertTrue(!f12CHF.equals(f14CHF));
}
JUnit comes with different implementations of TestResult. The default implementation counts the number of failures and errors and collects the results. TextTestResult collects the results and presents them in a textual form. Finally, UITestResult is used by the graphical version of the JUnit Test Runner to update the graphical test status.

TestResult is an extension point of the framework. Clients can define their own custom TestResult classes, for example, an HTMLTestResult reports the results as an HTML document.

3.4 No stupid subclasses - TestCase again

We have applied Command to represent a test. Command relies on a single method like execute() (called run() in TestCase) to invoke it. This simple interface allows us to invoke different implementations of a command through the same interface.

We need an interface to generically run our tests. However, all test cases are implemented as different methods in the same class. This avoids the unnecessary proliferation of classes. A given test case class may implement many different methods, each defining a single test case. Each test case has a descriptive name like testMoneyEquals or testMoneyAdd. The test cases dont conform to a simple command interface. Different instances of the same Command class need to be invoked with different methods. Therefore our next problem is make all the test cases look the same from the point of view of the invoker of the test.

Reviewing the problems addressed by available design patterns, the Adapter pattern springs to mind. Adapter has the following intent "Convert the interface of a class into another interface clients expect". This sounds like a good match. Adapter tells us different ways to do this. One of them is a class adapter, which uses subclassing to adapt the interface. For example, to adapt testMoneyEquals to runTest we implement a subclass of MoneyTest and override runTest to invoke testMoneyEquals.

public class TestMoneyEquals extends MoneyTest {
    public TestMoneyEquals() { super("testMoneyEquals"); }
    protected void runTest () { testMoneyEquals(); }
}
The use of subclassing requires us to implement a subclass for each test case. This puts an additional burden on the tester. This is against the JUnit goal that the framework should make it as simple as possible to add a test case. In addition, creating a subclass for each testing method results in class bloat. Many classes with only a single method are not worth their costs and it will be difficult to come up with meaningful names.

Java provides anonymous inner classes which provide an interesting Java-specific solution to the class naming problem. With anonymous inner classes we can create an Adapter without having to invent a class name:

TestCase test= new MoneyTest("testMoneyEquals ") {
    protected void runTest() { testMoneyEquals(); }
};
This is much more convenient than full subclassing. It preserves compile-time type checking at the cost of some burden on the developer. Smalltalk Best Practice Patterns describes another solution for the problem of different instances behaving differently under the common heading of pluggable behavior. The idea is to use a single class which can be parameterized to perform different logic without requiring subclassing.

The simplest form of pluggable behavior is the Pluggable Selector. Pluggable Selector stores a Smalltalk method selector in an instance variable. This idea is not limited to Smalltalk. It is also applicable to Java. In Java there is no notion of a method selector. However, the Java reflection API allows us to invoke a method from a string representing the methods name. We can use this feature to implement a pluggable selector in Java. As an aside, we usually dont use reflection in ordinary application code. In our case we are dealing with an infrastructure framework and it is therefore OK to wear the reflection hat.

JUnit offers the client the choice of using pluggable selector or implementing an anonymous adapter class as shown above. To do so, we provide the pluggable selector as the default implementation of the runTest method. In this case the name of the test case has to correspond to the name of a test method. We use reflection to invoke the method as shown below. First we look up the Method object. Once we have the method object we can invoke it and pass its arguments. Since our test methods take no arguments we can pass an empty argument array:

protected void runTest() throws Throwable {
    Method runMethod= null;
    try {
        runMethod= getClass().getMethod(fName, new Class[0]);
    } catch (NoSuchMethodException e) {
        assertTrue("Method \""+fName+"\" not found", false);
    }
    try {
        runMethod.invoke(this, new Class[0]);
    }
    // catch InvocationTargetException and IllegalAccessException
}
The JDK 1.1 reflection API only allows us to find public methods. For this reason you have to declare the test methods as public, otherwise you will get a NoSuchMethodException.

Here is the next design snapshot, with Adapter and Pluggable Selector added.

Figure 4: TestCase applies either Adapter with an anonymous inner class or Pluggable Selector

3.5 Dont care about one or many - TestSuite

To get confidence in the state of a system we need to run many tests. Up to this point JUnit can run a single test case and report the result in a TestResult. Our next challenge is to extend it so that it can run many different tests. This problem can be solved easily when the invoker of the tests doesnt have to care about whether it runs one or many test cases. A popular pattern to pull out in such a situation is Composite. To quote its intent "Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly." The point about part-whole hierarchies is of interest here. We want to support suites of suites of suites of tests.

Composite introduces the following participants:

  • Component: declares the interface we want to use to interact with our tests.
  • Composite: implements this interface and maintains a collection of tests.
  • Leaf: represents a test case in a composition that conforms to the Component interface.
The pattern tells us to introduce an abstract class which defines the common interface for single and composite objects. The primary purpose of the class is to define an interface. When applying Composite in Java we prefer to define an interface and not an abstract class. Using an interface avoids committing JUnit to a specific base class for tests. All that is required is that the tests conform to this interface. We therefore tweak the pattern description and introduce a Test interface: public interface Test {
    public abstract void run(TestResult result);
}
TestCase corresponds to a Leaf in Composite and implements this interface as we have seen above.

Next, we introduce the Composite participant. We name the class TestSuite. A TestSuite keeps its child tests in a Vector:

public class TestSuite implements Test {
    private Vector fTests= new Vector();
}
The run() method delegates to its children: public void run(TestResult result) {
    for (Enumeration e= fTests.elements(); e.hasMoreElements(); ) {
        Test test= (Test)e.nextElement();
        test.run(result);
    }
}

Figure 5: TestSuite applies Composite

Finally, clients have to be able to add tests to a suite, they can do so with the method addTest:

public void addTest(Test test) {
    fTests.addElement(test);
}
Notice how all of the above code only depends on the Test interface. Since both TestCase and TestSuite conform to the Test interface we can recursively compose suites of test suites. All developers can create their own TestSuites. We can run them all by creating a TestSuite composed of those suites.

Here is an example of creating a TestSuite:

public static Test suite() {
    TestSuite suite= new TestSuite();
    suite.addTest(new MoneyTest("testMoneyEquals"));
    suite.addTest(new MoneyTest("testSimpleAdd"));
}
This works fine, but it requires us to add all the tests to a suite manually. Early adopters of JUnit told us this was stupid. Whenever you write a new test case you have to remember to add it to a static suite() method, otherwise it will not be run. We added a convenience constructor to TestSuite which takes the test case class as an argument. Its purpose is to extract the test methods and create a suite containing them. The test methods must follow the simple convention that they start with the prefix "test" and take no arguments. The convenience constructor uses this convention, constructing the test objects by using reflection to find the testing methods. Using this constructor the above code is simplified to: public static Test suite() {
    return new TestSuite(MoneyTest.class);
}
The original way is still useful when you want to run a subset of the test cases only.

3.6 Summary

We are at the end of our cooks tour through JUnit. The following figure shows the design of JUnit at a glance explained with patterns.

Figure 6: JUnit Patterns Summary

Notice how TestCase, the central abstraction in the framework, is involved in four patterns. Pictures of mature object designs show this same "pattern density". The star of the design has a rich set of relationships with the supporting players.

Here is another way of looking at all of the patterns in JUnit. In this storyboard you see an abstract representation of the effect of each of the patterns in turn. So, the Command pattern creates the TestCase class, the Template Method pattern creates the run method, and so on. (The notation of the storyboard is the notation of figure 6 with all the text deleted).

Figure 7: JUnit Pattern Storyboard

One point to notice about the storyboard is how the complexity of the picture jumps when we apply Composite. This is pictorial corroboration for our intuition that Composite is a powerful pattern, but that it "complicates the picture." It should therefore be used with caution.

4. Conclusion

To conclude, lets make some general observations:

  • Patterns

  • We found discussing the design in terms of patterns to be invaluable, both as we were developing the framework and as we try to explain it to others. You are now in a perfect position to judge whether describing a framework with patterns is effective. If you liked the discussion above, try the same style of presentation for your own system.
  • Pattern density

  • There is a high pattern "density" around TestCase, which is the key abstraction of JUnit. Designs with high pattern density are easier to use but harder to change. We have found that such a high pattern density around key abstractions is common for mature frameworks. The opposite should be true of immature frameworks - they should have low pattern density. Once you discover what problem you are really solving, then you can begin to "compress" the solution, leading to a denser and denser field of patterns where they provide leverage.
  • Eat your own dog food

  • As soon as we had the base unit testing functionality implemented, we applied it ourselves. A TestTest verifies that the framework reports the correct results for errors, successes, and failures. We found this invaluable as we continued to evolve the design of the framework. We found that the most challenging application of JUnit was testing its own behavior.
  • Intersection, not union

  • There is a temptation in framework development to include every feature you can. After all, you want to make the framework as valuable as possible. However, there is a counteracting force- developers have to decide to use your framework. The fewer features the framework has, the easier it is to learn, the more likely a developer will use it. JUnit is written in this style. It implements only those features absolutely essential to running tests- running suites of tests, isolating the execution of tests from each other, and running tests automatically. Sure, we couldnt resist adding some features but we were careful to put them into their own extensions package (test.extensions). A notable member of this package is a TestDecorator allowing execution of additional code before and after a test.
  • Framework writers read their code

  • We spent far more time reading the JUnit code than we spent writing it, and nearly as much time removing duplicate functionality as we spent adding new functionality. We experimented aggressively with the design, adding new classes and moving responsibility around in as many different ways as we could imagine. We were rewarded (and are still being rewarded) for our monomania by a continuous flow of insights into JUnit, testing, object design, framework development, and opportunities for further articles.
The latest version of JUnit can be downloaded from ftp://www.armaties.com/D/home/armaties/ftp/TestingFramework/JUnit/.

5. Acknowledgements

Thanks to John Vlissides, Ralph Johnson, and Nick Edgar for careful reading and gentle correction. junit-3.8.2/doc/cookstour/Image2.gif0000644000175000017500000000467210402050446016235 0ustar mkochmkochGIF89a,@H*\ȰÇ#JHŋ3jȱǏ CIɓ("HRʖ0c$2!.q@<YsD3*tiǦNJuŪ$X+WZzvزbӚ],۵oEKU~Ew^~+ -x$VE]LS]2ZC+<0ң=sVͨQNm3?ݶݧɾNȓ+_μr!W y:4#[w7 /L铑j,tz%/ +\Ͼ׽Pս_~t &F(VhfaZxQ9AvK'h%"D Ha(c)<@I7hؒJƤbh9I֓S6ԁ(%pK&vژY@VF&cj~&9cVus̙F衈&Z\oadCH,"i)~#Umi}o*D>F\f]Zވ k; 6F+VkfۨjR-J E{฿.DOP첺}/HT:|0H ;~r rV %Cp<Mʵq0,&NԲYyXk^_w&3lzEtc"ugf'jz֜֙5yu}N".ZY*jfzqHK3m#VWM\]W}kv٩G+)"3'wrJ9YjktoXyܼK%;nidMOzeFfGjjz=ۭz/o H^ YLsdر3rTґEE b$TTAn'I{ (]*W 78/qP0a 9H0 hۏzB谈1Dt5%O_;ĉL$W_KEuq[U(Fy0xZ~63ťcH!phx#8qyd)@B*"G R!E,򒐄4){yI5oq$ F~1FO 4R,JSڔ2+$7B J$hˤ5S DT]3= $ &9)(R5aӦٚiaK;i4ɞF 05><\<~~3f?M CyѳER&JУ写Kin43 C͓l)6ڣFIԢ:=RԦ:uq̀JXͪVգqJdϺJֲլ}hs#g\U~֣!xB=B Wv/wym4Rv]r[;㱊LYS_T_hYqgi DszNa@'RZS[ah*.ͭnY ҂NsmXl0V-55mtre%lc:XFw!o%r>7}-q8?=ۃ\pRԹU`5WM_y˳M0t+7{ GLZ;junit-3.8.2/doc/cookstour/Image3.gif0000644000175000017500000000560210402050446016230 0ustar mkochmkochGIF89aE,E@H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗$P&͛8sO>jshСT:ϓOuJ2*UVj1+ת1f*!ٲ%ώe(ХmV)ݤE]H߿ LaHy 4Φ#+~8reƓ%CmE8ҡS=xQO3_^ٲK9${Ɖ#_{}^tֳޮ;wY|vSܷ@߃-| W_|7`~&_} oE%Z݆qa ~(b RșeI&-X+p4bZ\ը<@)DiH&L6$EE)TVyؓXx_ٌY6Zlz1%\f:ך8y=!IVwAjbgRcs~_P"OxN^(\hhXgF^eQifl娞vzggKզ*X8D$"u$hl[[IכWT` ˟˟[Y:T6lu͆X0tFJkvv/h5hf;20,4l8<@-DmtY.ѷݼ4,5Vڗɚs B>=dg3iv@rmdh*5\o]Jr~<ƹkiHR]{]l(!1>\%v:!^5.wH{ٳLqT(N|qm]5萣Ѓ }8qNݱB=#!Ro]7ܽ=߷?~>Uב݇arN?| v-V֡#Ru:  )p^zPJ(. ^V e0( וsUkC]JdNE/B"ik(Ɗf_6]]2W|#FMIȂa!?HRhCmp!RG;fRN$(&RL*WV򕰌,gIZ̥.w^ 0ILLz %2IedZ.A%Fs1?mufCmnO^4NQ8Murg"1]R G&}l&B ̅2T1#Y E=ٷd A!лnf~3)&:R%H.Yh(ݧ8y29zXHzS I:ݒy״'9ES1)渶eu[6ǖIA5RMVIt+]%7:ΫrPVJ!.];=ۊԗZer-\7}骓 IeW]5V4SUMcmij}vIdcRTf kZ^5m{}e:rUA\ ik(dn@ =no(;F^.r0M$` cAAJpYꅯ|_l$kGYEV 28pCvdﵯ VF0`FnHnc1 -z7 /N=2Dˁf0|w t?+FEDIt.[֗$8r 0(U@:@s|Lg!Á̮Byx3L8)f+_b07p|7? U(drtil5+ BmNzѩF t-zՊ. J EaAF1w`{,`΂e?涺gYq53c}o~;Ƿ -Aڷ\.p?[F%N!fKpI<&gO9vT^򕻼0GesbMdMݴŭ-?ri.C.E-Ao:-uwҲĺuޥzQNhOpZ@;junit-3.8.2/doc/changes21.html0000644000175000017500000000705110402050446015045 0ustar mkochmkoch JUnit 2

Summary of Changes between 1.0 and 2.1

The focus of this release was to refactor parts of the framework and to make it more consistent. In addition, we have simplified the writing and running of tests.
  • We renamed the package prefix for all junit classes from "test" to "junit."
  • This version extracts test suites automatically. TestSuite now provides a constructor TestSuite(Class theClass). This constructor adds all the methods from the given class starting with "test" as test cases to the suite. This avoids you having to update the suite method manually when adding a new test. For example, the suite() method of the VectorTest can now be written as:
    • public static Test suite() {
        return new TestSuite(VectorTest.class);
      }
  • Several new assert methods were added:
    • assertNotNull(Object object)
    • assertNotNull(String message, Object object)
    • assertNull(Object object)
    • assertNull(String message, Object object)
    • assertSame(Object actual, Object expected)
    • assertSame(String message, Object actual, Object expected)
    • fail()
    • fail(String message).
  • Exceptions during setUp() and tearDown() are now caught and reported.
  • A warning is now given when a TestCase class isn't public or has no test methods.
  • All the assert methods are now public.
  • Both the batch and the interactive TestRunner no longer require that the Test class provides a static suite() method. If there is no suite method all the public void methods starting with "test" and no arguments are run (see above). There is a new variation of the graphical TestRunner (junit.ui.TestRunner) the LoadingTestRunner. The LoadingTestRunner uses a custom class loader to reload user classes for each test run. This avoids that the TestRunner tool needs to be restarted for each run. The old TestRunner attempted to address this by making assumptions about the garbage collection of classes which were not portable.  In particular, the old scheme would not work at Notice, in an environment with dynamic object migration support or hot code updating like VisualAge for Java this isn't an issue.

  • There, the environment takes care of updating the code and objects run by the TestRunner. When using JUnit with VisualAge for Java, just use the standard junit.ui.TestRunner.
  • When the graphical TestRunner is run under Visual Age for Java there is an additional run button to rerun a failed test. This is typically used to set a breakpoint in the test method and to rerun it under the debugger.
  • The TestRunners support the command line option -c TestClassName. This allows you to run them  as VisualAge for Java tools.

  • Once you have JUnit installed as a VAJ tool you can select the Test class and run its tests from a VAJ menu (see how to run JUnit as a VisualAge for Java tool).
  • The batch TestRunner supports a runAndWait method to run a suite and wait until the user types RETURN.

junit-3.8.2/doc/cookbook/0000755000175000017500000000000010402050446014207 5ustar mkochmkochjunit-3.8.2/doc/cookbook/logo.gif0000644000175000017500000000170410402050446015640 0ustar mkochmkochGIF89a& ! ,&@HD#B(1 b(ѠE C,Ñ(KrHE/3tQI(mn̙Seŏ?<9TC'4h͖JD0hTX{N%!ή jҊ)wz'Χ3R-JnۥbE.W{;գU~D;q@;junit-3.8.2/doc/cookbook/IMG00001.GIF0000644000175000017500000003303010402050446015532 0ustar mkochmkochGIF89aBAB$s,s(s0{!8(k0s!XhaEA `p DY4"D@h12-l!/]I.Fу@x@J$Ri O aj Wd*K MFpֈ1F̨w3f8yd 'K1!ĉ)C2P0S DM%ӦDQ]1U`O2ecc2!s8! Q>L2͛A2 ndbw3s1M7屼…=4`2Mh-pᅁpk0r|Qalġv  2(@쬓O=T><@@Z  G.5E xҕ"9pI*җ0a 4pә9OlQp&%PRP T]V֠d Y0hZ4ho]UC^}fا9cBf8Ph~Vڬ9DQ+kvk:VmY1VklW\q5;Y<,tQGufagyrQD{'}wD'o;hᅽ"x` B评k|q_Q0 H"1&R):<5֣c*T>ϏiPB CKN$ eF!sJ,[p$C0?K>Y7OY^@R+`L8yF&6(qS ^0e|JU5A*,d D6Qˤ&m}L@x`TB UdT  ^%+J"kW]f6rœq`gM+: 0FlYg Ó3u) wdy@н ~y_:" / yF81 H2ѫC"eobQ;axcH$ +SҤTfHDҳdK`b2 i \ZOz"@Mjrj4>MkZWB-j [Ά6/z3„J1qL&S3Hqlh`7Xܲ46sԪεH}'urzֳtn]]~ @KЂ5<šB"؊R`RhlȦJ2*+BKr38 h\RiiMkQ$MY)Zӟ(훉"R(Jхm/aYC9o;gC n;jB r *'hVl?FڎhV7Σs\wp𝾂/`ȓv!I$wm]M4^n `j\UYZ}VZ\kF _Veb>Grtx8\#G4tȖBHin$u֙p3UDLzCyk^s:<Lu+²"%ui]kLd? 3'1)fU5m~eeAZi6mm:κ1; ǥA\jB P>Co#o9YDk4~;]y6~v~ @R!`:e߬]Ϲw~8"H])ԋӃR U iUC̘$3ET*+L%L/LڴR;.]/ ,Y{kFĊ bNͰ1{Vٞvhs5m^6BmjZVZmu]wܪQUeo.z$RŅ~eʥooe<s!0wm]gg]5ggӳyy|VT^^TJGBK2r+31`"Q`t`B`EV54;amLMW#AEaݔtNXOgN(kp#C,6Yr774Y#83+Q v<Pqv59e,lvJ9dFn`Qw~e8\\;< xrffhxpUy]ȁx1IDq)gh5hzqhh >H"?V?bKi>%@F@F8|6j MjXjVA}HWk('dXؗXօ07'N@lC7@VDΦ~VLDm,ئmBZ,dcTFnrD!oyD;HZ H\f(p]+y᠉nyV=""Tp hTEUP r)3r6hr8(3a-/GL4`H̤sn5stִaGaޤtXt&vN(&u+67buzSOh_G#vbOePvBkWdQ w%-%x7ewQw[&x$ňx͵Rx"]2 G1h]=%?U=7"'J317>C>U'$\%{SKv{X%,{!%h5k%|fjLA8'u|z||^#kXi(JG6٨kۗNYbelhyYhDZ+EG,Ud|n%n7Q-fwFGu/yo\/f0X0؁;y)^"%JTŚ!r`3_%7KǓTi<3@3 |HIX=WaOZ#W9 VBXtNgN'6d cbeXgxOikh8mcK?ftHdw8ILFnQ:Yeu"^ֈaBf j?Xi?'Ci8h7WujjPjAYXBx}k-bP:8$~*?l'+DQmRT޶E[`DnX[gF: G[(wѐ H/oxJp2گ٨Z1 J#J597Y$'K AK*, !`VK|0aLGL7Ԕ)M@GMS }F'}Y NKוI ua٤DVgX7}u6OXOp)>F5jPmǗrewwY}eq#Ex%ux(UH)s10j#rԃp"rM>##U9KfU`Wgjș|GWT8gBŝ_蝒Uᇖɚla~͆HDim)[d݊U+E R[ ˕R]HlpP{؛ڻI; [蛾껾˽۾; [{[|, 9 <S"I L<L*, # L(-\6|+L'<2@Bl \g= HCLEF HT\Kl)"(V`%|\<\ҠÈ`$̉l Lgnj<hp|̐?%L } -S,MS ] Ƽ߬ >L&}ә8_ <@=,D}H+lLP="T},X٫\`=.ӊzhjlnpr=t]v}xz| r p0}؈؊،؎ْؐ=ٔ]ٖ}ٟ٘ٚ0 mؤ]ڦ}ڨڪڬھٗ ymg}۸ۺۼ۾ ͙-I}ȝʽтMۖg]}؝0˙ @ަmʍ  =ݣ}  (  .~M*ϓnˑ@-=)b &.} .0n,3.: 9- NCFNnE4N/CNPHUB~O.d^-\@^p_ q.L.uUXNxn^>|^f~舞 h4MmnM^>+[>"~{.*256>^ n"-~䧐IN.V^ 줰Ӭ -=与5>&Tnܞ.轮#Ҏ3-No.>/+.wz.s" .خo /?2h 3:]m0#LŏY/M1M?O̿'oЌuuuŗɝƚȢ˟ΔǴ޶Ξȕg*\ԹwԵY%jqb6 #4k&*:"B;V۪f&jɫx]{e)㝇vJ.'04hɻS&8Vɔ1 l 0,|7u%%4l8<@-DmDdL7>-TXXgu"WoLw d&vhXj\g-_MxCew|~.xmn vGxWn9W_f%MdJX25x\ӄJ#";P.{V??QFrI 6$ɓO@C)pO=+ԃx#)o}>k9oyOO:8 qcK>$ 2%p-3J"`gRP  A0 !A $ A}aZAU/\!'vP'B~ a)BLd^Fwdd)J$X0N: <'R΅LePPVք%L`)Z*e9p^bqIHD,2!BȾcv2=\3="V$ӞI n< 4i&INu IEs"1S';i 6ɑmjh;%Cx]̧ !;KEMwM"0YP+6޼ʧY.MixӞfɧ@ OԡէF=NT2}*T)թV%V˺` XJֲhMZֶp\J׺xͫ^únxU6 `KMb?CJd#KZf3zhCKњ=jSպ}lcKږ%l pKMr:ЍtKZ.rKf xKM/t Wn)n|;W/}wqk^50tWoy1S/p \xn@3W'Na׸(p غ1.gW,q5@B8?)AJL؄NMh03bPXVxXZ83RhT`b8d4]W_Xjlcxn8tXvȃp(bH8w؇~X!5{xyHLJo8ӈxL!2x W82ȉ؊>c 9芴X85rx:6ыxȈx88*xhS Ќ֘8`TĈ@H؎JhOx >X95hQI ِfױ@'yCR"97)D!I,ْN_D:ȋ8ۈ ɋ9qؓFɐB*GٔETɎP99RUȉ{5V鸃\9!EZIjyXpYm vs;7y|Hoٗyy b9 :똘 )uYI Ɇ{ Uj ٚ9Yi9 6y7Yyƙ[y"[^ԩYXFWٜҙy≝i❱؛1 "FY9bHR;n9Zt F6y7ڠ)X Z7F@iJYވ^Ѣ$ZI6,G$3JvBʡ+W@Z8:7?J! KI ڤXʠݩãUʤN JWku _lڦnpr*VW:vڡiʥWէ~dzIzj/ )sxYtHȴ[s:Zz* |:::z0) ]75)Z)ø1_9c ٚ:4ت303j3:P2H0ں 7H ߚj@*:3K k{k+ 0ۮ!۱ :Z%;K*[ ʲ8K3 D *@ ʴJK8A{H+ڳB< FKW)R۱Bk*[L;k˲۵iqgb1{uk?;V e+ j[{  n[h۷{ڳ[d|۷+k뷅+{e[;Kd۷,ʞz+K;;ۻ›nQۼK ;{ :뺥;k٫9kq>ii+F{^9[ѫ{K 뺼۽;k( | L ,:` !kK[1|3|kä;K9,;'k)|tՊK*˹TܹL LlĔ+a>L3c 8+k˲{{Yp۶ Lȧ{\G[(F(m J H~,^#T+\֐ɀЀ]9n+-˚?U} }3~ބNn4WYu[R>h>[|}i\H tk>u-}O~BL}mуr|чtlH>UA J<P^3Xn4=2cIڀ0^ =K*fӡ7;C@}4YZ^ȿ/|M]-ͱ,F^t\Ջ[nK >`}](N›9#맘,؏i@نM=%/利 y}Δj^,=ǵ-n ?l=]d]2˫ׄl:c9}=ߐ0/UM7.S_([aL4ՇmݏnknKtԞimH qL%!|NA,N(, o׈>l,-ʌnΐ5hoK4߬_ռK/?ϟ<߮à|}-xџ]nRB]yE uuκӤߊڔְLTWk \&D ]&zacΟ8M tN߰Bɓ(6KZ-m3X޺8k3Mo:k(O1q.V5LLhƫj5!ҜZ{.HّfQ]r1i/HKjR\MJn%  p=W*2WȘ%6Y$ي^drS|1lCR9^1`ޜM֑c~>jޕyg},]bٱkc/+ ꗈYݭ1_ȧOo_Ôy?uQ69U`9GuцIwexi{FWGԈ XaM~,Xbmf}k wVH!y,ea?dC028O><ך-4XTɔ+"j]UZw%Y"G BYof䟀*蠄jKu!hw~g|b褔Vj饞vJZ< iEzjꩨꪬ"'*Z{ꭸ뮼^r2ʪj&쟿&'kVk6[в%-f%IK $i&ZJܘ.romڶd&}{+; Pp*L0 ct0HuH'<Jq`n^D㔒L=nt2Pp ]֙TYl~#sD=WRÏ9][ٯΒLLbv$" vh Nw`Si -77Xvm%]h\u^-bpggb݁f61-"eOC_!'fJ ['u`\dQO&9H6"Mm:3\~ݍ֫<.^{ĝndN_QB/~]98!TZ\T:]a <t><܇Ĉ@7AGuZ mJM(,f&U{hC8e;m%1oh-Fi5zРI Ka(;a닝C%?b9g6э+di71.kyϣFq^У.A^p1qF:" EIZ"=&r٣(Gi*idL%*W9XTaX̥'%^\I'e X~2|ԥ2f2.&4{I@ |*M t|$;ys@Z}B7Pjp# f(8;іɡ ZHyLNw*і.uGa'FtRȕE'QgNj1LͪVUO>W}%UikbuhMx ֶ.4$,hRku^Z͢6ժo l!Mb:d'K^,9X\V!GKҚMjWֺlg[Ƚڶ?ŇhEMMU :=+tK*UͮvOr ngiMzuiفnͯ~ 7<*I*1Cw5L ¡j{X8!爭Q/֦hblʸ6f!Ocp[ ~w"/1C >&1) cksmg;P-XǶ$Ls׭_u)e/AL JUnit Cookbook

JUnit Cookbook

Kent Beck, Erich Gamma



Here is a short cookbook showing you the steps you can follow in writing and organizing your own tests using JUnit.

Simple Test Case

How do you write testing code?

The simplest way is as an expression in a debugger. You can change debug expressions without recompiling, and you can wait to decide what to write until you have seen the running objects. You can also write test expressions as statements which print to the standard output stream. Both styles of tests are limited because they require human judgment to analyze their results. Also, they don't compose nicely- you can only execute one debug expression at a time and a program with too many print statements causes the dreaded "Scroll Blindness".

JUnit tests do not require human judgment to interpret, and it is easy to run many of them at the same time. When you need to test something, here is what you do:

  1. Create a subclass of TestCase.
  2. Override the method runTest()
  3. When you want to check a value, call assertTrue() and pass a boolean that is true if the test succeeds
For example, to test that the sum of two Moneys with the same currency contains a value which is the sum of the values of the two Moneys, write:
public void testSimpleAdd() {
    Money m12CHF= new Money(12, "CHF"); 
    Money m14CHF= new Money(14, "CHF"); 
    Money expected= new Money(26, "CHF"); 
    Money result= m12CHF.add(m14CHF); 
    assertTrue(expected.equals(result));
}
If you want to write a test similar to one you have already written, write a Fixture instead. When you want to run more than one test, create a Suite.

Fixture

What if you have two or more tests that operate on the same or similar sets of objects?

Tests need to run against the background of a known set of objects. This set of objects is called a test fixture. When you are writing tests you will often find that you spend more time writing the code to set up the fixture than you do in actually testing values.

To some extent, you can make writing the fixture code easier by paying careful attention to the constructors you write. However, a much bigger savings comes from sharing fixture code. Often, you will be able to use the same fixture for several different tests. Each case will send slightly different messages or parameters to the fixture and will check for different results.

When you have a common fixture, here is what you do:

  1. Create a subclass of TestCase
  2. Add an instance variable for each part of the fixture
  3. Override setUp() to initialize the variables
  4. Override tearDown() to release any permanent resources you allocated in setUp
For example, to write several test cases that want to work with different combinations of 12 Swiss Francs, 14 Swiss Francs, and 28 US Dollars, first create a fixture:
public class MoneyTest extends TestCase { 
    private Money f12CHF; 
    private Money f14CHF; 
    private Money f28USD; 
    
    protected void setUp() { 
        f12CHF= new Money(12, "CHF"); 
        f14CHF= new Money(14, "CHF"); 
        f28USD= new Money(28, "USD"); 
    }
}
Once you have the Fixture in place, you can write as many Test Cases as you'd like.

Test Case

How do you write and invoke an individual test case when you have a Fixture?

Writing a test case without a fixture is simple- override runTest in an anonymous subclass of TestCase. You write test cases for a Fixture the same way, by making a subclass of TestCase for your set up code and then making anonymous subclasses for the individual test cases. However, after a few such tests you would notice that a large percentage of your lines of code are sacrificed to syntax.

JUnit provides a more concise way to write a test against a Fixture. Here is what you do:

  1. Write a public void method in the fixture class. By convention, the name of the method begins with "test".
For example, to test the addition of a Money and a MoneyBag, write:
public void testMoneyMoneyBag() { 
    // [12 CHF] + [14 CHF] + [28 USD] == {[26 CHF][28 USD]} 
    Money bag[]= { f26CHF, f28USD }; 
    MoneyBag expected= new MoneyBag(bag); 
    assertEquals(expected, f12CHF.add(f28USD.add(f14CHF)));
}
Create an instance of of MoneyTest that will run this test case like this:
new MoneyTest("testMoneyMoneyBag")
When the test is run, the name of the test is used to look up the method to run.

Once you have several tests, organize them into a Suite.

Suite

How do you run several tests at once?

As soon as you have two tests, you'll want to run them together. You could run the tests one at a time yourself, but you would quickly grow tired of that. Instead, JUnit provides an object, TestSuite which runs any number of test cases together.

For example, to run a single test case, you execute:

TestResult result= (new MoneyTest("testMoneyMoneyBag")).run();
To create a suite of two test cases and run them together, execute:
TestSuite suite= new TestSuite();
suite.addTest(new MoneyTest("testMoneyEquals"));
suite.addTest(new MoneyTest("testSimpleAdd"));
TestResult result= suite.run();
Another way is to let JUnit extract a suite from a TestCase. To do so you pass the class of your TestCase to the
TestSuite constructor.
TestSuite suite= new TestSuite(MoneyTest.class);
TestResult result= suite.run();

Use the manual way when you want a suite to only contain a subset of the test cases. Otherwise the automatic suite extraction is the preferred way. It avoids you having to update the suite creation code when you add a new test case.

TestSuites don't only have to contain TestCases. They contain any object that implements the Test interface. For example, you can create a TestSuite in your code and I can create one in mine, and we can run them together by creating a TestSuite that contains both:

TestSuite suite= new TestSuite();
suite.addTest(Kent.suite());
suite.addTest(Erich.suite());
TestResult result= suite.run();

TestRunner

How do you run your tests and collect their results?

Once you have a test suite, you'll want to run it. JUnit provides tools to define the suite to be run and to display its results. You make your suite accessible to a TestRunner tool with a static method suite that returns a test suite.
For example, to make a MoneyTest suite available to a TestRunner, add the following code to MoneyTest:

public static Test suite() { 
    TestSuite suite= new TestSuite(); 
    suite.addTest(new MoneyTest("testMoneyEquals")); 
    suite.addTest(new MoneyTest("testSimpleAdd")); 
    return suite;
}
Or, as a shortcut:
public static Test suite() { 
    return new TestSuite(MoneyTest.class); 
}

If a TestCase class doesn't define a suite method a TestRunner will extract a suite and fill it with all the methods starting with "test".

JUnit provides both a graphical and a textual version of a TestRunner tool. Start it by typing java junit.awtui.TestRunner or junit.swingui.TestRunner. The graphical user interface presents a window with:

  • a field to type in the name of a class with a suite method,
  • a Run button to start the test,
  • a progress indicator that turns from green to red in the case of a failed test,
  • a list of failed tests.
In the case of an unsuccessful test JUnit reports the failed tests in a list at the bottom. JUnit distinguishes between failures and errors. A failure is anticipated and checked for with assertions. Errors are unanticipated problems like an ArrayIndexOutOfBoundsException. The following figure shows an example of a failed test.


You have to restart the graphical interface each time you change the code. This is tedious and time consuming. As an alternative JUnit's AWT and Swing UIs use junit.runner.LoadingTestCollector . This LoadingTestCollector reloads all your classes for each test run. This feature can be disabled by unchecking the 'Reload classes every run' checkbox. The most common JUnit problem is that many packages want to use their own class loader. Include such packages in excluded.properties. See the FAQ for details.

There is a batch interface to JUnit, also. To use it typejava junit.textui.TestRunner followed by the name of the class with a suite method at an operating system prompt. The batch interface shows the result as text output. An alternative way to invoke the batch interface is to define a main method in your TestCase class.

For example, to start the batch TestRunner for MoneyTest, write:

public static void main(String args[]) { 
    junit.textui.TestRunner.run(suite());
}
With this definition of main you can run your tests by simply typing java MoneyTest at an operating system prompt.

For using either the graphical or the textual version make sure that the junit.jar file is on your CLASSPATH.


junit-3.8.2/doc/testinfected/0000755000175000017500000000000010402050446015062 5ustar mkochmkochjunit-3.8.2/doc/testinfected/logo.gif0000644000175000017500000000170410402050446016513 0ustar mkochmkochGIF89a& ! ,&@HD#B(1 b(ѠE C,Ñ(KrHE/3tQI(mn̙Seŏ?<9TC'4h͖JD0hTX{N%!ή jҊ)wz'Χ3R-JnۥbE.W{;գU~D;q@;junit-3.8.2/doc/testinfected/IMG00001.GIF0000644000175000017500000001443210402050446016412 0ustar mkochmkochGIF89a6@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,6 H*\ȰÇ#JHŋ3jܨmBIɓ(S\ɲ˗0cʜI͛8s#H[@ JѣH*]ʴӧPJJիXV֯`ÊKٳhri+۷pʝKݻx˷߿ L6@IpA,˘3k̹|dd^ͺװ5@nEwz;dGN?2\ܶ=sZ྅ $atC"OJ}{ѥwع[+>p~whށ&zIރ={BQ8}֘~q 蘀 #Ɨ "`QDآ^(uoq_@^%~G"PQ/PPiLaޙs9`hhݏkQiy5z0ʘWI!rv1ʦi饖MiTC][ !YZJfJ&͉*j`i~:afhߛ!gRsNNV[`*,VKBVlҚv+:`\{XJ*k;zz7ߍHwn"lvwܱG̱sz,sn͜-K/wDmt_BL7PG=RWmXg58n`-]mhSepǍurmxcEw|{-x'xԇ/㐃ԕn]#5y35F~_gκS#c^Fz4N:V:o<̧ީ i+:~:Л?߻Zϭ??>.u_7:)P~ l'/;UP~d` |A9p~`1H児۠٣ gBrp4/ nЁ+ PzU_8D0[H/H@6bx7vqpK`iІZc =Y3|G_{!X;mr̤&Mzi$(GIʭLNV,|,gyXl-s^.싾 0L.L2f:Ќ4IjF1^ Nl׸ 8IrL:yNd#鉋)*m̧>Osk 7驛~MBuO݋O֋(D'*ъR$&tEz A5D,A3$Җ0m Iд(hPѐ&MLJ~j&NwzԂ="6XISeCt(5ݡ rӁɚ%XVsڢ˵`]{ ,xƱ Ko⽎n 0ʖN/Ή#{|Ҧ-gFHzr~*& 4aSϺs.|*w4ßCr*fڮlѿY/q3/oj??@bM7WB$0ؠBRXbrءRוz$p+آ/3X7☣;أ?XU'YG"K2dBVESRYWbPR%_cf%q *"k٦ohT^Yw≤Qљ{:է"hfBj*2(SRh)E2)ꑨꡧJjGZu'z.:"엹I*F2`-i-DNA {mr.8{бF4{.11" ˭[ܰ)PkPmCk˱ɶzl <2|̥z\ ~w'9vE D(`6<3F)P4̙v| H|Y9`sz㜊 oB!qv̘J҇~sr!OMs4x&$Τ}Hlu&Ѕ\TM_Lp&Tb \I0}la"{++pbYA8)Y)*QD-^ĘQF3OG%MDRJ-[9L5męSC#wTP6{,TRMuUTU-BUVEvVX_ɞEVmAkݾ+m\u{W^eCXy F B隃9dq'0Sq?n 0;tk1ȔBH#/"H%l(I&')Ē+䒾-/$ӱ1D0`M7߄3N9礳N;3O=O?4PAd05C4QEeQG4RI'RK/4SM70'TQG%TSOE5UUWeUW_5VYgV[ouSCd&\6Xa%XcUW@EYg6Zi-U٪6[mh ׅ|\sE7QMN\U7^yXvr7!x_+l&`7faMةbW/3fjcG&`}KfyOVJdgBMkghaNJf&ޛ٠fY*iBrjaZǥj65&hivZlFmmn;o ooɖk/YpFqE·~p/m6s?=t?WiP(u{?~goM/ly^'?~ /}tr義Ђ"va>PyD2h:Ё{adЄLa:Li^g(CHPz,uV-@ :цcbiA7QQ2{%Ģ Hc 7D&285U+Ilg`AmSaC!F8bE1fԸcGA^hm$QT%I,2fH7qԹgOG4ْhQ/i& OOF:jå$պ Jg2MXlYgNZM[oƕ;\Ie~Mo_-paÇ'Vx^]G<\1gn2A=ZagͧQs3iׯa56Wzcֽڿ˛xq}W,ϡCOãgמ{zn?^tw3'_kGٺ}}RO}]6  ,LPl!Ы( - 5= E,\M?s)Eb2FqQyB'Qk+߄$R% nB{),?//Ĭ*,3r0+)*(I6鬓=!3R3JTQA-H9%K3 UTN'RuRNtS2 QieSqEWUWeZ5-tVO{S`O]T^M/~%6Zi]fu?l_5kMem)+r\l˭yWmE7uU߅%1%X^bθaNz I.QNYYɍaxcpYy矁瘉fmn駡Zꩩ+F)˽X.{N[V;YM\ wǻޖ!\)1WI{I0>뜞|p}E(T+9%1C/|[=@/Qw` 텯W \`+_KGkx_! 5ABP S?|! ]ZJ8|aǹ/;T h{5t! DNOQ(Abш9>xB/qIXdXDn H@po"/b+U\hiϏģ!4r\$)=)y u}Lcb8ޑd(1yJFN҃BԊ5x2nRq$,'@)fЎ}< ^0mt#YJZҘd LiZll {xZ.Qa&]p~whށ&zIރ={BQ8}֘~q 蘀 #Ɨ "`QDآ^(uoq_@^%~G"PQ/PPiLaޙs9`hhݏkQiy5z0ʘWI!rv1ʦi饖MiTC][ !YZJfJ&͉*j`i~:afhߛ!gRsNNV[`*,VKBVlҚv+:`\{XJ*k;zz7ߍHwn"lvwܱG̱sz,sn͜-K/wDmt_BL7PG=RWmXg58n`-]mhSepǍurmxcEw|{-x'xԇ/㐃ԕn]#5y35F~_gκS#c^Fz4N:V:o<̧ީ i+:~:Л?߻Zϭ??>.u_7:)P~ l'/;UP~d` |A9p~`1H児۠٣ gBrp4/ nЁ+ PzU_8D0[H/H@6bx7vqpK`iІZc =Y3|G_{!X;mr̤&Mzi$(GIʭLNV,|,gyXl-s^.싾 0L.L2f:Ќ4IjF1^ Nl׸ 8IrL:yNd#鉋)*m̧>Osk 7驛~MBuOti$&tEZͨA*-"h4JҒ-(<RtCIEC2Sk6(ͩNҫT-/eZQس,ANԚ4)4**.SGjҴ^G*VU$5mHZV6pUVrUF֏)UނUdb `kVug=aظ:'h ʩjEXאSi`&5mI ־8[+EQ(yE8%i AkXYK^h =5%8$mE[l%,qKMs׻SK Pwc ^vEq_8=}|gasaįZ[^I2]ζ .YEn \ر$P)dTHLK7NzZ^ūL*ۄM*촬V_U,^-[6N;3,R7pnɒzMB 5=2#ΐv3Ii44-wNӞ5(A-RgԦN5 ml,h „ 2l!Ĉ'Rh"ƌ7r옱 =,i$ʔ*Wlȁ.gҬi&Μ:'РBSfѤJ2mJӨRRj*CZZ+ؙX0X6,ڴj 铬Yen5;W-\ 7/k,޼t&1Ɛ Sly["8g_.mrf'nbҰOӮ6hͬ?/;§⎫z7ޑAC=9n-b;9o7oᄄO>t (txx.D : J8!Zx!j!z!!!u]G8)"-"18#5x#9#=#%Zu"Ey$I*$M(dUD:9%UZy%Y%URj%a9f\B(&mfJ%uy'Hy'S} z(I~h&J:)2e(j)RIrz*z:Ѩ(B:+*QC+~',Ɏ9,ŚtJ[%:[jFQܚ{nBP;*ۢ>k)"D0;D$1+pCx)1rjBS\Zl%r3̩38 -3ӳm3ADp-4֪f$AROo=5٩>}m^ Y6Zom,6U}7 >8~8+8;8KFrr YrB0Ry?CvWD魻zy.`_ /_^+];\KoZ[OYkV{mKFŞDõM}uƕ^9tG;QY?.w c," v#AL!# K@ͤ51zRh ѧB p#Ck(}q QRA7IDob~A]ڲș[f9h۵EMΛ_&[wSW'ͼ`/Gճ8TWcn{_.oiT9B_;ހ}>R a^~݄-C'V\7]s",$f*gMX vfV|-RhBiED %PdT9eXxe\ҷe`ed:6fhYlp)tix|矀*( fx&袌6裐F*餔Vj饘fա*ꨤjꩨꪬ꫰*무j뭮zj +k챳j6F+*[d--ߊږkz;қn v mSWؾ.,* ꮸ믩BL.+k2lmx.|q6/1 L4O7lr+'ײB/wsrPT GLߨ/Nӄ?Noyފ~{3N;G0E~ˮZ7\n{K_{?;k >ߚ>u/|旳٘'玾çKUڧ= uMl]>ɏ~\9mx[8?0~ˠ6:wΓY w/p[lH#_Sh|]4jX*6CZ {K!ט8-krW'zc&D0Z(GgXVl 5>rڣRXF:򑐌Cm̤&7Nz (GIRL*)>&,gIZ%)Y,$ 0Ibe\`"Ќ4YLe Œ̦6nnϚA7Irs8vJO zДIX -z Mh' ~Jə D#2n顾dD'ю޳HGJҒ(-)HzPz0='HyQ8Lo@Py_fsͩRZ D$IQ5zT&Xj-wLUUJֲr}IM[:Vj 5l+\WD*ULs-#E%jCYJ~e_+d'ͤ,\fU=+SU]ig{ZBHO!"XV nNQܺg yQG{Y:>Y–.G{#Mo[j.N[X.MKUlg`AmSaC!F8bE1fԸcGA^hmTeKDhr`˙!qԹgO?n$GQ&ETiSOڊi3P7fպkW_Z%YeYf^ZS-XoƕUl6wջo_|SR)3\Ç'V-I!G:αzwޯg_?mǗz}{׿p}񃏿 ˿ p%i! ) 1P 9Lim!Q" Dn"{$15#TS7dtO=ųK1qSsTRW<YCFGYMPXQԂ"a Z=Usز҄YavKYVZq}=W7UKuscSuJ7s6{ö]veQUt]`W~ex)N_Θĉ+ۇǭXٌd`|=f$|YiqYg<猷y{[裑NZ饙n駛YꅗWӖAZ뭹[챹\L[mDx[nܞn;ռot[ 2O\q_!W)<-\[A]I/O751o%a]iq]61-.'tBor%e^uuȡGų/v@w%eiH[2}7w(Xcߖg?X,;UP%9Ū ā(A B0 9ATUw`,  ł!zC, IC#Lb _8,D%TJ#ρAd%1d$#hF(QBtcTq`dH1K wHB(F>fІptA+1٢YH/R,$ CM1T# ILna%=GEr$J\*r,-Q 'URp$ULLrHl ?SfSCjL=6|T7IaRdb#3|:DϢٓ§~_2BPXԴPnRz<{QnG3:,I9T*eKRts2M)gStq:O SoB%QfT.mSUNUUIm]WVUk3Yњ;junit-3.8.2/doc/testinfected/IMG00003.GIF0000644000175000017500000001355010402050446016414 0ustar mkochmkochGIF89a @ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,  H*\ȰÇ#JHŋ3jȱǏɓ(S\ɲ˗0cʜI͛8sɳϟ@ F$I[H*]ʴӧPJJիXjʵׯ`ÊK֢#]˶۷pʝKݮh ߿ LÈ+^̸ǐ#KL˘3/FW)'zIͨS^ͺװc˞Q|Q6 N1E&G_i27mZtسkν wa:K}:~;.98߯xԼ ږ6^ӕ^o!'!{EXe_T(!%R'}vZ`ƈᄈG$SC"YbR*u^m,2HaQ%tby%_&e|Jcj衫ԙKG nv4'{N _}qjd6(D"fI9zYN8 ka2*jbjκ}kkbdž+nm l(knjV;jz:Hc#j:J^Kb)W n ®sD$lc,,R0p1|xV<3_ -t@-b7O?7ӲI TW we\w`bmhZp-tvx|߀.uw'G.ڎOngVw砛4n騧ꬷ.n{-o'7G/WozޢCu/o==@o>/oRQ+ H<_1'H [ڇAD9IB'9KDĒ6,, Mx07DɀDCȇ??ЈD! whD%3ԉ }(RQKa#Xb-O™o `˨'qe<h;QgTDARqL#P9H::" ߉\&C-Na x?"$b wQ e*[YHZVё&u)HR\fA ?ҏN\f&ge3yLҚה0OYYrtf.)(]ҁf8YH;2D$2 Ov^9>QNeJҔ?jP>6ԛL>I(.󛉬'? ̀Ft(4ѓVad&ϙЌ\g2IcRӥ0iK Ln̦:sL󧳼iHsGVJt3hcF.ԨiFGʑ6Le fsԔNMk9Rvħ-9ymzҗ4? bխjVjRXNL(.ؿs]C#GBդIXJ=/UyWzv%NkZӪVBe!YZUlINBMjڤ6K)[ UmwQԵ=dMyVwiqңlTFUjj[L*1`K[eŮAڵgwc_SuL2[J0ʽ6NU1_ Nt,GJؖp0- .i-&dB*>)ArI"%`3u|crflCu$YL:x̽<π ЈNɧ?O{'MJ[Z&\~!MF .ӌT Ƥ~wN %{Puj5!li^!ӳ2Lj_x1j][6C#L2/%c T/eykb[px P}Aky9ٚ+.}o%p@VЂfsܣst1}jzG -iU0Ta ԙ| _[ T+]Tw)aԘiN߄ȶ4? 6tbD *XqE)ZF&4$J*1v cK/At&I#qc͜3agK<{NtjTS 4x BX&Bc S(Z5]tۛoֵ -]y%J_98dқyu2`Ub#wy21ŋxE}4cJuiل3vbu&;eOJmzo{PөW偔3ozxɗ7yͳW^<)W+x޽;/@ J+;% -02>.E 3$H+绯K|e+۰iܑ}q?SGerqKjњ|,&|6$l'!!.G,I##tO˗,.7k7 <\H"I'{B =51AOH\NMC-%JA1uT7J:D/sISCTdX{N0TQA00 t 6+ػX/iӫ\}ZvŔ N0ljU|HZ"1]lD]g9lm5PjQkך_lWy-6^a̯L2CR+4,8muՔ+ 9QIWڏ\MUNW=Oh?EM%Z^Q#Ur_ gyi}i^*Nau`}^ȖNgFvn1w؍{ڬkY>o}5wnQ޻l^~V\-ۚM[HURL4N_u=yv׉EA>s]5\!+w{h$xWsߞɚ@/z볇_}?۟/x0@zⷢ $.R] дp-z: 8YJ'X5_Hn:ܜt79Md[#CH*V'J RZTy5.eR xMk4U:X8kbvE)Y_JԄ"͈B8lix*.97<WA:p'|ʑ7\ #G7qa^s9ysAЉ^,΋ml,h D!Ĉ'Rh"ƌ7r#Ȑ"G,*S\%̗/ND&Dp2t8p!>M-j(ҤJ2m:Rg̨2RU3hOy Ʉ` JpӴjײm-܆AҭjwUgRzЫ_yk0Ċ#Zݘf kM˖j1ТGv2xr6ksج%sҺw;lw'<;9MUmnެ3'ϩ(Ǔ//.zNq7o>_]E$w9 *z9ҁVD`wYEXj[=-۴q")-"18#5x#9#=#A 9d^ן45$QJ9%UZy%Yj%]z%a9&e j9w q9'uy'y'}' :(z(*(7`}H:)Zz)j)z):*z**q8+ + ;,X,*k:,-ZZj-Թ-Q{yz\ߢ.ԨvnNkًܱ 'kޭ>??W??(2| #( RT;junit-3.8.2/doc/testinfected/testing.htm0000644000175000017500000007531010402050446017257 0ustar mkochmkoch Test Infected:

JUnit Test Infected: Programmers Love Writing Tests


Testing is not closely integrated with development. This prevents you from measuring the progress of development- you can't tell when something starts working or when something stops working. Using JUnit you can cheaply and incrementally build a test suite that will help you measure your progress, spot unintended side effects, and focus your development efforts.

Contents

The Problem

Every programmer knows they should write tests for their code. Few do. The universal response to "Why not?" is "I'm in too much of a hurry." This quickly becomes a vicious cycle- the more pressure you feel, the fewer tests you write. The fewer tests you write, the less productive you are and the less stable your code becomes. The less productive and accurate you are, the more pressure you feel.

Programmers burn out from just such cycles. Breaking out requires an outside influence. We found the outside influence we needed in a simple testing framework that lets us do a little testing that makes a big difference.

The best way to convince you of the value of writing your own tests would be to sit down with you and do a bit of development. Along the way, we would encounter new bugs, catch them with tests, fix them, have them come back, fix them again, and so on. You would see the value of the immediate feedback you get from writing and saving and rerunning your own unit tests.

Unfortunately, this is an article, not an office overlooking charming old-town Zürich, with the bustle of medieval commerce outside and the thump of techno from the record store downstairs, so we'll have to simulate the process of development. We'll write a simple program and its tests, and show you the results of running the tests. This way you can get a feel for the process we use and advocate without having to pay for our presence.

Example

As you read, pay attention to the interplay of the code and the tests. The style here is to write a few lines of code, then a test that should run, or even better, to write a test that won't run, then write the code that will make it run.

The program we write will solve the problem of representing arithmetic with multiple currencies. Arithmetic between single currencies is trivial, you can just add the two amounts. Simple numbers suffice. You can ignore the presence of currencies altogether.

Things get more interesting once multiple currencies are involved. You cannot just convert one currency into another for doing arithmetic since there is no single conversion rate- you may need to compare the value of a portfolio at yesterday's rate and today's rate.

Let's start simple and define a class Money to represent a value in a single currency. We represent the amount by a simple int. To get full accuracy you would probably use double or java.math.BigDecimal to store arbitrary-precision signed decimal numbers. We represent a currency as a string holding the ISO three letter abbreviation (USD, CHF, etc.). In more complex implementations, currency might deserve its own object.

class Money {
    private int fAmount;
    private String fCurrency;
    public Money(int amount, String currency) {
        fAmount= amount;
        fCurrency= currency;
    }

    public int amount() {
        return fAmount;
    }

    public String currency() {
        return fCurrency;
    }
}
When you add two Moneys of the same currency, the resulting Money has as its amount the sum of the other two amounts.
public Money add(Money m) {
    return new Money(amount()+m.amount(), currency());
}
Now, instead of just coding on, we want to get immediate feedback and practice "code a little, test a little, code a little, test a little". To implement our tests we use the JUnit framework. To write tests you need to get the latest copy JUnit (or write your own equivalent- it's not so much work).

JUnit defines how to structure your test cases and provides the tools to run them. You implement a test in a subclass of TestCase. To test our Money implementation we therefore define MoneyTest as a subclass of TestCase. In Java, classes are contained in packages and we have to decide where to put MoneyTest. Our current practice is to put MoneyTest in the same package as the classes under test. In this way a test case has access to the package private methods. We add a test method testSimpleAdd, that will exercise the simple version of Money.add() above. A JUnit test method is an ordinary method without any parameters.

public class MoneyTest extends TestCase {
    //
    public void testSimpleAdd() {
        Money m12CHF= new Money(12, "CHF");  // (1)
        Money m14CHF= new Money(14, "CHF");        
        Money expected= new Money(26, "CHF");
        Money result= m12CHF.add(m14CHF);    // (2)
        Assert.assertTrue(expected.equals(result));     // (3)
    }
}
The testSimpleAdd() test case consists of:
  1. Code which creates the objects we will interact with during the test. This testing context is commonly referred to as a test's fixture. All we need for the testSimpleAdd test are some Money objects.
  2. Code which exercises the objects in the fixture.
  3. Code which verifies the result.
Before we can verify the result we have to digress a little since we need a way to test that two Money objects are equal. The Java idiom to do so is to override the method equals defined in Object. Before we implement equals let's a write a test for equals in MoneyTest.
public void testEquals() {
    Money m12CHF= new Money(12, "CHF");
    Money m14CHF= new Money(14, "CHF");

    Assert.assertTrue(!m12CHF.equals(null));
    Assert.assertEquals(m12CHF, m12CHF);
    Assert.assertEquals(m12CHF, new Money(12, "CHF")); // (1)
    Assert.assertTrue(!m12CHF.equals(m14CHF));
}
The equals method in Object returns true when both objects are the same. However, Money is a value object. Two Monies are considered equal if they have the same currency and value. To test this property we have added a test (1) to verify that Monies are equal when they have the same value but are not the same object.

Next let's write the equals method in Money:

public boolean equals(Object anObject) {
    if (anObject instanceof Money) {
        Money aMoney= (Money)anObject;
        return aMoney.currency().equals(currency())
            && amount() == aMoney.amount();
    }
    return false;
}
Since equals can receive any kind of object as its argument we first have to check its type before we cast it as a Money. As an aside, it is a recommended practice to also override the method hashCode whenever you override method equals. However, we want to get back to our test case.

With an equals method in hand we can verify the outcome of testSimpleAdd. In JUnit you do so by a calling Assert.assertTrue, which triggers a failure that is recorded by JUnit when the argument isn't true. Since assertions for equality are very common, there is also an Assert.assertEquals convenience method. In addition to testing for equality with equals, it reports the printed value of the two objects in the case they differ. This lets us immediately see why a test failed in a JUnit test result report. The value a string representation created by the toString converter method. There are other asertXXXX variants not discussed here.

Now that we have implemented two test cases we notice some code duplication for setting-up the tests. It would be nice to reuse some of this test set-up code. In other words, we would like to have a common fixture for running the tests. With JUnit you can do so by storing the fixture's objects in instance variables of your TestCase subclass and initialize them by overridding the setUp method. The symmetric operation to setUp is tearDown which you can override to clean up the test fixture at the end of a test. Each test runs in its own fixture and JUnit calls setUp and tearDown for each test so that there can be no side effects among test runs.

public class MoneyTest extends TestCase {
    private Money f12CHF;
    private Money f14CHF;   

    protected void setUp() {
        f12CHF= new Money(12, "CHF");
        f14CHF= new Money(14, "CHF");
    }
}
We can rewrite the two test case methods, removing the common setup code:
public void testEquals() {
    Assert.assertTrue(!f12CHF.equals(null));
    Assert.assertEquals(f12CHF, f12CHF);
    Assert.assertEquals(f12CHF, new Money(12, "CHF"));
    Assert.assertTrue(!f12CHF.equals(f14CHF));
}

public void testSimpleAdd() {
    Money expected= new Money(26, "CHF");
    Money result= f12CHF.add(f14CHF);
    Assert.assertTrue(expected.equals(result));
}
Two additional steps are needed to run the two test cases:
  1. define how to run an individual test case,
  2. define how to run a test suite.
JUnit supports two ways of running single tests:
  • static
  • dynamic
In the static way you override the runTest method inherited from TestCase and call the desired test case. A convenient way to do this is with an anonymous inner class. Note that each test must be given a name, so you can identify it if it fails.
TestCase test= new MoneyTest("simple add") {
    public void runTest() {
        testSimpleAdd();
    }
};
A template method[1] in the superclass will make sure runTest is executed when the time comes.

The dynamic way to create a test case to be run uses reflection to implement runTest. It assumes the name of the test is the name of the test case method to invoke. It dynamically finds and invokes the test method. To invoke the testSimpleAdd test we therefore construct a MoneyTest as shown below:

TestCase test= new MoneyTest("testSimpleAdd");
The dynamic way is more compact to write but it is less static type safe. An error in the name of the test case goes unnoticed until you run it and get a NoSuchMethodException. Since both approaches have advantages, we decided to leave the choice of which to use up to you.

As the last step to getting both test cases to run together, we have to define a test suite. In JUnit this requires the definition of a static method called suite. The suite method is like a main method that is specialized to run tests. Inside suite you add the tests to be run to a TestSuite object and return it. A TestSuite can run a collection of tests. TestSuite and TestCase both implement an interface called Test which defines the methods to run a test. This enables the creation of test suites by composing arbitrary TestCases and TestSuites. In short TestSuite is a Composite [1]. The code below illustrates the creation of a test suite with the dynamic way to run a test.

public static Test suite() {
    TestSuite suite= new TestSuite();
    suite.addTest(new MoneyTest("testEquals"));
    suite.addTest(new MoneyTest("testSimpleAdd"));
    return suite;
}
Since JUnit 2.0 there is an even simpler dynamic way. You only pass the class with the tests to a TestSuite and it extracts the test methods automatically.

public static Test suite() {
    return new TestSuite(MoneyTest.class);
}

Here is the corresponding code using the static way.

public static Test suite() {
    TestSuite suite= new TestSuite();
    suite.addTest(
        new MoneyTest("money equals") {
            protected void runTest() { testEquals(); }
        }
    );
    
    suite.addTest(
        new MoneyTest("simple add") {
            protected void runTest() { testSimpleAdd(); }
        }
    );
    return suite;
}
Now we are ready to run our tests. JUnit comes with a graphical  interface to run tests. Type the name of your test class in the field at the top of the window. Press the Run button. While the test is run JUnit shows its progress with a progress bar below the input field. The bar is initially green but turns into red as soon as there is an unsuccessful test. Failed tests are shown in a list at the bottom. Figure 1 shows the TestRunner window after we run our trivial test suite.

Figure 1: A Successful Run

After having verified that the simple currency case works we move on to multiple currencies. As mentioned above the problem of mixed currency arithmetic is that there isn't a single exchange rate. To avoid this problem we introduce a MoneyBag which defers exchange rate conversions. For example adding 12 Swiss Francs to 14 US Dollars is represented as a bag containing the two Monies 12 CHF and 14 USD. Adding another 10 Swiss francs gives a bag with 22 CHF and 14 USD. We can later evaluate a MoneyBag with different exchange rates.

A MoneyBag is represented as a list of Monies and provides different constructors to create a MoneyBag. Note, that the constructors are package private since MoneyBags are created behind the scenes when doing currency arithmetic.

class MoneyBag {
    private Vector fMonies= new Vector();

    MoneyBag(Money m1, Money m2) {
        appendMoney(m1);
        appendMoney(m2);
    }

    MoneyBag(Money bag[]) {
        for (int i= 0; i < bag.length; i++)
            appendMoney(bag[i]);
    }
}
The method appendMoney is an internal helper method that adds a Money to the list of Moneys and takes care of consolidating Monies with the same currency. MoneyBag also needs an equals method together with a corresponding test. We skip the implementation of equals and only show the testBagEquals method. In a first step we extend the fixture to include two MoneyBags.
protected void setUp() {
    f12CHF= new Money(12, "CHF");
    f14CHF= new Money(14, "CHF");
    f7USD=  new Money( 7, "USD");
    f21USD= new Money(21, "USD");
    fMB1= new MoneyBag(f12CHF, f7USD);
    fMB2= new MoneyBag(f14CHF, f21USD);
}
With this fixture the testBagEquals test case becomes:
public void testBagEquals() {
    Assert.assertTrue(!fMB1.equals(null));
    Assert.assertEquals(fMB1, fMB1);
    Assert.assertTrue(!fMB1.equals(f12CHF));
    Assert.assertTrue(!f12CHF.equals(fMB1));
    Assert.assertTrue(!fMB1.equals(fMB2));
}
Following "code a little, test a little" we run our extended test with JUnit and verify that we are still doing fine. With MoneyBag in hand, we can now fix the add method in Money.
public Money add(Money m) {
    if (m.currency().equals(currency()) )
        return new Money(amount()+m.amount(), currency());
    return new MoneyBag(this, m);
}
As defined above this method will not compile since it expects a Money and not a MoneyBag as its return value. With the introduction of MoneyBag there are now two representations for Moneys which we would like to hide from the client code. To do so we introduce an interface IMoney that both representations implement. Here is the IMoney interface:
interface IMoney {
    public abstract IMoney add(IMoney aMoney);
    //
}
To fully hide the different representations from the client we have to support arithmetic between all combinations of Moneys with MoneyBags. Before we code on, we therefore define a couple more test cases. The expected MoneyBag results use the convenience constructor shown above, initializing a MoneyBag from an array.
public void testMixedSimpleAdd() { 
    // [12 CHF] + [7 USD] == {[12 CHF][7 USD]} 
    Money bag[]= { f12CHF, f7USD }; 
    MoneyBag expected= new MoneyBag(bag); 
    Assert.assertEquals(expected, f12CHF.add(f7USD)); 
}
The other tests follow the same pattern:
  • testBagSimpleAdd - to add a MoneyBag to a simple Money
  • testSimpleBagAdd - to add a simple Money to a MoneyBag
  • testBagBagAdd - to add two MoneyBags
  • Next, we extend our test suite accordingly:
    public static Test suite() {
        TestSuite suite= new TestSuite();
        suite.addTest(new MoneyTest("testMoneyEquals"));
        suite.addTest(new MoneyTest("testBagEquals"));
        suite.addTest(new MoneyTest("testSimpleAdd"));
        suite.addTest(new MoneyTest("testMixedSimpleAdd"));
        suite.addTest(new MoneyTest("testBagSimpleAdd"));
        suite.addTest(new MoneyTest("testSimpleBagAdd"));
        suite.addTest(new MoneyTest("testBagBagAdd"));
        return suite;
    }
    Having defined the test cases we can start to implement them. The implementation challenge here is dealing with all the different combinations of Money with MoneyBag. Double dispatch [2] is an elegant way to solve this problem. The idea behind double dispatch is to use an additional call to discover the kind of argument we are dealing with. We call a method on the argument with the name of the original method followed by the class name of the receiver. The add method in Money and MoneyBag becomes:
    class Money implements IMoney {
        public IMoney add(IMoney m) {
            return m.addMoney(this);
        }
        //
    }
    class MoneyBag implements IMoney {
        public IMoney add(IMoney m) {
            return m.addMoneyBag(this);
        }
        //
    }
    In order to get this to compile we need to extend the interface of IMoney with the two helper methods:
    interface IMoney {
    //
        IMoney addMoney(Money aMoney);
        IMoney addMoneyBag(MoneyBag aMoneyBag);
    }
    To complete the implementation of double dispatch, we have to implement these methods in Money and MoneyBag. This is the implementation in Money.
    public IMoney addMoney(Money m) {
        if (m.currency().equals(currency()) )
            return new Money(amount()+m.amount(), currency());
        return new MoneyBag(this, m);
    }
    
    public IMoney addMoneyBag(MoneyBag s) {
        return s.addMoney(this);
    }
    Here is the implemenation in MoneyBag which assumes additional constructors to create a MoneyBag from a Money and a MoneyBag and from two MoneyBags.
    public IMoney addMoney(Money m) {
        return new MoneyBag(m, this);
    }
    
    public IMoney addMoneyBag(MoneyBag s) {
        return new MoneyBag(s, this);
    }
    We run the tests, and they pass. However, while reflecting on the implementation we discover another interesting case. What happens when as the result of an addition a MoneyBag turns into a bag with only one Money? For example, adding -12 CHF to a Moneybag holding 7 USD and 12 CHF results in a bag with just 7 USD. Obviously, such a bag should be equal with a single Money of 7 USD. To verify the problem let's implement a test case and run it.
    public void testSimplify() {
        // {[12 CHF][7 USD]} + [-12 CHF] == [7 USD]
        Money expected= new Money(7, "USD");
        Assert.assertEquals(expected, fMS1.add(new Money(-12, "CHF")));
    }
    When you are developing in this style you will often have a thought and turn immediately to writing a test, rather than going straight to the code.

    It comes to no surprise that our test run ends with a red progress bar indicating the failure. So we fix the code in MoneyBag to get back to a green state.

    public IMoney addMoney(Money m) {
        return (new MoneyBag(m, this)).simplify();
    }
    
    public IMoney addMoneyBag(MoneyBag s) {
        return (new MoneyBag(s, this)).simplify();
    }
    
    private IMoney simplify() {
        if (fMonies.size() == 1)
            return (IMoney)fMonies.firstElement()
        return this;
    }
    Now we run our tests again and voila we end up with green.

    The code above solves only a small portion of the multi-currency arithmetic problem. We have to represent different exchange rates, print formatting, and the other arithmetic operations, and do it all with reasonable speed. However, we hope you can see how you could develop the rest of the objects one test at a time- a little test, a little code, a little test, a little code.

    In particular, review how in the development above:

    • We wrote the first test, testSimpleAdd, immediately after we had written add(). In general, your development will go much smoother if you write tests a little at a time as you develop. It is at the moment that you are coding that you are imagining how that code will work. That's the perfect time to capture your thoughts in a test.
    • We refactored the existing tests, testSimpleAdd and testEqual, as soon as we introduced the common setUp code. Test code is just like model code in working best if it is factored well. When you see you have the same test code in two places, try to find a way to refactor it so it only appears once.
    • We created a suite method, then extended it when we applied Double Dispatch. Keeping old tests running is just as important as making new ones run. The ideal is to always run all of your tests. Sometimes that will be too slow to do 10 times an hour. Make sure you run all of your tests at least daily.
    • We created a new test immediately when we thought of the requirement that a one element MoneyBag should just return its element. It can be difficult to learn to switch gears like this, but we have found it valuable. When you are struck by an idea of what your system should do, defer thinking about the implementation. Instead, first write the test. Then run it (you never know, it might already work). Then work on the implementation.

    Testing Practices

    Martin Fowler makes this easy for you. He says, "Whenever you are tempted to type something into a print statement or a debugger expression, write it as a test instead." At first you will find that you have to create a new fixtures all the time, and testing will seem to slow you down a little. Soon, however, you will begin reusing your library of fixtures and new tests will usually be as simple as adding a method to an existing TestCase subclass.

    You can always write more tests. However, you will quickly find that only a fraction of the tests you can imagine are actually useful. What you want is to write tests that fail even though you think they should work, or tests that succeed even though you think they should fail. Another way to think of it is in cost/benefit terms. You want to write tests that will pay you back with information.

    Here are a couple of the times that you will receive a reasonable return on your testing investment:

    • During Development- When you need to add new functionality to the system, write the tests first. Then, you will be done developing when the test runs.
    • During Debugging- When someone discovers a defect in your code, first write a test that will succeed if the code is working. Then debug until the test succeeds.
    One word of caution about your tests. Once you get them running, make sure they stay running. There is a huge difference between having your suite running and having it broken. Ideally, you would run every test in your suite every time you change a method. Practically, your suite will soon grow too large to run all the time. Try to optimize your setup code so you can run all the tests. Or, at the very least, create special suites that contain all the tests that might possibly be affected by your current development. Then, run the suite every time you compile. And make sure you run every test at least once a day: overnight, during lunch, during one of those long meetings.

    Conclusion

    This article only scratches the surface of testing. However, it focuses on a style of testing that with a remarkably small investment will make you a faster, more productive, more predictable, and less stressed developer.

    Once you've been test infected, your attitude toward development is likely to change. Here are some of the changes we have noticed:

    There is a huge difference between tests that are all running correctly and tests that aren't. Part of being test infected is not being able to go home if your tests aren't 100%. If you run your suite ten or a hundred times an hour, though, you won't be able to create enough havoc to make you late for supper.

    Sometimes you just won't feel like writing tests, especially at first. Don't. However, pay attention to how much more trouble you get into, how much more time you spend debugging, and how much more stress you feel when you don't have tests. We have been amazed at how much more fun programming is and how much more aggressive we are willing to be and how much less stress we feel when we are supported by tests. The difference is dramatic enough to keep us writing tests even when we don't feel like it.

    You will be able to refactor much more aggressively once you have the tests. You won't understand at first just how much you can do, though. Try to catch yourself saying, "Oh, I see, I should have designed this thus and so. I can't change it now. I don't want to break anything." When you say this, save a copy of your current code and give yourself a couple of hours to clean up. (This part works best you can get a buddy to look over your shoulder while you work.) Make your changes, all the while running your tests. You will be surprised at how much ground you can cover in a couple of hours if you aren't worrying every second about what you might be breaking.

    For example, we switched from the Vector-based implementation of MoneyBag to one based on HashTable. We were able to make the switch very quickly and confidently because we had so many tests to rely on. If the tests all worked, we were sure we hadn't changed the answers the system produced at all.

    You will want to get the rest of your team writing tests. The best way we have found to spread the test infection is through direct contact. The next time someone asks you for help debugging, get them to talk about the problem in terms of a fixture and expected results. Then say, "I'd like to write down what you just told me in a form we can use." Have them watch while you write one little test. Run it. Fix it. Write another. Pretty soon they will be writing their own.

    So- give JUnit a try. If you make it better, please send us the changes so we can spread them around. Our next article will double click on the JUnit framework itself. We will show you how it is constructed, and talk a little about our philosophy of framework development.

    We would like to thank Martin Fowler, as good a programmer as any analyst can ever hope to be, for his helpful comments in spite of being subjected to early versions of JUnit.

    References

    1. Gamma, E., et al. Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, Reading, MA, 1995
    2. Beck, K. Smalltalk Best Practice Patterns, Prentice Hall, 1996

    junit-3.8.2/doc/JUnitProperties.html0000644000175000017500000000521610402050446016401 0ustar mkochmkoch JUnit 2

    JUnit TestRunner Properties

    The TestRunners use a properties file for preference settings. This file is stored in the folder referred to by the "user.home" system property. The following properties are supported:
     
    loading Use a custom class loader to load classes for each run. Default value=true.
    filterstack Filter JUnit internal methods in failure or error stack traces. Default value=true. 
    maxmessage The maximum output length. Default value=500. Set maxmessage to -1 to disable output truncation. Disabling the output truncation will result in long test runs when an assertEquals method fails and the toString() method results in massive output. 
    TestCollectorClass
    Swing UI TestRunner only
    The Swing TestRunner supports to browse test classes. There is an additional browse ("...") button besides the suite combo. It shows a simple dialog to select a test class from a list. Different strategies to locate Test classes are supported and you can plug-in your own strategy. This allows to leverage functionality provided by an extension API of an integrated development environment (IDE). To define a custom test collector you 1) implement the junit.runner.TestCollector interface and 2) add an entry to the junit.properties file with the key TestCollectorClass and the name of your TestCollector implementation class as the key: 
                 TestCollectorClass=junit.swingui.LoadingTestCollector 
    This class has to be installed on the class path. 
    FailureViewClass
    Swing UI TestRunner only
    Plug-in a custom failure panel that provides additional functionality like navigating from a failure to the source. To do so you implement the junit.runner.FailureDetailView interface and register the implementation class in the junit.properties file under the key FailureViewClass, for example. 
                 FailureViewClass=somepackage.MyFailureViewClassName. 
    This class has to be installed on the class path. 
    junit-3.8.2/README.html0000644000175000017500000006560310402050446013471 0ustar mkochmkoch JUnit 3.8

    JUnit 3.8.2



    11/11/2004

    Summary of Changes between 3.8.1 and 3.8.2

    The changes between the versions are minimal and the focus was on fixing the accumulated bug reports. The most signifanct change is replacing the much-reviled string comparison format with something easier to read and use.
    • ComparisonFailure shows context. 
      • assertEquals("Mary had a little lamb", "Mary had the little lamb") shows: expected:<Mary had [a] little lamb> but was:<Mary had [the] little lamb>
        Longer prefixes and suffixes are truncated to a fixed size (currently 20):
      • expected:<...st of the emergency [broadcasting] system> but was:<...st of the emergency [locating] system>
    • Running single tests.  junit.ui.TestRunner can be invoked with "-m ClassName.testName" to run a single test.
    • TestSuite(Class[]).  There is a new TestSuite constructor that takes an array of classes as a parameter and returns a suite of suites, each of which is constructed from a single class.

    Closed Bugs/Patches and Enhancment Requests

    Summary of Changes between 3.8 and 3.8.1

    Summary of Changes between 3.7 and 3.8

    Framework

    • Made the string argument TestCase constructor optional. You can now delete constructors of the form "FooTestCase(String name) { super(name); }".
    • Deleted deprecated assert(boolean) in favor of assertTrue(boolean) and assertFalse(boolean). To migrate to JUnit 3.8, rename calls to assert(boolean) to call assertTrue(boolean).
    • Added assertFalse() to avoid the difficult of reading the assertTrue(! condition).
    • Added assertNotSame(Object, Object).
    • Deleted deprecated TestCase.name() in favor of TestCase.getName().
    • Deleted deprecated package junit.ui in favor of junit.awtui.

    Test Runner

    • When you compare two long strings with a small delta embedded in the middle, it is hard to spot the difference. In 3.8, when you call assertEquals(String, String), only the differences between the strings are displayed. The common prefix and suffix are replaced with "...".
    • Added initial version of a TestRunListener attached to TestRunners which eventually will replace TestListeners attached to the TestResult.
    • Filled in ActiveTestSuite constructors.
    • Added these packages to the excluded.properties:
      • org.w3c.dom.*
      • org.xml.sax.*
      • net.jini.*
    • Extracted textual formatting of a TestResult from junit.textui.TestRunner into ResultPrinter.

    Documentation

    • Much improved FAQ thanks to Mike Clark.

    Closed Bugs

    Summary of Changes between 3.6 and 3.7

    GUI

    • Eliminated warning when re-running tests when class loading checkbox is unchecked. There are legitimate reasons for doing this, so a warning didn't make much sense, and it was too obtrusive.
    • Stopped reloading classes when running in VisualAge for Java.
    • Print total number of tests as well as number of tests run so far (Swing only).

    Framework

    • Introduced Assert.assertTrue(boolean) and assertTrue(String, boolean) deprecated assert(boolean) and assert(String, boolean) in preparation for the assert keyword in Java 1.4. We plan to support native assertions when they are publicly available. You can either move to assertTrue() or wait for 1.4 and delete parentheses as the syntax is e.g. "assert 2 == 3".
    • Added accessors for TestCase.fName and TestSuite.fName.
    • Added a no argument TestCase constructor to support serialization.
    • Improved warnings when constructing TestSuites.

    Text Runner

    • Made doRun() public so clients can create a text runner with a specified output stream and then run tests.

    Fixed Bugs (SourceForge Bug Tracker Ids)

        [420315] No trace when fail with message...
        [419375] reload warning lags
        [418849] Classloader warning too obtrusive
        [417978] constructor stack trace, please
        [415103] Reload checkbox should be ignored in VAJ
        [414954] error reporting when invoking suite()
        [407296] Make doRun() public
        [227578] rmi callbacks fail since TestCase has no noArg constructor
        [422603] Decorated decorators bug

    Summary of Changes between 3.5 and 3.6

    TestRunner

    • The UI test runners provide a check box to enable/disable the custom class loader. The user is warned when running a second test with the non loading class loader.
    • Renames to address file name length limitation on MacOS:
      • LoadingClassPathTestCollector -> LoadingTestCollector
      • SimpleClassPathTestCollector -> SimpleTestCollector

    Framework

    • Added TestSuite.getName()

    Builds

    • Updated the build script for Ant 1.3.

    Fixed Bugs (SourceForge Bug Tracker Ids)

    [ #229753 ] assertEquals on NaN and Infinity does not work correctly
    [ #229287 ] Class Name too long "SimpleClassPathTestCollector"
    [ #229609 ] Stack Filtering missing in textui.TesRunner
    [ #229870 ] Clicking on ... after tests failed gives NPE
    [ #229974 ] Incorrect icon shown for first element in Swing GUI
    [ #230581 ] swingui.TestTreeModel: results of decorated testcases...
    [ #230971 ] Make junit.extensions.TestDecorator.getTest() public
    [ #231569 ] DocBug: JUnit Test Infected: Programmers Love Writing Tests
    [ #232645 ] BaseTestRunner.getTest loses exception information
    [ #233094 ] TestSuite masks exceptions
    [ #410967 ] No icon provided for first test
    [ #230745 ] ClassPathTestCollector sometimes lists classes in duplicate

    Documentation

    • Added documentation about the properties supported by TestRunners.
    • Updated the FAQ

    Summary of Changes between 3.4 and 3.5

    Framework

    • Added TestSuite.addTestSuite(Class testClass)

    • This method allows to create a TestSuite with a class containing test cases directly.
      Instead of writing suite.addTest(new TestSuite(AssertTest.class)) you can now write suite.addTestSuite(AssertTest.class);
    • Added assertEquals methods for all primitive types: float, boolean, byte, char, int, short
    • The signature of  TestListeners.addFailure(Test test, Throwable t)

    • was changed to addFailure(Test test, AssertionFailedError t)

    TestRunner

    • The Swing TestRunner provides an experimental feature to browse test classes. There is an additional browse ("...") button besides the suite combo. It shows a simple dialog to select a test class from a list. Different strategies to locate Test classes are supported and you can plug-in your own strategy. This allows to leverage functionality provided by an extension API of an integrated development environment (IDE). To define a custom test collector you 1) implement the junit.runner.TestCollector interface and 2) add an entry to the junit.properties file with the key TestCollectorClass and the name of your TestCollector implementation class as the key:

    •         TestCollectorClass=junit.swingui.LoadingClassPathTestCollector
      This class has to be installed on the class path.
      JUnit provides two different TestCollector implementations:
      • simple (junit.runner.SimpleClassPathTestCollector) - considers all classes on the class path on the file system that contain "Test" in their name. Classes in JARs are not considered.
      • loading (junit.runner.LoadingClassPathTestCollector) - loads all classes on the class path and tests whether the class is assignable from Test or has a static suite method.
      By default the simple the test collector is used. The loading collector is more precise but much slower than the simple one. The loading collector doesn't scale up when many classes are available on the class path.
      Notice: that both TestCollectors assume that the class files reside are kept in the file system. This isn't case in VA/Java and they will not work there. A custom TestCollector is required for VA/Java.
    • The Swing TestRunner now provides an additional test result view that shows all tests of the executed test suite as a tree. The view shows the success status for each test. The view is shown as an additional tab in the TestRunner window. In previous versions of JUnit this view was shown in a separate window.
    • The failure panels in the Swing and AWT TestRunners filter the exception stack trace so that only non-framework stack frames are shown.
    • There is support to plug-in a custom failure panel that provides additional functionality like navigating from a failure to the source. To do so you implement the junit.runner.FailureDetailView interface and register the implementation class in the junit.properties file under the key FailureViewClass, for example

    •         FailureViewClass=MyFailureViewClassName.
    • The Swing and AWT TestRunners now understand an additional command line argument "-noloading". When this argument is set then the standard system class loader is used to load classes. This is an alternative to setting the loading property to false in the junit.properties file.
    • Swing TestRunner - the maximum test history length shown in the suite combo can be defined in the junit.properties file with the key maxhistory.
    • BaseTestRunner.getLoader() is no longer a static method and can now be overridden in subclasses.
    • BaseTestRunner removed dependency on JDK 1.2.
    • Swing TestRunner - fixed the problem that a suite name was sometimes duplicated in the history combo.
    • Swing TestRunner - the Run button is now the default button.
    • Output string truncation can now be controlled by adding the maxmessage key with the desired maximum length to the junit.properties file. Setting maxmessage to -1 means no output truncation.
    • The Text TestRunner now shows the summary at the very end so that you don't have to scroll back.

    Tests

    • TextRunnerTest now only depends on a nonzero status to indicate abnormal termination.
    • TextRunnerTest now also passes on JDK 1.1.*. It uses the -classpath command line argument instead of -cp.

    Documentation

    • Add an FAQ entry about what to do when the junit tests provided with the distribution can't be found.

    Older Change Notes

  • Changes between 2.1 and 3.4
  • Changes between 1.0 and 2.1
  • Contents of the Release

    README.html  this file
    junit.jar a jar file with the JUnit framework and  tools 
    src.jar a jar file with the source code of the junit framework
    junit the source code of the JUnit samples
        samples sample test cases
        tests test cases for JUnit itself
    javadoc javadoc generated documentation
    doc documentation and articles

    Installation

    Below are the installation steps for installing JUnit:
    1. unzip the junit.zip file
    2. add junit.jar to the CLASSPATH. For example: set classpath=%classpath%;INSTALL_DIR\junit3\junit.jar
    3. test the installation by using either the batch or the graphical TestRunner tool to run the tests that come with this release. All the tests should pass OK.

    4. Notice: that the tests are not contained in the junit.jar but in the installation directory directly. Therefore make sure that the installation directory is on the class path
      • for the batch TestRunner type:

      •     java junit.textui.TestRunner junit.samples.AllTests
      • for the graphical TestRunner type:

      •     java junit.awtui.TestRunner junit.samples.AllTests
      • for the Swing based graphical TestRunner type:

      •     java junit.swingui.TestRunner junit.samples.AllTests
    Important: don't install the junit.jar into the extension directory of your JDK installation. If you do so the test class on the files system will not be found.

    Getting Started

    To get started with unit testing and JUnit read the Java Report article: Test Infected - Programmers Love Writing Tests.
    This article demonstrates the development process with JUnit in the context of multiple currency arithmetic. The corresponding source code is in junit\samples\money.

    You find additional samples in the junit.samples package:

    • SimpleTest.java - some simple test cases
    • VectorTest.java - test cases for java.util.Vector

    Documentation

    JUnit Cookbook
        A cookbook for implementing tests with JUnit.
    Test Infected - Programmers Love Writing Tests
        An article demonstrating the development process with JUnit.
    JUnit - A cooks tour
    Javadoc
        API documentation generated with javadoc.
    Frequently asked questions
        Some frequently asked questions about using JUnit.
    TestRunner Preference settings
        Describes the preferences settings that can be configured for the JUnit TestRunners.
    License
        The terms of the common public license used for JUnit.

    Extending JUnit

    Examples of possible JUnit extensions can be found in the junit.extensions package:
    • TestDecorator - A decorator for Test. You can use it as the base class for implementing decorators to extend test cases.
    • ActiveTestSuite - A TestSuite which runs each test in a separate thread and waits until they are all terminated.
    • TestSetup - A Decorator to set up and tear down additional fixture state. Subclass TestSetup and insert it into your tests when you want to set up additional state once before the tests are run.
    • ExceptionTestCase - A TestCase that expects a particular Exception to be thrown.

    SourceForge Logo