Sample

Schnappinger/junit4/junit.framework.TestCase

Human rating uses the original dataset scale.

Human3.96
Lines546

Scores

MethodScoreScaleDataset rank
(0–100)
Posnett00–1; higher is more readable
31.4Δ 48.9
Scalabrino0.8920–1; higher is more readable
87.7Δ 7.3
Dorn0.0010–1; higher is more readable
11.6Δ 68.8
Mi0.6450–1; higher is more readable
71.9Δ 8.4
LLOC125Logical lines; fewer is more readable
20.1Δ 60.2
DeepSeek V4 Pro160–20; mean of three runs
47.4Δ 33.0
GPT-6.1 Sol160–20; mean of three runs
38.9Δ 41.4
BTTF0.7020–1; higher is more readable
81.8Δ 1.5
Human3.961–4; original rating
80.4

Views

Source code

package junit.framework; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * A test case defines the fixture to run multiple tests. To define a test case<br/> * <ol> * <li>implement a subclass of <code>TestCase</code></li> * <li>define instance variables that store the state of the fixture</li> * <li>initialize the fixture state by overriding {@link #setUp()}</li> * <li>clean-up after a test by overriding {@link #tearDown()}.</li> * </ol> * Each test runs in its own fixture so there * can be no side effects among test runs. * Here is an example: * <pre> * public class MathTest extends TestCase { * protected double fValue1; * protected double fValue2; * * protected void setUp() { * fValue1= 2.0; * fValue2= 3.0; * } * } * </pre> * * For each test implement a method which interacts * with the fixture. Verify the expected results with assertions specified * by calling {@link junit.framework.Assert#assertTrue(String, boolean)} with a boolean. * <pre> * public void testAdd() { * double result= fValue1 + fValue2; * assertTrue(result == 5.0); * } * </pre> * * 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. * <pre> * TestCase test= new MathTest("add") { * public void runTest() { * testAdd(); * } * }; * test.run(); * </pre> * The dynamic way uses reflection to implement {@link #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. * <pre> * TestCase test= new MathTest("testAdd"); * test.run(); * </pre> * * The tests to be run can be collected into a TestSuite. JUnit provides * different <i>test runners</i> which can run a test suite and collect the results. * A test runner either expects a static method <code>suite</code> as the entry * point to get a test to run or it will extract the suite automatically. * <pre> * public static Test suite() { * suite.addTest(new MathTest("testAdd")); * suite.addTest(new MathTest("testDivideByZero")); * return suite; * } * </pre> * * @see TestResult * @see TestSuite */ public abstract class TestCase extends Assert implements Test { /** * the name of the test case */ private String fName; /** * No-arg constructor to enable serialization. This method * is not intended to be used by mere mortals without calling setName(). */ public TestCase() { fName = null; } /** * Constructs a test case with the given name. */ public TestCase(String name) { fName = name; } /** * Counts the number of test cases executed by run(TestResult result). */ public int countTestCases() { return 1; } /** * Creates a default TestResult object * * @see TestResult */ protected TestResult createResult() { return new TestResult(); } /** * A convenience method to run this test, collecting the results with a * default TestResult object. * * @see TestResult */ public TestResult run() { TestResult result = createResult(); run(result); return result; } /** * Runs the test case and collects the results in TestResult. */ public void run(TestResult result) { result.run(this); } /** * Runs the bare test sequence. * * @throws Throwable if any exception is thrown */ public void runBare() throws Throwable { Throwable exception = null; setUp(); try { runTest(); } catch (Throwable running) { exception = running; } finally { try { tearDown(); } catch (Throwable tearingDown) { if (exception == null) exception = tearingDown; } } if (exception != null) throw exception; } /** * Override to run the test and assert its state. * * @throws Throwable if any exception is thrown */ protected void runTest() throws Throwable { assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null); Method runMethod = null; try { // use getMethod to get all public inherited // methods. getDeclaredMethods returns all // methods of this class but excludes the // inherited ones. runMethod = getClass().getMethod(fName, (Class[]) null); } catch (NoSuchMethodException e) { fail("Method \"" + fName + "\" not found"); } if (!Modifier.isPublic(runMethod.getModifiers())) { fail("Method \"" + fName + "\" should be public"); } try { runMethod.invoke(this); } catch (InvocationTargetException e) { e.fillInStackTrace(); throw e.getTargetException(); } catch (IllegalAccessException e) { e.fillInStackTrace(); throw e; } } /** * Asserts that a condition is true. If it isn't it throws * an AssertionFailedError with the given message. */ @SuppressWarnings("deprecation") public static void assertTrue(String message, boolean condition) { Assert.assertTrue(message, condition); } /** * Asserts that a condition is true. If it isn't it throws * an AssertionFailedError. */ @SuppressWarnings("deprecation") public static void assertTrue(boolean condition) { Assert.assertTrue(condition); } /** * Asserts that a condition is false. If it isn't it throws * an AssertionFailedError with the given message. */ @SuppressWarnings("deprecation") public static void assertFalse(String message, boolean condition) { Assert.assertFalse(message, condition); } /** * Asserts that a condition is false. If it isn't it throws * an AssertionFailedError. */ @SuppressWarnings("deprecation") public static void assertFalse(boolean condition) { Assert.assertFalse(condition); } /** * Fails a test with the given message. */ @SuppressWarnings("deprecation") public static void fail(String message) { Assert.fail(message); } /** * Fails a test with no message. */ @SuppressWarnings("deprecation") public static void fail() { Assert.fail(); } /** * Asserts that two objects are equal. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, Object expected, Object actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two objects are equal. If they are not * an AssertionFailedError is thrown. */ @SuppressWarnings("deprecation") public static void assertEquals(Object expected, Object actual) { Assert.assertEquals(expected, actual); } /** * Asserts that two Strings are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, String expected, String actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two Strings are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(String expected, String actual) { Assert.assertEquals(expected, actual); } /** * 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. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, double expected, double actual, double delta) { Assert.assertEquals(message, expected, actual, delta); } /** * Asserts that two doubles are equal concerning a delta. If the expected * value is infinity then the delta value is ignored. */ @SuppressWarnings("deprecation") public static void assertEquals(double expected, double actual, double delta) { Assert.assertEquals(expected, actual, delta); } /** * Asserts that two floats are equal concerning a positive 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. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, float expected, float actual, float delta) { Assert.assertEquals(message, expected, actual, delta); } /** * Asserts that two floats are equal concerning a delta. If the expected * value is infinity then the delta value is ignored. */ @SuppressWarnings("deprecation") public static void assertEquals(float expected, float actual, float delta) { Assert.assertEquals(expected, actual, delta); } /** * Asserts that two longs are equal. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, long expected, long actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two longs are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(long expected, long actual) { Assert.assertEquals(expected, actual); } /** * Asserts that two booleans are equal. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, boolean expected, boolean actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two booleans are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(boolean expected, boolean actual) { Assert.assertEquals(expected, actual); } /** * Asserts that two bytes are equal. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, byte expected, byte actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two bytes are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(byte expected, byte actual) { Assert.assertEquals(expected, actual); } /** * Asserts that two chars are equal. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, char expected, char actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two chars are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(char expected, char actual) { Assert.assertEquals(expected, actual); } /** * Asserts that two shorts are equal. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, short expected, short actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two shorts are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(short expected, short actual) { Assert.assertEquals(expected, actual); } /** * Asserts that two ints are equal. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertEquals(String message, int expected, int actual) { Assert.assertEquals(message, expected, actual); } /** * Asserts that two ints are equal. */ @SuppressWarnings("deprecation") public static void assertEquals(int expected, int actual) { Assert.assertEquals(expected, actual); } /** * Asserts that an object isn't null. */ @SuppressWarnings("deprecation") public static void assertNotNull(Object object) { Assert.assertNotNull(object); } /** * Asserts that an object isn't null. If it is * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertNotNull(String message, Object object) { Assert.assertNotNull(message, object); } /** * Asserts that an object is null. If it isn't an {@link AssertionError} is * thrown. * Message contains: Expected: <null> but was: object * * @param object Object to check or <code>null</code> */ @SuppressWarnings("deprecation") public static void assertNull(Object object) { Assert.assertNull(object); } /** * Asserts that an object is null. If it is not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertNull(String message, Object object) { Assert.assertNull(message, object); } /** * Asserts that two objects refer to the same object. If they are not * an AssertionFailedError is thrown with the given message. */ @SuppressWarnings("deprecation") public static void assertSame(String message, Object expected, Object actual) { Assert.assertSame(message, expected, actual); } /** * Asserts that two objects refer to the same object. If they are not * the same an AssertionFailedError is thrown. */ @SuppressWarnings("deprecation") public static void assertSame(Object expected, Object actual) { Assert.assertSame(expected, 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. */ @SuppressWarnings("deprecation") public static void assertNotSame(String message, Object expected, Object actual) { Assert.assertNotSame(message, expected, actual); } /** * Asserts that two objects do not refer to the same object. If they do * refer to the same object an AssertionFailedError is thrown. */ @SuppressWarnings("deprecation") public static void assertNotSame(Object expected, Object actual) { Assert.assertNotSame(expected, actual); } @SuppressWarnings("deprecation") public static void failSame(String message) { Assert.failSame(message); } @SuppressWarnings("deprecation") public static void failNotSame(String message, Object expected, Object actual) { Assert.failNotSame(message, expected, actual); } @SuppressWarnings("deprecation") public static void failNotEquals(String message, Object expected, Object actual) { Assert.failNotEquals(message, expected, actual); } @SuppressWarnings("deprecation") public static String format(String message, Object expected, Object actual) { return Assert.format(message, expected, actual); } /** * Sets up the fixture, for example, open a network connection. * This method is called before a test is executed. */ protected void setUp() throws Exception { } /** * Tears down the fixture, for example, close a network connection. * This method is called after a test is executed. */ protected void tearDown() throws Exception { } /** * Returns a string representation of the test case */ @Override public String toString() { return getName() + "(" + getClass().getName() + ")"; } /** * Gets the name of a TestCase * * @return the name of the TestCase */ public String getName() { return fName; } /** * Sets the name of a TestCase * * @param name the name to set */ public void setName(String name) { fName = name; } }

Loading feature diagnosis…

Source regions

Feature contributions

Feature contributions

FeatureValueContribution
(log-odds)
Halstead volumeHow much symbolic information the code contains. It combines the total number of operators and values with the number of distinct ones.9871.197−325.749
Source linesThe number of non-empty source lines.546+218.4
Byte entropyHow varied the bytes in the source text are. Repeated bytes give a lower value; a more even mixture gives a higher value.4.517−6.776

Intercept 8.87 + feature contributions = -105.256 (log-odds).
Score = sigmoid(-105.256) = 0.

Score0.892

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.547−18.331
Indentation frequencyHow rapidly indentation changes from line to line.332+10.746
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.545.966+7.222
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.332−7.198
Identifier layout (horizontal)How rapidly the visual pattern of identifier characters changes from left to right. It measures spatial frequency, not the meaning of the names.114.978−1.205
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.114.982+1.051
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.045+0.508

Intercept 0.07 + feature contributions = -7.136 (log-odds).
Score = sigmoid(-7.136) = 0.001.

Score0.645
Score125
Run 1

The code is highly readable overall. It follows a clear, logical structure with well-organized sections: class documentation, constructors, core test-running methods, and assertion wrappers. Javadoc is thorough and explanatory, aiding clarity of intent. Nesting is minimal; the deepest logic in runBare() uses a flat try-catch-finally with clear exception handling. Reading flow is natural and method order is logical. However, the lengthy blocks of repetitive assertion wrapper methods (~40 methods) inflate code length and feel verbose, though each method is simple and one-action-per-line. Minor readability drawbacks: the runBare() exception-handling logic is slightly condensed but still understandable; some inline comments are terse. Overall, this is legacy-style but readable Java code with good structure and documentation.

Run 2

The code is generally well-structured and readable. It follows a logical organization with clear separation of concerns: constructors, test execution flow (run, runBare, runTest), and then delegating assertion methods. The Javadoc comments provide extensive context and examples, aiding clarity of intent. Nesting is moderate and mostly confined to exception handling in runBare and runTest, which is necessary and well-formatted. Action granularity is appropriate—most lines perform a single logical operation. However, the file is quite long due to the repetitive assertion delegation methods, which slightly reduces conciseness. The runTest method has some complex exception handling that slightly disrupts the reading flow. Overall, the code is professional and maintainable, with clear purpose and good structure, only slightly penalized for verbosity and occasional complexity.

Run 3

The code is generally well-structured and readable, with a clear class hierarchy and well-documented public API. It follows a flat structure with minimal nesting, except for the runBare() method which has a slightly deeper try-catch-finally structure but remains understandable. The class has a clear purpose as a base test case, and each method has a clear intent. The code length is long but appropriate for a base class with many assertion wrappers. Action granularity is good, with one logical action per line. The reading flow is natural, with methods ordered logically: constructors, core test execution methods, then assertion wrappers. The main readability issues are the repetitive assert methods and the slightly complex runBare() exception handling, though this is inherent to JUnit's design rather than poor code style.

Run 1

Code Structure: Methods are logically grouped, with execution logic separated from assertion wrappers, though fixture hooks and accessors are distant from the core lifecycle. Nesting: Most methods are flat; runBare has moderately nested exception handling that requires careful reading. Clarity of intent: Descriptive method names and extensive documentation make the purpose clear, but reflection, the legacy fName convention, and implicit control flow through fail slightly obscure details. Code length: Individual methods are concise, but numerous repetitive assertion wrappers and comments substantially inflate the class. Action granularity: Statements generally perform one action per line; inline unbraced conditionals in runBare reduce consistency. Reading flow: Formatting and predictable overload patterns support scanning, but the large assertion block interrupts the lifecycle narrative and increases navigation effort.

Run 2

Code Structure: Methods are logically grouped into construction, execution, assertions, and fixture utilities, with consistent formatting. Nesting: Most methods are flat; runBare has moderately nested exception handling that requires closer attention. Clarity of intent: Descriptive method names and extensive documentation explain the test lifecycle, though reflection, legacy naming such as fName, and reliance on fail throwing exceptions add cognitive overhead. Code length: Individual methods are concise, but numerous assertion wrappers and repetitive comments substantially inflate the class. Action granularity: Statements generally perform one action per line; a few inline conditionals compress control flow. Reading flow: Execution methods follow a natural sequence, but the large assertion block separates lifecycle execution from setup and teardown hooks, making navigation less convenient.

Run 3

Code Structure: Methods are logically grouped into construction, execution, assertions, and fixture utilities, with well-defined responsibilities. Nesting: Mostly flat; runBare introduces moderate nested exception handling that requires careful reading. Clarity of intent: Descriptive method names and extensive documentation explain behavior, although fName and reflective invocation are less immediately clear. Code length: Individual methods are concise, but numerous repetitive assertion wrappers and comments make the class lengthy and obscure its core lifecycle logic. Action granularity: Almost every statement occupies its own line; inline conditional assignments and throws slightly reduce consistency. Reading flow: Execution methods follow a natural sequence, and formatting is consistent, but the large assertion block separates execution from setup and teardown hooks. Some documentation examples are incomplete, further weakening clarity.