From 52cdcf78f6577abbfd586aba90f335cec52554c3 Mon Sep 17 00:00:00 2001 From: Jim Bethancourt Date: Sun, 4 Oct 2026 21:48:14 -0500 Subject: [PATCH 1/5] Assembling links instead of providing pre-rendered renderedLabel for class relationships --- assets/refactor-first-report.mustache | 2 +- lib/renderer.js | 106 +- lib/table-operations.js | 25 +- public/assets/refactor-first-report.mustache | 2 +- tests/e2e/report-pagination.spec.js | 13 +- tests/fixtures/junit4-report.json | 7576 ++++++++++-------- tests/unit/renderer.test.js | 347 +- tests/unit/table-enhancer.test.js | 36 +- tests/unit/table-operations.test.js | 45 +- 9 files changed, 4714 insertions(+), 3438 deletions(-) diff --git a/assets/refactor-first-report.mustache b/assets/refactor-first-report.mustache index 0b9c568..581ce1b 100644 --- a/assets/refactor-first-report.mustache +++ b/assets/refactor-first-report.mustache @@ -458,7 +458,7 @@ Class relationships to remove, in priority order - + diff --git a/lib/renderer.js b/lib/renderer.js index 16b3c96..7d634ee 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -67,6 +67,71 @@ function sanitizeRelationshipLabel(label) { }); } +/** + * Escapes a value for safe interpolation into HTML text or a double-quoted + * attribute. Relationship fields (repoUrl, class paths, simple names) are + * untrusted report data, so they are escaped before the markup is built. + * + * @param {*} value - Raw value from the report JSON. + * @returns {string} HTML-escaped text. + */ +function escapeHtml(value) { + return String(value ?? '') + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +const RELATIONSHIP_ARROW = ' → '; + +/** + * Builds the raw markup of one class relationship from the structured + * ClassRelationshipDTO fields: the hyperlink targets are project.repoUrl plus + * sourceClassPath/targetClassPath (paths relative to the project root), the + * anchor texts are the simple class names, and the two anchors are separated + * by the → arrow. A class marked for removal is followed by *. + * + * Entries without the structured fields (pre-DTO strings, legacy entries + * carrying only a renderedLabel) yield null so callers can drop them. + * + * @param {*} relationship - Raw ClassRelationshipDTO entry. + * @param {string} repoUrl - Repository URL prefix from project metadata. + * @returns {string|null} The unsanitized relationship markup, or null when the + * entry is not a structured ClassRelationshipDTO. + */ +export function classRelationshipMarkup(relationship, repoUrl) { + if (!relationship || typeof relationship !== 'object') return null; + const hasStructuredFields = relationship.simpleSourceClassName != null + || relationship.simpleTargetClassName != null; + if (!hasStructuredFields) return null; + const base = typeof repoUrl === 'string' ? repoUrl : ''; + const anchor = (classPath, simpleName) => + '' + + escapeHtml(simpleName) + ''; + return anchor(relationship.sourceClassPath, relationship.simpleSourceClassName) + + (relationship.sourceMarked ? '*' : '') + + RELATIONSHIP_ARROW + + anchor(relationship.targetClassPath, relationship.simpleTargetClassName) + + (relationship.targetMarked ? '*' : ''); +} + +/** + * Builds the sanitized class-relationship label for template interpolation. + * The markup is derived from untrusted report data, so it is still + * restricted to links and markers before it reaches the template. + * + * @param {*} relationship - Raw ClassRelationshipDTO entry. + * @param {string} repoUrl - Repository URL prefix from project metadata. + * @returns {string} Sanitized label markup ('' when the entry has no fields). + */ +function safeClassRelationshipLabel(relationship, repoUrl) { + registerLinkSafetyHook(); + const markup = classRelationshipMarkup(relationship, repoUrl); + return markup == null ? '' : sanitizeRelationshipLabel(markup); +} + /** * Adapts one "class relationship to break a package cycle" entry for the * template. Reports serialize structured ClassRelationshipDTO objects, and @@ -75,30 +140,49 @@ function sanitizeRelationshipLabel(label) { * of any other shape (including pre-DTO rendered-label strings) are dropped. * * @param {*} entry - Raw class-break entry. + * @param {string} repoUrl - Repository URL prefix from project metadata. * @returns {string|null} Sanitized label markup, or null when the entry is * not a valid ClassRelationshipDTO object. */ -function prepareClassBreakEntry(entry) { +function prepareClassBreakEntry(entry, repoUrl) { if (!entry || typeof entry !== 'object') return null; - return sanitizeRelationshipLabel(entry.renderedLabel); + const markup = classRelationshipMarkup(entry, repoUrl); + return markup == null ? null : sanitizeRelationshipLabel(markup); } /** - * Copies a relationship with label markup limited to source links and markers, - * and normalizes its class-break entries the same way. Never trust a - * precomputed value from JSON. + * Copies a class relationship with its label markup built from repoUrl, the + * class paths and the simple class names, restricted to links and markers. + * Never trust a precomputed value from JSON. * - * @param {object} relationship - Raw relationship data. + * @param {object} relationship - Raw class relationship data. + * @param {string} repoUrl - Repository URL prefix from project metadata. + * @returns {object} Relationship with a restricted HTML label. + */ +function prepareClassRelationship(relationship, repoUrl) { + return { + ...relationship, + safeRenderedLabel: safeClassRelationshipLabel(relationship, repoUrl) + }; +} + +/** + * Copies a package relationship with label markup limited to links and + * markers, and normalizes its class-break entries the same way. Never trust + * a precomputed value from JSON. + * + * @param {object} relationship - Raw package relationship data. + * @param {string} repoUrl - Repository URL prefix from project metadata. * @returns {object} Relationship with restricted HTML labels. */ -function prepareRelationship(relationship) { +function preparePackageRelationship(relationship, repoUrl) { registerLinkSafetyHook(); return { ...relationship, safeRenderedLabel: sanitizeRelationshipLabel(relationship.renderedLabel), classRelationshipsToBreakPackage: Array.isArray(relationship.classRelationshipsToBreakPackage) ? relationship.classRelationshipsToBreakPackage - .map(prepareClassBreakEntry) + .map(entry => prepareClassBreakEntry(entry, repoUrl)) .filter(entry => entry !== null) : [] }; @@ -218,13 +302,15 @@ export function prepareReportData(data, tableStates = {}, config = TABLE_CONFIG) const result = { ...data }; const stateOf = tableId => tableStates?.[tableId]; + const repoUrl = data.project?.repoUrl; + if (Array.isArray(data.classRelationshipsToRemove?.relationships)) { const descriptor = REPORT_TABLES['class-relationships']; const { rows, ui } = buildTableSlice( descriptor, data.classRelationshipsToRemove.relationships, stateOf(descriptor.id), config); result.classRelationshipsToRemove = { ...data.classRelationshipsToRemove, - relationships: rows.map(prepareRelationship), + relationships: rows.map(row => prepareClassRelationship(row, repoUrl)), tableUi: ui }; } @@ -235,7 +321,7 @@ export function prepareReportData(data, tableStates = {}, config = TABLE_CONFIG) descriptor, data.packageRelationshipsToRemove.relationships, stateOf(descriptor.id), config); result.packageRelationshipsToRemove = { ...data.packageRelationshipsToRemove, - relationships: rows.map(prepareRelationship), + relationships: rows.map(row => preparePackageRelationship(row, repoUrl)), tableUi: ui }; } diff --git a/lib/table-operations.js b/lib/table-operations.js index 805b90d..a786739 100644 --- a/lib/table-operations.js +++ b/lib/table-operations.js @@ -354,13 +354,34 @@ function fallbackCopy(text) { // filter/export value from a row; without it the raw property is used. // --------------------------------------------------------------------------- +/** + * Builds the plain-text form of one class relationship (source NAME [marked] + * → target NAME [marked]) from the structured ClassRelationshipDTO + * fields, used for filtering, sorting and CSV export. Entries without the + * structured fields (older reports) yield an empty string. + * + * @param {*} relationship - Raw ClassRelationshipDTO entry. + * @returns {string} Plain-text relationship value. + */ +function classRelationshipText(relationship) { + if (!relationship || typeof relationship !== 'object') return ''; + const hasStructuredFields = relationship.simpleSourceClassName != null + || relationship.simpleTargetClassName != null; + if (!hasStructuredFields) return ''; + const source = String(relationship.simpleSourceClassName ?? '') + + (relationship.sourceMarked ? '*' : ''); + const target = String(relationship.simpleTargetClassName ?? '') + + (relationship.targetMarked ? '*' : ''); + return `${source} → ${target}`; +} + export const REPORT_TABLES = { 'class-relationships': { id: 'class-relationships', caption: 'Class relationships to remove, in priority order', getRows: data => data?.classRelationshipsToRemove?.relationships ?? [], columns: [ - { key: 'renderedLabel', label: 'Class Relationship', value: row => stripHtml(row.renderedLabel) }, + { key: 'classRelationship', label: 'Class Relationship', value: classRelationshipText }, { key: 'priority', label: 'Priority' }, { key: 'cycleCount', label: 'In Class Cycles' }, { key: 'effortRank', label: 'Relationship Strength' }, @@ -385,7 +406,7 @@ export const REPORT_TABLES = { key: 'classRelationshipsToBreakPackage', label: 'Class Relationships to Remove To Break Package Relationship', value: row => (row.classRelationshipsToBreakPackage ?? []) - .map(entry => stripHtml(entry?.renderedLabel ?? '')) + .map(entry => classRelationshipText(entry)) .join('; ') } ] diff --git a/public/assets/refactor-first-report.mustache b/public/assets/refactor-first-report.mustache index 0b9c568..581ce1b 100644 --- a/public/assets/refactor-first-report.mustache +++ b/public/assets/refactor-first-report.mustache @@ -458,7 +458,7 @@ Class relationships to remove, in priority order - + diff --git a/tests/e2e/report-pagination.spec.js b/tests/e2e/report-pagination.spec.js index 34161bc..dd30979 100644 --- a/tests/e2e/report-pagination.spec.js +++ b/tests/e2e/report-pagination.spec.js @@ -40,12 +40,13 @@ function buildReport() { relationships: Array.from({ length: CLASS_ROW_COUNT }, (_, i) => ({ sourceClass: `com.example.Source${i}`, targetClass: `com.example.Target${i}`, - sourceUrl: null, - targetUrl: null, + sourceClassPath: `src/main/java/com/example/Source${i}.java`, + targetClassPath: `src/main/java/com/example/Target${i}.java`, + simpleSourceClassName: `Source${i}`, + simpleTargetClassName: `Target${i}`, sourceMarked: false, targetMarked: false, weight: 1, - renderedLabel: `Source${i} to Target${i}`, priority: (i % 5) + 1, cycleCount: i % 4, effortRank: CLASS_ROW_COUNT - i, @@ -298,8 +299,8 @@ test.describe('csv export', () => { expect(lines.length).toBe(CLASS_ROW_COUNT + 1); // The export honours the default sort (priority ascending): the first // priority-1 row is Source0, the last priority-5 row is Source44. - expect(lines[1]).toContain('Source0 to Target0'); - expect(lines[CLASS_ROW_COUNT]).toContain(`Source${CLASS_ROW_COUNT - 1} to Target${CLASS_ROW_COUNT - 1}`); + expect(lines[1]).toContain('Source0 → Target0'); + expect(lines[CLASS_ROW_COUNT]).toContain(`Source${CLASS_ROW_COUNT - 1} → Target${CLASS_ROW_COUNT - 1}`); }); test('export buttons are labelled and keyboard operable', async ({ page }) => { @@ -320,7 +321,7 @@ test.describe('wide tables', () => { async function loadWideReport(page) { const report = buildReport(); for (const rel of report.classRelationshipsToRemove.relationships) { - rel.renderedLabel = `${WIDE_LABEL} ${rel.priority}`; + rel.simpleSourceClassName = `${WIDE_LABEL} ${rel.priority}`; } await page.route('**/raw.githubusercontent.com/**', route => { const url = route.request().url(); diff --git a/tests/fixtures/junit4-report.json b/tests/fixtures/junit4-report.json index c48ef1c..ac0f21d 100644 --- a/tests/fixtures/junit4-report.json +++ b/tests/fixtures/junit4-report.json @@ -1,3388 +1,4326 @@ { - "project" : { - "name" : "JUnit", - "version" : "4.13.3-SNAPSHOT", - "repoUrl" : "https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/", - "baseDir" : "C:\\Code\\junit4", - "scanTimestamp" : "9/9/26, 8:06 PM", - "hasAnyDisharmony" : true + "project": { + "name": "JUnit", + "version": "4.13.3-SNAPSHOT", + "repoUrl": "https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/", + "baseDir": "C:\\Code\\junit4", + "scanTimestamp": "9/9/26, 8:06 PM", + "hasAnyDisharmony": true }, - "classMap" : { - "graphId" : "classGraph", - "classCount" : 335, - "relationshipCount" : 934, - "dotThreshold" : 4000, - "dotThresholdExceeded" : false, - "dot" : "strict digraph G {\nActiveTestSuite -> TestSuite [ label = \"6\" weight = \"6\" ];\nActiveTestSuite -> TestCase [ label = \"2\" weight = \"2\" ];\nActiveTestSuite -> TestResult [ label = \"2\" weight = \"2\" ];\nActiveTestSuite -> junit_framework_Test [ label = \"2\" weight = \"2\" ];\nRepeatedTest -> TestDecorator [ label = \"5\" weight = \"5\" ];\nRepeatedTest -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nRepeatedTest -> TestResult [ label = \"2\" weight = \"2\" ];\nTestDecorator -> junit_framework_Assert [ label = \"1\" weight = \"1\" ];\nTestDecorator -> junit_framework_Test [ label = \"7\" weight = \"7\" ];\nTestDecorator -> TestResult [ label = \"2\" weight = \"2\" ];\nTestSetup -> TestDecorator [ label = \"3\" weight = \"3\" ];\nTestSetup -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nTestSetup -> TestResult [ label = \"2\" weight = \"2\" ];\nTestSetup -> Protectable [ label = \"1\" weight = \"1\" ];\njunit_framework_Assert -> AssertionFailedError [ label = \"2\" weight = \"2\" ];\njunit_framework_Assert -> junit_framework_ComparisonFailure [ label = \"1\" weight = \"1\" ];\nComparisonCompactor -> junit_framework_Assert [ label = \"2\" weight = \"2\" color = \"red\" ];\njunit_framework_ComparisonFailure -> AssertionFailedError [ label = \"2\" weight = \"2\" ];\njunit_framework_ComparisonFailure -> ComparisonCompactor [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> junit_framework_Test [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> Filterable [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Orderable [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Describable [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Runner [ label = \"4\" weight = \"4\" ];\nJUnit4TestAdapter -> JUnit4TestAdapterCache [ label = \"5\" weight = \"5\" color = \"red\" ];\nJUnit4TestAdapter -> Request [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> TestResult [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Description [ label = \"13\" weight = \"13\" ];\nJUnit4TestAdapter -> Filter [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Sorter [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> Orderer [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapterCache -> junit_framework_Test [ label = \"6\" weight = \"6\" ];\nJUnit4TestAdapterCache -> Description [ label = \"14\" weight = \"14\" ];\nJUnit4TestAdapterCache -> JUnit4TestCaseFacade [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapterCache -> TestSuite [ label = \"3\" weight = \"3\" ];\nJUnit4TestAdapterCache -> TestResult [ label = \"4\" weight = \"4\" ];\nJUnit4TestAdapterCache -> JUnit4TestAdapter [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapterCache -> RunNotifier [ label = \"4\" weight = \"4\" ];\nJUnit4TestAdapterCache -> Failure [ label = \"3\" weight = \"3\" ];\nJUnit4TestCaseFacade -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nJUnit4TestCaseFacade -> Describable [ label = \"1\" weight = \"1\" ];\nJUnit4TestCaseFacade -> Description [ label = \"4\" weight = \"4\" ];\nJUnit4TestCaseFacade -> TestResult [ label = \"1\" weight = \"1\" ];\njunit_framework_Test -> TestResult [ label = \"1\" weight = \"1\" color = \"red\" ];\nTestCase -> junit_framework_Assert [ label = \"39\" weight = \"39\" ];\nTestCase -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nTestCase -> TestResult [ label = \"6\" weight = \"6\" color = \"red\" ];\nTestFailure -> junit_framework_Test [ label = \"3\" weight = \"3\" ];\nTestFailure -> Throwables [ label = \"1\" weight = \"1\" ];\nTestFailure -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nTestListener -> junit_framework_Test [ label = \"4\" weight = \"4\" ];\nTestListener -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nTestResult -> TestFailure [ label = \"8\" weight = \"8\" ];\nTestResult -> TestListener [ label = \"15\" weight = \"15\" ];\nTestResult -> junit_framework_Test [ label = \"6\" weight = \"6\" ];\nTestResult -> AssertionFailedError [ label = \"2\" weight = \"2\" ];\nTestResult -> TestCase [ label = \"2\" weight = \"2\" ];\nTestResult -> Protectable [ label = \"3\" weight = \"3\" ];\nTestSuite -> junit_framework_Test [ label = \"15\" weight = \"15\" ];\nTestSuite -> TestCase [ label = \"7\" weight = \"7\" ];\nTestSuite -> Throwables [ label = \"3\" weight = \"3\" ];\nTestSuite -> MethodSorter [ label = \"1\" weight = \"1\" ];\nTestSuite -> TestResult [ label = \"3\" weight = \"3\" ];\nBaseTestRunner -> TestListener [ label = \"1\" weight = \"1\" ];\nBaseTestRunner -> junit_framework_Test [ label = \"10\" weight = \"10\" ];\nBaseTestRunner -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nBaseTestRunner -> TestSuite [ label = \"1\" weight = \"1\" ];\nBaseTestRunner -> Throwables [ label = \"1\" weight = \"1\" ];\nResultPrinter -> TestListener [ label = \"1\" weight = \"1\" ];\nResultPrinter -> TestResult [ label = \"14\" weight = \"14\" ];\nResultPrinter -> TestFailure [ label = \"6\" weight = \"6\" ];\nResultPrinter -> BaseTestRunner [ label = \"1\" weight = \"1\" ];\nResultPrinter -> junit_framework_Test [ label = \"4\" weight = \"4\" ];\nResultPrinter -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nTestRunner -> BaseTestRunner [ label = \"4\" weight = \"4\" ];\nTestRunner -> ResultPrinter [ label = \"6\" weight = \"6\" ];\nTestRunner -> TestCase [ label = \"2\" weight = \"2\" ];\nTestRunner -> TestSuite [ label = \"2\" weight = \"2\" ];\nTestRunner -> junit_framework_Test [ label = \"8\" weight = \"8\" ];\nTestRunner -> TestResult [ label = \"11\" weight = \"11\" ];\nTestRunner -> Version [ label = \"1\" weight = \"1\" ];\norg_junit_Assert -> org_junit_ComparisonFailure [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_Assert -> ArrayComparisonFailure [ label = \"10\" weight = \"10\" ];\norg_junit_Assert -> InexactComparisonCriteria [ label = \"2\" weight = \"2\" ];\norg_junit_Assert -> ComparisonCriteria [ label = \"3\" weight = \"3\" ];\norg_junit_Assert -> ExactComparisonCriteria [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_Assert -> ThrowingRunnable [ label = \"3\" weight = \"3\" ];\nAssume -> org_junit_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\norg_junit_AssumptionViolatedException -> org_junit_internal_AssumptionViolatedException [ label = \"5\" weight = \"5\" ];\norg_junit_ComparisonFailure -> org_junit_ComparisonFailure_ComparisonCompactor [ label = \"2\" weight = \"2\" ];\norg_junit_ComparisonFailure_ComparisonCompactor -> org_junit_Assert [ label = \"2\" weight = \"2\" ];\norg_junit_ComparisonFailure_ComparisonCompactor -> org_junit_ComparisonFailure_ComparisonCompactor_DiffExtractor [ label = \"6\" weight = \"6\" ];\norg_junit_ComparisonFailure_ComparisonCompactor_DiffExtractor -> org_junit_ComparisonFailure_ComparisonCompactor [ label = \"2\" weight = \"2\" color = \"red\" ];\nCategories -> Suite [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Filter [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Categories [ label = \"6\" weight = \"6\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Description [ label = \"11\" weight = \"11\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> ValidateWith [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Category [ label = \"2\" weight = \"2\" ];\nCategories -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nCategories -> org_junit_experimental_categories_Categories_CategoryFilter [ label = \"1\" weight = \"1\" color = \"red\" ];\nCategories -> ParentRunner [ label = \"1\" weight = \"1\" ];\nCategories -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nCategories -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nCategories -> org_junit_experimental_categories_Categories_IncludeCategory [ label = \"4\" weight = \"4\" ];\nCategories -> org_junit_experimental_categories_Categories_ExcludeCategory [ label = \"4\" weight = \"4\" ];\nCategory -> ValidateWith [ label = \"2\" weight = \"2\" ];\nCategory -> CategoryValidator [ label = \"1\" weight = \"1\" ];\nCategoryFilterFactory -> FilterFactory [ label = \"1\" weight = \"1\" ];\nCategoryFilterFactory -> FilterFactoryParams [ label = \"2\" weight = \"2\" ];\nCategoryFilterFactory -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"2\" weight = \"2\" ];\nCategoryFilterFactory -> Filter [ label = \"2\" weight = \"2\" ];\nCategoryFilterFactory -> Classes [ label = \"1\" weight = \"1\" ];\nCategoryValidator -> AnnotationValidator [ label = \"1\" weight = \"1\" ];\nCategoryValidator -> FrameworkMethod [ label = \"2\" weight = \"2\" ];\nExcludeCategories -> CategoryFilterFactory [ label = \"1\" weight = \"1\" ];\nExcludeCategories -> org_junit_experimental_categories_ExcludeCategories_ExcludesAny [ label = \"1\" weight = \"1\" ];\nExcludeCategories -> Filter [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_categories_ExcludeCategories_ExcludesAny -> org_junit_experimental_categories_Categories_CategoryFilter [ label = \"3\" weight = \"3\" ];\nIncludeCategories -> CategoryFilterFactory [ label = \"1\" weight = \"1\" ];\nIncludeCategories -> org_junit_experimental_categories_IncludeCategories_IncludesAny [ label = \"1\" weight = \"1\" ];\nIncludeCategories -> Filter [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_categories_IncludeCategories_IncludesAny -> org_junit_experimental_categories_Categories_CategoryFilter [ label = \"3\" weight = \"3\" ];\nMaxCore -> MaxHistory [ label = \"4\" weight = \"4\" ];\nMaxCore -> Request [ label = \"14\" weight = \"14\" ];\nMaxCore -> Result [ label = \"3\" weight = \"3\" ];\nMaxCore -> JUnitCore [ label = \"4\" weight = \"4\" ];\nMaxCore -> SortingRequest [ label = \"1\" weight = \"1\" ];\nMaxCore -> Description [ label = \"22\" weight = \"22\" ];\nMaxCore -> Runner [ label = \"4\" weight = \"4\" ];\nMaxCore -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nMaxCore -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_max_MaxCore_1 -> Runner [ label = \"1\" weight = \"1\" ];\nMaxCore -> org_junit_experimental_max_MaxCore_1 [ label = \"1\" weight = \"1\" ];\nMaxCore -> Suite [ label = \"1\" weight = \"1\" ];\nMaxCore -> TestSuite [ label = \"1\" weight = \"1\" ];\nMaxCore -> JUnit38ClassRunner [ label = \"1\" weight = \"1\" ];\nMaxHistory -> CouldNotReadCoreException [ label = \"3\" weight = \"3\" ];\nMaxHistory -> Description [ label = \"11\" weight = \"11\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> RunListener [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> Description [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> MaxHistory [ label = \"3\" weight = \"3\" color = \"red\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> Failure [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> Result [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_max_MaxHistory_TestComparator -> Description [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_max_MaxHistory_TestComparator -> MaxHistory [ label = \"5\" weight = \"5\" ];\nMaxHistory -> org_junit_experimental_max_MaxHistory_RememberingListener [ label = \"1\" weight = \"1\" ];\nMaxHistory -> RunListener [ label = \"1\" weight = \"1\" ];\nMaxHistory -> org_junit_experimental_max_MaxHistory_TestComparator [ label = \"1\" weight = \"1\" color = \"red\" ];\nParallelComputer -> Computer [ label = \"5\" weight = \"5\" ];\nParallelComputer -> Runner [ label = \"6\" weight = \"6\" ];\nParallelComputer -> ParentRunner [ label = \"3\" weight = \"3\" ];\nParallelComputer -> RunnerBuilder [ label = \"2\" weight = \"2\" ];\nParallelComputer -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nFailureList -> Failure [ label = \"3\" weight = \"3\" ];\nFailureList -> Result [ label = \"4\" weight = \"4\" ];\nFailureList -> RunListener [ label = \"2\" weight = \"2\" ];\nPrintableResult -> Result [ label = \"4\" weight = \"4\" ];\nPrintableResult -> Request [ label = \"2\" weight = \"2\" ];\nPrintableResult -> JUnitCore [ label = \"2\" weight = \"2\" ];\nPrintableResult -> Failure [ label = \"2\" weight = \"2\" ];\nPrintableResult -> FailureList [ label = \"2\" weight = \"2\" ];\nPrintableResult -> TextListener [ label = \"2\" weight = \"2\" ];\nResultMatchers -> PrintableResult [ label = \"8\" weight = \"8\" ];\nResultMatchers -> Failure [ label = \"1\" weight = \"1\" ];\nEnclosed -> Suite [ label = \"2\" weight = \"2\" ];\nEnclosed -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nFromDataPoints -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nFromDataPoints -> SpecificDataPointsSupplier [ label = \"1\" weight = \"1\" ];\nAllMembersSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> PotentialAssignment [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> DataPoint [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> AllMembersSupplier [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> Assume [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> org_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [ label = \"3\" weight = \"3\" ];\nAllMembersSupplier -> org_junit_runners_model_TestClass [ label = \"6\" weight = \"6\" ];\nAllMembersSupplier -> ParameterSignature [ label = \"17\" weight = \"17\" ];\nAllMembersSupplier -> PotentialAssignment [ label = \"13\" weight = \"13\" ];\nAllMembersSupplier -> FrameworkMethod [ label = \"9\" weight = \"9\" ];\nAllMembersSupplier -> DataPoints [ label = \"2\" weight = \"2\" ];\nAllMembersSupplier -> org_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue [ label = \"1\" weight = \"1\" ];\nAllMembersSupplier -> FrameworkField [ label = \"6\" weight = \"6\" ];\nAssignments -> PotentialAssignment [ label = \"11\" weight = \"11\" ];\nAssignments -> ParameterSignature [ label = \"13\" weight = \"13\" ];\nAssignments -> org_junit_runners_model_TestClass [ label = \"5\" weight = \"5\" ];\nAssignments -> org_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [ label = \"5\" weight = \"5\" ];\nAssignments -> ParameterSupplier [ label = \"5\" weight = \"5\" ];\nAssignments -> EnumSupplier [ label = \"2\" weight = \"2\" ];\nAssignments -> BooleanSupplier [ label = \"2\" weight = \"2\" ];\nAssignments -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nAssignments -> AllMembersSupplier [ label = \"1\" weight = \"1\" ];\nBooleanSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nBooleanSupplier -> ParameterSignature [ label = \"1\" weight = \"1\" ];\nBooleanSupplier -> PotentialAssignment [ label = \"3\" weight = \"3\" ];\nEnumSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nEnumSupplier -> ParameterSignature [ label = \"1\" weight = \"1\" ];\nEnumSupplier -> PotentialAssignment [ label = \"4\" weight = \"4\" ];\nSpecificDataPointsSupplier -> AllMembersSupplier [ label = \"6\" weight = \"6\" ];\nSpecificDataPointsSupplier -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nSpecificDataPointsSupplier -> ParameterSignature [ label = \"8\" weight = \"8\" ];\nSpecificDataPointsSupplier -> ParametersSuppliedBy [ label = \"4\" weight = \"4\" ];\nSpecificDataPointsSupplier -> FromDataPoints [ label = \"4\" weight = \"4\" color = \"red\" ];\nSpecificDataPointsSupplier -> DataPoint [ label = \"2\" weight = \"2\" ];\nSpecificDataPointsSupplier -> DataPoints [ label = \"2\" weight = \"2\" ];\nSpecificDataPointsSupplier -> FrameworkMethod [ label = \"12\" weight = \"12\" ];\nParametersSuppliedBy -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nParameterSupplier -> ParameterSignature [ label = \"1\" weight = \"1\" ];\nParameterSupplier -> PotentialAssignment [ label = \"1\" weight = \"1\" ];\nPotentialAssignment -> org_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [ label = \"2\" weight = \"2\" ];\nTestedOn -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nTestedOn -> TestedOnSupplier [ label = \"1\" weight = \"1\" ];\nTestedOnSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nTestedOnSupplier -> ParameterSignature [ label = \"2\" weight = \"2\" ];\nTestedOnSupplier -> PotentialAssignment [ label = \"4\" weight = \"4\" ];\nTestedOnSupplier -> TestedOn [ label = \"2\" weight = \"2\" color = \"red\" ];\nTestedOnSupplier -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nTheories -> BlockJUnit4ClassRunner [ label = \"6\" weight = \"6\" ];\nTheories -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nTheories -> org_junit_runners_model_TestClass [ label = \"4\" weight = \"4\" ];\nTheories -> ParentRunner [ label = \"4\" weight = \"4\" ];\nTheories -> FrameworkMethod [ label = \"11\" weight = \"11\" ];\nTheories -> ParameterSignature [ label = \"3\" weight = \"3\" ];\nTheories -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nTheories -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nTheories -> org_junit_experimental_theories_Theories_TheoryAnchor [ label = \"1\" weight = \"1\" ];\nTheories -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Statement [ label = \"5\" weight = \"5\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> FrameworkMethod [ label = \"10\" weight = \"10\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_runners_model_TestClass [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_internal_AssumptionViolatedException [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Assignments [ label = \"11\" weight = \"11\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> PotentialAssignment [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> BlockJUnit4ClassRunner [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor_1 -> Statement [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Assume [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> ParentRunner [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_experimental_theories_Theories_TheoryAnchor_1 [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> ParameterizedAssertionError [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Theory [ label = \"2\" weight = \"2\" ];\nFixMethodOrder -> MethodSorters [ label = \"1\" weight = \"1\" ];\norg_junit_internal_AssumptionViolatedException -> SerializableMatcherDescription [ label = \"1\" weight = \"1\" ];\norg_junit_internal_AssumptionViolatedException -> SerializableValueDescription [ label = \"1\" weight = \"1\" ];\nAllDefaultPossibilitiesBuilder -> RunnerBuilder [ label = \"5\" weight = \"5\" ];\nAllDefaultPossibilitiesBuilder -> Runner [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> JUnit4Builder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> JUnit3Builder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> AnnotatedBuilder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> IgnoredBuilder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> SuiteMethodBuilder [ label = \"1\" weight = \"1\" ];\nAllDefaultPossibilitiesBuilder -> NullBuilder [ label = \"1\" weight = \"1\" ];\nAnnotatedBuilder -> RunnerBuilder [ label = \"3\" weight = \"3\" ];\nAnnotatedBuilder -> RunWith [ label = \"2\" weight = \"2\" ];\nAnnotatedBuilder -> Runner [ label = \"3\" weight = \"3\" ];\nAnnotatedBuilder -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nIgnoredBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nIgnoredBuilder -> IgnoredClassRunner [ label = \"1\" weight = \"1\" ];\nIgnoredBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nIgnoredClassRunner -> Runner [ label = \"1\" weight = \"1\" ];\nIgnoredClassRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\nIgnoredClassRunner -> Description [ label = \"2\" weight = \"2\" ];\nJUnit3Builder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nJUnit3Builder -> JUnit38ClassRunner [ label = \"1\" weight = \"1\" ];\nJUnit3Builder -> Runner [ label = \"1\" weight = \"1\" ];\nJUnit4Builder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nJUnit4Builder -> JUnit4 [ label = \"1\" weight = \"1\" ];\nJUnit4Builder -> Runner [ label = \"1\" weight = \"1\" ];\nNullBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nNullBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nSuiteMethodBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nSuiteMethodBuilder -> SuiteMethod [ label = \"1\" weight = \"1\" ];\nSuiteMethodBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nComparisonCriteria -> ArrayComparisonFailure [ label = \"7\" weight = \"7\" ];\nComparisonCriteria -> org_junit_Assert [ label = \"3\" weight = \"3\" color = \"red\" ];\nExactComparisonCriteria -> ComparisonCriteria [ label = \"1\" weight = \"1\" ];\nExactComparisonCriteria -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nInexactComparisonCriteria -> ComparisonCriteria [ label = \"1\" weight = \"1\" ];\nInexactComparisonCriteria -> org_junit_Assert [ label = \"2\" weight = \"2\" color = \"red\" ];\nFakeRuntimeMXBean -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\nFakeThreadMXBean -> ThreadMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_FactoryHolder -> Classes [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> org_junit_internal_management_ManagementFactory_FactoryHolder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> RuntimeMXBean [ label = \"2\" weight = \"2\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> ReflectiveRuntimeMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> FakeRuntimeMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> org_junit_internal_management_ManagementFactory_FactoryHolder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> ThreadMXBean [ label = \"2\" weight = \"2\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> ReflectiveThreadMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> FakeThreadMXBean [ label = \"1\" weight = \"1\" ];\nManagementFactory -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\nManagementFactory -> ThreadMXBean [ label = \"1\" weight = \"1\" ];\nReflectiveRuntimeMXBean -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ReflectiveRuntimeMXBean_Holder -> Classes [ label = \"1\" weight = \"1\" ];\nReflectiveThreadMXBean -> ThreadMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ReflectiveThreadMXBean_Holder -> Classes [ label = \"1\" weight = \"1\" ];\nStacktracePrintingMatcher -> Throwables [ label = \"1\" weight = \"1\" ];\nThrowableCauseMatcher -> TypeSafeMatcher [ label = \"1\" weight = \"1\" ];\nThrowableMessageMatcher -> TypeSafeMatcher [ label = \"1\" weight = \"1\" ];\nTypeSafeMatcher -> MethodSorter [ label = \"1\" weight = \"1\" ];\nMethodSorter -> FixMethodOrder [ label = \"2\" weight = \"2\" ];\nMethodSorter -> MethodSorters [ label = \"1\" weight = \"1\" ];\nRealSystem -> JUnitSystem [ label = \"1\" weight = \"1\" ];\nClassRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nClassRequest -> org_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder [ label = \"1\" weight = \"1\" ];\nClassRequest -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nClassRequest -> Runner [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder -> AllDefaultPossibilitiesBuilder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder -> org_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder -> SuiteMethodBuilder [ label = \"2\" weight = \"2\" ];\norg_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nFilterRequest -> Request [ label = \"4\" weight = \"4\" ];\nFilterRequest -> Filter [ label = \"4\" weight = \"4\" ];\nFilterRequest -> Runner [ label = \"2\" weight = \"2\" ];\nFilterRequest -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nFilterRequest -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\nMemoizingRequest -> Request [ label = \"1\" weight = \"1\" color = \"red\" ];\nMemoizingRequest -> Runner [ label = \"3\" weight = \"3\" ];\nOrderingRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nOrderingRequest -> Request [ label = \"3\" weight = \"3\" color = \"red\" ];\nOrderingRequest -> Ordering [ label = \"3\" weight = \"3\" ];\nOrderingRequest -> Runner [ label = \"2\" weight = \"2\" ];\nOrderingRequest -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nOrderingRequest -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\nSortingRequest -> Request [ label = \"4\" weight = \"4\" ];\nSortingRequest -> Description [ label = \"2\" weight = \"2\" ];\nSortingRequest -> Runner [ label = \"2\" weight = \"2\" ];\nSortingRequest -> Sorter [ label = \"2\" weight = \"2\" ];\nClassRoadie -> RunNotifier [ label = \"3\" weight = \"3\" ];\nClassRoadie -> org_junit_internal_runners_TestClass [ label = \"4\" weight = \"4\" ];\nClassRoadie -> Description [ label = \"2\" weight = \"2\" ];\nClassRoadie -> Failure [ label = \"1\" weight = \"1\" ];\nClassRoadie -> FailedBefore [ label = \"4\" weight = \"4\" ];\nClassRoadie -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nErrorReportingRunner -> Runner [ label = \"1\" weight = \"1\" ];\nErrorReportingRunner -> Description [ label = \"7\" weight = \"7\" ];\nErrorReportingRunner -> RunNotifier [ label = \"5\" weight = \"5\" ];\nErrorReportingRunner -> InvalidTestClassError [ label = \"1\" weight = \"1\" ];\nErrorReportingRunner -> org_junit_runners_model_InitializationError [ label = \"3\" weight = \"3\" ];\nErrorReportingRunner -> org_junit_internal_runners_InitializationError [ label = \"3\" weight = \"3\" ];\nErrorReportingRunner -> Failure [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> Runner [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> Filterable [ label = \"5\" weight = \"5\" ];\nJUnit38ClassRunner -> Orderable [ label = \"5\" weight = \"5\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> TestListener [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> RunNotifier [ label = \"5\" weight = \"5\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> junit_framework_Test [ label = \"10\" weight = \"10\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> Failure [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> Describable [ label = \"4\" weight = \"4\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> Description [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> TestCase [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> junit_framework_Test [ label = \"8\" weight = \"8\" ];\nJUnit38ClassRunner -> TestSuite [ label = \"21\" weight = \"21\" ];\nJUnit38ClassRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> TestResult [ label = \"3\" weight = \"3\" ];\nJUnit38ClassRunner -> org_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> TestListener [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> Description [ label = \"8\" weight = \"8\" ];\nJUnit38ClassRunner -> TestCase [ label = \"6\" weight = \"6\" ];\nJUnit38ClassRunner -> Describable [ label = \"4\" weight = \"4\" ];\nJUnit38ClassRunner -> TestDecorator [ label = \"4\" weight = \"4\" ];\nJUnit38ClassRunner -> Filter [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> NoTestsRemainException [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> Sorter [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> Sortable [ label = \"4\" weight = \"4\" ];\nJUnit38ClassRunner -> Orderer [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Runner [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Filterable [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Sortable [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> org_junit_internal_runners_TestClass [ label = \"8\" weight = \"8\" ];\nJUnit4ClassRunner -> org_junit_internal_runners_InitializationError [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> MethodValidator [ label = \"4\" weight = \"4\" ];\nJUnit4ClassRunner -> RunNotifier [ label = \"7\" weight = \"7\" ];\nJUnit4ClassRunner -> ClassRoadie [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> Description [ label = \"8\" weight = \"8\" ];\nJUnit4ClassRunner -> TestMethod [ label = \"3\" weight = \"3\" ];\nJUnit4ClassRunner -> MethodRoadie [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> Failure [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Filter [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> NoTestsRemainException [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> Sorter [ label = \"2\" weight = \"2\" ];\nMethodRoadie -> RunNotifier [ label = \"6\" weight = \"6\" ];\nMethodRoadie -> Description [ label = \"2\" weight = \"2\" ];\nMethodRoadie -> TestMethod [ label = \"12\" weight = \"12\" ];\nMethodRoadie -> TestTimedOutException [ label = \"1\" weight = \"1\" ];\nMethodRoadie -> FailedBefore [ label = \"4\" weight = \"4\" ];\nMethodRoadie -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\nMethodRoadie -> Failure [ label = \"1\" weight = \"1\" ];\nMethodValidator -> org_junit_internal_runners_TestClass [ label = \"5\" weight = \"5\" ];\nMethodValidator -> org_junit_internal_runners_InitializationError [ label = \"2\" weight = \"2\" ];\nEachTestNotifier -> RunNotifier [ label = \"9\" weight = \"9\" ];\nEachTestNotifier -> Description [ label = \"2\" weight = \"2\" ];\nEachTestNotifier -> org_junit_runners_model_MultipleFailureException [ label = \"4\" weight = \"4\" ];\nEachTestNotifier -> Failure [ label = \"2\" weight = \"2\" ];\nEachTestNotifier -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_model_MultipleFailureException -> org_junit_runners_model_MultipleFailureException [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_Builder [ label = \"25\" weight = \"25\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic [ label = \"4\" weight = \"4\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule [ label = \"1\" weight = \"1\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule [ label = \"1\" weight = \"1\" color = \"red\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule [ label = \"1\" weight = \"1\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule [ label = \"1\" weight = \"1\" color = \"red\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"3\" weight = \"3\" ];\nRuleMemberValidator -> org_junit_runners_model_TestClass [ label = \"3\" weight = \"3\" ];\nRuleMemberValidator -> FrameworkMember [ label = \"8\" weight = \"8\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_Builder -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_Builder -> RuleMemberValidator [ label = \"2\" weight = \"2\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_RuleValidator -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> FrameworkMember [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> RuleMemberValidator [ label = \"2\" weight = \"2\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> Annotatable [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic -> FrameworkMember [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic -> FrameworkMember [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic -> FrameworkMember [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> RuleMemberValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> RuleMemberValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> RuleMemberValidator [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> RuleMemberValidator [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> ValidationError [ label = \"1\" weight = \"1\" ];\nValidationError -> FrameworkMember [ label = \"2\" weight = \"2\" ];\nExpectException -> Statement [ label = \"4\" weight = \"4\" ];\nExpectException -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nFail -> Statement [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> Statement [ label = \"4\" weight = \"4\" ];\nFailOnTimeout -> org_junit_internal_runners_statements_FailOnTimeout_Builder [ label = \"4\" weight = \"4\" ];\norg_junit_internal_runners_statements_FailOnTimeout_Builder -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_statements_FailOnTimeout_Builder -> FailOnTimeout [ label = \"2\" weight = \"2\" color = \"red\" ];\nFailOnTimeout -> org_junit_internal_runners_statements_FailOnTimeout_CallableStatement [ label = \"3\" weight = \"3\" ];\nFailOnTimeout -> TestTimedOutException [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> ManagementFactory [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> ThreadMXBean [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_statements_FailOnTimeout_CallableStatement -> Statement [ label = \"1\" weight = \"1\" ];\nInvokeMethod -> Statement [ label = \"1\" weight = \"1\" ];\nInvokeMethod -> FrameworkMethod [ label = \"3\" weight = \"3\" ];\nRunAfters -> Statement [ label = \"4\" weight = \"4\" ];\nRunAfters -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nRunAfters -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nRunBefores -> Statement [ label = \"4\" weight = \"4\" ];\nRunBefores -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nSuiteMethod -> JUnit38ClassRunner [ label = \"2\" weight = \"2\" ];\nSuiteMethod -> junit_framework_Test [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_TestClass -> MethodSorter [ label = \"1\" weight = \"1\" ];\nTestMethod -> org_junit_internal_runners_TestClass [ label = \"4\" weight = \"4\" ];\nTestMethod -> org_junit_Test [ label = \"5\" weight = \"5\" ];\nTextListener -> RunListener [ label = \"1\" weight = \"1\" ];\nTextListener -> JUnitSystem [ label = \"2\" weight = \"2\" ];\nTextListener -> Result [ label = \"10\" weight = \"10\" ];\nTextListener -> Description [ label = \"2\" weight = \"2\" ];\nTextListener -> Failure [ label = \"6\" weight = \"6\" ];\nThrowables -> org_junit_internal_Throwables_State [ label = \"2\" weight = \"2\" ];\norg_junit_internal_Throwables_State -> Throwables [ label = \"5\" weight = \"5\" color = \"red\" ];\norg_junit_internal_Throwables_State_1 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_1 [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_Throwables_State_2 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_2 [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State_3 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_3 [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State_4 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_4 [ label = \"1\" weight = \"1\" color = \"red\" ];\nJUnitMatchers -> StacktracePrintingMatcher [ label = \"2\" weight = \"2\" ];\nDisableOnDebug -> TestRule [ label = \"5\" weight = \"5\" ];\nDisableOnDebug -> ManagementFactory [ label = \"1\" weight = \"1\" ];\nDisableOnDebug -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\nDisableOnDebug -> Statement [ label = \"2\" weight = \"2\" ];\nDisableOnDebug -> Description [ label = \"1\" weight = \"1\" ];\nErrorCollector -> Verifier [ label = \"1\" weight = \"1\" ];\nErrorCollector -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nErrorCollector -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\nErrorCollector -> ThrowingRunnable [ label = \"1\" weight = \"1\" ];\nErrorCollector -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nExpectedException -> TestRule [ label = \"1\" weight = \"1\" ];\nExpectedException -> ExpectedExceptionMatcherBuilder [ label = \"6\" weight = \"6\" ];\nExpectedException -> Statement [ label = \"2\" weight = \"2\" ];\nExpectedException -> Description [ label = \"1\" weight = \"1\" ];\nExpectedException -> org_junit_rules_ExpectedException_ExpectedExceptionStatement [ label = \"1\" weight = \"1\" ];\nExpectedException -> ThrowableMessageMatcher [ label = \"1\" weight = \"1\" ];\nExpectedException -> ThrowableCauseMatcher [ label = \"1\" weight = \"1\" ];\norg_junit_rules_ExpectedException_ExpectedExceptionStatement -> Statement [ label = \"4\" weight = \"4\" ];\norg_junit_rules_ExpectedException_ExpectedExceptionStatement -> ExpectedException [ label = \"3\" weight = \"3\" color = \"red\" ];\nExpectedException -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nExpectedExceptionMatcherBuilder -> JUnitMatchers [ label = \"1\" weight = \"1\" ];\nExternalResource -> TestRule [ label = \"1\" weight = \"1\" ];\nExternalResource -> Statement [ label = \"5\" weight = \"5\" ];\nExternalResource -> Description [ label = \"1\" weight = \"1\" ];\nExternalResource -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nMethodRule -> Statement [ label = \"2\" weight = \"2\" ];\nMethodRule -> FrameworkMethod [ label = \"1\" weight = \"1\" ];\nRuleChain -> TestRule [ label = \"8\" weight = \"8\" ];\nRuleChain -> Statement [ label = \"2\" weight = \"2\" ];\nRuleChain -> Description [ label = \"1\" weight = \"1\" ];\nRuleChain -> RunRules [ label = \"1\" weight = \"1\" ];\nRunRules -> Statement [ label = \"6\" weight = \"6\" ];\nRunRules -> TestRule [ label = \"4\" weight = \"4\" ];\nRunRules -> Description [ label = \"2\" weight = \"2\" ];\nStopwatch -> TestRule [ label = \"1\" weight = \"1\" ];\nStopwatch -> org_junit_rules_Stopwatch_Clock [ label = \"6\" weight = \"6\" ];\nStopwatch -> Description [ label = \"5\" weight = \"5\" ];\nStopwatch -> org_junit_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nStopwatch -> Statement [ label = \"2\" weight = \"2\" ];\nStopwatch -> org_junit_rules_Stopwatch_InternalWatcher [ label = \"1\" weight = \"1\" ];\nStopwatch -> TestWatcher [ label = \"1\" weight = \"1\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> TestWatcher [ label = \"1\" weight = \"1\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> Description [ label = \"5\" weight = \"5\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> Stopwatch [ label = \"12\" weight = \"12\" color = \"red\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> org_junit_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nTemporaryFolder -> ExternalResource [ label = \"1\" weight = \"1\" ];\nTemporaryFolder -> org_junit_rules_TemporaryFolder_Builder [ label = \"3\" weight = \"3\" color = \"red\" ];\norg_junit_rules_TemporaryFolder_Builder -> TemporaryFolder [ label = \"2\" weight = \"2\" ];\nTemporaryFolder -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nTestName -> TestWatcher [ label = \"1\" weight = \"1\" ];\nTestName -> Description [ label = \"2\" weight = \"2\" ];\nTestRule -> Statement [ label = \"2\" weight = \"2\" ];\nTestRule -> Description [ label = \"1\" weight = \"1\" ];\nTestWatcher -> TestRule [ label = \"1\" weight = \"1\" ];\nTestWatcher -> Statement [ label = \"3\" weight = \"3\" ];\nTestWatcher -> Description [ label = \"12\" weight = \"12\" ];\nTestWatcher -> org_junit_internal_AssumptionViolatedException [ label = \"4\" weight = \"4\" ];\nTestWatcher -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nTestWatcher -> org_junit_AssumptionViolatedException [ label = \"3\" weight = \"3\" ];\nTestWatchman -> MethodRule [ label = \"1\" weight = \"1\" ];\nTestWatchman -> Statement [ label = \"3\" weight = \"3\" ];\nTestWatchman -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nTestWatchman -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nTimeout -> TestRule [ label = \"1\" weight = \"1\" ];\nTimeout -> org_junit_rules_Timeout_Builder [ label = \"6\" weight = \"6\" color = \"red\" ];\nTimeout -> Statement [ label = \"4\" weight = \"4\" ];\nTimeout -> FailOnTimeout [ label = \"1\" weight = \"1\" ];\nTimeout -> org_junit_internal_runners_statements_FailOnTimeout_Builder [ label = \"3\" weight = \"3\" ];\nTimeout -> Description [ label = \"1\" weight = \"1\" ];\norg_junit_rules_Timeout_Builder -> Timeout [ label = \"2\" weight = \"2\" ];\nVerifier -> TestRule [ label = \"1\" weight = \"1\" ];\nVerifier -> Statement [ label = \"3\" weight = \"3\" ];\nVerifier -> Description [ label = \"1\" weight = \"1\" ];\nComputer -> RunnerBuilder [ label = \"3\" weight = \"3\" ];\norg_junit_runner_Computer_1 -> Runner [ label = \"1\" weight = \"1\" ];\nComputer -> org_junit_runner_Computer_1 [ label = \"1\" weight = \"1\" ];\nComputer -> Runner [ label = \"2\" weight = \"2\" ];\nComputer -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nDescribable -> Description [ label = \"1\" weight = \"1\" ];\nFilterFactories -> Request [ label = \"2\" weight = \"2\" ];\nFilterFactories -> Runner [ label = \"1\" weight = \"1\" ];\nFilterFactories -> Description [ label = \"1\" weight = \"1\" ];\nFilterFactories -> FilterFactoryParams [ label = \"3\" weight = \"3\" ];\nFilterFactories -> Filter [ label = \"3\" weight = \"3\" ];\nFilterFactories -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"7\" weight = \"7\" ];\nFilterFactories -> FilterFactory [ label = \"9\" weight = \"9\" ];\nFilterFactories -> Classes [ label = \"1\" weight = \"1\" ];\nFilterFactory -> FilterFactoryParams [ label = \"1\" weight = \"1\" ];\nFilterFactory -> Filter [ label = \"1\" weight = \"1\" ];\nFilterFactory -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"1\" weight = \"1\" ];\nFilterFactoryParams -> Description [ label = \"3\" weight = \"3\" ];\nJUnitCommandLineParseResult -> org_junit_runner_JUnitCommandLineParseResult_CommandLineParserError [ label = \"2\" weight = \"2\" ];\nJUnitCommandLineParseResult -> Classes [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> Request [ label = \"8\" weight = \"8\" ];\nJUnitCommandLineParseResult -> Computer [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> FilterFactories [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> Filter [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"1\" weight = \"1\" ];\nJUnitCore -> RunNotifier [ label = \"7\" weight = \"7\" ];\nJUnitCore -> RealSystem [ label = \"1\" weight = \"1\" ];\nJUnitCore -> Result [ label = \"13\" weight = \"13\" ];\nJUnitCore -> Computer [ label = \"4\" weight = \"4\" ];\nJUnitCore -> JUnitSystem [ label = \"2\" weight = \"2\" ];\nJUnitCore -> Version [ label = \"2\" weight = \"2\" ];\nJUnitCore -> JUnitCommandLineParseResult [ label = \"3\" weight = \"3\" ];\nJUnitCore -> TextListener [ label = \"1\" weight = \"1\" ];\nJUnitCore -> RunListener [ label = \"4\" weight = \"4\" ];\nJUnitCore -> Request [ label = \"3\" weight = \"3\" ];\nJUnitCore -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nJUnitCore -> JUnit38ClassRunner [ label = \"1\" weight = \"1\" ];\nJUnitCore -> Runner [ label = \"3\" weight = \"3\" ];\nAlphanumeric -> Sorter [ label = \"2\" weight = \"2\" ];\nAlphanumeric -> org_junit_runner_manipulation_Ordering_Factory [ label = \"1\" weight = \"1\" ];\nAlphanumeric -> org_junit_runner_manipulation_Ordering_Context [ label = \"1\" weight = \"1\" ];\nAlphanumeric -> Ordering [ label = \"1\" weight = \"1\" ];\nAlphanumeric -> Description [ label = \"5\" weight = \"5\" ];\nFilter -> Description [ label = \"10\" weight = \"10\" ];\norg_junit_runner_manipulation_Filter_1 -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\norg_junit_runner_manipulation_Filter_1 -> Filter [ label = \"1\" weight = \"1\" ];\nFilter -> org_junit_runner_manipulation_Filter_1 [ label = \"1\" weight = \"1\" color = \"red\" ];\nFilter -> Filterable [ label = \"4\" weight = \"4\" ];\nFilter -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nFilterable -> Filter [ label = \"1\" weight = \"1\" color = \"red\" ];\nFilterable -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nOrderable -> Sortable [ label = \"1\" weight = \"1\" ];\nOrderable -> Orderer [ label = \"1\" weight = \"1\" color = \"red\" ];\nOrderable -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nOrderer -> Ordering [ label = \"4\" weight = \"4\" ];\nOrderer -> Description [ label = \"7\" weight = \"7\" ];\nOrderer -> InvalidOrderingException [ label = \"5\" weight = \"5\" ];\nOrderer -> Orderable [ label = \"4\" weight = \"4\" ];\nOrdering -> Description [ label = \"7\" weight = \"7\" ];\norg_junit_runner_manipulation_Ordering_1 -> Description [ label = \"1\" weight = \"1\" ];\nOrdering -> org_junit_runner_manipulation_Ordering_1 [ label = \"1\" weight = \"1\" ];\nOrdering -> org_junit_runner_manipulation_Ordering_Factory [ label = \"5\" weight = \"5\" ];\nOrdering -> InvalidOrderingException [ label = \"5\" weight = \"5\" ];\nOrdering -> org_junit_runner_manipulation_Ordering_Context [ label = \"1\" weight = \"1\" ];\nOrdering -> Orderable [ label = \"4\" weight = \"4\" ];\nOrdering -> Orderer [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_runner_manipulation_Ordering_Context -> Description [ label = \"3\" weight = \"3\" ];\norg_junit_runner_manipulation_Ordering_Factory -> org_junit_runner_manipulation_Ordering_Context [ label = \"1\" weight = \"1\" ];\norg_junit_runner_manipulation_Ordering_Factory -> Ordering [ label = \"1\" weight = \"1\" color = \"red\" ];\nSortable -> Sorter [ label = \"1\" weight = \"1\" color = \"red\" ];\nSorter -> Ordering [ label = \"1\" weight = \"1\" ];\nSorter -> Description [ label = \"11\" weight = \"11\" ];\nSorter -> Sortable [ label = \"4\" weight = \"4\" ];\nFailure -> Description [ label = \"4\" weight = \"4\" ];\nFailure -> Throwables [ label = \"2\" weight = \"2\" ];\nRunListener -> Description [ label = \"6\" weight = \"6\" ];\nRunListener -> Result [ label = \"1\" weight = \"1\" color = \"red\" ];\nRunListener -> Failure [ label = \"2\" weight = \"2\" ];\nRunNotifier -> RunListener [ label = \"26\" weight = \"26\" ];\nRunNotifier -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"1\" weight = \"1\" ];\nRunNotifier -> SynchronizedRunListener [ label = \"1\" weight = \"1\" ];\norg_junit_runner_notification_RunNotifier_SafeNotifier -> RunListener [ label = \"6\" weight = \"6\" ];\norg_junit_runner_notification_RunNotifier_SafeNotifier -> Failure [ label = \"3\" weight = \"3\" ];\norg_junit_runner_notification_RunNotifier_SafeNotifier -> RunNotifier [ label = \"1\" weight = \"1\" color = \"red\" ];\nRunNotifier -> Description [ label = \"6\" weight = \"6\" ];\nRunNotifier -> org_junit_runner_notification_RunNotifier_SafeNotifier [ label = \"9\" weight = \"9\" ];\nRunNotifier -> Result [ label = \"1\" weight = \"1\" ];\nRunNotifier -> StoppedByUserException [ label = \"2\" weight = \"2\" ];\nRunNotifier -> Failure [ label = \"4\" weight = \"4\" ];\nSynchronizedRunListener -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"5\" weight = \"5\" ];\nSynchronizedRunListener -> RunListener [ label = \"12\" weight = \"12\" ];\nSynchronizedRunListener -> Description [ label = \"6\" weight = \"6\" ];\nSynchronizedRunListener -> Result [ label = \"1\" weight = \"1\" ];\nSynchronizedRunListener -> Failure [ label = \"2\" weight = \"2\" ];\nOrderWith -> ValidateWith [ label = \"2\" weight = \"2\" ];\nOrderWith -> OrderWithValidator [ label = \"1\" weight = \"1\" ];\nOrderWith -> org_junit_runner_manipulation_Ordering_Factory [ label = \"1\" weight = \"1\" ];\nOrderWithValidator -> AnnotationValidator [ label = \"1\" weight = \"1\" ];\nOrderWithValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\nRequest -> Description [ label = \"4\" weight = \"4\" ];\nRequest -> ClassRequest [ label = \"2\" weight = \"2\" ];\nRequest -> Computer [ label = \"2\" weight = \"2\" ];\nRequest -> AllDefaultPossibilitiesBuilder [ label = \"2\" weight = \"2\" ];\nRequest -> Runner [ label = \"3\" weight = \"3\" ];\nRequest -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nRequest -> ErrorReportingRunner [ label = \"2\" weight = \"2\" ];\nRequest -> JUnitCore [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_runner_Request_1 -> Runner [ label = \"1\" weight = \"1\" ];\nRequest -> org_junit_runner_Request_1 [ label = \"1\" weight = \"1\" ];\nRequest -> Filter [ label = \"2\" weight = \"2\" ];\nRequest -> FilterRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> SortingRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> Ordering [ label = \"1\" weight = \"1\" ];\nRequest -> OrderingRequest [ label = \"1\" weight = \"1\" ];\nResult -> Failure [ label = \"4\" weight = \"4\" ];\nResult -> org_junit_runner_Result_SerializedForm [ label = \"6\" weight = \"6\" color = \"red\" ];\norg_junit_runner_Result_Listener -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"2\" weight = \"2\" ];\norg_junit_runner_Result_Listener -> RunListener [ label = \"1\" weight = \"1\" ];\norg_junit_runner_Result_Listener -> Description [ label = \"3\" weight = \"3\" ];\norg_junit_runner_Result_Listener -> Result [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_runner_Result_Listener -> Failure [ label = \"2\" weight = \"2\" ];\nResult -> org_junit_runner_Result_Listener [ label = \"1\" weight = \"1\" ];\nResult -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"1\" weight = \"1\" ];\nResult -> RunListener [ label = \"1\" weight = \"1\" ];\norg_junit_runner_Result_SerializedForm -> Failure [ label = \"3\" weight = \"3\" ];\norg_junit_runner_Result_SerializedForm -> Result [ label = \"1\" weight = \"1\" ];\nRunner -> Describable [ label = \"1\" weight = \"1\" ];\nRunner -> Description [ label = \"2\" weight = \"2\" ];\nRunner -> RunNotifier [ label = \"1\" weight = \"1\" ];\nRunWith -> Runner [ label = \"1\" weight = \"1\" ];\nAllTests -> SuiteMethod [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> FrameworkMethod [ label = \"24\" weight = \"24\" ];\nBlockJUnit4ClassRunner -> ParentRunner [ label = \"27\" weight = \"27\" ];\nBlockJUnit4ClassRunner -> PublicClassValidator [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> TestClassValidator [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> Description [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunner -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> org_junit_runners_model_TestClass [ label = \"16\" weight = \"16\" ];\nBlockJUnit4ClassRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> Statement [ label = \"15\" weight = \"15\" ];\nBlockJUnit4ClassRunner -> RuleMemberValidator [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> ReflectiveCallable [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> Fail [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> InvokeMethod [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> org_junit_Test [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunner -> ExpectException [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> FailOnTimeout [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> org_junit_internal_runners_statements_FailOnTimeout_Builder [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> RunBefores [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> RunAfters [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> RuleContainer [ label = \"7\" weight = \"7\" ];\nBlockJUnit4ClassRunner -> TestRule [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunner -> MethodRule [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunner -> org_junit_runners_BlockJUnit4ClassRunner_RuleCollector [ label = \"4\" weight = \"4\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> MemberValueConsumer [ label = \"1\" weight = \"1\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> Annotatable [ label = \"1\" weight = \"1\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> Rule [ label = \"2\" weight = \"2\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> RuleContainer [ label = \"2\" weight = \"2\" ];\nJUnit4 -> BlockJUnit4ClassRunner [ label = \"2\" weight = \"2\" ];\nJUnit4 -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nJUnit4 -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nFrameworkField -> FrameworkMember [ label = \"2\" weight = \"2\" ];\nFrameworkMember -> Annotatable [ label = \"1\" weight = \"1\" ];\nFrameworkMethod -> FrameworkMember [ label = \"4\" weight = \"4\" ];\nFrameworkMethod -> ReflectiveCallable [ label = \"1\" weight = \"1\" ];\nFrameworkMethod -> NoGenericTypeParametersValidator [ label = \"2\" weight = \"2\" ];\nInvalidTestClassError -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nMemberValueConsumer -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_MultipleFailureException -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_MultipleFailureException -> TestCouldNotBeSkippedException [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_MultipleFailureException -> Throwables [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_MultipleFailureException -> org_junit_internal_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" color = \"red\" ];\nRunnerBuilder -> Runner [ label = \"11\" weight = \"11\" ];\nRunnerBuilder -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\nRunnerBuilder -> Description [ label = \"2\" weight = \"2\" ];\nRunnerBuilder -> ValidateWith [ label = \"2\" weight = \"2\" ];\nRunnerBuilder -> OrderWith [ label = \"2\" weight = \"2\" ];\nRunnerBuilder -> Ordering [ label = \"3\" weight = \"3\" ];\nRunnerBuilder -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nRunnerBuilder -> org_junit_runners_model_InitializationError [ label = \"4\" weight = \"4\" ];\norg_junit_runners_model_TestClass -> Annotatable [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_TestClass -> org_junit_runners_model_TestClass_FieldComparator [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_TestClass -> org_junit_runners_model_TestClass_MethodComparator [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_TestClass -> FrameworkMethod [ label = \"12\" weight = \"12\" ];\norg_junit_runners_model_TestClass -> FrameworkField [ label = \"9\" weight = \"9\" ];\norg_junit_runners_model_TestClass -> MethodSorter [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_TestClass -> FrameworkMember [ label = \"14\" weight = \"14\" ];\norg_junit_runners_model_TestClass -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_TestClass -> MemberValueConsumer [ label = \"4\" weight = \"4\" ];\norg_junit_runners_model_TestClass_MethodComparator -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nBlockJUnit4ClassRunnerWithParameters -> BlockJUnit4ClassRunner [ label = \"5\" weight = \"5\" ];\nBlockJUnit4ClassRunnerWithParameters -> TestWithParameters [ label = \"5\" weight = \"5\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_InjectionType [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunnerWithParameters -> ParentRunner [ label = \"8\" weight = \"8\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_model_TestClass [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunnerWithParameters -> FrameworkField [ label = \"7\" weight = \"7\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_Parameterized_Parameter [ label = \"3\" weight = \"3\" ];\nBlockJUnit4ClassRunnerWithParameters -> FrameworkMethod [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunnerWithParameters -> RunNotifier [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParameters -> Statement [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams -> RunBefores [ label = \"2\" weight = \"2\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams -> FrameworkMethod [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams -> RunAfters [ label = \"2\" weight = \"2\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams -> FrameworkMethod [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> ParametersRunnerFactory [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> TestWithParameters [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> BlockJUnit4ClassRunnerWithParameters [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> Runner [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nParametersRunnerFactory -> TestWithParameters [ label = \"1\" weight = \"1\" ];\nParametersRunnerFactory -> Runner [ label = \"1\" weight = \"1\" ];\nParametersRunnerFactory -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nTestWithParameters -> org_junit_runners_model_TestClass [ label = \"6\" weight = \"6\" ];\nTestWithParameters -> Checks [ label = \"3\" weight = \"3\" ];\nParameterized -> Suite [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_UseParametersRunnerFactory -> ParametersRunnerFactory [ label = \"1\" weight = \"1\" ];\nParameterized -> org_junit_runners_Parameterized_RunnersFactory [ label = \"3\" weight = \"3\" ];\nParameterized -> ParentRunner [ label = \"2\" weight = \"2\" ];\nParameterized -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\nParameterized -> InvalidTestClassError [ label = \"2\" weight = \"2\" ];\nParameterized -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> Runner [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> Description [ label = \"3\" weight = \"3\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> Failure [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_RunnersFactory -> BlockJUnit4ClassRunnerWithParametersFactory [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_RunnersFactory -> ParametersRunnerFactory [ label = \"5\" weight = \"5\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_model_TestClass [ label = \"10\" weight = \"10\" ];\norg_junit_runners_Parameterized_RunnersFactory -> FrameworkMethod [ label = \"10\" weight = \"10\" ];\norg_junit_runners_Parameterized_RunnersFactory -> Runner [ label = \"5\" weight = \"5\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_Parameterized_AssumptionViolationRunner [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_Parameterized_Parameters [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_Parameterized_UseParametersRunnerFactory [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_RunnersFactory -> TestWithParameters [ label = \"8\" weight = \"8\" ];\norg_junit_runners_Parameterized_RunnersFactory -> FrameworkMember [ label = \"2\" weight = \"2\" ];\nParentRunner -> Runner [ label = \"1\" weight = \"1\" ];\nParentRunner -> Filterable [ label = \"1\" weight = \"1\" ];\nParentRunner -> Orderable [ label = \"1\" weight = \"1\" ];\nParentRunner -> AnnotationsValidator [ label = \"1\" weight = \"1\" ];\nParentRunner -> TestClassValidator [ label = \"4\" weight = \"4\" ];\nParentRunner -> org_junit_runners_model_TestClass [ label = \"15\" weight = \"15\" ];\nParentRunner -> RunnerScheduler [ label = \"5\" weight = \"5\" ];\nParentRunner -> org_junit_runners_model_InitializationError [ label = \"3\" weight = \"3\" ];\nParentRunner -> Checks [ label = \"1\" weight = \"1\" ];\nParentRunner -> Description [ label = \"13\" weight = \"13\" ];\nParentRunner -> RunNotifier [ label = \"6\" weight = \"6\" ];\nParentRunner -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nParentRunner -> RuleMemberValidator [ label = \"2\" weight = \"2\" ];\nParentRunner -> Statement [ label = \"16\" weight = \"16\" ];\nParentRunner -> RunBefores [ label = \"1\" weight = \"1\" ];\nParentRunner -> RunAfters [ label = \"1\" weight = \"1\" ];\nParentRunner -> TestRule [ label = \"2\" weight = \"2\" ];\nParentRunner -> RunRules [ label = \"1\" weight = \"1\" ];\nParentRunner -> org_junit_runners_ParentRunner_ClassRuleCollector [ label = \"3\" weight = \"3\" ];\nParentRunner -> EachTestNotifier [ label = \"12\" weight = \"12\" ];\nParentRunner -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\nParentRunner -> StoppedByUserException [ label = \"1\" weight = \"1\" ];\nParentRunner -> Filter [ label = \"4\" weight = \"4\" ];\nParentRunner -> NoTestsRemainException [ label = \"3\" weight = \"3\" ];\nParentRunner -> Sorter [ label = \"4\" weight = \"4\" ];\nParentRunner -> Orderer [ label = \"3\" weight = \"3\" ];\nParentRunner -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nParentRunner -> InvalidTestClassError [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> MemberValueConsumer [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> TestRule [ label = \"6\" weight = \"6\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> org_junit_runners_RuleContainer_RuleEntry [ label = \"4\" weight = \"4\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> Annotatable [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> ClassRule [ label = \"2\" weight = \"2\" ];\nRuleContainer -> TestRule [ label = \"6\" weight = \"6\" ];\nRuleContainer -> MethodRule [ label = \"6\" weight = \"6\" ];\nRuleContainer -> org_junit_runners_RuleContainer_RuleEntry [ label = \"10\" weight = \"10\" ];\nRuleContainer -> FrameworkMethod [ label = \"1\" weight = \"1\" ];\nRuleContainer -> Description [ label = \"1\" weight = \"1\" ];\nRuleContainer -> Statement [ label = \"3\" weight = \"3\" ];\nSuite -> Runner [ label = \"9\" weight = \"9\" ];\nSuite -> ParentRunner [ label = \"2\" weight = \"2\" ];\nSuite -> org_junit_runners_model_InitializationError [ label = \"8\" weight = \"8\" ];\nSuite -> org_junit_runners_Suite_SuiteClasses [ label = \"2\" weight = \"2\" ];\nSuite -> RunnerBuilder [ label = \"5\" weight = \"5\" ];\nSuite -> AllDefaultPossibilitiesBuilder [ label = \"1\" weight = \"1\" ];\nSuite -> Description [ label = \"1\" weight = \"1\" ];\nSuite -> RunNotifier [ label = \"1\" weight = \"1\" ];\nTestCouldNotBeSkippedException -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> TestClassValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_ClassValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_MethodValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_FieldValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"4\" weight = \"4\" ];\nAnnotationsValidator -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> Annotatable [ label = \"7\" weight = \"7\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> AnnotationValidatorFactory [ label = \"3\" weight = \"3\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> ValidateWith [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_ClassValidator -> org_junit_runners_model_TestClass [ label = \"4\" weight = \"4\" ];\norg_junit_validator_AnnotationsValidator_ClassValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_ClassValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> FrameworkMethod [ label = \"3\" weight = \"3\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> FrameworkField [ label = \"3\" weight = \"3\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\nAnnotationValidator -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nAnnotationValidator -> FrameworkField [ label = \"1\" weight = \"1\" ];\nAnnotationValidator -> FrameworkMethod [ label = \"1\" weight = \"1\" ];\nAnnotationValidatorFactory -> ValidateWith [ label = \"4\" weight = \"4\" ];\nAnnotationValidatorFactory -> AnnotationValidator [ label = \"6\" weight = \"6\" ];\nPublicClassValidator -> TestClassValidator [ label = \"1\" weight = \"1\" ];\nPublicClassValidator -> org_junit_runners_model_TestClass [ label = \"3\" weight = \"3\" ];\nTestClassValidator -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nValidateWith -> AnnotationValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\" label=\"ClassRequest$CustomSuiteMethodBuilder\"];\nRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Request.java\" target=\"_blank\" color=red style=filled];\nIncludeCategories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/IncludeCategories.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$AnnotatableValidator\"];\nParameterSignature [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/ParameterSignature.java\" target=\"_blank\"];\norg_junit_rules_ExpectedException_ExpectedExceptionStatement [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExpectedException.java\" target=\"_blank\" label=\"ExpectedException$ExpectedExceptionStatement\"];\nNullBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/NullBuilder.java\" target=\"_blank\"];\nOrdering [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\"];\nTestSuite [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestSuite.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_FieldValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$FieldValidator\"];\norg_junit_ComparisonFailure_ComparisonCompactor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ComparisonFailure.java\" target=\"_blank\" label=\"ComparisonFailure$ComparisonCompactor\" color=red style=filled];\norg_junit_experimental_categories_Categories_IncludeCategory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" label=\"Categories$IncludeCategory\"];\nExpectedExceptionMatcherBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExpectedExceptionMatcherBuilder.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$DeclaringClassMustBePublic\"];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_InjectionType [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunnerWithParameters$InjectionType\"];\nSortingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/SortingRequest.java\" target=\"_blank\"];\nTestSetup [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/TestSetup.java\" target=\"_blank\"];\nArrayComparisonFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/ArrayComparisonFailure.java\" target=\"_blank\"];\norg_junit_runner_Request_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Request.java\" target=\"_blank\" label=\"Request$1\"];\norg_junit_runner_Computer_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Computer.java\" target=\"_blank\" label=\"Computer$1\"];\nErrorCollector [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ErrorCollector.java\" target=\"_blank\"];\norg_junit_internal_runners_InitializationError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/InitializationError.java\" target=\"_blank\"];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunnerWithParameters$RunAfterParams\"];\nVerifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Verifier.java\" target=\"_blank\"];\nThrowingRunnable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/function/ThrowingRunnable.java\" target=\"_blank\"];\nExternalResource [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExternalResource.java\" target=\"_blank\"];\nFailureList [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/results/FailureList.java\" target=\"_blank\"];\nResultPrinter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/textui/ResultPrinter.java\" target=\"_blank\"];\nReflectiveRuntimeMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveRuntimeMXBean.java\" target=\"_blank\"];\norg_junit_ComparisonFailure_ComparisonCompactor_DiffExtractor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ComparisonFailure.java\" target=\"_blank\" label=\"ComparisonFailure$ComparisonCompactor$DiffExtractor\"];\nValidationError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/ValidationError.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MemberMustBeStatic\"];\nSuiteMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/SuiteMethod.java\" target=\"_blank\"];\nSerializableMatcherDescription [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/SerializableMatcherDescription.java\" target=\"_blank\"];\nRunWith [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/RunWith.java\" target=\"_blank\"];\nPrintableResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/results/PrintableResult.java\" target=\"_blank\"];\norg_junit_internal_management_ManagementFactory_ThreadHolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\" label=\"ManagementFactory$ThreadHolder\"];\nInvokeMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/InvokeMethod.java\" target=\"_blank\"];\nFakeRuntimeMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/FakeRuntimeMXBean.java\" target=\"_blank\"];\nActiveTestSuite [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/ActiveTestSuite.java\" target=\"_blank\"];\nTheories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theories.java\" target=\"_blank\"];\nComparisonCriteria [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/ComparisonCriteria.java\" target=\"_blank\"];\nClassRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\"];\nTimeout [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Timeout.java\" target=\"_blank\" color=red style=filled];\nTestCase [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestCase.java\" target=\"_blank\"];\norg_junit_AssumptionViolatedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/AssumptionViolatedException.java\" target=\"_blank\"];\norg_junit_experimental_categories_IncludeCategories_IncludesAny [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/IncludeCategories.java\" target=\"_blank\" label=\"IncludeCategories$IncludesAny\"];\nFilter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Filter.java\" target=\"_blank\" color=red style=filled];\norg_junit_internal_runners_statements_FailOnTimeout_CallableStatement [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java\" target=\"_blank\" label=\"FailOnTimeout$CallableStatement\"];\norg_junit_runner_notification_RunNotifier_SafeNotifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunNotifier.java\" target=\"_blank\" label=\"RunNotifier$SafeNotifier\"];\norg_junit_runner_notification_RunListener_ThreadSafe [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunListener.java\" target=\"_blank\" label=\"RunListener$ThreadSafe\"];\norg_junit_Test [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Test.java\" target=\"_blank\"];\nJUnit4TestCaseFacade [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/JUnit4TestCaseFacade.java\" target=\"_blank\"];\norg_junit_runners_Parameterized_Parameter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$Parameter\"];\nFilterRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/FilterRequest.java\" target=\"_blank\"];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java\" target=\"_blank\" label=\"AllMembersSupplier$MethodParameterValue\"];\nCategoryValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/CategoryValidator.java\" target=\"_blank\"];\norg_junit_experimental_categories_Categories_ExcludeCategory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" label=\"Categories$ExcludeCategory\"];\norg_junit_ComparisonFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ComparisonFailure.java\" target=\"_blank\"];\nMethodSorters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/MethodSorters.java\" target=\"_blank\"];\nRunnerBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/RunnerBuilder.java\" target=\"_blank\" color=red style=filled];\nChecks [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Checks.java\" target=\"_blank\"];\nFilterable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Filterable.java\" target=\"_blank\"];\nManagementFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_MethodValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$MethodValidator\"];\nRunRules [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/RunRules.java\" target=\"_blank\"];\nMethodSorter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/MethodSorter.java\" target=\"_blank\"];\nThrowables [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\"];\nEachTestNotifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/model/EachTestNotifier.java\" target=\"_blank\"];\norg_junit_internal_Throwables_State_4 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$4\"];\norg_junit_internal_Throwables_State_3 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$3\"];\norg_junit_internal_Throwables_State_2 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$2\"];\nRunListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunListener.java\" target=\"_blank\"];\norg_junit_internal_Throwables_State_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$1\"];\nTestFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestFailure.java\" target=\"_blank\"];\nDescription [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Description.java\" target=\"_blank\"];\nAnnotationValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationValidator.java\" target=\"_blank\"];\nFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/Failure.java\" target=\"_blank\" color=red style=filled];\nInvalidTestClassError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/InvalidTestClassError.java\" target=\"_blank\"];\nValidateWith [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/ValidateWith.java\" target=\"_blank\"];\norg_junit_runner_Result_SerializedForm [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Result.java\" target=\"_blank\" label=\"Result$SerializedForm\"];\norg_junit_runners_Parameterized_RunnersFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$RunnersFactory\"];\nFailOnTimeout [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java\" target=\"_blank\" color=red style=filled];\nAllDefaultPossibilitiesBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/AllDefaultPossibilitiesBuilder.java\" target=\"_blank\"];\norg_junit_runner_manipulation_Ordering_Factory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\" label=\"Ordering$Factory\"];\nDisableOnDebug [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/DisableOnDebug.java\" target=\"_blank\"];\norg_junit_runners_Parameterized_AssumptionViolationRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$AssumptionViolationRunner\"];\nNoGenericTypeParametersValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/NoGenericTypeParametersValidator.java\" target=\"_blank\"];\nStatement [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/Statement.java\" target=\"_blank\" color=red style=filled];\njunit_framework_Test [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/Test.java\" target=\"_blank\" color=red style=filled];\nJUnitMatchers [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/matchers/JUnitMatchers.java\" target=\"_blank\"];\nMemberValueConsumer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/MemberValueConsumer.java\" target=\"_blank\"];\nJUnit4TestAdapter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/JUnit4TestAdapter.java\" target=\"_blank\" color=red style=filled];\norg_junit_experimental_categories_Categories_CategoryFilter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" label=\"Categories$CategoryFilter\"];\nFakeThreadMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/FakeThreadMXBean.java\" target=\"_blank\"];\norg_junit_internal_runners_TestClass [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/TestClass.java\" target=\"_blank\"];\nInvalidOrderingException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/InvalidOrderingException.java\" target=\"_blank\"];\norg_junit_internal_management_ManagementFactory_FactoryHolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\" label=\"ManagementFactory$FactoryHolder\"];\nParallelComputer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/ParallelComputer.java\" target=\"_blank\"];\nStacktracePrintingMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/StacktracePrintingMatcher.java\" target=\"_blank\"];\norg_junit_internal_runners_statements_FailOnTimeout_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java\" target=\"_blank\" label=\"FailOnTimeout$Builder\"];\norg_junit_runner_JUnitCommandLineParseResult_CommandLineParserError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCommandLineParseResult.java\" target=\"_blank\" label=\"JUnitCommandLineParseResult$CommandLineParserError\"];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunner$RuleCollector\"];\nExcludeCategories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/ExcludeCategories.java\" target=\"_blank\"];\nMethodValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/MethodValidator.java\" target=\"_blank\"];\norg_junit_experimental_theories_Theories_TheoryAnchor_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theories.java\" target=\"_blank\" label=\"Theories$TheoryAnchor$1\"];\norg_junit_runner_Result_Listener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Result.java\" target=\"_blank\" label=\"Result$Listener\"];\nExactComparisonCriteria [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/ExactComparisonCriteria.java\" target=\"_blank\"];\nAnnotationsValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\"];\nAssume [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Assume.java\" target=\"_blank\"];\nTestCouldNotBeSkippedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/TestCouldNotBeSkippedException.java\" target=\"_blank\"];\nJUnitSystem [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/JUnitSystem.java\" target=\"_blank\"];\nBlockJUnit4ClassRunnerWithParametersFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParametersFactory.java\" target=\"_blank\"];\nClassRoadie [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/ClassRoadie.java\" target=\"_blank\"];\norg_junit_rules_Stopwatch_Clock [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Stopwatch.java\" target=\"_blank\" label=\"Stopwatch$Clock\"];\nJUnit3Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/JUnit3Builder.java\" target=\"_blank\"];\nFrameworkMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/FrameworkMethod.java\" target=\"_blank\" color=red style=filled];\nIgnoredBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/IgnoredBuilder.java\" target=\"_blank\"];\norg_junit_internal_Throwables_State [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State\"];\nTestTimedOutException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestTimedOutException.java\" target=\"_blank\"];\nSpecificDataPointsSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java\" target=\"_blank\" color=red style=filled];\nJUnit4 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/JUnit4.java\" target=\"_blank\"];\nJUnitCommandLineParseResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCommandLineParseResult.java\" target=\"_blank\"];\njunit_framework_Assert [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/Assert.java\" target=\"_blank\" color=red style=filled];\nOrderWithValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/OrderWithValidator.java\" target=\"_blank\"];\nParametersRunnerFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/ParametersRunnerFactory.java\" target=\"_blank\"];\nTestDecorator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/TestDecorator.java\" target=\"_blank\"];\nParametersSuppliedBy [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/ParametersSuppliedBy.java\" target=\"_blank\"];\nMemoizingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/MemoizingRequest.java\" target=\"_blank\"];\nTestClassValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/TestClassValidator.java\" target=\"_blank\"];\nResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Result.java\" target=\"_blank\"];\nJUnitCore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCore.java\" target=\"_blank\"];\norg_junit_experimental_theories_Theories_TheoryAnchor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theories.java\" target=\"_blank\" label=\"Theories$TheoryAnchor\"];\nTestRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/textui/TestRunner.java\" target=\"_blank\"];\nInexactComparisonCriteria [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/InexactComparisonCriteria.java\" target=\"_blank\"];\nRunnerScheduler [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/RunnerScheduler.java\" target=\"_blank\"];\norg_junit_internal_AssumptionViolatedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/AssumptionViolatedException.java\" target=\"_blank\"];\nFilterFactories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactories.java\" target=\"_blank\"];\nParameterSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/ParameterSupplier.java\" target=\"_blank\"];\nThrowableMessageMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/ThrowableMessageMatcher.java\" target=\"_blank\"];\nMaxCore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxCore.java\" target=\"_blank\"];\nReflectiveThreadMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveThreadMXBean.java\" target=\"_blank\"];\nRuleContainer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/RuleContainer.java\" target=\"_blank\"];\nBlockJUnit4ClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java\" target=\"_blank\" color=red style=filled];\norg_junit_runner_FilterFactory_FilterNotCreatedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactory.java\" target=\"_blank\" label=\"FilterFactory$FilterNotCreatedException\"];\njunit_framework_ComparisonFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/ComparisonFailure.java\" target=\"_blank\"];\nFrameworkMember [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/FrameworkMember.java\" target=\"_blank\"];\nClassRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ClassRule.java\" target=\"_blank\"];\nTheory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theory.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MethodMustBeARule\"];\nJUnit4Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/JUnit4Builder.java\" target=\"_blank\"];\nSuiteMethodBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/SuiteMethodBuilder.java\" target=\"_blank\"];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java\" target=\"_blank\" label=\"JUnit38ClassRunner$OldTestClassAdaptingListener\"];\nTestWithParameters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/TestWithParameters.java\" target=\"_blank\"];\norg_junit_runners_Parameterized_UseParametersRunnerFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$UseParametersRunnerFactory\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MemberMustBePublic\"];\nCategory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Category.java\" target=\"_blank\"];\nTestWatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestWatcher.java\" target=\"_blank\"];\nMethodRoadie [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/MethodRoadie.java\" target=\"_blank\"];\nSuite [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Suite.java\" target=\"_blank\"];\nAssignments [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/Assignments.java\" target=\"_blank\"];\nIgnoredClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/IgnoredClassRunner.java\" target=\"_blank\"];\nTestedOnSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/suppliers/TestedOnSupplier.java\" target=\"_blank\" color=red style=filled];\nTypeSafeMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/TypeSafeMatcher.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$FieldMustBeARule\"];\nFixMethodOrder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/FixMethodOrder.java\" target=\"_blank\"];\nFailedBefore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/FailedBefore.java\" target=\"_blank\"];\nRealSystem [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/RealSystem.java\" target=\"_blank\"];\nFrameworkField [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/FrameworkField.java\" target=\"_blank\"];\nThreadMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ThreadMXBean.java\" target=\"_blank\"];\norg_junit_internal_management_ReflectiveThreadMXBean_Holder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveThreadMXBean.java\" target=\"_blank\" label=\"ReflectiveThreadMXBean$Holder\"];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\" label=\"ClassRequest$CustomAllDefaultPossibilitiesBuilder\"];\nRunAfters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/RunAfters.java\" target=\"_blank\"];\nStopwatch [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Stopwatch.java\" target=\"_blank\" color=red style=filled];\norg_junit_experimental_max_MaxHistory_RememberingListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxHistory.java\" target=\"_blank\" label=\"MaxHistory$RememberingListener\"];\norg_junit_runners_model_MultipleFailureException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/MultipleFailureException.java\" target=\"_blank\"];\nOrderable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Orderable.java\" target=\"_blank\"];\nParameterizedAssertionError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/ParameterizedAssertionError.java\" target=\"_blank\"];\nAnnotatable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/Annotatable.java\" target=\"_blank\"];\nTestWatchman [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestWatchman.java\" target=\"_blank\"];\nDescribable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Describable.java\" target=\"_blank\"];\nRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Runner.java\" target=\"_blank\"];\nTestName [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestName.java\" target=\"_blank\"];\nBooleanSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/BooleanSupplier.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$FieldMustBeATestRule\"];\norg_junit_runners_model_InitializationError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/InitializationError.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$RuleValidator\"];\nCategoryFilterFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/CategoryFilterFactory.java\" target=\"_blank\"];\nTextListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/TextListener.java\" target=\"_blank\"];\nTestMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/TestMethod.java\" target=\"_blank\"];\norg_junit_runners_ParentRunner_ClassRuleCollector [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/ParentRunner.java\" target=\"_blank\" label=\"ParentRunner$ClassRuleCollector\"];\norg_junit_runners_Parameterized_Parameters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$Parameters\"];\nAssertionFailedError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/AssertionFailedError.java\" target=\"_blank\"];\nPublicClassValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/PublicClassValidator.java\" target=\"_blank\"];\norg_junit_experimental_categories_ExcludeCategories_ExcludesAny [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/ExcludeCategories.java\" target=\"_blank\" label=\"ExcludeCategories$ExcludesAny\"];\nJUnit4TestAdapterCache [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/JUnit4TestAdapterCache.java\" target=\"_blank\"];\nEnumSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/EnumSupplier.java\" target=\"_blank\"];\nTestListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestListener.java\" target=\"_blank\"];\nParentRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/ParentRunner.java\" target=\"_blank\"];\nEnclosed [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/runners/Enclosed.java\" target=\"_blank\"];\norg_junit_Assert [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Assert.java\" target=\"_blank\"];\norg_junit_experimental_max_MaxCore_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxCore.java\" target=\"_blank\" label=\"MaxCore$1\"];\nProtectable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/Protectable.java\" target=\"_blank\"];\nJUnit4ClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/JUnit4ClassRunner.java\" target=\"_blank\"];\nFilterFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactory.java\" target=\"_blank\"];\norg_junit_rules_Timeout_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Timeout.java\" target=\"_blank\" label=\"Timeout$Builder\"];\norg_junit_runner_manipulation_Ordering_Context [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\" label=\"Ordering$Context\"];\nMethodRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/MethodRule.java\" target=\"_blank\"];\norg_junit_rules_Stopwatch_InternalWatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Stopwatch.java\" target=\"_blank\" label=\"Stopwatch$InternalWatcher\"];\nComparisonCompactor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/ComparisonCompactor.java\" target=\"_blank\"];\norg_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/PotentialAssignment.java\" target=\"_blank\" label=\"PotentialAssignment$CouldNotGenerateValueException\"];\nOrderWith [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/OrderWith.java\" target=\"_blank\"];\nFilterFactoryParams [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactoryParams.java\" target=\"_blank\"];\norg_junit_runners_model_TestClass [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestClass.java\" target=\"_blank\" color=red style=filled];\nClasses [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Classes.java\" target=\"_blank\"];\nDataPoint [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/DataPoint.java\" target=\"_blank\"];\nSortable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Sortable.java\" target=\"_blank\"];\nComputer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Computer.java\" target=\"_blank\"];\norg_junit_runners_model_TestClass_FieldComparator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestClass.java\" target=\"_blank\" label=\"TestClass$FieldComparator\"];\nTestResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestResult.java\" target=\"_blank\"];\nBaseTestRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/runner/BaseTestRunner.java\" target=\"_blank\"];\nSynchronizedRunListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/SynchronizedRunListener.java\" target=\"_blank\"];\nSerializableValueDescription [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/SerializableValueDescription.java\" target=\"_blank\"];\nAnnotatedBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/AnnotatedBuilder.java\" target=\"_blank\"];\nAlphanumeric [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Alphanumeric.java\" target=\"_blank\"];\nRuntimeMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/RuntimeMXBean.java\" target=\"_blank\"];\nFail [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/Fail.java\" target=\"_blank\"];\nParameterized [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_ClassValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$ClassValidator\"];\nSorter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Sorter.java\" target=\"_blank\" color=red style=filled];\nBlockJUnit4ClassRunnerWithParameters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\"];\nErrorReportingRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/ErrorReportingRunner.java\" target=\"_blank\"];\nResultMatchers [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/results/ResultMatchers.java\" target=\"_blank\"];\nAllTests [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/AllTests.java\" target=\"_blank\"];\norg_junit_runners_Suite_SuiteClasses [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Suite.java\" target=\"_blank\" label=\"Suite$SuiteClasses\"];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunnerWithParameters$RunBeforeParams\"];\nNoTestsRemainException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/NoTestsRemainException.java\" target=\"_blank\"];\nAllMembersSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java\" target=\"_blank\" color=red style=filled];\nFromDataPoints [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/FromDataPoints.java\" target=\"_blank\"];\nStoppedByUserException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/StoppedByUserException.java\" target=\"_blank\"];\nTestedOn [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/suppliers/TestedOn.java\" target=\"_blank\"];\nRuleMemberValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\"];\nDataPoints [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/DataPoints.java\" target=\"_blank\"];\nCategories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" color=red style=filled];\nMaxHistory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxHistory.java\" target=\"_blank\" color=red style=filled];\nTestRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestRule.java\" target=\"_blank\"];\nRunBefores [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/RunBefores.java\" target=\"_blank\"];\nJUnit38ClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java\" target=\"_blank\" color=red style=filled];\nOrderer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Orderer.java\" target=\"_blank\" color=red style=filled];\norg_junit_runner_manipulation_Filter_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Filter.java\" target=\"_blank\" label=\"Filter$1\"];\nRepeatedTest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/RepeatedTest.java\" target=\"_blank\"];\nPotentialAssignment [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/PotentialAssignment.java\" target=\"_blank\"];\norg_junit_internal_management_ManagementFactory_RuntimeHolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\" label=\"ManagementFactory$RuntimeHolder\"];\nAnnotationValidatorFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationValidatorFactory.java\" target=\"_blank\"];\norg_junit_rules_TemporaryFolder_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TemporaryFolder.java\" target=\"_blank\" label=\"TemporaryFolder$Builder\"];\norg_junit_internal_management_ReflectiveRuntimeMXBean_Holder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveRuntimeMXBean.java\" target=\"_blank\" label=\"ReflectiveRuntimeMXBean$Holder\"];\nExpectedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExpectedException.java\" target=\"_blank\" color=red style=filled];\norg_junit_runners_RuleContainer_RuleEntry [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/RuleContainer.java\" target=\"_blank\" label=\"RuleContainer$RuleEntry\"];\norg_junit_internal_runners_model_MultipleFailureException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/model/MultipleFailureException.java\" target=\"_blank\"];\nVersion [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/runner/Version.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MethodMustBeATestRule\"];\norg_junit_experimental_max_MaxHistory_TestComparator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxHistory.java\" target=\"_blank\" label=\"MaxHistory$TestComparator\"];\norg_junit_internal_runners_rules_RuleMemberValidator_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$Builder\"];\norg_junit_runners_model_TestClass_MethodComparator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestClass.java\" target=\"_blank\" label=\"TestClass$MethodComparator\"];\nExpectException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/ExpectException.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MemberMustBeNonStaticOrAlsoClassRule\"];\norg_junit_runner_manipulation_Ordering_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\" label=\"Ordering$1\"];\nReflectiveCallable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/model/ReflectiveCallable.java\" target=\"_blank\"];\nRuleChain [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/RuleChain.java\" target=\"_blank\"];\nCouldNotReadCoreException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/CouldNotReadCoreException.java\" target=\"_blank\"];\nRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Rule.java\" target=\"_blank\"];\nThrowableCauseMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/ThrowableCauseMatcher.java\" target=\"_blank\"];\nOrderingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/OrderingRequest.java\" target=\"_blank\"];\nRunNotifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunNotifier.java\" target=\"_blank\"];\nTemporaryFolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TemporaryFolder.java\" target=\"_blank\" color=red style=filled];\n}", - "hasEdges" : false + "classMap": { + "graphId": "classGraph", + "classCount": 335, + "relationshipCount": 934, + "dotThreshold": 4000, + "dotThresholdExceeded": false, + "dot": "strict digraph G {\nActiveTestSuite -> TestSuite [ label = \"6\" weight = \"6\" ];\nActiveTestSuite -> TestCase [ label = \"2\" weight = \"2\" ];\nActiveTestSuite -> TestResult [ label = \"2\" weight = \"2\" ];\nActiveTestSuite -> junit_framework_Test [ label = \"2\" weight = \"2\" ];\nRepeatedTest -> TestDecorator [ label = \"5\" weight = \"5\" ];\nRepeatedTest -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nRepeatedTest -> TestResult [ label = \"2\" weight = \"2\" ];\nTestDecorator -> junit_framework_Assert [ label = \"1\" weight = \"1\" ];\nTestDecorator -> junit_framework_Test [ label = \"7\" weight = \"7\" ];\nTestDecorator -> TestResult [ label = \"2\" weight = \"2\" ];\nTestSetup -> TestDecorator [ label = \"3\" weight = \"3\" ];\nTestSetup -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nTestSetup -> TestResult [ label = \"2\" weight = \"2\" ];\nTestSetup -> Protectable [ label = \"1\" weight = \"1\" ];\njunit_framework_Assert -> AssertionFailedError [ label = \"2\" weight = \"2\" ];\njunit_framework_Assert -> junit_framework_ComparisonFailure [ label = \"1\" weight = \"1\" ];\nComparisonCompactor -> junit_framework_Assert [ label = \"2\" weight = \"2\" color = \"red\" ];\njunit_framework_ComparisonFailure -> AssertionFailedError [ label = \"2\" weight = \"2\" ];\njunit_framework_ComparisonFailure -> ComparisonCompactor [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> junit_framework_Test [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> Filterable [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Orderable [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Describable [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Runner [ label = \"4\" weight = \"4\" ];\nJUnit4TestAdapter -> JUnit4TestAdapterCache [ label = \"5\" weight = \"5\" color = \"red\" ];\nJUnit4TestAdapter -> Request [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> TestResult [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Description [ label = \"13\" weight = \"13\" ];\nJUnit4TestAdapter -> Filter [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapter -> Sorter [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> Orderer [ label = \"2\" weight = \"2\" ];\nJUnit4TestAdapter -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapterCache -> junit_framework_Test [ label = \"6\" weight = \"6\" ];\nJUnit4TestAdapterCache -> Description [ label = \"14\" weight = \"14\" ];\nJUnit4TestAdapterCache -> JUnit4TestCaseFacade [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapterCache -> TestSuite [ label = \"3\" weight = \"3\" ];\nJUnit4TestAdapterCache -> TestResult [ label = \"4\" weight = \"4\" ];\nJUnit4TestAdapterCache -> JUnit4TestAdapter [ label = \"1\" weight = \"1\" ];\nJUnit4TestAdapterCache -> RunNotifier [ label = \"4\" weight = \"4\" ];\nJUnit4TestAdapterCache -> Failure [ label = \"3\" weight = \"3\" ];\nJUnit4TestCaseFacade -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nJUnit4TestCaseFacade -> Describable [ label = \"1\" weight = \"1\" ];\nJUnit4TestCaseFacade -> Description [ label = \"4\" weight = \"4\" ];\nJUnit4TestCaseFacade -> TestResult [ label = \"1\" weight = \"1\" ];\njunit_framework_Test -> TestResult [ label = \"1\" weight = \"1\" color = \"red\" ];\nTestCase -> junit_framework_Assert [ label = \"39\" weight = \"39\" ];\nTestCase -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nTestCase -> TestResult [ label = \"6\" weight = \"6\" color = \"red\" ];\nTestFailure -> junit_framework_Test [ label = \"3\" weight = \"3\" ];\nTestFailure -> Throwables [ label = \"1\" weight = \"1\" ];\nTestFailure -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nTestListener -> junit_framework_Test [ label = \"4\" weight = \"4\" ];\nTestListener -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nTestResult -> TestFailure [ label = \"8\" weight = \"8\" ];\nTestResult -> TestListener [ label = \"15\" weight = \"15\" ];\nTestResult -> junit_framework_Test [ label = \"6\" weight = \"6\" ];\nTestResult -> AssertionFailedError [ label = \"2\" weight = \"2\" ];\nTestResult -> TestCase [ label = \"2\" weight = \"2\" ];\nTestResult -> Protectable [ label = \"3\" weight = \"3\" ];\nTestSuite -> junit_framework_Test [ label = \"15\" weight = \"15\" ];\nTestSuite -> TestCase [ label = \"7\" weight = \"7\" ];\nTestSuite -> Throwables [ label = \"3\" weight = \"3\" ];\nTestSuite -> MethodSorter [ label = \"1\" weight = \"1\" ];\nTestSuite -> TestResult [ label = \"3\" weight = \"3\" ];\nBaseTestRunner -> TestListener [ label = \"1\" weight = \"1\" ];\nBaseTestRunner -> junit_framework_Test [ label = \"10\" weight = \"10\" ];\nBaseTestRunner -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nBaseTestRunner -> TestSuite [ label = \"1\" weight = \"1\" ];\nBaseTestRunner -> Throwables [ label = \"1\" weight = \"1\" ];\nResultPrinter -> TestListener [ label = \"1\" weight = \"1\" ];\nResultPrinter -> TestResult [ label = \"14\" weight = \"14\" ];\nResultPrinter -> TestFailure [ label = \"6\" weight = \"6\" ];\nResultPrinter -> BaseTestRunner [ label = \"1\" weight = \"1\" ];\nResultPrinter -> junit_framework_Test [ label = \"4\" weight = \"4\" ];\nResultPrinter -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nTestRunner -> BaseTestRunner [ label = \"4\" weight = \"4\" ];\nTestRunner -> ResultPrinter [ label = \"6\" weight = \"6\" ];\nTestRunner -> TestCase [ label = \"2\" weight = \"2\" ];\nTestRunner -> TestSuite [ label = \"2\" weight = \"2\" ];\nTestRunner -> junit_framework_Test [ label = \"8\" weight = \"8\" ];\nTestRunner -> TestResult [ label = \"11\" weight = \"11\" ];\nTestRunner -> Version [ label = \"1\" weight = \"1\" ];\norg_junit_Assert -> org_junit_ComparisonFailure [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_Assert -> ArrayComparisonFailure [ label = \"10\" weight = \"10\" ];\norg_junit_Assert -> InexactComparisonCriteria [ label = \"2\" weight = \"2\" ];\norg_junit_Assert -> ComparisonCriteria [ label = \"3\" weight = \"3\" ];\norg_junit_Assert -> ExactComparisonCriteria [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_Assert -> ThrowingRunnable [ label = \"3\" weight = \"3\" ];\nAssume -> org_junit_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\norg_junit_AssumptionViolatedException -> org_junit_internal_AssumptionViolatedException [ label = \"5\" weight = \"5\" ];\norg_junit_ComparisonFailure -> org_junit_ComparisonFailure_ComparisonCompactor [ label = \"2\" weight = \"2\" ];\norg_junit_ComparisonFailure_ComparisonCompactor -> org_junit_Assert [ label = \"2\" weight = \"2\" ];\norg_junit_ComparisonFailure_ComparisonCompactor -> org_junit_ComparisonFailure_ComparisonCompactor_DiffExtractor [ label = \"6\" weight = \"6\" ];\norg_junit_ComparisonFailure_ComparisonCompactor_DiffExtractor -> org_junit_ComparisonFailure_ComparisonCompactor [ label = \"2\" weight = \"2\" color = \"red\" ];\nCategories -> Suite [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Filter [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Categories [ label = \"6\" weight = \"6\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Description [ label = \"11\" weight = \"11\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> ValidateWith [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_categories_Categories_CategoryFilter -> Category [ label = \"2\" weight = \"2\" ];\nCategories -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nCategories -> org_junit_experimental_categories_Categories_CategoryFilter [ label = \"1\" weight = \"1\" color = \"red\" ];\nCategories -> ParentRunner [ label = \"1\" weight = \"1\" ];\nCategories -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nCategories -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nCategories -> org_junit_experimental_categories_Categories_IncludeCategory [ label = \"4\" weight = \"4\" ];\nCategories -> org_junit_experimental_categories_Categories_ExcludeCategory [ label = \"4\" weight = \"4\" ];\nCategory -> ValidateWith [ label = \"2\" weight = \"2\" ];\nCategory -> CategoryValidator [ label = \"1\" weight = \"1\" ];\nCategoryFilterFactory -> FilterFactory [ label = \"1\" weight = \"1\" ];\nCategoryFilterFactory -> FilterFactoryParams [ label = \"2\" weight = \"2\" ];\nCategoryFilterFactory -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"2\" weight = \"2\" ];\nCategoryFilterFactory -> Filter [ label = \"2\" weight = \"2\" ];\nCategoryFilterFactory -> Classes [ label = \"1\" weight = \"1\" ];\nCategoryValidator -> AnnotationValidator [ label = \"1\" weight = \"1\" ];\nCategoryValidator -> FrameworkMethod [ label = \"2\" weight = \"2\" ];\nExcludeCategories -> CategoryFilterFactory [ label = \"1\" weight = \"1\" ];\nExcludeCategories -> org_junit_experimental_categories_ExcludeCategories_ExcludesAny [ label = \"1\" weight = \"1\" ];\nExcludeCategories -> Filter [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_categories_ExcludeCategories_ExcludesAny -> org_junit_experimental_categories_Categories_CategoryFilter [ label = \"3\" weight = \"3\" ];\nIncludeCategories -> CategoryFilterFactory [ label = \"1\" weight = \"1\" ];\nIncludeCategories -> org_junit_experimental_categories_IncludeCategories_IncludesAny [ label = \"1\" weight = \"1\" ];\nIncludeCategories -> Filter [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_categories_IncludeCategories_IncludesAny -> org_junit_experimental_categories_Categories_CategoryFilter [ label = \"3\" weight = \"3\" ];\nMaxCore -> MaxHistory [ label = \"4\" weight = \"4\" ];\nMaxCore -> Request [ label = \"14\" weight = \"14\" ];\nMaxCore -> Result [ label = \"3\" weight = \"3\" ];\nMaxCore -> JUnitCore [ label = \"4\" weight = \"4\" ];\nMaxCore -> SortingRequest [ label = \"1\" weight = \"1\" ];\nMaxCore -> Description [ label = \"22\" weight = \"22\" ];\nMaxCore -> Runner [ label = \"4\" weight = \"4\" ];\nMaxCore -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nMaxCore -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_max_MaxCore_1 -> Runner [ label = \"1\" weight = \"1\" ];\nMaxCore -> org_junit_experimental_max_MaxCore_1 [ label = \"1\" weight = \"1\" ];\nMaxCore -> Suite [ label = \"1\" weight = \"1\" ];\nMaxCore -> TestSuite [ label = \"1\" weight = \"1\" ];\nMaxCore -> JUnit38ClassRunner [ label = \"1\" weight = \"1\" ];\nMaxHistory -> CouldNotReadCoreException [ label = \"3\" weight = \"3\" ];\nMaxHistory -> Description [ label = \"11\" weight = \"11\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> RunListener [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> Description [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> MaxHistory [ label = \"3\" weight = \"3\" color = \"red\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> Failure [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_max_MaxHistory_RememberingListener -> Result [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_max_MaxHistory_TestComparator -> Description [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_max_MaxHistory_TestComparator -> MaxHistory [ label = \"5\" weight = \"5\" ];\nMaxHistory -> org_junit_experimental_max_MaxHistory_RememberingListener [ label = \"1\" weight = \"1\" ];\nMaxHistory -> RunListener [ label = \"1\" weight = \"1\" ];\nMaxHistory -> org_junit_experimental_max_MaxHistory_TestComparator [ label = \"1\" weight = \"1\" color = \"red\" ];\nParallelComputer -> Computer [ label = \"5\" weight = \"5\" ];\nParallelComputer -> Runner [ label = \"6\" weight = \"6\" ];\nParallelComputer -> ParentRunner [ label = \"3\" weight = \"3\" ];\nParallelComputer -> RunnerBuilder [ label = \"2\" weight = \"2\" ];\nParallelComputer -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nFailureList -> Failure [ label = \"3\" weight = \"3\" ];\nFailureList -> Result [ label = \"4\" weight = \"4\" ];\nFailureList -> RunListener [ label = \"2\" weight = \"2\" ];\nPrintableResult -> Result [ label = \"4\" weight = \"4\" ];\nPrintableResult -> Request [ label = \"2\" weight = \"2\" ];\nPrintableResult -> JUnitCore [ label = \"2\" weight = \"2\" ];\nPrintableResult -> Failure [ label = \"2\" weight = \"2\" ];\nPrintableResult -> FailureList [ label = \"2\" weight = \"2\" ];\nPrintableResult -> TextListener [ label = \"2\" weight = \"2\" ];\nResultMatchers -> PrintableResult [ label = \"8\" weight = \"8\" ];\nResultMatchers -> Failure [ label = \"1\" weight = \"1\" ];\nEnclosed -> Suite [ label = \"2\" weight = \"2\" ];\nEnclosed -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nFromDataPoints -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nFromDataPoints -> SpecificDataPointsSupplier [ label = \"1\" weight = \"1\" ];\nAllMembersSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> PotentialAssignment [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> DataPoint [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> AllMembersSupplier [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> Assume [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue -> org_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [ label = \"3\" weight = \"3\" ];\nAllMembersSupplier -> org_junit_runners_model_TestClass [ label = \"6\" weight = \"6\" ];\nAllMembersSupplier -> ParameterSignature [ label = \"17\" weight = \"17\" ];\nAllMembersSupplier -> PotentialAssignment [ label = \"13\" weight = \"13\" ];\nAllMembersSupplier -> FrameworkMethod [ label = \"9\" weight = \"9\" ];\nAllMembersSupplier -> DataPoints [ label = \"2\" weight = \"2\" ];\nAllMembersSupplier -> org_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue [ label = \"1\" weight = \"1\" ];\nAllMembersSupplier -> FrameworkField [ label = \"6\" weight = \"6\" ];\nAssignments -> PotentialAssignment [ label = \"11\" weight = \"11\" ];\nAssignments -> ParameterSignature [ label = \"13\" weight = \"13\" ];\nAssignments -> org_junit_runners_model_TestClass [ label = \"5\" weight = \"5\" ];\nAssignments -> org_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [ label = \"5\" weight = \"5\" ];\nAssignments -> ParameterSupplier [ label = \"5\" weight = \"5\" ];\nAssignments -> EnumSupplier [ label = \"2\" weight = \"2\" ];\nAssignments -> BooleanSupplier [ label = \"2\" weight = \"2\" ];\nAssignments -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nAssignments -> AllMembersSupplier [ label = \"1\" weight = \"1\" ];\nBooleanSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nBooleanSupplier -> ParameterSignature [ label = \"1\" weight = \"1\" ];\nBooleanSupplier -> PotentialAssignment [ label = \"3\" weight = \"3\" ];\nEnumSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nEnumSupplier -> ParameterSignature [ label = \"1\" weight = \"1\" ];\nEnumSupplier -> PotentialAssignment [ label = \"4\" weight = \"4\" ];\nSpecificDataPointsSupplier -> AllMembersSupplier [ label = \"6\" weight = \"6\" ];\nSpecificDataPointsSupplier -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nSpecificDataPointsSupplier -> ParameterSignature [ label = \"8\" weight = \"8\" ];\nSpecificDataPointsSupplier -> ParametersSuppliedBy [ label = \"4\" weight = \"4\" ];\nSpecificDataPointsSupplier -> FromDataPoints [ label = \"4\" weight = \"4\" color = \"red\" ];\nSpecificDataPointsSupplier -> DataPoint [ label = \"2\" weight = \"2\" ];\nSpecificDataPointsSupplier -> DataPoints [ label = \"2\" weight = \"2\" ];\nSpecificDataPointsSupplier -> FrameworkMethod [ label = \"12\" weight = \"12\" ];\nParametersSuppliedBy -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nParameterSupplier -> ParameterSignature [ label = \"1\" weight = \"1\" ];\nParameterSupplier -> PotentialAssignment [ label = \"1\" weight = \"1\" ];\nPotentialAssignment -> org_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [ label = \"2\" weight = \"2\" ];\nTestedOn -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nTestedOn -> TestedOnSupplier [ label = \"1\" weight = \"1\" ];\nTestedOnSupplier -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nTestedOnSupplier -> ParameterSignature [ label = \"2\" weight = \"2\" ];\nTestedOnSupplier -> PotentialAssignment [ label = \"4\" weight = \"4\" ];\nTestedOnSupplier -> TestedOn [ label = \"2\" weight = \"2\" color = \"red\" ];\nTestedOnSupplier -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nTheories -> BlockJUnit4ClassRunner [ label = \"6\" weight = \"6\" ];\nTheories -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nTheories -> org_junit_runners_model_TestClass [ label = \"4\" weight = \"4\" ];\nTheories -> ParentRunner [ label = \"4\" weight = \"4\" ];\nTheories -> FrameworkMethod [ label = \"11\" weight = \"11\" ];\nTheories -> ParameterSignature [ label = \"3\" weight = \"3\" ];\nTheories -> ParametersSuppliedBy [ label = \"2\" weight = \"2\" ];\nTheories -> ParameterSupplier [ label = \"1\" weight = \"1\" ];\nTheories -> org_junit_experimental_theories_Theories_TheoryAnchor [ label = \"1\" weight = \"1\" ];\nTheories -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Statement [ label = \"5\" weight = \"5\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> FrameworkMethod [ label = \"10\" weight = \"10\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_runners_model_TestClass [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_internal_AssumptionViolatedException [ label = \"4\" weight = \"4\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Assignments [ label = \"11\" weight = \"11\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> PotentialAssignment [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> BlockJUnit4ClassRunner [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor_1 -> Statement [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Assume [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> ParentRunner [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> org_junit_experimental_theories_Theories_TheoryAnchor_1 [ label = \"2\" weight = \"2\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> ParameterizedAssertionError [ label = \"1\" weight = \"1\" ];\norg_junit_experimental_theories_Theories_TheoryAnchor -> Theory [ label = \"2\" weight = \"2\" ];\nFixMethodOrder -> MethodSorters [ label = \"1\" weight = \"1\" ];\norg_junit_internal_AssumptionViolatedException -> SerializableMatcherDescription [ label = \"1\" weight = \"1\" ];\norg_junit_internal_AssumptionViolatedException -> SerializableValueDescription [ label = \"1\" weight = \"1\" ];\nAllDefaultPossibilitiesBuilder -> RunnerBuilder [ label = \"5\" weight = \"5\" ];\nAllDefaultPossibilitiesBuilder -> Runner [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> JUnit4Builder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> JUnit3Builder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> AnnotatedBuilder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> IgnoredBuilder [ label = \"2\" weight = \"2\" ];\nAllDefaultPossibilitiesBuilder -> SuiteMethodBuilder [ label = \"1\" weight = \"1\" ];\nAllDefaultPossibilitiesBuilder -> NullBuilder [ label = \"1\" weight = \"1\" ];\nAnnotatedBuilder -> RunnerBuilder [ label = \"3\" weight = \"3\" ];\nAnnotatedBuilder -> RunWith [ label = \"2\" weight = \"2\" ];\nAnnotatedBuilder -> Runner [ label = \"3\" weight = \"3\" ];\nAnnotatedBuilder -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nIgnoredBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nIgnoredBuilder -> IgnoredClassRunner [ label = \"1\" weight = \"1\" ];\nIgnoredBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nIgnoredClassRunner -> Runner [ label = \"1\" weight = \"1\" ];\nIgnoredClassRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\nIgnoredClassRunner -> Description [ label = \"2\" weight = \"2\" ];\nJUnit3Builder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nJUnit3Builder -> JUnit38ClassRunner [ label = \"1\" weight = \"1\" ];\nJUnit3Builder -> Runner [ label = \"1\" weight = \"1\" ];\nJUnit4Builder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nJUnit4Builder -> JUnit4 [ label = \"1\" weight = \"1\" ];\nJUnit4Builder -> Runner [ label = \"1\" weight = \"1\" ];\nNullBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nNullBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nSuiteMethodBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nSuiteMethodBuilder -> SuiteMethod [ label = \"1\" weight = \"1\" ];\nSuiteMethodBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nComparisonCriteria -> ArrayComparisonFailure [ label = \"7\" weight = \"7\" ];\nComparisonCriteria -> org_junit_Assert [ label = \"3\" weight = \"3\" color = \"red\" ];\nExactComparisonCriteria -> ComparisonCriteria [ label = \"1\" weight = \"1\" ];\nExactComparisonCriteria -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nInexactComparisonCriteria -> ComparisonCriteria [ label = \"1\" weight = \"1\" ];\nInexactComparisonCriteria -> org_junit_Assert [ label = \"2\" weight = \"2\" color = \"red\" ];\nFakeRuntimeMXBean -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\nFakeThreadMXBean -> ThreadMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_FactoryHolder -> Classes [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> org_junit_internal_management_ManagementFactory_FactoryHolder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> RuntimeMXBean [ label = \"2\" weight = \"2\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> ReflectiveRuntimeMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_RuntimeHolder -> FakeRuntimeMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> org_junit_internal_management_ManagementFactory_FactoryHolder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> ThreadMXBean [ label = \"2\" weight = \"2\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> ReflectiveThreadMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ManagementFactory_ThreadHolder -> FakeThreadMXBean [ label = \"1\" weight = \"1\" ];\nManagementFactory -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\nManagementFactory -> ThreadMXBean [ label = \"1\" weight = \"1\" ];\nReflectiveRuntimeMXBean -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ReflectiveRuntimeMXBean_Holder -> Classes [ label = \"1\" weight = \"1\" ];\nReflectiveThreadMXBean -> ThreadMXBean [ label = \"1\" weight = \"1\" ];\norg_junit_internal_management_ReflectiveThreadMXBean_Holder -> Classes [ label = \"1\" weight = \"1\" ];\nStacktracePrintingMatcher -> Throwables [ label = \"1\" weight = \"1\" ];\nThrowableCauseMatcher -> TypeSafeMatcher [ label = \"1\" weight = \"1\" ];\nThrowableMessageMatcher -> TypeSafeMatcher [ label = \"1\" weight = \"1\" ];\nTypeSafeMatcher -> MethodSorter [ label = \"1\" weight = \"1\" ];\nMethodSorter -> FixMethodOrder [ label = \"2\" weight = \"2\" ];\nMethodSorter -> MethodSorters [ label = \"1\" weight = \"1\" ];\nRealSystem -> JUnitSystem [ label = \"1\" weight = \"1\" ];\nClassRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nClassRequest -> org_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder [ label = \"1\" weight = \"1\" ];\nClassRequest -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\nClassRequest -> Runner [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder -> AllDefaultPossibilitiesBuilder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder -> org_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder -> RunnerBuilder [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder -> SuiteMethodBuilder [ label = \"2\" weight = \"2\" ];\norg_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder -> Runner [ label = \"1\" weight = \"1\" ];\nFilterRequest -> Request [ label = \"4\" weight = \"4\" ];\nFilterRequest -> Filter [ label = \"4\" weight = \"4\" ];\nFilterRequest -> Runner [ label = \"2\" weight = \"2\" ];\nFilterRequest -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nFilterRequest -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\nMemoizingRequest -> Request [ label = \"1\" weight = \"1\" color = \"red\" ];\nMemoizingRequest -> Runner [ label = \"3\" weight = \"3\" ];\nOrderingRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nOrderingRequest -> Request [ label = \"3\" weight = \"3\" color = \"red\" ];\nOrderingRequest -> Ordering [ label = \"3\" weight = \"3\" ];\nOrderingRequest -> Runner [ label = \"2\" weight = \"2\" ];\nOrderingRequest -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nOrderingRequest -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\nSortingRequest -> Request [ label = \"4\" weight = \"4\" ];\nSortingRequest -> Description [ label = \"2\" weight = \"2\" ];\nSortingRequest -> Runner [ label = \"2\" weight = \"2\" ];\nSortingRequest -> Sorter [ label = \"2\" weight = \"2\" ];\nClassRoadie -> RunNotifier [ label = \"3\" weight = \"3\" ];\nClassRoadie -> org_junit_internal_runners_TestClass [ label = \"4\" weight = \"4\" ];\nClassRoadie -> Description [ label = \"2\" weight = \"2\" ];\nClassRoadie -> Failure [ label = \"1\" weight = \"1\" ];\nClassRoadie -> FailedBefore [ label = \"4\" weight = \"4\" ];\nClassRoadie -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nErrorReportingRunner -> Runner [ label = \"1\" weight = \"1\" ];\nErrorReportingRunner -> Description [ label = \"7\" weight = \"7\" ];\nErrorReportingRunner -> RunNotifier [ label = \"5\" weight = \"5\" ];\nErrorReportingRunner -> InvalidTestClassError [ label = \"1\" weight = \"1\" ];\nErrorReportingRunner -> org_junit_runners_model_InitializationError [ label = \"3\" weight = \"3\" ];\nErrorReportingRunner -> org_junit_internal_runners_InitializationError [ label = \"3\" weight = \"3\" ];\nErrorReportingRunner -> Failure [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> Runner [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> Filterable [ label = \"5\" weight = \"5\" ];\nJUnit38ClassRunner -> Orderable [ label = \"5\" weight = \"5\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> TestListener [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> RunNotifier [ label = \"5\" weight = \"5\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> junit_framework_Test [ label = \"10\" weight = \"10\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> Failure [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> Describable [ label = \"4\" weight = \"4\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> Description [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> TestCase [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener -> AssertionFailedError [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> junit_framework_Test [ label = \"8\" weight = \"8\" ];\nJUnit38ClassRunner -> TestSuite [ label = \"21\" weight = \"21\" ];\nJUnit38ClassRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> TestResult [ label = \"3\" weight = \"3\" ];\nJUnit38ClassRunner -> org_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> TestListener [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> Description [ label = \"8\" weight = \"8\" ];\nJUnit38ClassRunner -> TestCase [ label = \"6\" weight = \"6\" ];\nJUnit38ClassRunner -> Describable [ label = \"4\" weight = \"4\" ];\nJUnit38ClassRunner -> TestDecorator [ label = \"4\" weight = \"4\" ];\nJUnit38ClassRunner -> Filter [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> NoTestsRemainException [ label = \"2\" weight = \"2\" ];\nJUnit38ClassRunner -> Sorter [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> Sortable [ label = \"4\" weight = \"4\" ];\nJUnit38ClassRunner -> Orderer [ label = \"1\" weight = \"1\" ];\nJUnit38ClassRunner -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Runner [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Filterable [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Sortable [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> org_junit_internal_runners_TestClass [ label = \"8\" weight = \"8\" ];\nJUnit4ClassRunner -> org_junit_internal_runners_InitializationError [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> MethodValidator [ label = \"4\" weight = \"4\" ];\nJUnit4ClassRunner -> RunNotifier [ label = \"7\" weight = \"7\" ];\nJUnit4ClassRunner -> ClassRoadie [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> Description [ label = \"8\" weight = \"8\" ];\nJUnit4ClassRunner -> TestMethod [ label = \"3\" weight = \"3\" ];\nJUnit4ClassRunner -> MethodRoadie [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> Failure [ label = \"1\" weight = \"1\" ];\nJUnit4ClassRunner -> Filter [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> NoTestsRemainException [ label = \"2\" weight = \"2\" ];\nJUnit4ClassRunner -> Sorter [ label = \"2\" weight = \"2\" ];\nMethodRoadie -> RunNotifier [ label = \"6\" weight = \"6\" ];\nMethodRoadie -> Description [ label = \"2\" weight = \"2\" ];\nMethodRoadie -> TestMethod [ label = \"12\" weight = \"12\" ];\nMethodRoadie -> TestTimedOutException [ label = \"1\" weight = \"1\" ];\nMethodRoadie -> FailedBefore [ label = \"4\" weight = \"4\" ];\nMethodRoadie -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\nMethodRoadie -> Failure [ label = \"1\" weight = \"1\" ];\nMethodValidator -> org_junit_internal_runners_TestClass [ label = \"5\" weight = \"5\" ];\nMethodValidator -> org_junit_internal_runners_InitializationError [ label = \"2\" weight = \"2\" ];\nEachTestNotifier -> RunNotifier [ label = \"9\" weight = \"9\" ];\nEachTestNotifier -> Description [ label = \"2\" weight = \"2\" ];\nEachTestNotifier -> org_junit_runners_model_MultipleFailureException [ label = \"4\" weight = \"4\" ];\nEachTestNotifier -> Failure [ label = \"2\" weight = \"2\" ];\nEachTestNotifier -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_model_MultipleFailureException -> org_junit_runners_model_MultipleFailureException [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_Builder [ label = \"25\" weight = \"25\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic [ label = \"4\" weight = \"4\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule [ label = \"1\" weight = \"1\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule [ label = \"2\" weight = \"2\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule [ label = \"1\" weight = \"1\" color = \"red\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule [ label = \"1\" weight = \"1\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule [ label = \"1\" weight = \"1\" color = \"red\" ];\nRuleMemberValidator -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"3\" weight = \"3\" ];\nRuleMemberValidator -> org_junit_runners_model_TestClass [ label = \"3\" weight = \"3\" ];\nRuleMemberValidator -> FrameworkMember [ label = \"8\" weight = \"8\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_Builder -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_Builder -> RuleMemberValidator [ label = \"2\" weight = \"2\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_RuleValidator -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> FrameworkMember [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> RuleMemberValidator [ label = \"2\" weight = \"2\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> Annotatable [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic -> FrameworkMember [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic -> FrameworkMember [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic -> FrameworkMember [ label = \"2\" weight = \"2\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> RuleMemberValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> RuleMemberValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> RuleMemberValidator [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule -> ValidationError [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> org_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> RuleMemberValidator [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule -> ValidationError [ label = \"1\" weight = \"1\" ];\nValidationError -> FrameworkMember [ label = \"2\" weight = \"2\" ];\nExpectException -> Statement [ label = \"4\" weight = \"4\" ];\nExpectException -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nFail -> Statement [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> Statement [ label = \"4\" weight = \"4\" ];\nFailOnTimeout -> org_junit_internal_runners_statements_FailOnTimeout_Builder [ label = \"4\" weight = \"4\" ];\norg_junit_internal_runners_statements_FailOnTimeout_Builder -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_internal_runners_statements_FailOnTimeout_Builder -> FailOnTimeout [ label = \"2\" weight = \"2\" color = \"red\" ];\nFailOnTimeout -> org_junit_internal_runners_statements_FailOnTimeout_CallableStatement [ label = \"3\" weight = \"3\" ];\nFailOnTimeout -> TestTimedOutException [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> ManagementFactory [ label = \"1\" weight = \"1\" ];\nFailOnTimeout -> ThreadMXBean [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_statements_FailOnTimeout_CallableStatement -> Statement [ label = \"1\" weight = \"1\" ];\nInvokeMethod -> Statement [ label = \"1\" weight = \"1\" ];\nInvokeMethod -> FrameworkMethod [ label = \"3\" weight = \"3\" ];\nRunAfters -> Statement [ label = \"4\" weight = \"4\" ];\nRunAfters -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nRunAfters -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nRunBefores -> Statement [ label = \"4\" weight = \"4\" ];\nRunBefores -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nSuiteMethod -> JUnit38ClassRunner [ label = \"2\" weight = \"2\" ];\nSuiteMethod -> junit_framework_Test [ label = \"3\" weight = \"3\" ];\norg_junit_internal_runners_TestClass -> MethodSorter [ label = \"1\" weight = \"1\" ];\nTestMethod -> org_junit_internal_runners_TestClass [ label = \"4\" weight = \"4\" ];\nTestMethod -> org_junit_Test [ label = \"5\" weight = \"5\" ];\nTextListener -> RunListener [ label = \"1\" weight = \"1\" ];\nTextListener -> JUnitSystem [ label = \"2\" weight = \"2\" ];\nTextListener -> Result [ label = \"10\" weight = \"10\" ];\nTextListener -> Description [ label = \"2\" weight = \"2\" ];\nTextListener -> Failure [ label = \"6\" weight = \"6\" ];\nThrowables -> org_junit_internal_Throwables_State [ label = \"2\" weight = \"2\" ];\norg_junit_internal_Throwables_State -> Throwables [ label = \"5\" weight = \"5\" color = \"red\" ];\norg_junit_internal_Throwables_State_1 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_1 [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_Throwables_State_2 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_2 [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State_3 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_3 [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State_4 -> org_junit_internal_Throwables_State [ label = \"1\" weight = \"1\" ];\norg_junit_internal_Throwables_State -> org_junit_internal_Throwables_State_4 [ label = \"1\" weight = \"1\" color = \"red\" ];\nJUnitMatchers -> StacktracePrintingMatcher [ label = \"2\" weight = \"2\" ];\nDisableOnDebug -> TestRule [ label = \"5\" weight = \"5\" ];\nDisableOnDebug -> ManagementFactory [ label = \"1\" weight = \"1\" ];\nDisableOnDebug -> RuntimeMXBean [ label = \"1\" weight = \"1\" ];\nDisableOnDebug -> Statement [ label = \"2\" weight = \"2\" ];\nDisableOnDebug -> Description [ label = \"1\" weight = \"1\" ];\nErrorCollector -> Verifier [ label = \"1\" weight = \"1\" ];\nErrorCollector -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nErrorCollector -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\nErrorCollector -> ThrowingRunnable [ label = \"1\" weight = \"1\" ];\nErrorCollector -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nExpectedException -> TestRule [ label = \"1\" weight = \"1\" ];\nExpectedException -> ExpectedExceptionMatcherBuilder [ label = \"6\" weight = \"6\" ];\nExpectedException -> Statement [ label = \"2\" weight = \"2\" ];\nExpectedException -> Description [ label = \"1\" weight = \"1\" ];\nExpectedException -> org_junit_rules_ExpectedException_ExpectedExceptionStatement [ label = \"1\" weight = \"1\" ];\nExpectedException -> ThrowableMessageMatcher [ label = \"1\" weight = \"1\" ];\nExpectedException -> ThrowableCauseMatcher [ label = \"1\" weight = \"1\" ];\norg_junit_rules_ExpectedException_ExpectedExceptionStatement -> Statement [ label = \"4\" weight = \"4\" ];\norg_junit_rules_ExpectedException_ExpectedExceptionStatement -> ExpectedException [ label = \"3\" weight = \"3\" color = \"red\" ];\nExpectedException -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nExpectedExceptionMatcherBuilder -> JUnitMatchers [ label = \"1\" weight = \"1\" ];\nExternalResource -> TestRule [ label = \"1\" weight = \"1\" ];\nExternalResource -> Statement [ label = \"5\" weight = \"5\" ];\nExternalResource -> Description [ label = \"1\" weight = \"1\" ];\nExternalResource -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nMethodRule -> Statement [ label = \"2\" weight = \"2\" ];\nMethodRule -> FrameworkMethod [ label = \"1\" weight = \"1\" ];\nRuleChain -> TestRule [ label = \"8\" weight = \"8\" ];\nRuleChain -> Statement [ label = \"2\" weight = \"2\" ];\nRuleChain -> Description [ label = \"1\" weight = \"1\" ];\nRuleChain -> RunRules [ label = \"1\" weight = \"1\" ];\nRunRules -> Statement [ label = \"6\" weight = \"6\" ];\nRunRules -> TestRule [ label = \"4\" weight = \"4\" ];\nRunRules -> Description [ label = \"2\" weight = \"2\" ];\nStopwatch -> TestRule [ label = \"1\" weight = \"1\" ];\nStopwatch -> org_junit_rules_Stopwatch_Clock [ label = \"6\" weight = \"6\" ];\nStopwatch -> Description [ label = \"5\" weight = \"5\" ];\nStopwatch -> org_junit_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nStopwatch -> Statement [ label = \"2\" weight = \"2\" ];\nStopwatch -> org_junit_rules_Stopwatch_InternalWatcher [ label = \"1\" weight = \"1\" ];\nStopwatch -> TestWatcher [ label = \"1\" weight = \"1\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> TestWatcher [ label = \"1\" weight = \"1\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> Description [ label = \"5\" weight = \"5\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> Stopwatch [ label = \"12\" weight = \"12\" color = \"red\" ];\norg_junit_rules_Stopwatch_InternalWatcher -> org_junit_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nTemporaryFolder -> ExternalResource [ label = \"1\" weight = \"1\" ];\nTemporaryFolder -> org_junit_rules_TemporaryFolder_Builder [ label = \"3\" weight = \"3\" color = \"red\" ];\norg_junit_rules_TemporaryFolder_Builder -> TemporaryFolder [ label = \"2\" weight = \"2\" ];\nTemporaryFolder -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\nTestName -> TestWatcher [ label = \"1\" weight = \"1\" ];\nTestName -> Description [ label = \"2\" weight = \"2\" ];\nTestRule -> Statement [ label = \"2\" weight = \"2\" ];\nTestRule -> Description [ label = \"1\" weight = \"1\" ];\nTestWatcher -> TestRule [ label = \"1\" weight = \"1\" ];\nTestWatcher -> Statement [ label = \"3\" weight = \"3\" ];\nTestWatcher -> Description [ label = \"12\" weight = \"12\" ];\nTestWatcher -> org_junit_internal_AssumptionViolatedException [ label = \"4\" weight = \"4\" ];\nTestWatcher -> org_junit_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" ];\nTestWatcher -> org_junit_AssumptionViolatedException [ label = \"3\" weight = \"3\" ];\nTestWatchman -> MethodRule [ label = \"1\" weight = \"1\" ];\nTestWatchman -> Statement [ label = \"3\" weight = \"3\" ];\nTestWatchman -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nTestWatchman -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nTimeout -> TestRule [ label = \"1\" weight = \"1\" ];\nTimeout -> org_junit_rules_Timeout_Builder [ label = \"6\" weight = \"6\" color = \"red\" ];\nTimeout -> Statement [ label = \"4\" weight = \"4\" ];\nTimeout -> FailOnTimeout [ label = \"1\" weight = \"1\" ];\nTimeout -> org_junit_internal_runners_statements_FailOnTimeout_Builder [ label = \"3\" weight = \"3\" ];\nTimeout -> Description [ label = \"1\" weight = \"1\" ];\norg_junit_rules_Timeout_Builder -> Timeout [ label = \"2\" weight = \"2\" ];\nVerifier -> TestRule [ label = \"1\" weight = \"1\" ];\nVerifier -> Statement [ label = \"3\" weight = \"3\" ];\nVerifier -> Description [ label = \"1\" weight = \"1\" ];\nComputer -> RunnerBuilder [ label = \"3\" weight = \"3\" ];\norg_junit_runner_Computer_1 -> Runner [ label = \"1\" weight = \"1\" ];\nComputer -> org_junit_runner_Computer_1 [ label = \"1\" weight = \"1\" ];\nComputer -> Runner [ label = \"2\" weight = \"2\" ];\nComputer -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nDescribable -> Description [ label = \"1\" weight = \"1\" ];\nFilterFactories -> Request [ label = \"2\" weight = \"2\" ];\nFilterFactories -> Runner [ label = \"1\" weight = \"1\" ];\nFilterFactories -> Description [ label = \"1\" weight = \"1\" ];\nFilterFactories -> FilterFactoryParams [ label = \"3\" weight = \"3\" ];\nFilterFactories -> Filter [ label = \"3\" weight = \"3\" ];\nFilterFactories -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"7\" weight = \"7\" ];\nFilterFactories -> FilterFactory [ label = \"9\" weight = \"9\" ];\nFilterFactories -> Classes [ label = \"1\" weight = \"1\" ];\nFilterFactory -> FilterFactoryParams [ label = \"1\" weight = \"1\" ];\nFilterFactory -> Filter [ label = \"1\" weight = \"1\" ];\nFilterFactory -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"1\" weight = \"1\" ];\nFilterFactoryParams -> Description [ label = \"3\" weight = \"3\" ];\nJUnitCommandLineParseResult -> org_junit_runner_JUnitCommandLineParseResult_CommandLineParserError [ label = \"2\" weight = \"2\" ];\nJUnitCommandLineParseResult -> Classes [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> Request [ label = \"8\" weight = \"8\" ];\nJUnitCommandLineParseResult -> Computer [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> FilterFactories [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> Filter [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> org_junit_runner_FilterFactory_FilterNotCreatedException [ label = \"1\" weight = \"1\" ];\nJUnitCore -> RunNotifier [ label = \"7\" weight = \"7\" ];\nJUnitCore -> RealSystem [ label = \"1\" weight = \"1\" ];\nJUnitCore -> Result [ label = \"13\" weight = \"13\" ];\nJUnitCore -> Computer [ label = \"4\" weight = \"4\" ];\nJUnitCore -> JUnitSystem [ label = \"2\" weight = \"2\" ];\nJUnitCore -> Version [ label = \"2\" weight = \"2\" ];\nJUnitCore -> JUnitCommandLineParseResult [ label = \"3\" weight = \"3\" ];\nJUnitCore -> TextListener [ label = \"1\" weight = \"1\" ];\nJUnitCore -> RunListener [ label = \"4\" weight = \"4\" ];\nJUnitCore -> Request [ label = \"3\" weight = \"3\" ];\nJUnitCore -> junit_framework_Test [ label = \"1\" weight = \"1\" ];\nJUnitCore -> JUnit38ClassRunner [ label = \"1\" weight = \"1\" ];\nJUnitCore -> Runner [ label = \"3\" weight = \"3\" ];\nAlphanumeric -> Sorter [ label = \"2\" weight = \"2\" ];\nAlphanumeric -> org_junit_runner_manipulation_Ordering_Factory [ label = \"1\" weight = \"1\" ];\nAlphanumeric -> org_junit_runner_manipulation_Ordering_Context [ label = \"1\" weight = \"1\" ];\nAlphanumeric -> Ordering [ label = \"1\" weight = \"1\" ];\nAlphanumeric -> Description [ label = \"5\" weight = \"5\" ];\nFilter -> Description [ label = \"10\" weight = \"10\" ];\norg_junit_runner_manipulation_Filter_1 -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\norg_junit_runner_manipulation_Filter_1 -> Filter [ label = \"1\" weight = \"1\" ];\nFilter -> org_junit_runner_manipulation_Filter_1 [ label = \"1\" weight = \"1\" color = \"red\" ];\nFilter -> Filterable [ label = \"4\" weight = \"4\" ];\nFilter -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nFilterable -> Filter [ label = \"1\" weight = \"1\" color = \"red\" ];\nFilterable -> NoTestsRemainException [ label = \"1\" weight = \"1\" ];\nOrderable -> Sortable [ label = \"1\" weight = \"1\" ];\nOrderable -> Orderer [ label = \"1\" weight = \"1\" color = \"red\" ];\nOrderable -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nOrderer -> Ordering [ label = \"4\" weight = \"4\" ];\nOrderer -> Description [ label = \"7\" weight = \"7\" ];\nOrderer -> InvalidOrderingException [ label = \"5\" weight = \"5\" ];\nOrderer -> Orderable [ label = \"4\" weight = \"4\" ];\nOrdering -> Description [ label = \"7\" weight = \"7\" ];\norg_junit_runner_manipulation_Ordering_1 -> Description [ label = \"1\" weight = \"1\" ];\nOrdering -> org_junit_runner_manipulation_Ordering_1 [ label = \"1\" weight = \"1\" ];\nOrdering -> org_junit_runner_manipulation_Ordering_Factory [ label = \"5\" weight = \"5\" ];\nOrdering -> InvalidOrderingException [ label = \"5\" weight = \"5\" ];\nOrdering -> org_junit_runner_manipulation_Ordering_Context [ label = \"1\" weight = \"1\" ];\nOrdering -> Orderable [ label = \"4\" weight = \"4\" ];\nOrdering -> Orderer [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_runner_manipulation_Ordering_Context -> Description [ label = \"3\" weight = \"3\" ];\norg_junit_runner_manipulation_Ordering_Factory -> org_junit_runner_manipulation_Ordering_Context [ label = \"1\" weight = \"1\" ];\norg_junit_runner_manipulation_Ordering_Factory -> Ordering [ label = \"1\" weight = \"1\" color = \"red\" ];\nSortable -> Sorter [ label = \"1\" weight = \"1\" color = \"red\" ];\nSorter -> Ordering [ label = \"1\" weight = \"1\" ];\nSorter -> Description [ label = \"11\" weight = \"11\" ];\nSorter -> Sortable [ label = \"4\" weight = \"4\" ];\nFailure -> Description [ label = \"4\" weight = \"4\" ];\nFailure -> Throwables [ label = \"2\" weight = \"2\" ];\nRunListener -> Description [ label = \"6\" weight = \"6\" ];\nRunListener -> Result [ label = \"1\" weight = \"1\" color = \"red\" ];\nRunListener -> Failure [ label = \"2\" weight = \"2\" ];\nRunNotifier -> RunListener [ label = \"26\" weight = \"26\" ];\nRunNotifier -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"1\" weight = \"1\" ];\nRunNotifier -> SynchronizedRunListener [ label = \"1\" weight = \"1\" ];\norg_junit_runner_notification_RunNotifier_SafeNotifier -> RunListener [ label = \"6\" weight = \"6\" ];\norg_junit_runner_notification_RunNotifier_SafeNotifier -> Failure [ label = \"3\" weight = \"3\" ];\norg_junit_runner_notification_RunNotifier_SafeNotifier -> RunNotifier [ label = \"1\" weight = \"1\" color = \"red\" ];\nRunNotifier -> Description [ label = \"6\" weight = \"6\" ];\nRunNotifier -> org_junit_runner_notification_RunNotifier_SafeNotifier [ label = \"9\" weight = \"9\" ];\nRunNotifier -> Result [ label = \"1\" weight = \"1\" ];\nRunNotifier -> StoppedByUserException [ label = \"2\" weight = \"2\" ];\nRunNotifier -> Failure [ label = \"4\" weight = \"4\" ];\nSynchronizedRunListener -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"5\" weight = \"5\" ];\nSynchronizedRunListener -> RunListener [ label = \"12\" weight = \"12\" ];\nSynchronizedRunListener -> Description [ label = \"6\" weight = \"6\" ];\nSynchronizedRunListener -> Result [ label = \"1\" weight = \"1\" ];\nSynchronizedRunListener -> Failure [ label = \"2\" weight = \"2\" ];\nOrderWith -> ValidateWith [ label = \"2\" weight = \"2\" ];\nOrderWith -> OrderWithValidator [ label = \"1\" weight = \"1\" ];\nOrderWith -> org_junit_runner_manipulation_Ordering_Factory [ label = \"1\" weight = \"1\" ];\nOrderWithValidator -> AnnotationValidator [ label = \"1\" weight = \"1\" ];\nOrderWithValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\nRequest -> Description [ label = \"4\" weight = \"4\" ];\nRequest -> ClassRequest [ label = \"2\" weight = \"2\" ];\nRequest -> Computer [ label = \"2\" weight = \"2\" ];\nRequest -> AllDefaultPossibilitiesBuilder [ label = \"2\" weight = \"2\" ];\nRequest -> Runner [ label = \"3\" weight = \"3\" ];\nRequest -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nRequest -> ErrorReportingRunner [ label = \"2\" weight = \"2\" ];\nRequest -> JUnitCore [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_runner_Request_1 -> Runner [ label = \"1\" weight = \"1\" ];\nRequest -> org_junit_runner_Request_1 [ label = \"1\" weight = \"1\" ];\nRequest -> Filter [ label = \"2\" weight = \"2\" ];\nRequest -> FilterRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> SortingRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> Ordering [ label = \"1\" weight = \"1\" ];\nRequest -> OrderingRequest [ label = \"1\" weight = \"1\" ];\nResult -> Failure [ label = \"4\" weight = \"4\" ];\nResult -> org_junit_runner_Result_SerializedForm [ label = \"6\" weight = \"6\" color = \"red\" ];\norg_junit_runner_Result_Listener -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"2\" weight = \"2\" ];\norg_junit_runner_Result_Listener -> RunListener [ label = \"1\" weight = \"1\" ];\norg_junit_runner_Result_Listener -> Description [ label = \"3\" weight = \"3\" ];\norg_junit_runner_Result_Listener -> Result [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_junit_runner_Result_Listener -> Failure [ label = \"2\" weight = \"2\" ];\nResult -> org_junit_runner_Result_Listener [ label = \"1\" weight = \"1\" ];\nResult -> org_junit_runner_notification_RunListener_ThreadSafe [ label = \"1\" weight = \"1\" ];\nResult -> RunListener [ label = \"1\" weight = \"1\" ];\norg_junit_runner_Result_SerializedForm -> Failure [ label = \"3\" weight = \"3\" ];\norg_junit_runner_Result_SerializedForm -> Result [ label = \"1\" weight = \"1\" ];\nRunner -> Describable [ label = \"1\" weight = \"1\" ];\nRunner -> Description [ label = \"2\" weight = \"2\" ];\nRunner -> RunNotifier [ label = \"1\" weight = \"1\" ];\nRunWith -> Runner [ label = \"1\" weight = \"1\" ];\nAllTests -> SuiteMethod [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> FrameworkMethod [ label = \"24\" weight = \"24\" ];\nBlockJUnit4ClassRunner -> ParentRunner [ label = \"27\" weight = \"27\" ];\nBlockJUnit4ClassRunner -> PublicClassValidator [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> TestClassValidator [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> Description [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunner -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> org_junit_runners_model_TestClass [ label = \"16\" weight = \"16\" ];\nBlockJUnit4ClassRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> Statement [ label = \"15\" weight = \"15\" ];\nBlockJUnit4ClassRunner -> RuleMemberValidator [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> ReflectiveCallable [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> Fail [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> InvokeMethod [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> org_junit_Test [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunner -> ExpectException [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> FailOnTimeout [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> org_junit_internal_runners_statements_FailOnTimeout_Builder [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunner -> RunBefores [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> RunAfters [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunner -> RuleContainer [ label = \"7\" weight = \"7\" ];\nBlockJUnit4ClassRunner -> TestRule [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunner -> MethodRule [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunner -> org_junit_runners_BlockJUnit4ClassRunner_RuleCollector [ label = \"4\" weight = \"4\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> MemberValueConsumer [ label = \"1\" weight = \"1\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> Annotatable [ label = \"1\" weight = \"1\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> Rule [ label = \"2\" weight = \"2\" ];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector -> RuleContainer [ label = \"2\" weight = \"2\" ];\nJUnit4 -> BlockJUnit4ClassRunner [ label = \"2\" weight = \"2\" ];\nJUnit4 -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nJUnit4 -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nFrameworkField -> FrameworkMember [ label = \"2\" weight = \"2\" ];\nFrameworkMember -> Annotatable [ label = \"1\" weight = \"1\" ];\nFrameworkMethod -> FrameworkMember [ label = \"4\" weight = \"4\" ];\nFrameworkMethod -> ReflectiveCallable [ label = \"1\" weight = \"1\" ];\nFrameworkMethod -> NoGenericTypeParametersValidator [ label = \"2\" weight = \"2\" ];\nInvalidTestClassError -> org_junit_runners_model_InitializationError [ label = \"2\" weight = \"2\" ];\nMemberValueConsumer -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_MultipleFailureException -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_MultipleFailureException -> TestCouldNotBeSkippedException [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_MultipleFailureException -> Throwables [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_MultipleFailureException -> org_junit_internal_runners_model_MultipleFailureException [ label = \"1\" weight = \"1\" color = \"red\" ];\nRunnerBuilder -> Runner [ label = \"11\" weight = \"11\" ];\nRunnerBuilder -> ErrorReportingRunner [ label = \"1\" weight = \"1\" ];\nRunnerBuilder -> Description [ label = \"2\" weight = \"2\" ];\nRunnerBuilder -> ValidateWith [ label = \"2\" weight = \"2\" ];\nRunnerBuilder -> OrderWith [ label = \"2\" weight = \"2\" ];\nRunnerBuilder -> Ordering [ label = \"3\" weight = \"3\" ];\nRunnerBuilder -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nRunnerBuilder -> org_junit_runners_model_InitializationError [ label = \"4\" weight = \"4\" ];\norg_junit_runners_model_TestClass -> Annotatable [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_TestClass -> org_junit_runners_model_TestClass_FieldComparator [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_TestClass -> org_junit_runners_model_TestClass_MethodComparator [ label = \"2\" weight = \"2\" ];\norg_junit_runners_model_TestClass -> FrameworkMethod [ label = \"12\" weight = \"12\" ];\norg_junit_runners_model_TestClass -> FrameworkField [ label = \"9\" weight = \"9\" ];\norg_junit_runners_model_TestClass -> MethodSorter [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_TestClass -> FrameworkMember [ label = \"14\" weight = \"14\" ];\norg_junit_runners_model_TestClass -> org_junit_Assert [ label = \"1\" weight = \"1\" ];\norg_junit_runners_model_TestClass -> MemberValueConsumer [ label = \"4\" weight = \"4\" ];\norg_junit_runners_model_TestClass_MethodComparator -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nBlockJUnit4ClassRunnerWithParameters -> BlockJUnit4ClassRunner [ label = \"5\" weight = \"5\" ];\nBlockJUnit4ClassRunnerWithParameters -> TestWithParameters [ label = \"5\" weight = \"5\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_InjectionType [ label = \"2\" weight = \"2\" ];\nBlockJUnit4ClassRunnerWithParameters -> ParentRunner [ label = \"8\" weight = \"8\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_model_TestClass [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunnerWithParameters -> FrameworkField [ label = \"7\" weight = \"7\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_Parameterized_Parameter [ label = \"3\" weight = \"3\" ];\nBlockJUnit4ClassRunnerWithParameters -> FrameworkMethod [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunnerWithParameters -> RunNotifier [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParameters -> Statement [ label = \"6\" weight = \"6\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams -> RunBefores [ label = \"2\" weight = \"2\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams -> FrameworkMethod [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunnerWithParameters -> org_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams -> RunAfters [ label = \"2\" weight = \"2\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams -> Statement [ label = \"1\" weight = \"1\" ];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams -> FrameworkMethod [ label = \"4\" weight = \"4\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> ParametersRunnerFactory [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> TestWithParameters [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> BlockJUnit4ClassRunnerWithParameters [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> Runner [ label = \"1\" weight = \"1\" ];\nBlockJUnit4ClassRunnerWithParametersFactory -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nParametersRunnerFactory -> TestWithParameters [ label = \"1\" weight = \"1\" ];\nParametersRunnerFactory -> Runner [ label = \"1\" weight = \"1\" ];\nParametersRunnerFactory -> org_junit_runners_model_InitializationError [ label = \"1\" weight = \"1\" ];\nTestWithParameters -> org_junit_runners_model_TestClass [ label = \"6\" weight = \"6\" ];\nTestWithParameters -> Checks [ label = \"3\" weight = \"3\" ];\nParameterized -> Suite [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_UseParametersRunnerFactory -> ParametersRunnerFactory [ label = \"1\" weight = \"1\" ];\nParameterized -> org_junit_runners_Parameterized_RunnersFactory [ label = \"3\" weight = \"3\" ];\nParameterized -> ParentRunner [ label = \"2\" weight = \"2\" ];\nParameterized -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\nParameterized -> InvalidTestClassError [ label = \"2\" weight = \"2\" ];\nParameterized -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> Runner [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> Description [ label = \"3\" weight = \"3\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> RunNotifier [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_AssumptionViolationRunner -> Failure [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_RunnersFactory -> BlockJUnit4ClassRunnerWithParametersFactory [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_RunnersFactory -> ParametersRunnerFactory [ label = \"5\" weight = \"5\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_model_TestClass [ label = \"10\" weight = \"10\" ];\norg_junit_runners_Parameterized_RunnersFactory -> FrameworkMethod [ label = \"10\" weight = \"10\" ];\norg_junit_runners_Parameterized_RunnersFactory -> Runner [ label = \"5\" weight = \"5\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_Parameterized_AssumptionViolationRunner [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_Parameterized_Parameters [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_RunnersFactory -> org_junit_runners_Parameterized_UseParametersRunnerFactory [ label = \"2\" weight = \"2\" ];\norg_junit_runners_Parameterized_RunnersFactory -> TestWithParameters [ label = \"8\" weight = \"8\" ];\norg_junit_runners_Parameterized_RunnersFactory -> FrameworkMember [ label = \"2\" weight = \"2\" ];\nParentRunner -> Runner [ label = \"1\" weight = \"1\" ];\nParentRunner -> Filterable [ label = \"1\" weight = \"1\" ];\nParentRunner -> Orderable [ label = \"1\" weight = \"1\" ];\nParentRunner -> AnnotationsValidator [ label = \"1\" weight = \"1\" ];\nParentRunner -> TestClassValidator [ label = \"4\" weight = \"4\" ];\nParentRunner -> org_junit_runners_model_TestClass [ label = \"15\" weight = \"15\" ];\nParentRunner -> RunnerScheduler [ label = \"5\" weight = \"5\" ];\nParentRunner -> org_junit_runners_model_InitializationError [ label = \"3\" weight = \"3\" ];\nParentRunner -> Checks [ label = \"1\" weight = \"1\" ];\nParentRunner -> Description [ label = \"13\" weight = \"13\" ];\nParentRunner -> RunNotifier [ label = \"6\" weight = \"6\" ];\nParentRunner -> FrameworkMethod [ label = \"5\" weight = \"5\" ];\nParentRunner -> RuleMemberValidator [ label = \"2\" weight = \"2\" ];\nParentRunner -> Statement [ label = \"16\" weight = \"16\" ];\nParentRunner -> RunBefores [ label = \"1\" weight = \"1\" ];\nParentRunner -> RunAfters [ label = \"1\" weight = \"1\" ];\nParentRunner -> TestRule [ label = \"2\" weight = \"2\" ];\nParentRunner -> RunRules [ label = \"1\" weight = \"1\" ];\nParentRunner -> org_junit_runners_ParentRunner_ClassRuleCollector [ label = \"3\" weight = \"3\" ];\nParentRunner -> EachTestNotifier [ label = \"12\" weight = \"12\" ];\nParentRunner -> org_junit_internal_AssumptionViolatedException [ label = \"2\" weight = \"2\" ];\nParentRunner -> StoppedByUserException [ label = \"1\" weight = \"1\" ];\nParentRunner -> Filter [ label = \"4\" weight = \"4\" ];\nParentRunner -> NoTestsRemainException [ label = \"3\" weight = \"3\" ];\nParentRunner -> Sorter [ label = \"4\" weight = \"4\" ];\nParentRunner -> Orderer [ label = \"3\" weight = \"3\" ];\nParentRunner -> InvalidOrderingException [ label = \"1\" weight = \"1\" ];\nParentRunner -> InvalidTestClassError [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> MemberValueConsumer [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> TestRule [ label = \"6\" weight = \"6\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> org_junit_runners_RuleContainer_RuleEntry [ label = \"4\" weight = \"4\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> FrameworkMember [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> Annotatable [ label = \"1\" weight = \"1\" ];\norg_junit_runners_ParentRunner_ClassRuleCollector -> ClassRule [ label = \"2\" weight = \"2\" ];\nRuleContainer -> TestRule [ label = \"6\" weight = \"6\" ];\nRuleContainer -> MethodRule [ label = \"6\" weight = \"6\" ];\nRuleContainer -> org_junit_runners_RuleContainer_RuleEntry [ label = \"10\" weight = \"10\" ];\nRuleContainer -> FrameworkMethod [ label = \"1\" weight = \"1\" ];\nRuleContainer -> Description [ label = \"1\" weight = \"1\" ];\nRuleContainer -> Statement [ label = \"3\" weight = \"3\" ];\nSuite -> Runner [ label = \"9\" weight = \"9\" ];\nSuite -> ParentRunner [ label = \"2\" weight = \"2\" ];\nSuite -> org_junit_runners_model_InitializationError [ label = \"8\" weight = \"8\" ];\nSuite -> org_junit_runners_Suite_SuiteClasses [ label = \"2\" weight = \"2\" ];\nSuite -> RunnerBuilder [ label = \"5\" weight = \"5\" ];\nSuite -> AllDefaultPossibilitiesBuilder [ label = \"1\" weight = \"1\" ];\nSuite -> Description [ label = \"1\" weight = \"1\" ];\nSuite -> RunNotifier [ label = \"1\" weight = \"1\" ];\nTestCouldNotBeSkippedException -> org_junit_internal_AssumptionViolatedException [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> TestClassValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_ClassValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_MethodValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_FieldValidator [ label = \"1\" weight = \"1\" ];\nAnnotationsValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"4\" weight = \"4\" ];\nAnnotationsValidator -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> Annotatable [ label = \"7\" weight = \"7\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> AnnotationValidatorFactory [ label = \"3\" weight = \"3\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator -> ValidateWith [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_ClassValidator -> org_junit_runners_model_TestClass [ label = \"4\" weight = \"4\" ];\norg_junit_validator_AnnotationsValidator_ClassValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_ClassValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> FrameworkMethod [ label = \"3\" weight = \"3\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_MethodValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> org_junit_validator_AnnotationsValidator_AnnotatableValidator [ label = \"1\" weight = \"1\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> FrameworkField [ label = \"3\" weight = \"3\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> org_junit_runners_model_TestClass [ label = \"2\" weight = \"2\" ];\norg_junit_validator_AnnotationsValidator_FieldValidator -> AnnotationValidator [ label = \"2\" weight = \"2\" ];\nAnnotationValidator -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nAnnotationValidator -> FrameworkField [ label = \"1\" weight = \"1\" ];\nAnnotationValidator -> FrameworkMethod [ label = \"1\" weight = \"1\" ];\nAnnotationValidatorFactory -> ValidateWith [ label = \"4\" weight = \"4\" ];\nAnnotationValidatorFactory -> AnnotationValidator [ label = \"6\" weight = \"6\" ];\nPublicClassValidator -> TestClassValidator [ label = \"1\" weight = \"1\" ];\nPublicClassValidator -> org_junit_runners_model_TestClass [ label = \"3\" weight = \"3\" ];\nTestClassValidator -> org_junit_runners_model_TestClass [ label = \"1\" weight = \"1\" ];\nValidateWith -> AnnotationValidator [ label = \"1\" weight = \"1\" ];\norg_junit_internal_requests_ClassRequest_CustomSuiteMethodBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\" label=\"ClassRequest$CustomSuiteMethodBuilder\"];\nRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Request.java\" target=\"_blank\" color=red style=filled];\nIncludeCategories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/IncludeCategories.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_AnnotatableValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$AnnotatableValidator\"];\nParameterSignature [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/ParameterSignature.java\" target=\"_blank\"];\norg_junit_rules_ExpectedException_ExpectedExceptionStatement [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExpectedException.java\" target=\"_blank\" label=\"ExpectedException$ExpectedExceptionStatement\"];\nNullBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/NullBuilder.java\" target=\"_blank\"];\nOrdering [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\"];\nTestSuite [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestSuite.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_FieldValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$FieldValidator\"];\norg_junit_ComparisonFailure_ComparisonCompactor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ComparisonFailure.java\" target=\"_blank\" label=\"ComparisonFailure$ComparisonCompactor\" color=red style=filled];\norg_junit_experimental_categories_Categories_IncludeCategory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" label=\"Categories$IncludeCategory\"];\nExpectedExceptionMatcherBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExpectedExceptionMatcherBuilder.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_DeclaringClassMustBePublic [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$DeclaringClassMustBePublic\"];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_InjectionType [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunnerWithParameters$InjectionType\"];\nSortingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/SortingRequest.java\" target=\"_blank\"];\nTestSetup [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/TestSetup.java\" target=\"_blank\"];\nArrayComparisonFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/ArrayComparisonFailure.java\" target=\"_blank\"];\norg_junit_runner_Request_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Request.java\" target=\"_blank\" label=\"Request$1\"];\norg_junit_runner_Computer_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Computer.java\" target=\"_blank\" label=\"Computer$1\"];\nErrorCollector [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ErrorCollector.java\" target=\"_blank\"];\norg_junit_internal_runners_InitializationError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/InitializationError.java\" target=\"_blank\"];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunAfterParams [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunnerWithParameters$RunAfterParams\"];\nVerifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Verifier.java\" target=\"_blank\"];\nThrowingRunnable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/function/ThrowingRunnable.java\" target=\"_blank\"];\nExternalResource [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExternalResource.java\" target=\"_blank\"];\nFailureList [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/results/FailureList.java\" target=\"_blank\"];\nResultPrinter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/textui/ResultPrinter.java\" target=\"_blank\"];\nReflectiveRuntimeMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveRuntimeMXBean.java\" target=\"_blank\"];\norg_junit_ComparisonFailure_ComparisonCompactor_DiffExtractor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ComparisonFailure.java\" target=\"_blank\" label=\"ComparisonFailure$ComparisonCompactor$DiffExtractor\"];\nValidationError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/ValidationError.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeStatic [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MemberMustBeStatic\"];\nSuiteMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/SuiteMethod.java\" target=\"_blank\"];\nSerializableMatcherDescription [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/SerializableMatcherDescription.java\" target=\"_blank\"];\nRunWith [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/RunWith.java\" target=\"_blank\"];\nPrintableResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/results/PrintableResult.java\" target=\"_blank\"];\norg_junit_internal_management_ManagementFactory_ThreadHolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\" label=\"ManagementFactory$ThreadHolder\"];\nInvokeMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/InvokeMethod.java\" target=\"_blank\"];\nFakeRuntimeMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/FakeRuntimeMXBean.java\" target=\"_blank\"];\nActiveTestSuite [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/ActiveTestSuite.java\" target=\"_blank\"];\nTheories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theories.java\" target=\"_blank\"];\nComparisonCriteria [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/ComparisonCriteria.java\" target=\"_blank\"];\nClassRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\"];\nTimeout [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Timeout.java\" target=\"_blank\" color=red style=filled];\nTestCase [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestCase.java\" target=\"_blank\"];\norg_junit_AssumptionViolatedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/AssumptionViolatedException.java\" target=\"_blank\"];\norg_junit_experimental_categories_IncludeCategories_IncludesAny [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/IncludeCategories.java\" target=\"_blank\" label=\"IncludeCategories$IncludesAny\"];\nFilter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Filter.java\" target=\"_blank\" color=red style=filled];\norg_junit_internal_runners_statements_FailOnTimeout_CallableStatement [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java\" target=\"_blank\" label=\"FailOnTimeout$CallableStatement\"];\norg_junit_runner_notification_RunNotifier_SafeNotifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunNotifier.java\" target=\"_blank\" label=\"RunNotifier$SafeNotifier\"];\norg_junit_runner_notification_RunListener_ThreadSafe [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunListener.java\" target=\"_blank\" label=\"RunListener$ThreadSafe\"];\norg_junit_Test [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Test.java\" target=\"_blank\"];\nJUnit4TestCaseFacade [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/JUnit4TestCaseFacade.java\" target=\"_blank\"];\norg_junit_runners_Parameterized_Parameter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$Parameter\"];\nFilterRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/FilterRequest.java\" target=\"_blank\"];\norg_junit_experimental_theories_internal_AllMembersSupplier_MethodParameterValue [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java\" target=\"_blank\" label=\"AllMembersSupplier$MethodParameterValue\"];\nCategoryValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/CategoryValidator.java\" target=\"_blank\"];\norg_junit_experimental_categories_Categories_ExcludeCategory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" label=\"Categories$ExcludeCategory\"];\norg_junit_ComparisonFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ComparisonFailure.java\" target=\"_blank\"];\nMethodSorters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/MethodSorters.java\" target=\"_blank\"];\nRunnerBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/RunnerBuilder.java\" target=\"_blank\" color=red style=filled];\nChecks [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Checks.java\" target=\"_blank\"];\nFilterable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Filterable.java\" target=\"_blank\"];\nManagementFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_MethodValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$MethodValidator\"];\nRunRules [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/RunRules.java\" target=\"_blank\"];\nMethodSorter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/MethodSorter.java\" target=\"_blank\"];\nThrowables [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\"];\nEachTestNotifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/model/EachTestNotifier.java\" target=\"_blank\"];\norg_junit_internal_Throwables_State_4 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$4\"];\norg_junit_internal_Throwables_State_3 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$3\"];\norg_junit_internal_Throwables_State_2 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$2\"];\nRunListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunListener.java\" target=\"_blank\"];\norg_junit_internal_Throwables_State_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State$1\"];\nTestFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestFailure.java\" target=\"_blank\"];\nDescription [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Description.java\" target=\"_blank\"];\nAnnotationValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationValidator.java\" target=\"_blank\"];\nFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/Failure.java\" target=\"_blank\" color=red style=filled];\nInvalidTestClassError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/InvalidTestClassError.java\" target=\"_blank\"];\nValidateWith [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/ValidateWith.java\" target=\"_blank\"];\norg_junit_runner_Result_SerializedForm [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Result.java\" target=\"_blank\" label=\"Result$SerializedForm\"];\norg_junit_runners_Parameterized_RunnersFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$RunnersFactory\"];\nFailOnTimeout [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java\" target=\"_blank\" color=red style=filled];\nAllDefaultPossibilitiesBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/AllDefaultPossibilitiesBuilder.java\" target=\"_blank\"];\norg_junit_runner_manipulation_Ordering_Factory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\" label=\"Ordering$Factory\"];\nDisableOnDebug [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/DisableOnDebug.java\" target=\"_blank\"];\norg_junit_runners_Parameterized_AssumptionViolationRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$AssumptionViolationRunner\"];\nNoGenericTypeParametersValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/NoGenericTypeParametersValidator.java\" target=\"_blank\"];\nStatement [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/Statement.java\" target=\"_blank\" color=red style=filled];\njunit_framework_Test [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/Test.java\" target=\"_blank\" color=red style=filled];\nJUnitMatchers [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/matchers/JUnitMatchers.java\" target=\"_blank\"];\nMemberValueConsumer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/MemberValueConsumer.java\" target=\"_blank\"];\nJUnit4TestAdapter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/JUnit4TestAdapter.java\" target=\"_blank\" color=red style=filled];\norg_junit_experimental_categories_Categories_CategoryFilter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" label=\"Categories$CategoryFilter\"];\nFakeThreadMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/FakeThreadMXBean.java\" target=\"_blank\"];\norg_junit_internal_runners_TestClass [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/TestClass.java\" target=\"_blank\"];\nInvalidOrderingException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/InvalidOrderingException.java\" target=\"_blank\"];\norg_junit_internal_management_ManagementFactory_FactoryHolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\" label=\"ManagementFactory$FactoryHolder\"];\nParallelComputer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/ParallelComputer.java\" target=\"_blank\"];\nStacktracePrintingMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/StacktracePrintingMatcher.java\" target=\"_blank\"];\norg_junit_internal_runners_statements_FailOnTimeout_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java\" target=\"_blank\" label=\"FailOnTimeout$Builder\"];\norg_junit_runner_JUnitCommandLineParseResult_CommandLineParserError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCommandLineParseResult.java\" target=\"_blank\" label=\"JUnitCommandLineParseResult$CommandLineParserError\"];\norg_junit_runners_BlockJUnit4ClassRunner_RuleCollector [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunner$RuleCollector\"];\nExcludeCategories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/ExcludeCategories.java\" target=\"_blank\"];\nMethodValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/MethodValidator.java\" target=\"_blank\"];\norg_junit_experimental_theories_Theories_TheoryAnchor_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theories.java\" target=\"_blank\" label=\"Theories$TheoryAnchor$1\"];\norg_junit_runner_Result_Listener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Result.java\" target=\"_blank\" label=\"Result$Listener\"];\nExactComparisonCriteria [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/ExactComparisonCriteria.java\" target=\"_blank\"];\nAnnotationsValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\"];\nAssume [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Assume.java\" target=\"_blank\"];\nTestCouldNotBeSkippedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/TestCouldNotBeSkippedException.java\" target=\"_blank\"];\nJUnitSystem [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/JUnitSystem.java\" target=\"_blank\"];\nBlockJUnit4ClassRunnerWithParametersFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParametersFactory.java\" target=\"_blank\"];\nClassRoadie [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/ClassRoadie.java\" target=\"_blank\"];\norg_junit_rules_Stopwatch_Clock [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Stopwatch.java\" target=\"_blank\" label=\"Stopwatch$Clock\"];\nJUnit3Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/JUnit3Builder.java\" target=\"_blank\"];\nFrameworkMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/FrameworkMethod.java\" target=\"_blank\" color=red style=filled];\nIgnoredBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/IgnoredBuilder.java\" target=\"_blank\"];\norg_junit_internal_Throwables_State [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Throwables.java\" target=\"_blank\" label=\"Throwables$State\"];\nTestTimedOutException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestTimedOutException.java\" target=\"_blank\"];\nSpecificDataPointsSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java\" target=\"_blank\" color=red style=filled];\nJUnit4 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/JUnit4.java\" target=\"_blank\"];\nJUnitCommandLineParseResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCommandLineParseResult.java\" target=\"_blank\"];\njunit_framework_Assert [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/Assert.java\" target=\"_blank\" color=red style=filled];\nOrderWithValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/OrderWithValidator.java\" target=\"_blank\"];\nParametersRunnerFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/ParametersRunnerFactory.java\" target=\"_blank\"];\nTestDecorator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/TestDecorator.java\" target=\"_blank\"];\nParametersSuppliedBy [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/ParametersSuppliedBy.java\" target=\"_blank\"];\nMemoizingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/MemoizingRequest.java\" target=\"_blank\"];\nTestClassValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/TestClassValidator.java\" target=\"_blank\"];\nResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Result.java\" target=\"_blank\"];\nJUnitCore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCore.java\" target=\"_blank\"];\norg_junit_experimental_theories_Theories_TheoryAnchor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theories.java\" target=\"_blank\" label=\"Theories$TheoryAnchor\"];\nTestRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/textui/TestRunner.java\" target=\"_blank\"];\nInexactComparisonCriteria [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/InexactComparisonCriteria.java\" target=\"_blank\"];\nRunnerScheduler [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/RunnerScheduler.java\" target=\"_blank\"];\norg_junit_internal_AssumptionViolatedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/AssumptionViolatedException.java\" target=\"_blank\"];\nFilterFactories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactories.java\" target=\"_blank\"];\nParameterSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/ParameterSupplier.java\" target=\"_blank\"];\nThrowableMessageMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/ThrowableMessageMatcher.java\" target=\"_blank\"];\nMaxCore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxCore.java\" target=\"_blank\"];\nReflectiveThreadMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveThreadMXBean.java\" target=\"_blank\"];\nRuleContainer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/RuleContainer.java\" target=\"_blank\"];\nBlockJUnit4ClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java\" target=\"_blank\" color=red style=filled];\norg_junit_runner_FilterFactory_FilterNotCreatedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactory.java\" target=\"_blank\" label=\"FilterFactory$FilterNotCreatedException\"];\njunit_framework_ComparisonFailure [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/ComparisonFailure.java\" target=\"_blank\"];\nFrameworkMember [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/FrameworkMember.java\" target=\"_blank\"];\nClassRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/ClassRule.java\" target=\"_blank\"];\nTheory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/Theory.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeARule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MethodMustBeARule\"];\nJUnit4Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/JUnit4Builder.java\" target=\"_blank\"];\nSuiteMethodBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/SuiteMethodBuilder.java\" target=\"_blank\"];\norg_junit_internal_runners_JUnit38ClassRunner_OldTestClassAdaptingListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java\" target=\"_blank\" label=\"JUnit38ClassRunner$OldTestClassAdaptingListener\"];\nTestWithParameters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/TestWithParameters.java\" target=\"_blank\"];\norg_junit_runners_Parameterized_UseParametersRunnerFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$UseParametersRunnerFactory\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBePublic [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MemberMustBePublic\"];\nCategory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Category.java\" target=\"_blank\"];\nTestWatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestWatcher.java\" target=\"_blank\"];\nMethodRoadie [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/MethodRoadie.java\" target=\"_blank\"];\nSuite [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Suite.java\" target=\"_blank\"];\nAssignments [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/Assignments.java\" target=\"_blank\"];\nIgnoredClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/IgnoredClassRunner.java\" target=\"_blank\"];\nTestedOnSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/suppliers/TestedOnSupplier.java\" target=\"_blank\" color=red style=filled];\nTypeSafeMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/TypeSafeMatcher.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeARule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$FieldMustBeARule\"];\nFixMethodOrder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/FixMethodOrder.java\" target=\"_blank\"];\nFailedBefore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/FailedBefore.java\" target=\"_blank\"];\nRealSystem [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/RealSystem.java\" target=\"_blank\"];\nFrameworkField [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/FrameworkField.java\" target=\"_blank\"];\nThreadMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ThreadMXBean.java\" target=\"_blank\"];\norg_junit_internal_management_ReflectiveThreadMXBean_Holder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveThreadMXBean.java\" target=\"_blank\" label=\"ReflectiveThreadMXBean$Holder\"];\norg_junit_internal_requests_ClassRequest_CustomAllDefaultPossibilitiesBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\" label=\"ClassRequest$CustomAllDefaultPossibilitiesBuilder\"];\nRunAfters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/RunAfters.java\" target=\"_blank\"];\nStopwatch [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Stopwatch.java\" target=\"_blank\" color=red style=filled];\norg_junit_experimental_max_MaxHistory_RememberingListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxHistory.java\" target=\"_blank\" label=\"MaxHistory$RememberingListener\"];\norg_junit_runners_model_MultipleFailureException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/MultipleFailureException.java\" target=\"_blank\"];\nOrderable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Orderable.java\" target=\"_blank\"];\nParameterizedAssertionError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/ParameterizedAssertionError.java\" target=\"_blank\"];\nAnnotatable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/Annotatable.java\" target=\"_blank\"];\nTestWatchman [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestWatchman.java\" target=\"_blank\"];\nDescribable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Describable.java\" target=\"_blank\"];\nRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Runner.java\" target=\"_blank\"];\nTestName [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestName.java\" target=\"_blank\"];\nBooleanSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/BooleanSupplier.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_FieldMustBeATestRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$FieldMustBeATestRule\"];\norg_junit_runners_model_InitializationError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/InitializationError.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_RuleValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$RuleValidator\"];\nCategoryFilterFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/CategoryFilterFactory.java\" target=\"_blank\"];\nTextListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/TextListener.java\" target=\"_blank\"];\nTestMethod [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/TestMethod.java\" target=\"_blank\"];\norg_junit_runners_ParentRunner_ClassRuleCollector [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/ParentRunner.java\" target=\"_blank\" label=\"ParentRunner$ClassRuleCollector\"];\norg_junit_runners_Parameterized_Parameters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\" label=\"Parameterized$Parameters\"];\nAssertionFailedError [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/AssertionFailedError.java\" target=\"_blank\"];\nPublicClassValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/PublicClassValidator.java\" target=\"_blank\"];\norg_junit_experimental_categories_ExcludeCategories_ExcludesAny [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/ExcludeCategories.java\" target=\"_blank\" label=\"ExcludeCategories$ExcludesAny\"];\nJUnit4TestAdapterCache [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/JUnit4TestAdapterCache.java\" target=\"_blank\"];\nEnumSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/EnumSupplier.java\" target=\"_blank\"];\nTestListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestListener.java\" target=\"_blank\"];\nParentRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/ParentRunner.java\" target=\"_blank\"];\nEnclosed [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/runners/Enclosed.java\" target=\"_blank\"];\norg_junit_Assert [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Assert.java\" target=\"_blank\"];\norg_junit_experimental_max_MaxCore_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxCore.java\" target=\"_blank\" label=\"MaxCore$1\"];\nProtectable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/Protectable.java\" target=\"_blank\"];\nJUnit4ClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/JUnit4ClassRunner.java\" target=\"_blank\"];\nFilterFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactory.java\" target=\"_blank\"];\norg_junit_rules_Timeout_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Timeout.java\" target=\"_blank\" label=\"Timeout$Builder\"];\norg_junit_runner_manipulation_Ordering_Context [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\" label=\"Ordering$Context\"];\nMethodRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/MethodRule.java\" target=\"_blank\"];\norg_junit_rules_Stopwatch_InternalWatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/Stopwatch.java\" target=\"_blank\" label=\"Stopwatch$InternalWatcher\"];\nComparisonCompactor [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/ComparisonCompactor.java\" target=\"_blank\"];\norg_junit_experimental_theories_PotentialAssignment_CouldNotGenerateValueException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/PotentialAssignment.java\" target=\"_blank\" label=\"PotentialAssignment$CouldNotGenerateValueException\"];\nOrderWith [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/OrderWith.java\" target=\"_blank\"];\nFilterFactoryParams [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactoryParams.java\" target=\"_blank\"];\norg_junit_runners_model_TestClass [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestClass.java\" target=\"_blank\" color=red style=filled];\nClasses [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/Classes.java\" target=\"_blank\"];\nDataPoint [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/DataPoint.java\" target=\"_blank\"];\nSortable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Sortable.java\" target=\"_blank\"];\nComputer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Computer.java\" target=\"_blank\"];\norg_junit_runners_model_TestClass_FieldComparator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestClass.java\" target=\"_blank\" label=\"TestClass$FieldComparator\"];\nTestResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/framework/TestResult.java\" target=\"_blank\"];\nBaseTestRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/runner/BaseTestRunner.java\" target=\"_blank\"];\nSynchronizedRunListener [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/SynchronizedRunListener.java\" target=\"_blank\"];\nSerializableValueDescription [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/SerializableValueDescription.java\" target=\"_blank\"];\nAnnotatedBuilder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/builders/AnnotatedBuilder.java\" target=\"_blank\"];\nAlphanumeric [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Alphanumeric.java\" target=\"_blank\"];\nRuntimeMXBean [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/RuntimeMXBean.java\" target=\"_blank\"];\nFail [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/Fail.java\" target=\"_blank\"];\nParameterized [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Parameterized.java\" target=\"_blank\"];\norg_junit_validator_AnnotationsValidator_ClassValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationsValidator.java\" target=\"_blank\" label=\"AnnotationsValidator$ClassValidator\"];\nSorter [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Sorter.java\" target=\"_blank\" color=red style=filled];\nBlockJUnit4ClassRunnerWithParameters [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\"];\nErrorReportingRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/ErrorReportingRunner.java\" target=\"_blank\"];\nResultMatchers [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/results/ResultMatchers.java\" target=\"_blank\"];\nAllTests [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/AllTests.java\" target=\"_blank\"];\norg_junit_runners_Suite_SuiteClasses [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/Suite.java\" target=\"_blank\" label=\"Suite$SuiteClasses\"];\norg_junit_runners_parameterized_BlockJUnit4ClassRunnerWithParameters_RunBeforeParams [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java\" target=\"_blank\" label=\"BlockJUnit4ClassRunnerWithParameters$RunBeforeParams\"];\nNoTestsRemainException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/NoTestsRemainException.java\" target=\"_blank\"];\nAllMembersSupplier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java\" target=\"_blank\" color=red style=filled];\nFromDataPoints [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/FromDataPoints.java\" target=\"_blank\"];\nStoppedByUserException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/StoppedByUserException.java\" target=\"_blank\"];\nTestedOn [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/suppliers/TestedOn.java\" target=\"_blank\"];\nRuleMemberValidator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\"];\nDataPoints [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/DataPoints.java\" target=\"_blank\"];\nCategories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/categories/Categories.java\" target=\"_blank\" color=red style=filled];\nMaxHistory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxHistory.java\" target=\"_blank\" color=red style=filled];\nTestRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TestRule.java\" target=\"_blank\"];\nRunBefores [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/RunBefores.java\" target=\"_blank\"];\nJUnit38ClassRunner [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java\" target=\"_blank\" color=red style=filled];\nOrderer [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Orderer.java\" target=\"_blank\" color=red style=filled];\norg_junit_runner_manipulation_Filter_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Filter.java\" target=\"_blank\" label=\"Filter$1\"];\nRepeatedTest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/extensions/RepeatedTest.java\" target=\"_blank\"];\nPotentialAssignment [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/theories/PotentialAssignment.java\" target=\"_blank\"];\norg_junit_internal_management_ManagementFactory_RuntimeHolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ManagementFactory.java\" target=\"_blank\" label=\"ManagementFactory$RuntimeHolder\"];\nAnnotationValidatorFactory [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/validator/AnnotationValidatorFactory.java\" target=\"_blank\"];\norg_junit_rules_TemporaryFolder_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TemporaryFolder.java\" target=\"_blank\" label=\"TemporaryFolder$Builder\"];\norg_junit_internal_management_ReflectiveRuntimeMXBean_Holder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/management/ReflectiveRuntimeMXBean.java\" target=\"_blank\" label=\"ReflectiveRuntimeMXBean$Holder\"];\nExpectedException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/ExpectedException.java\" target=\"_blank\" color=red style=filled];\norg_junit_runners_RuleContainer_RuleEntry [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/RuleContainer.java\" target=\"_blank\" label=\"RuleContainer$RuleEntry\"];\norg_junit_internal_runners_model_MultipleFailureException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/model/MultipleFailureException.java\" target=\"_blank\"];\nVersion [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/junit/runner/Version.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MethodMustBeATestRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MethodMustBeATestRule\"];\norg_junit_experimental_max_MaxHistory_TestComparator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/MaxHistory.java\" target=\"_blank\" label=\"MaxHistory$TestComparator\"];\norg_junit_internal_runners_rules_RuleMemberValidator_Builder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$Builder\"];\norg_junit_runners_model_TestClass_MethodComparator [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runners/model/TestClass.java\" target=\"_blank\" label=\"TestClass$MethodComparator\"];\nExpectException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/statements/ExpectException.java\" target=\"_blank\"];\norg_junit_internal_runners_rules_RuleMemberValidator_MemberMustBeNonStaticOrAlsoClassRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java\" target=\"_blank\" label=\"RuleMemberValidator$MemberMustBeNonStaticOrAlsoClassRule\"];\norg_junit_runner_manipulation_Ordering_1 [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/manipulation/Ordering.java\" target=\"_blank\" label=\"Ordering$1\"];\nReflectiveCallable [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/runners/model/ReflectiveCallable.java\" target=\"_blank\"];\nRuleChain [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/RuleChain.java\" target=\"_blank\"];\nCouldNotReadCoreException [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/experimental/max/CouldNotReadCoreException.java\" target=\"_blank\"];\nRule [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/Rule.java\" target=\"_blank\"];\nThrowableCauseMatcher [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/matchers/ThrowableCauseMatcher.java\" target=\"_blank\"];\nOrderingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/OrderingRequest.java\" target=\"_blank\"];\nRunNotifier [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/notification/RunNotifier.java\" target=\"_blank\"];\nTemporaryFolder [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/rules/TemporaryFolder.java\" target=\"_blank\" color=red style=filled];\n}", + "hasEdges": false }, - "classRelationshipsToRemove" : { - "cycleCount" : 25, - "relationshipsToRemoveCount" : 47, - "hasRelationships" : true, - "relationships" : [ { - "sourceClass" : "org.junit.Assert", - "targetClass" : "org.junit.ComparisonFailure", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Assert → ComparisonFailure : 1", - "priority" : 1, - "cycleCount" : 3, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.Assert", - "targetClass" : "org.junit.internal.ExactComparisonCriteria", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Assert → ExactComparisonCriteria : 1", - "priority" : 2, - "cycleCount" : 2, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 3 - }, { - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.runner.JUnitCore", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Request* → JUnitCore : 1", - "priority" : 3, - "cycleCount" : 2, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.InexactComparisonCriteria", - "targetClass" : "org.junit.Assert", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "InexactComparisonCriteria → Assert : 2", - "priority" : 4, - "cycleCount" : 2, - "effortRank" : 2, - "alsoRemovesPackageRelationship" : true, - "packageCycleCount" : 3 - }, { - "sourceClass" : "org.junit.ComparisonFailure$ComparisonCompactor$DiffExtractor", - "targetClass" : "org.junit.ComparisonFailure$ComparisonCompactor", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "ComparisonFailure$ComparisonCompactor$DiffExtractor → ComparisonFailure$ComparisonCompactor* : 2", - "priority" : 5, - "cycleCount" : 2, - "effortRank" : 2, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.ComparisonCriteria", - "targetClass" : "org.junit.Assert", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 3, - "renderedLabel" : "ComparisonCriteria → Assert : 3", - "priority" : 6, - "cycleCount" : 2, - "effortRank" : 3, - "alsoRemovesPackageRelationship" : true, - "packageCycleCount" : 3 - }, { - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.internal.requests.FilterRequest", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Request* → FilterRequest : 1", - "priority" : 7, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : true, - "packageCycleCount" : 4 - }, { - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.internal.requests.SortingRequest", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Request* → SortingRequest : 1", - "priority" : 8, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : true, - "packageCycleCount" : 4 - }, { - "sourceClass" : "org.junit.runner.notification.RunListener", - "targetClass" : "org.junit.runner.Result", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RunListener → Result : 1", - "priority" : 9, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : true, - "packageCycleCount" : 3 - }, { - "sourceClass" : "org.junit.runners.model.MultipleFailureException", - "targetClass" : "org.junit.internal.runners.model.MultipleFailureException", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "MultipleFailureException → MultipleFailureException : 1", - "priority" : 10, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : true, - "packageCycleCount" : 3 - }, { - "sourceClass" : "org.junit.internal.requests.MemoizingRequest", - "targetClass" : "org.junit.runner.Request", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "MemoizingRequest → Request* : 1", - "priority" : 11, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 4 - }, { - "sourceClass" : "junit.framework.Test", - "targetClass" : "junit.framework.TestResult", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Test* → TestResult : 1", - "priority" : 12, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.experimental.categories.Categories", - "targetClass" : "org.junit.experimental.categories.Categories$CategoryFilter", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Categories* → Categories$CategoryFilter : 1", - "priority" : 13, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.experimental.max.MaxHistory", - "targetClass" : "org.junit.experimental.max.MaxHistory$TestComparator", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "MaxHistory* → MaxHistory$TestComparator : 1", - "priority" : 14, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.manipulation.Filter", - "targetClass" : "org.junit.runner.manipulation.Filter$1", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Filter* → Filter$1 : 1", - "priority" : 15, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.experimental.theories.internal.AllMembersSupplier$MethodParameterValue", - "targetClass" : "org.junit.experimental.theories.internal.AllMembersSupplier", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "AllMembersSupplier$MethodParameterValue → AllMembersSupplier* : 1", - "priority" : 16, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.manipulation.Filterable", - "targetClass" : "org.junit.runner.manipulation.Filter", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "Filterable → Filter* : 1", - "priority" : 17, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.manipulation.Orderable", - "targetClass" : "org.junit.runner.manipulation.Orderer", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "Orderable → Orderer* : 1", - "priority" : 18, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.manipulation.Ordering", - "targetClass" : "org.junit.runner.manipulation.Orderer", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "Ordering → Orderer* : 1", - "priority" : 19, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.manipulation.Sortable", - "targetClass" : "org.junit.runner.manipulation.Sorter", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "Sortable → Sorter* : 1", - "priority" : 20, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.runners.rules.RuleMemberValidator", - "targetClass" : "org.junit.internal.runners.rules.RuleMemberValidator$FieldMustBeARule", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RuleMemberValidator → RuleMemberValidator$FieldMustBeARule : 1", - "priority" : 21, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.runners.rules.RuleMemberValidator", - "targetClass" : "org.junit.internal.runners.rules.RuleMemberValidator$MethodMustBeARule", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RuleMemberValidator → RuleMemberValidator$MethodMustBeARule : 1", - "priority" : 22, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.runners.rules.RuleMemberValidator$MethodMustBeATestRule", - "targetClass" : "org.junit.internal.runners.rules.RuleMemberValidator", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RuleMemberValidator$MethodMustBeATestRule → RuleMemberValidator : 1", - "priority" : 23, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.runners.rules.RuleMemberValidator$FieldMustBeATestRule", - "targetClass" : "org.junit.internal.runners.rules.RuleMemberValidator", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RuleMemberValidator$FieldMustBeATestRule → RuleMemberValidator : 1", - "priority" : 24, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.Throwables$State", - "targetClass" : "org.junit.internal.Throwables$State$1", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Throwables$State → Throwables$State$1 : 1", - "priority" : 25, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.Throwables$State$2", - "targetClass" : "org.junit.internal.Throwables$State", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Throwables$State$2 → Throwables$State : 1", - "priority" : 26, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.Throwables$State$3", - "targetClass" : "org.junit.internal.Throwables$State", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Throwables$State$3 → Throwables$State : 1", - "priority" : 27, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.Throwables$State", - "targetClass" : "org.junit.internal.Throwables$State$4", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Throwables$State → Throwables$State$4 : 1", - "priority" : 28, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.manipulation.Ordering$Factory", - "targetClass" : "org.junit.runner.manipulation.Ordering", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Ordering$Factory → Ordering : 1", - "priority" : 29, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.notification.RunNotifier$SafeNotifier", - "targetClass" : "org.junit.runner.notification.RunNotifier", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RunNotifier$SafeNotifier → RunNotifier : 1", - "priority" : 30, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.Result$Listener", - "targetClass" : "org.junit.runner.Result", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Result$Listener → Result : 1", - "priority" : 31, - "cycleCount" : 1, - "effortRank" : 1, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.experimental.theories.suppliers.TestedOnSupplier", - "targetClass" : "org.junit.experimental.theories.suppliers.TestedOn", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "TestedOnSupplier* → TestedOn : 2", - "priority" : 32, - "cycleCount" : 1, - "effortRank" : 2, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "junit.framework.ComparisonCompactor", - "targetClass" : "junit.framework.Assert", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "ComparisonCompactor → Assert* : 2", - "priority" : 33, - "cycleCount" : 1, - "effortRank" : 2, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.runners.statements.FailOnTimeout$Builder", - "targetClass" : "org.junit.internal.runners.statements.FailOnTimeout", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "FailOnTimeout$Builder → FailOnTimeout* : 2", - "priority" : 34, - "cycleCount" : 1, - "effortRank" : 2, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.runners.rules.RuleMemberValidator$Builder", - "targetClass" : "org.junit.internal.runners.rules.RuleMemberValidator", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "RuleMemberValidator$Builder → RuleMemberValidator : 2", - "priority" : 35, - "cycleCount" : 1, - "effortRank" : 2, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.runners.rules.RuleMemberValidator$MemberMustBeNonStaticOrAlsoClassRule", - "targetClass" : "org.junit.internal.runners.rules.RuleMemberValidator", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "RuleMemberValidator$MemberMustBeNonStaticOrAlsoClassRule → RuleMemberValidator : 2", - "priority" : 36, - "cycleCount" : 1, - "effortRank" : 2, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.requests.OrderingRequest", - "targetClass" : "org.junit.runner.Request", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 3, - "renderedLabel" : "OrderingRequest → Request* : 3", - "priority" : 37, - "cycleCount" : 1, - "effortRank" : 3, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 4 - }, { - "sourceClass" : "org.junit.rules.TemporaryFolder", - "targetClass" : "org.junit.rules.TemporaryFolder$Builder", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 3, - "renderedLabel" : "TemporaryFolder* → TemporaryFolder$Builder : 3", - "priority" : 38, - "cycleCount" : 1, - "effortRank" : 3, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.experimental.max.MaxHistory$RememberingListener", - "targetClass" : "org.junit.experimental.max.MaxHistory", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 3, - "renderedLabel" : "MaxHistory$RememberingListener → MaxHistory* : 3", - "priority" : 39, - "cycleCount" : 1, - "effortRank" : 3, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.rules.ExpectedException$ExpectedExceptionStatement", - "targetClass" : "org.junit.rules.ExpectedException", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 3, - "renderedLabel" : "ExpectedException$ExpectedExceptionStatement → ExpectedException* : 3", - "priority" : 40, - "cycleCount" : 1, - "effortRank" : 3, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.experimental.theories.internal.SpecificDataPointsSupplier", - "targetClass" : "org.junit.experimental.theories.FromDataPoints", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 4, - "renderedLabel" : "SpecificDataPointsSupplier* → FromDataPoints : 4", - "priority" : 41, - "cycleCount" : 1, - "effortRank" : 4, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 1 - }, { - "sourceClass" : "junit.framework.JUnit4TestAdapter", - "targetClass" : "junit.framework.JUnit4TestAdapterCache", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 5, - "renderedLabel" : "JUnit4TestAdapter* → JUnit4TestAdapterCache : 5", - "priority" : 42, - "cycleCount" : 1, - "effortRank" : 5, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.internal.Throwables$State", - "targetClass" : "org.junit.internal.Throwables", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 5, - "renderedLabel" : "Throwables$State → Throwables : 5", - "priority" : 43, - "cycleCount" : 1, - "effortRank" : 5, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.rules.Timeout", - "targetClass" : "org.junit.rules.Timeout$Builder", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 6, - "renderedLabel" : "Timeout* → Timeout$Builder : 6", - "priority" : 44, - "cycleCount" : 1, - "effortRank" : 6, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "junit.framework.TestCase", - "targetClass" : "junit.framework.TestResult", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 6, - "renderedLabel" : "TestCase → TestResult : 6", - "priority" : 45, - "cycleCount" : 1, - "effortRank" : 6, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.runner.Result", - "targetClass" : "org.junit.runner.Result$SerializedForm", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 6, - "renderedLabel" : "Result → Result$SerializedForm : 6", - "priority" : 46, - "cycleCount" : 1, - "effortRank" : 6, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - }, { - "sourceClass" : "org.junit.rules.Stopwatch$InternalWatcher", - "targetClass" : "org.junit.rules.Stopwatch", - "sourceUrl" : null, - "targetUrl" : null, - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 12, - "renderedLabel" : "Stopwatch$InternalWatcher → Stopwatch* : 12", - "priority" : 47, - "cycleCount" : 1, - "effortRank" : 12, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, - "packageMap" : { - "graphId" : "packageGraph", - "classCount" : 32, - "relationshipCount" : 125, - "dotThreshold" : 4000, - "dotThresholdExceeded" : false, - "dot" : "strict digraph G {\npackage_9bf1e82bbcacae569c713bba -> package_08fe06d73182d2aba49f0a3b [ label = \"29\" weight = \"29\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_63ec0cff5f640f6c4bea0fbf [ label = \"10\" weight = \"10\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_430407bac0561c25bf36889d [ label = \"39\" weight = \"39\" color = \"red\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_586bd4db20fb6988a9d4eaf8 [ label = \"7\" weight = \"7\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_ca30420dac77c856476365b1 [ label = \"5\" weight = \"5\" ];\npackage_e98a44e5d67bad99f479d7c6 -> package_08fe06d73182d2aba49f0a3b [ label = \"13\" weight = \"13\" ];\npackage_e98a44e5d67bad99f479d7c6 -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_4a7bf01725342795a1658980 -> package_08fe06d73182d2aba49f0a3b [ label = \"49\" weight = \"49\" ];\npackage_4a7bf01725342795a1658980 -> package_e98a44e5d67bad99f479d7c6 [ label = \"6\" weight = \"6\" ];\npackage_57c57c07a5bca0ee4c17b142 -> package_ca30420dac77c856476365b1 [ label = \"22\" weight = \"22\" ];\npackage_57c57c07a5bca0ee4c17b142 -> package_0d5cc855f96914d3926ad59c [ label = \"3\" weight = \"3\" ];\npackage_ecd46349524a87b5d286d241 -> package_77ce60de3666f8dc6de1e090 [ label = \"3\" weight = \"3\" ];\npackage_ecd46349524a87b5d286d241 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"6\" weight = \"6\" ];\npackage_ecd46349524a87b5d286d241 -> package_430407bac0561c25bf36889d [ label = \"16\" weight = \"16\" ];\npackage_ecd46349524a87b5d286d241 -> package_4b999d8089061c322291f538 [ label = \"5\" weight = \"5\" ];\npackage_ecd46349524a87b5d286d241 -> package_3a322087a44efafbd4368a08 [ label = \"5\" weight = \"5\" ];\npackage_ecd46349524a87b5d286d241 -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_430407bac0561c25bf36889d [ label = \"68\" weight = \"68\" ];\npackage_ad0c39b57276a6da897dffac -> package_2a0e4fa3bf7e37ca1b867475 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_3a322087a44efafbd4368a08 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_ad0c39b57276a6da897dffac -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_08fe06d73182d2aba49f0a3b [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_586bd4db20fb6988a9d4eaf8 [ label = \"4\" weight = \"4\" ];\npackage_8ee2c1f7beac932dbb525a9a -> package_430407bac0561c25bf36889d [ label = \"11\" weight = \"11\" ];\npackage_8ee2c1f7beac932dbb525a9a -> package_77ce60de3666f8dc6de1e090 [ label = \"3\" weight = \"3\" ];\npackage_8ee2c1f7beac932dbb525a9a -> package_3a322087a44efafbd4368a08 [ label = \"3\" weight = \"3\" ];\npackage_6f19bfeb0acefc8cdf5f6c84 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"8\" weight = \"8\" ];\npackage_6f19bfeb0acefc8cdf5f6c84 -> package_430407bac0561c25bf36889d [ label = \"12\" weight = \"12\" ];\npackage_6f19bfeb0acefc8cdf5f6c84 -> package_ca30420dac77c856476365b1 [ label = \"2\" weight = \"2\" ];\npackage_9d7b823b1681ca5a7ca0d3c3 -> package_77ce60de3666f8dc6de1e090 [ label = \"2\" weight = \"2\" ];\npackage_9d7b823b1681ca5a7ca0d3c3 -> package_3a322087a44efafbd4368a08 [ label = \"1\" weight = \"1\" ];\npackage_8121c686a17bf5f549e393d6 -> package_2c56d155865671623aa3e3cd [ label = \"13\" weight = \"13\" color = \"red\" ];\npackage_2c56d155865671623aa3e3cd -> package_8121c686a17bf5f549e393d6 [ label = \"106\" weight = \"106\" ];\npackage_2c56d155865671623aa3e3cd -> package_3a322087a44efafbd4368a08 [ label = \"44\" weight = \"44\" ];\npackage_2c56d155865671623aa3e3cd -> package_57c57c07a5bca0ee4c17b142 [ label = \"1\" weight = \"1\" ];\npackage_43a57afdb19564533e19988f -> package_8121c686a17bf5f549e393d6 [ label = \"11\" weight = \"11\" ];\npackage_8121c686a17bf5f549e393d6 -> package_77ce60de3666f8dc6de1e090 [ label = \"12\" weight = \"12\" ];\npackage_8121c686a17bf5f549e393d6 -> package_3a322087a44efafbd4368a08 [ label = \"39\" weight = \"39\" ];\npackage_8121c686a17bf5f549e393d6 -> package_ca30420dac77c856476365b1 [ label = \"4\" weight = \"4\" ];\npackage_8121c686a17bf5f549e393d6 -> package_57c57c07a5bca0ee4c17b142 [ label = \"3\" weight = \"3\" ];\npackage_57c57c07a5bca0ee4c17b142 -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_529853b483d236ddde25a3d4 -> package_3a322087a44efafbd4368a08 [ label = \"14\" weight = \"14\" ];\npackage_529853b483d236ddde25a3d4 -> package_430407bac0561c25bf36889d [ label = \"15\" weight = \"15\" ];\npackage_529853b483d236ddde25a3d4 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"2\" weight = \"2\" ];\npackage_529853b483d236ddde25a3d4 -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_529853b483d236ddde25a3d4 -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" ];\npackage_ca30420dac77c856476365b1 -> package_57c57c07a5bca0ee4c17b142 [ label = \"8\" weight = \"8\" color = \"red\" ];\npackage_f77a9a3ce2a59ef8ddf2c7a8 -> package_ca30420dac77c856476365b1 [ label = \"3\" weight = \"3\" ];\npackage_ebb7dcde9205bd371607c09b -> package_ca30420dac77c856476365b1 [ label = \"2\" weight = \"2\" ];\npackage_ca30420dac77c856476365b1 -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_3a322087a44efafbd4368a08 [ label = \"2\" weight = \"2\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_430407bac0561c25bf36889d [ label = \"25\" weight = \"25\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_529853b483d236ddde25a3d4 [ label = \"3\" weight = \"3\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"11\" weight = \"11\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_884afb9c851443f871179dc0 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"34\" weight = \"34\" ];\npackage_884afb9c851443f871179dc0 -> package_430407bac0561c25bf36889d [ label = \"41\" weight = \"41\" color = \"red\" ];\npackage_884afb9c851443f871179dc0 -> package_ca30420dac77c856476365b1 [ label = \"4\" weight = \"4\" ];\npackage_884afb9c851443f871179dc0 -> package_3a322087a44efafbd4368a08 [ label = \"5\" weight = \"5\" color = \"red\" ];\npackage_884afb9c851443f871179dc0 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"29\" weight = \"29\" ];\npackage_884afb9c851443f871179dc0 -> package_08fe06d73182d2aba49f0a3b [ label = \"57\" weight = \"57\" ];\npackage_884afb9c851443f871179dc0 -> package_9bf1e82bbcacae569c713bba [ label = \"4\" weight = \"4\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"11\" weight = \"11\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_430407bac0561c25bf36889d [ label = \"2\" weight = \"2\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_3a322087a44efafbd4368a08 [ label = \"6\" weight = \"6\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_2f7cd55814b0fa522b0d505b -> package_3a322087a44efafbd4368a08 [ label = \"28\" weight = \"28\" ];\npackage_ccdae54bae7eac0c5941bcdb -> package_3a322087a44efafbd4368a08 [ label = \"36\" weight = \"36\" ];\npackage_ccdae54bae7eac0c5941bcdb -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_ccdae54bae7eac0c5941bcdb -> package_f77a9a3ce2a59ef8ddf2c7a8 [ label = \"4\" weight = \"4\" ];\npackage_884afb9c851443f871179dc0 -> package_57c57c07a5bca0ee4c17b142 [ label = \"5\" weight = \"5\" ];\npackage_ca30420dac77c856476365b1 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"7\" weight = \"7\" ];\npackage_ca30420dac77c856476365b1 -> package_430407bac0561c25bf36889d [ label = \"12\" weight = \"12\" color = \"red\" ];\npackage_d6156cb8cc463f7c0a8642e6 -> package_ebb7dcde9205bd371607c09b [ label = \"2\" weight = \"2\" ];\npackage_0ce60471b8c652f16eb24524 -> package_f77a9a3ce2a59ef8ddf2c7a8 [ label = \"2\" weight = \"2\" ];\npackage_0ce60471b8c652f16eb24524 -> package_3a322087a44efafbd4368a08 [ label = \"49\" weight = \"49\" ];\npackage_0ce60471b8c652f16eb24524 -> package_430407bac0561c25bf36889d [ label = \"33\" weight = \"33\" ];\npackage_0ce60471b8c652f16eb24524 -> package_ca30420dac77c856476365b1 [ label = \"7\" weight = \"7\" ];\npackage_0ce60471b8c652f16eb24524 -> package_0d5cc855f96914d3926ad59c [ label = \"1\" weight = \"1\" ];\npackage_0ce60471b8c652f16eb24524 -> package_57c57c07a5bca0ee4c17b142 [ label = \"8\" weight = \"8\" ];\npackage_0ce60471b8c652f16eb24524 -> package_ebb7dcde9205bd371607c09b [ label = \"2\" weight = \"2\" ];\npackage_0ce60471b8c652f16eb24524 -> package_d6156cb8cc463f7c0a8642e6 [ label = \"1\" weight = \"1\" ];\npackage_0ce60471b8c652f16eb24524 -> package_ccdae54bae7eac0c5941bcdb [ label = \"4\" weight = \"4\" ];\npackage_430407bac0561c25bf36889d -> package_3a322087a44efafbd4368a08 [ label = \"8\" weight = \"8\" ];\npackage_430407bac0561c25bf36889d -> package_63ec0cff5f640f6c4bea0fbf [ label = \"9\" weight = \"9\" ];\npackage_430407bac0561c25bf36889d -> package_ca30420dac77c856476365b1 [ label = \"6\" weight = \"6\" ];\npackage_430407bac0561c25bf36889d -> package_586bd4db20fb6988a9d4eaf8 [ label = \"26\" weight = \"26\" ];\npackage_430407bac0561c25bf36889d -> package_e98a44e5d67bad99f479d7c6 [ label = \"2\" weight = \"2\" ];\npackage_430407bac0561c25bf36889d -> package_08fe06d73182d2aba49f0a3b [ label = \"1\" weight = \"1\" ];\npackage_430407bac0561c25bf36889d -> package_884afb9c851443f871179dc0 [ label = \"3\" weight = \"3\" ];\npackage_63ec0cff5f640f6c4bea0fbf -> package_430407bac0561c25bf36889d [ label = \"44\" weight = \"44\" color = \"red\" ];\npackage_586bd4db20fb6988a9d4eaf8 -> package_430407bac0561c25bf36889d [ label = \"25\" weight = \"25\" color = \"red\" ];\npackage_586bd4db20fb6988a9d4eaf8 -> package_ca30420dac77c856476365b1 [ label = \"2\" weight = \"2\" color = \"red\" ];\npackage_430407bac0561c25bf36889d -> package_4b999d8089061c322291f538 [ label = \"3\" weight = \"3\" ];\npackage_430407bac0561c25bf36889d -> package_2a0e4fa3bf7e37ca1b867475 [ label = \"5\" weight = \"5\" color = \"red\" ];\npackage_430407bac0561c25bf36889d -> package_529853b483d236ddde25a3d4 [ label = \"2\" weight = \"2\" color = \"red\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_3a322087a44efafbd4368a08 [ label = \"160\" weight = \"160\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_4b999d8089061c322291f538 [ label = \"8\" weight = \"8\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_430407bac0561c25bf36889d [ label = \"40\" weight = \"40\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"13\" weight = \"13\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_2f7cd55814b0fa522b0d505b [ label = \"4\" weight = \"4\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_25c1ee20ce58bbdc8d3e4e83 [ label = \"13\" weight = \"13\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_ccdae54bae7eac0c5941bcdb [ label = \"10\" weight = \"10\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_57c57c07a5bca0ee4c17b142 [ label = \"10\" weight = \"10\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_0ce60471b8c652f16eb24524 [ label = \"31\" weight = \"31\" ];\npackage_3a322087a44efafbd4368a08 -> package_25c1ee20ce58bbdc8d3e4e83 [ label = \"2\" weight = \"2\" color = \"red\" ];\npackage_3a322087a44efafbd4368a08 -> package_ca30420dac77c856476365b1 [ label = \"4\" weight = \"4\" ];\npackage_3a322087a44efafbd4368a08 -> package_57c57c07a5bca0ee4c17b142 [ label = \"2\" weight = \"2\" ];\npackage_3a322087a44efafbd4368a08 -> package_430407bac0561c25bf36889d [ label = \"15\" weight = \"15\" color = \"red\" ];\npackage_3a322087a44efafbd4368a08 -> package_884afb9c851443f871179dc0 [ label = \"1\" weight = \"1\" ];\npackage_3a322087a44efafbd4368a08 -> package_4b999d8089061c322291f538 [ label = \"2\" weight = \"2\" ];\npackage_3a322087a44efafbd4368a08 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"4\" weight = \"4\" ];\npackage_7ece0e352e8696c73df41d29 -> package_77ce60de3666f8dc6de1e090 [ label = \"16\" weight = \"16\" color = \"red\" ];\npackage_7ece0e352e8696c73df41d29 -> package_3a322087a44efafbd4368a08 [ label = \"42\" weight = \"42\" ];\npackage_7ece0e352e8696c73df41d29 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"1\" weight = \"1\" ];\npackage_7ece0e352e8696c73df41d29 -> package_ccdae54bae7eac0c5941bcdb [ label = \"4\" weight = \"4\" ];\npackage_7ece0e352e8696c73df41d29 -> package_430407bac0561c25bf36889d [ label = \"2\" weight = \"2\" ];\npackage_7ece0e352e8696c73df41d29 -> package_ca30420dac77c856476365b1 [ label = \"3\" weight = \"3\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_7ece0e352e8696c73df41d29 [ label = \"15\" weight = \"15\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_ca30420dac77c856476365b1 [ label = \"6\" weight = \"6\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"17\" weight = \"17\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_529853b483d236ddde25a3d4 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_4b999d8089061c322291f538 -> package_3a322087a44efafbd4368a08 [ label = \"31\" weight = \"31\" color = \"red\" ];\npackage_77ce60de3666f8dc6de1e090 [label=\"org.junit.runners\" color=red style=filled];\npackage_8121c686a17bf5f549e393d6 [label=\"org.junit.experimental.theories\" color=red style=filled];\npackage_8ee2c1f7beac932dbb525a9a [label=\"org.junit.experimental\"];\npackage_2f7cd55814b0fa522b0d505b [label=\"org.junit.internal.runners.rules\"];\npackage_2a0e4fa3bf7e37ca1b867475 [label=\"org.junit.internal.requests\"];\npackage_6f19bfeb0acefc8cdf5f6c84 [label=\"org.junit.experimental.results\"];\npackage_25c1ee20ce58bbdc8d3e4e83 [label=\"org.junit.internal.runners.model\"];\npackage_529853b483d236ddde25a3d4 [label=\"org.junit.internal.builders\"];\npackage_4a7bf01725342795a1658980 [label=\"junit.textui\"];\npackage_ecd46349524a87b5d286d241 [label=\"org.junit.experimental.categories\"];\npackage_0d5cc855f96914d3926ad59c [label=\"org.junit.function\"];\npackage_2c56d155865671623aa3e3cd [label=\"org.junit.experimental.theories.internal\"];\npackage_7ece0e352e8696c73df41d29 [label=\"org.junit.runners.parameterized\"];\npackage_9bf1e82bbcacae569c713bba [label=\"junit.extensions\"];\npackage_ccdae54bae7eac0c5941bcdb [label=\"org.junit.internal.runners.statements\"];\npackage_ad0c39b57276a6da897dffac [label=\"org.junit.experimental.max\"];\npackage_586bd4db20fb6988a9d4eaf8 [label=\"org.junit.runner.notification\" color=red style=filled];\npackage_43a57afdb19564533e19988f [label=\"org.junit.experimental.theories.suppliers\"];\npackage_d6156cb8cc463f7c0a8642e6 [label=\"org.junit.matchers\"];\npackage_63ec0cff5f640f6c4bea0fbf [label=\"org.junit.runner.manipulation\"];\npackage_f77a9a3ce2a59ef8ddf2c7a8 [label=\"org.junit.internal.management\"];\npackage_ebb7dcde9205bd371607c09b [label=\"org.junit.internal.matchers\"];\npackage_9d7b823b1681ca5a7ca0d3c3 [label=\"org.junit.experimental.runners\"];\npackage_0ce60471b8c652f16eb24524 [label=\"org.junit.rules\"];\npackage_3a322087a44efafbd4368a08 [label=\"org.junit.runners.model\"];\npackage_ca30420dac77c856476365b1 [label=\"org.junit.internal\" color=red style=filled];\npackage_e98a44e5d67bad99f479d7c6 [label=\"junit.runner\"];\npackage_430407bac0561c25bf36889d [label=\"org.junit.runner\"];\npackage_57c57c07a5bca0ee4c17b142 [label=\"org.junit\"];\npackage_4b999d8089061c322291f538 [label=\"org.junit.validator\"];\npackage_08fe06d73182d2aba49f0a3b [label=\"junit.framework\"];\npackage_884afb9c851443f871179dc0 [label=\"org.junit.internal.runners\" color=red style=filled];\n}", - "hasEdges" : true - }, - "packageRelationshipsToRemove" : { - "cycleCount" : 5, - "relationshipsToRemoveCount" : 18, - "hasRelationships" : true, - "relationships" : [ { - "sourcePackage" : "org.junit.internal", - "targetPackage" : "org.junit.runners", - "sourceMarked" : true, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "org.junit.internal* → org.junit.runners* : 1", - "priority" : 1, - "cycleCount" : 4, - "effortRank" : 1, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.internal.MethodSorter", - "targetClass" : "org.junit.runners.MethodSorters", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "MethodSorter → MethodSorters : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runners", - "targetPackage" : "org.junit.internal.builders", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "org.junit.runners* → org.junit.internal.builders : 1", - "priority" : 2, - "cycleCount" : 4, - "effortRank" : 1, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runners.Suite", - "targetClass" : "org.junit.internal.builders.AllDefaultPossibilitiesBuilder", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Suite → AllDefaultPossibilitiesBuilder : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runner", - "targetPackage" : "org.junit.internal.builders", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "org.junit.runner → org.junit.internal.builders : 2", - "priority" : 3, - "cycleCount" : 4, - "effortRank" : 2, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.internal.builders.AllDefaultPossibilitiesBuilder", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "Request* → AllDefaultPossibilitiesBuilder : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runner", - "targetPackage" : "org.junit.internal.requests", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 5, - "renderedLabel" : "org.junit.runner → org.junit.internal.requests : 5", - "priority" : 4, - "cycleCount" : 4, - "effortRank" : 5, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.internal.requests.SortingRequest", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Request* → SortingRequest : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + "classRelationshipsToRemove": { + "cycleCount": 25, + "relationshipsToRemoveCount": 47, + "hasRelationships": true, + "relationships": [ + { + "sourceClass": "org.junit.Assert", + "targetClass": "org.junit.ComparisonFailure", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/Assert.java", + "targetClassPath": "src/main/java/org/junit/ComparisonFailure.java", + "simpleSourceClassName": "Assert", + "simpleTargetClassName": "ComparisonFailure", + "priority": 1, + "cycleCount": 3, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.internal.requests.ClassRequest", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "Request* → ClassRequest : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.Assert", + "targetClass": "org.junit.internal.ExactComparisonCriteria", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/Assert.java", + "targetClassPath": "src/main/java/org/junit/internal/ExactComparisonCriteria.java", + "simpleSourceClassName": "Assert", + "simpleTargetClassName": "ExactComparisonCriteria", + "priority": 2, + "cycleCount": 2, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 3 }, -{ - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.internal.requests.FilterRequest", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Request* → FilterRequest : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.runner.JUnitCore", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/runner/JUnitCore.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "JUnitCore", + "priority": 3, + "cycleCount": 2, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.Request", - "targetClass" : "org.junit.internal.requests.OrderingRequest", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Request* → OrderingRequest : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.internal", - "targetPackage" : "org.junit.runner", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 12, - "renderedLabel" : "org.junit.internal* → org.junit.runner : 12", - "priority" : 5, - "cycleCount" : 4, - "effortRank" : 12, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.internal.TextListener", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "TextListener → Description : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.InexactComparisonCriteria", + "targetClass": "org.junit.Assert", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/InexactComparisonCriteria.java", + "targetClassPath": "src/main/java/org/junit/Assert.java", + "simpleSourceClassName": "InexactComparisonCriteria", + "simpleTargetClassName": "Assert", + "priority": 4, + "cycleCount": 2, + "effortRank": 2, + "alsoRemovesPackageRelationship": true, + "packageCycleCount": 3 }, -{ - "sourceClass" : "org.junit.internal.TextListener", - "targetClass" : "org.junit.runner.Result", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 10, - "renderedLabel" : "TextListener → Result : 10", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit", - "targetPackage" : "org.junit.runners", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "org.junit → org.junit.runners* : 1", - "priority" : 6, - "cycleCount" : 3, - "effortRank" : 1, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.FixMethodOrder", - "targetClass" : "org.junit.runners.MethodSorters", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "FixMethodOrder → MethodSorters : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runner.notification", - "targetPackage" : "org.junit.internal", - "sourceMarked" : true, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "org.junit.runner.notification* → org.junit.internal* : 2", - "priority" : 7, - "cycleCount" : 3, - "effortRank" : 2, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runner.notification.Failure", - "targetClass" : "org.junit.internal.Throwables", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "Failure* → Throwables : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runners.model", - "targetPackage" : "org.junit.internal.runners.model", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "org.junit.runners.model → org.junit.internal.runners.model : 2", - "priority" : 8, - "cycleCount" : 3, - "effortRank" : 2, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runners.model.FrameworkMethod", - "targetClass" : "org.junit.internal.runners.model.ReflectiveCallable", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "FrameworkMethod* → ReflectiveCallable : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.ComparisonFailure$ComparisonCompactor$DiffExtractor", + "targetClass": "org.junit.ComparisonFailure$ComparisonCompactor", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/ComparisonFailure.java", + "targetClassPath": "src/main/java/org/junit/ComparisonFailure.java", + "simpleSourceClassName": "ComparisonFailure$ComparisonCompactor$DiffExtractor", + "simpleTargetClassName": "ComparisonFailure$ComparisonCompactor", + "priority": 5, + "cycleCount": 2, + "effortRank": 2, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runners.model.MultipleFailureException", - "targetClass" : "org.junit.internal.runners.model.MultipleFailureException", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "MultipleFailureException → MultipleFailureException : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.internal.runners", - "targetPackage" : "org.junit.runners.model", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 5, - "renderedLabel" : "org.junit.internal.runners* → org.junit.runners.model : 5", - "priority" : 9, - "cycleCount" : 3, - "effortRank" : 5, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.internal.runners.ErrorReportingRunner", - "targetClass" : "org.junit.runners.model.InvalidTestClassError", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "ErrorReportingRunner → InvalidTestClassError : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.ComparisonCriteria", + "targetClass": "org.junit.Assert", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/internal/ComparisonCriteria.java", + "targetClassPath": "src/main/java/org/junit/Assert.java", + "simpleSourceClassName": "ComparisonCriteria", + "simpleTargetClassName": "Assert", + "priority": 6, + "cycleCount": 2, + "effortRank": 3, + "alsoRemovesPackageRelationship": true, + "packageCycleCount": 3 }, -{ - "sourceClass" : "org.junit.internal.runners.ErrorReportingRunner", - "targetClass" : "org.junit.runners.model.InitializationError", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 3, - "renderedLabel" : "ErrorReportingRunner → InitializationError : 3", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.internal.requests.FilterRequest", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/internal/requests/FilterRequest.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "FilterRequest", + "priority": 7, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": true, + "packageCycleCount": 4 }, -{ - "sourceClass" : "org.junit.internal.runners.MethodRoadie", - "targetClass" : "org.junit.runners.model.TestTimedOutException", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "MethodRoadie → TestTimedOutException : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.internal", - "targetPackage" : "org.junit", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 8, - "renderedLabel" : "org.junit.internal* → org.junit : 8", - "priority" : 10, - "cycleCount" : 3, - "effortRank" : 8, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.internal.InexactComparisonCriteria", - "targetClass" : "org.junit.Assert", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "InexactComparisonCriteria → Assert : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.internal.requests.SortingRequest", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/internal/requests/SortingRequest.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "SortingRequest", + "priority": 8, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": true, + "packageCycleCount": 4 }, -{ - "sourceClass" : "org.junit.internal.ExactComparisonCriteria", - "targetClass" : "org.junit.Assert", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "ExactComparisonCriteria → Assert : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.notification.RunListener", + "targetClass": "org.junit.runner.Result", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/notification/RunListener.java", + "targetClassPath": "src/main/java/org/junit/runner/Result.java", + "simpleSourceClassName": "RunListener", + "simpleTargetClassName": "Result", + "priority": 9, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": true, + "packageCycleCount": 3 }, -{ - "sourceClass" : "org.junit.internal.ComparisonCriteria", - "targetClass" : "org.junit.Assert", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 3, - "renderedLabel" : "ComparisonCriteria → Assert : 3", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runners.model.MultipleFailureException", + "targetClass": "org.junit.internal.runners.model.MultipleFailureException", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runners/model/MultipleFailureException.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/model/MultipleFailureException.java", + "simpleSourceClassName": "MultipleFailureException", + "simpleTargetClassName": "MultipleFailureException", + "priority": 10, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": true, + "packageCycleCount": 3 }, -{ - "sourceClass" : "org.junit.internal.MethodSorter", - "targetClass" : "org.junit.FixMethodOrder", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "MethodSorter → FixMethodOrder : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runners.model", - "targetPackage" : "org.junit.runner", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 15, - "renderedLabel" : "org.junit.runners.model → org.junit.runner : 15", - "priority" : 11, - "cycleCount" : 3, - "effortRank" : 15, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runners.model.RunnerBuilder", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "RunnerBuilder* → Description : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.requests.MemoizingRequest", + "targetClass": "org.junit.runner.Request", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/requests/MemoizingRequest.java", + "targetClassPath": "src/main/java/org/junit/runner/Request.java", + "simpleSourceClassName": "MemoizingRequest", + "simpleTargetClassName": "Request", + "priority": 11, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 4 }, -{ - "sourceClass" : "org.junit.runners.model.RunnerBuilder", - "targetClass" : "org.junit.runner.Runner", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 11, - "renderedLabel" : "RunnerBuilder* → Runner : 11", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "junit.framework.Test", + "targetClass": "junit.framework.TestResult", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/junit/framework/Test.java", + "targetClassPath": "src/main/java/junit/framework/TestResult.java", + "simpleSourceClassName": "Test", + "simpleTargetClassName": "TestResult", + "priority": 12, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runners.model.RunnerBuilder", - "targetClass" : "org.junit.runner.OrderWith", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "RunnerBuilder* → OrderWith : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runners.parameterized", - "targetPackage" : "org.junit.runners", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 16, - "renderedLabel" : "org.junit.runners.parameterized → org.junit.runners* : 16", - "priority" : 12, - "cycleCount" : 3, - "effortRank" : 16, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters", - "targetClass" : "org.junit.runners.Parameterized$Parameter", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 3, - "renderedLabel" : "BlockJUnit4ClassRunnerWithParameters → Parameterized$Parameter : 3", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.experimental.categories.Categories", + "targetClass": "org.junit.experimental.categories.Categories$CategoryFilter", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/experimental/categories/Categories.java", + "targetClassPath": "src/main/java/org/junit/experimental/categories/Categories.java", + "simpleSourceClassName": "Categories", + "simpleTargetClassName": "Categories$CategoryFilter", + "priority": 13, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters", - "targetClass" : "org.junit.runners.BlockJUnit4ClassRunner", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 5, - "renderedLabel" : "BlockJUnit4ClassRunnerWithParameters → BlockJUnit4ClassRunner* : 5", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.experimental.max.MaxHistory", + "targetClass": "org.junit.experimental.max.MaxHistory$TestComparator", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/experimental/max/MaxHistory.java", + "targetClassPath": "src/main/java/org/junit/experimental/max/MaxHistory.java", + "simpleSourceClassName": "MaxHistory", + "simpleTargetClassName": "MaxHistory$TestComparator", + "priority": 14, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters", - "targetClass" : "org.junit.runners.ParentRunner", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 8, - "renderedLabel" : "BlockJUnit4ClassRunnerWithParameters → ParentRunner : 8", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runner.notification", - "targetPackage" : "org.junit.runner", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 25, - "renderedLabel" : "org.junit.runner.notification* → org.junit.runner : 25", - "priority" : 13, - "cycleCount" : 3, - "effortRank" : 25, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runner.notification.RunListener", - "targetClass" : "org.junit.runner.Result", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RunListener → Result : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.manipulation.Filter", + "targetClass": "org.junit.runner.manipulation.Filter$1", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Filter.java", + "targetClassPath": "src/main/java/org/junit/runner/manipulation/Filter.java", + "simpleSourceClassName": "Filter", + "simpleTargetClassName": "Filter$1", + "priority": 15, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.notification.RunListener", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 6, - "renderedLabel" : "RunListener → Description : 6", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.experimental.theories.internal.AllMembersSupplier$MethodParameterValue", + "targetClass": "org.junit.experimental.theories.internal.AllMembersSupplier", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java", + "targetClassPath": "src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java", + "simpleSourceClassName": "AllMembersSupplier$MethodParameterValue", + "simpleTargetClassName": "AllMembersSupplier", + "priority": 16, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.notification.SynchronizedRunListener", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 6, - "renderedLabel" : "SynchronizedRunListener → Description : 6", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.manipulation.Filterable", + "targetClass": "org.junit.runner.manipulation.Filter", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Filterable.java", + "targetClassPath": "src/main/java/org/junit/runner/manipulation/Filter.java", + "simpleSourceClassName": "Filterable", + "simpleTargetClassName": "Filter", + "priority": 17, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.notification.RunNotifier", - "targetClass" : "org.junit.runner.Result", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "RunNotifier → Result : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.manipulation.Orderable", + "targetClass": "org.junit.runner.manipulation.Orderer", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Orderable.java", + "targetClassPath": "src/main/java/org/junit/runner/manipulation/Orderer.java", + "simpleSourceClassName": "Orderable", + "simpleTargetClassName": "Orderer", + "priority": 18, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.notification.Failure", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 4, - "renderedLabel" : "Failure* → Description : 4", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.manipulation.Ordering", + "targetClass": "org.junit.runner.manipulation.Orderer", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Ordering.java", + "targetClassPath": "src/main/java/org/junit/runner/manipulation/Orderer.java", + "simpleSourceClassName": "Ordering", + "simpleTargetClassName": "Orderer", + "priority": 19, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.notification.RunNotifier", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 6, - "renderedLabel" : "RunNotifier → Description : 6", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.manipulation.Sortable", + "targetClass": "org.junit.runner.manipulation.Sorter", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Sortable.java", + "targetClassPath": "src/main/java/org/junit/runner/manipulation/Sorter.java", + "simpleSourceClassName": "Sortable", + "simpleTargetClassName": "Sorter", + "priority": 20, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.runner.notification.SynchronizedRunListener", - "targetClass" : "org.junit.runner.Result", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "SynchronizedRunListener → Result : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "junit.framework", - "targetPackage" : "org.junit.runner", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 39, - "renderedLabel" : "junit.framework → org.junit.runner : 39", - "priority" : 14, - "cycleCount" : 3, - "effortRank" : 39, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "junit.framework.JUnit4TestAdapter", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 13, - "renderedLabel" : "JUnit4TestAdapter* → Description : 13", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.runners.rules.RuleMemberValidator", + "targetClass": "org.junit.internal.runners.rules.RuleMemberValidator$FieldMustBeARule", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "simpleSourceClassName": "RuleMemberValidator", + "simpleTargetClassName": "RuleMemberValidator$FieldMustBeARule", + "priority": 21, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "junit.framework.JUnit4TestAdapterCache", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 14, - "renderedLabel" : "JUnit4TestAdapterCache → Description : 14", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.runners.rules.RuleMemberValidator", + "targetClass": "org.junit.internal.runners.rules.RuleMemberValidator$MethodMustBeARule", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "simpleSourceClassName": "RuleMemberValidator", + "simpleTargetClassName": "RuleMemberValidator$MethodMustBeARule", + "priority": 22, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "junit.framework.JUnit4TestCaseFacade", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 4, - "renderedLabel" : "JUnit4TestCaseFacade → Description : 4", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.runners.rules.RuleMemberValidator$MethodMustBeATestRule", + "targetClass": "org.junit.internal.runners.rules.RuleMemberValidator", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "simpleSourceClassName": "RuleMemberValidator$MethodMustBeATestRule", + "simpleTargetClassName": "RuleMemberValidator", + "priority": 23, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "junit.framework.JUnit4TestCaseFacade", - "targetClass" : "org.junit.runner.Describable", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "JUnit4TestCaseFacade → Describable : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.runners.rules.RuleMemberValidator$FieldMustBeATestRule", + "targetClass": "org.junit.internal.runners.rules.RuleMemberValidator", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "simpleSourceClassName": "RuleMemberValidator$FieldMustBeATestRule", + "simpleTargetClassName": "RuleMemberValidator", + "priority": 24, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "junit.framework.JUnit4TestAdapter", - "targetClass" : "org.junit.runner.Request", - "sourceMarked" : true, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "JUnit4TestAdapter* → Request* : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.Throwables$State", + "targetClass": "org.junit.internal.Throwables$State$1", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/Throwables.java", + "targetClassPath": "src/main/java/org/junit/internal/Throwables.java", + "simpleSourceClassName": "Throwables$State", + "simpleTargetClassName": "Throwables$State$1", + "priority": 25, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "junit.framework.JUnit4TestAdapter", - "targetClass" : "org.junit.runner.Runner", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 4, - "renderedLabel" : "JUnit4TestAdapter* → Runner : 4", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.Throwables$State$2", + "targetClass": "org.junit.internal.Throwables$State", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/Throwables.java", + "targetClassPath": "src/main/java/org/junit/internal/Throwables.java", + "simpleSourceClassName": "Throwables$State$2", + "simpleTargetClassName": "Throwables$State", + "priority": 26, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "junit.framework.JUnit4TestAdapter", - "targetClass" : "org.junit.runner.Describable", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "JUnit4TestAdapter* → Describable : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.internal.runners", - "targetPackage" : "org.junit.runner", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 41, - "renderedLabel" : "org.junit.internal.runners* → org.junit.runner : 41", - "priority" : 15, - "cycleCount" : 3, - "effortRank" : 41, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener", - "targetClass" : "org.junit.runner.Describable", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 4, - "renderedLabel" : "JUnit38ClassRunner$OldTestClassAdaptingListener → Describable : 4", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.Throwables$State$3", + "targetClass": "org.junit.internal.Throwables$State", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/Throwables.java", + "targetClassPath": "src/main/java/org/junit/internal/Throwables.java", + "simpleSourceClassName": "Throwables$State$3", + "simpleTargetClassName": "Throwables$State", + "priority": 27, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.ErrorReportingRunner", - "targetClass" : "org.junit.runner.Runner", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "ErrorReportingRunner → Runner : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.Throwables$State", + "targetClass": "org.junit.internal.Throwables$State$4", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/Throwables.java", + "targetClassPath": "src/main/java/org/junit/internal/Throwables.java", + "simpleSourceClassName": "Throwables$State", + "simpleTargetClassName": "Throwables$State$4", + "priority": 28, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.ErrorReportingRunner", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 7, - "renderedLabel" : "ErrorReportingRunner → Description : 7", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.manipulation.Ordering$Factory", + "targetClass": "org.junit.runner.manipulation.Ordering", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Ordering.java", + "targetClassPath": "src/main/java/org/junit/runner/manipulation/Ordering.java", + "simpleSourceClassName": "Ordering$Factory", + "simpleTargetClassName": "Ordering", + "priority": 29, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.JUnit38ClassRunner", - "targetClass" : "org.junit.runner.Describable", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 4, - "renderedLabel" : "JUnit38ClassRunner* → Describable : 4", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.notification.RunNotifier$SafeNotifier", + "targetClass": "org.junit.runner.notification.RunNotifier", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/notification/RunNotifier.java", + "targetClassPath": "src/main/java/org/junit/runner/notification/RunNotifier.java", + "simpleSourceClassName": "RunNotifier$SafeNotifier", + "simpleTargetClassName": "RunNotifier", + "priority": 30, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.JUnit38ClassRunner", - "targetClass" : "org.junit.runner.Runner", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "JUnit38ClassRunner* → Runner : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.Result$Listener", + "targetClass": "org.junit.runner.Result", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/Result.java", + "targetClassPath": "src/main/java/org/junit/runner/Result.java", + "simpleSourceClassName": "Result$Listener", + "simpleTargetClassName": "Result", + "priority": 31, + "cycleCount": 1, + "effortRank": 1, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.JUnit4ClassRunner", - "targetClass" : "org.junit.runner.Runner", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "JUnit4ClassRunner → Runner : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.experimental.theories.suppliers.TestedOnSupplier", + "targetClass": "org.junit.experimental.theories.suppliers.TestedOn", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/experimental/theories/suppliers/TestedOnSupplier.java", + "targetClassPath": "src/main/java/org/junit/experimental/theories/suppliers/TestedOn.java", + "simpleSourceClassName": "TestedOnSupplier", + "simpleTargetClassName": "TestedOn", + "priority": 32, + "cycleCount": 1, + "effortRank": 2, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.JUnit38ClassRunner", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 8, - "renderedLabel" : "JUnit38ClassRunner* → Description : 8", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "junit.framework.ComparisonCompactor", + "targetClass": "junit.framework.Assert", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 2, + "sourceClassPath": "src/main/java/junit/framework/ComparisonCompactor.java", + "targetClassPath": "src/main/java/junit/framework/Assert.java", + "simpleSourceClassName": "ComparisonCompactor", + "simpleTargetClassName": "Assert", + "priority": 33, + "cycleCount": 1, + "effortRank": 2, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "JUnit38ClassRunner$OldTestClassAdaptingListener → Description : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.runners.statements.FailOnTimeout$Builder", + "targetClass": "org.junit.internal.runners.statements.FailOnTimeout", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java", + "simpleSourceClassName": "FailOnTimeout$Builder", + "simpleTargetClassName": "FailOnTimeout", + "priority": 34, + "cycleCount": 1, + "effortRank": 2, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.ClassRoadie", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "ClassRoadie → Description : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.runners.rules.RuleMemberValidator$Builder", + "targetClass": "org.junit.internal.runners.rules.RuleMemberValidator", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "simpleSourceClassName": "RuleMemberValidator$Builder", + "simpleTargetClassName": "RuleMemberValidator", + "priority": 35, + "cycleCount": 1, + "effortRank": 2, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.JUnit4ClassRunner", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 8, - "renderedLabel" : "JUnit4ClassRunner → Description : 8", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.runners.rules.RuleMemberValidator$MemberMustBeNonStaticOrAlsoClassRule", + "targetClass": "org.junit.internal.runners.rules.RuleMemberValidator", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/rules/RuleMemberValidator.java", + "simpleSourceClassName": "RuleMemberValidator$MemberMustBeNonStaticOrAlsoClassRule", + "simpleTargetClassName": "RuleMemberValidator", + "priority": 36, + "cycleCount": 1, + "effortRank": 2, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.internal.runners.MethodRoadie", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 2, - "renderedLabel" : "MethodRoadie → Description : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.validator", - "targetPackage" : "org.junit.runners.model", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 31, - "renderedLabel" : "org.junit.validator → org.junit.runners.model : 31", - "priority" : 16, - "cycleCount" : 2, - "effortRank" : 31, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.validator.AnnotationsValidator$FieldValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "AnnotationsValidator$FieldValidator → TestClass* : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.requests.OrderingRequest", + "targetClass": "org.junit.runner.Request", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/internal/requests/OrderingRequest.java", + "targetClassPath": "src/main/java/org/junit/runner/Request.java", + "simpleSourceClassName": "OrderingRequest", + "simpleTargetClassName": "Request", + "priority": 37, + "cycleCount": 1, + "effortRank": 3, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 4 }, -{ - "sourceClass" : "org.junit.validator.AnnotationValidator", - "targetClass" : "org.junit.runners.model.FrameworkMethod", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "AnnotationValidator → FrameworkMethod* : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.rules.TemporaryFolder", + "targetClass": "org.junit.rules.TemporaryFolder$Builder", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/rules/TemporaryFolder.java", + "targetClassPath": "src/main/java/org/junit/rules/TemporaryFolder.java", + "simpleSourceClassName": "TemporaryFolder", + "simpleTargetClassName": "TemporaryFolder$Builder", + "priority": 38, + "cycleCount": 1, + "effortRank": 3, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.AnnotationsValidator$MethodValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "AnnotationsValidator$MethodValidator → TestClass* : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.experimental.max.MaxHistory$RememberingListener", + "targetClass": "org.junit.experimental.max.MaxHistory", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/experimental/max/MaxHistory.java", + "targetClassPath": "src/main/java/org/junit/experimental/max/MaxHistory.java", + "simpleSourceClassName": "MaxHistory$RememberingListener", + "simpleTargetClassName": "MaxHistory", + "priority": 39, + "cycleCount": 1, + "effortRank": 3, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.AnnotationsValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "AnnotationsValidator → TestClass* : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.rules.ExpectedException$ExpectedExceptionStatement", + "targetClass": "org.junit.rules.ExpectedException", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/rules/ExpectedException.java", + "targetClassPath": "src/main/java/org/junit/rules/ExpectedException.java", + "simpleSourceClassName": "ExpectedException$ExpectedExceptionStatement", + "simpleTargetClassName": "ExpectedException", + "priority": 40, + "cycleCount": 1, + "effortRank": 3, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.AnnotationsValidator$MethodValidator", - "targetClass" : "org.junit.runners.model.FrameworkMethod", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 3, - "renderedLabel" : "AnnotationsValidator$MethodValidator → FrameworkMethod* : 3", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.experimental.theories.internal.SpecificDataPointsSupplier", + "targetClass": "org.junit.experimental.theories.FromDataPoints", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 4, + "sourceClassPath": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java", + "targetClassPath": "src/main/java/org/junit/experimental/theories/FromDataPoints.java", + "simpleSourceClassName": "SpecificDataPointsSupplier", + "simpleTargetClassName": "FromDataPoints", + "priority": 41, + "cycleCount": 1, + "effortRank": 4, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 1 }, -{ - "sourceClass" : "org.junit.validator.AnnotationsValidator$AnnotatableValidator", - "targetClass" : "org.junit.runners.model.Annotatable", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 7, - "renderedLabel" : "AnnotationsValidator$AnnotatableValidator → Annotatable : 7", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "junit.framework.JUnit4TestAdapter", + "targetClass": "junit.framework.JUnit4TestAdapterCache", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 5, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestAdapter.java", + "targetClassPath": "src/main/java/junit/framework/JUnit4TestAdapterCache.java", + "simpleSourceClassName": "JUnit4TestAdapter", + "simpleTargetClassName": "JUnit4TestAdapterCache", + "priority": 42, + "cycleCount": 1, + "effortRank": 5, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.AnnotationValidator", - "targetClass" : "org.junit.runners.model.FrameworkField", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "AnnotationValidator → FrameworkField : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.internal.Throwables$State", + "targetClass": "org.junit.internal.Throwables", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 5, + "sourceClassPath": "src/main/java/org/junit/internal/Throwables.java", + "targetClassPath": "src/main/java/org/junit/internal/Throwables.java", + "simpleSourceClassName": "Throwables$State", + "simpleTargetClassName": "Throwables", + "priority": 43, + "cycleCount": 1, + "effortRank": 5, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.TestClassValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "TestClassValidator → TestClass* : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.rules.Timeout", + "targetClass": "org.junit.rules.Timeout$Builder", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": true, + "targetMarked": false, + "weight": 6, + "sourceClassPath": "src/main/java/org/junit/rules/Timeout.java", + "targetClassPath": "src/main/java/org/junit/rules/Timeout.java", + "simpleSourceClassName": "Timeout", + "simpleTargetClassName": "Timeout$Builder", + "priority": 44, + "cycleCount": 1, + "effortRank": 6, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.AnnotationsValidator$FieldValidator", - "targetClass" : "org.junit.runners.model.FrameworkField", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 3, - "renderedLabel" : "AnnotationsValidator$FieldValidator → FrameworkField : 3", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "junit.framework.TestCase", + "targetClass": "junit.framework.TestResult", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 6, + "sourceClassPath": "src/main/java/junit/framework/TestCase.java", + "targetClassPath": "src/main/java/junit/framework/TestResult.java", + "simpleSourceClassName": "TestCase", + "simpleTargetClassName": "TestResult", + "priority": 45, + "cycleCount": 1, + "effortRank": 6, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.AnnotationsValidator$ClassValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 4, - "renderedLabel" : "AnnotationsValidator$ClassValidator → TestClass* : 4", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.runner.Result", + "targetClass": "org.junit.runner.Result$SerializedForm", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": false, + "weight": 6, + "sourceClassPath": "src/main/java/org/junit/runner/Result.java", + "targetClassPath": "src/main/java/org/junit/runner/Result.java", + "simpleSourceClassName": "Result", + "simpleTargetClassName": "Result$SerializedForm", + "priority": 46, + "cycleCount": 1, + "effortRank": 6, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 }, -{ - "sourceClass" : "org.junit.validator.AnnotationValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "AnnotationValidator → TestClass* : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourceClass": "org.junit.rules.Stopwatch$InternalWatcher", + "targetClass": "org.junit.rules.Stopwatch", + "sourceUrl": null, + "targetUrl": null, + "sourceMarked": false, + "targetMarked": true, + "weight": 12, + "sourceClassPath": "src/main/java/org/junit/rules/Stopwatch.java", + "targetClassPath": "src/main/java/org/junit/rules/Stopwatch.java", + "simpleSourceClassName": "Stopwatch$InternalWatcher", + "simpleTargetClassName": "Stopwatch", + "priority": 47, + "cycleCount": 1, + "effortRank": 12, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + "packageMap": { + "graphId": "packageGraph", + "classCount": 32, + "relationshipCount": 125, + "dotThreshold": 4000, + "dotThresholdExceeded": false, + "dot": "strict digraph G {\npackage_9bf1e82bbcacae569c713bba -> package_08fe06d73182d2aba49f0a3b [ label = \"29\" weight = \"29\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_63ec0cff5f640f6c4bea0fbf [ label = \"10\" weight = \"10\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_430407bac0561c25bf36889d [ label = \"39\" weight = \"39\" color = \"red\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_586bd4db20fb6988a9d4eaf8 [ label = \"7\" weight = \"7\" ];\npackage_08fe06d73182d2aba49f0a3b -> package_ca30420dac77c856476365b1 [ label = \"5\" weight = \"5\" ];\npackage_e98a44e5d67bad99f479d7c6 -> package_08fe06d73182d2aba49f0a3b [ label = \"13\" weight = \"13\" ];\npackage_e98a44e5d67bad99f479d7c6 -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_4a7bf01725342795a1658980 -> package_08fe06d73182d2aba49f0a3b [ label = \"49\" weight = \"49\" ];\npackage_4a7bf01725342795a1658980 -> package_e98a44e5d67bad99f479d7c6 [ label = \"6\" weight = \"6\" ];\npackage_57c57c07a5bca0ee4c17b142 -> package_ca30420dac77c856476365b1 [ label = \"22\" weight = \"22\" ];\npackage_57c57c07a5bca0ee4c17b142 -> package_0d5cc855f96914d3926ad59c [ label = \"3\" weight = \"3\" ];\npackage_ecd46349524a87b5d286d241 -> package_77ce60de3666f8dc6de1e090 [ label = \"3\" weight = \"3\" ];\npackage_ecd46349524a87b5d286d241 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"6\" weight = \"6\" ];\npackage_ecd46349524a87b5d286d241 -> package_430407bac0561c25bf36889d [ label = \"16\" weight = \"16\" ];\npackage_ecd46349524a87b5d286d241 -> package_4b999d8089061c322291f538 [ label = \"5\" weight = \"5\" ];\npackage_ecd46349524a87b5d286d241 -> package_3a322087a44efafbd4368a08 [ label = \"5\" weight = \"5\" ];\npackage_ecd46349524a87b5d286d241 -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_430407bac0561c25bf36889d [ label = \"68\" weight = \"68\" ];\npackage_ad0c39b57276a6da897dffac -> package_2a0e4fa3bf7e37ca1b867475 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_3a322087a44efafbd4368a08 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_ad0c39b57276a6da897dffac -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_08fe06d73182d2aba49f0a3b [ label = \"1\" weight = \"1\" ];\npackage_ad0c39b57276a6da897dffac -> package_586bd4db20fb6988a9d4eaf8 [ label = \"4\" weight = \"4\" ];\npackage_8ee2c1f7beac932dbb525a9a -> package_430407bac0561c25bf36889d [ label = \"11\" weight = \"11\" ];\npackage_8ee2c1f7beac932dbb525a9a -> package_77ce60de3666f8dc6de1e090 [ label = \"3\" weight = \"3\" ];\npackage_8ee2c1f7beac932dbb525a9a -> package_3a322087a44efafbd4368a08 [ label = \"3\" weight = \"3\" ];\npackage_6f19bfeb0acefc8cdf5f6c84 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"8\" weight = \"8\" ];\npackage_6f19bfeb0acefc8cdf5f6c84 -> package_430407bac0561c25bf36889d [ label = \"12\" weight = \"12\" ];\npackage_6f19bfeb0acefc8cdf5f6c84 -> package_ca30420dac77c856476365b1 [ label = \"2\" weight = \"2\" ];\npackage_9d7b823b1681ca5a7ca0d3c3 -> package_77ce60de3666f8dc6de1e090 [ label = \"2\" weight = \"2\" ];\npackage_9d7b823b1681ca5a7ca0d3c3 -> package_3a322087a44efafbd4368a08 [ label = \"1\" weight = \"1\" ];\npackage_8121c686a17bf5f549e393d6 -> package_2c56d155865671623aa3e3cd [ label = \"13\" weight = \"13\" color = \"red\" ];\npackage_2c56d155865671623aa3e3cd -> package_8121c686a17bf5f549e393d6 [ label = \"106\" weight = \"106\" ];\npackage_2c56d155865671623aa3e3cd -> package_3a322087a44efafbd4368a08 [ label = \"44\" weight = \"44\" ];\npackage_2c56d155865671623aa3e3cd -> package_57c57c07a5bca0ee4c17b142 [ label = \"1\" weight = \"1\" ];\npackage_43a57afdb19564533e19988f -> package_8121c686a17bf5f549e393d6 [ label = \"11\" weight = \"11\" ];\npackage_8121c686a17bf5f549e393d6 -> package_77ce60de3666f8dc6de1e090 [ label = \"12\" weight = \"12\" ];\npackage_8121c686a17bf5f549e393d6 -> package_3a322087a44efafbd4368a08 [ label = \"39\" weight = \"39\" ];\npackage_8121c686a17bf5f549e393d6 -> package_ca30420dac77c856476365b1 [ label = \"4\" weight = \"4\" ];\npackage_8121c686a17bf5f549e393d6 -> package_57c57c07a5bca0ee4c17b142 [ label = \"3\" weight = \"3\" ];\npackage_57c57c07a5bca0ee4c17b142 -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_529853b483d236ddde25a3d4 -> package_3a322087a44efafbd4368a08 [ label = \"14\" weight = \"14\" ];\npackage_529853b483d236ddde25a3d4 -> package_430407bac0561c25bf36889d [ label = \"15\" weight = \"15\" ];\npackage_529853b483d236ddde25a3d4 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"2\" weight = \"2\" ];\npackage_529853b483d236ddde25a3d4 -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_529853b483d236ddde25a3d4 -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" ];\npackage_ca30420dac77c856476365b1 -> package_57c57c07a5bca0ee4c17b142 [ label = \"8\" weight = \"8\" color = \"red\" ];\npackage_f77a9a3ce2a59ef8ddf2c7a8 -> package_ca30420dac77c856476365b1 [ label = \"3\" weight = \"3\" ];\npackage_ebb7dcde9205bd371607c09b -> package_ca30420dac77c856476365b1 [ label = \"2\" weight = \"2\" ];\npackage_ca30420dac77c856476365b1 -> package_77ce60de3666f8dc6de1e090 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_3a322087a44efafbd4368a08 [ label = \"2\" weight = \"2\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_430407bac0561c25bf36889d [ label = \"25\" weight = \"25\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_529853b483d236ddde25a3d4 [ label = \"3\" weight = \"3\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"11\" weight = \"11\" ];\npackage_2a0e4fa3bf7e37ca1b867475 -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_884afb9c851443f871179dc0 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"34\" weight = \"34\" ];\npackage_884afb9c851443f871179dc0 -> package_430407bac0561c25bf36889d [ label = \"41\" weight = \"41\" color = \"red\" ];\npackage_884afb9c851443f871179dc0 -> package_ca30420dac77c856476365b1 [ label = \"4\" weight = \"4\" ];\npackage_884afb9c851443f871179dc0 -> package_3a322087a44efafbd4368a08 [ label = \"5\" weight = \"5\" color = \"red\" ];\npackage_884afb9c851443f871179dc0 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"29\" weight = \"29\" ];\npackage_884afb9c851443f871179dc0 -> package_08fe06d73182d2aba49f0a3b [ label = \"57\" weight = \"57\" ];\npackage_884afb9c851443f871179dc0 -> package_9bf1e82bbcacae569c713bba [ label = \"4\" weight = \"4\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"11\" weight = \"11\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_430407bac0561c25bf36889d [ label = \"2\" weight = \"2\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_3a322087a44efafbd4368a08 [ label = \"6\" weight = \"6\" ];\npackage_25c1ee20ce58bbdc8d3e4e83 -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_2f7cd55814b0fa522b0d505b -> package_3a322087a44efafbd4368a08 [ label = \"28\" weight = \"28\" ];\npackage_ccdae54bae7eac0c5941bcdb -> package_3a322087a44efafbd4368a08 [ label = \"36\" weight = \"36\" ];\npackage_ccdae54bae7eac0c5941bcdb -> package_ca30420dac77c856476365b1 [ label = \"1\" weight = \"1\" ];\npackage_ccdae54bae7eac0c5941bcdb -> package_f77a9a3ce2a59ef8ddf2c7a8 [ label = \"4\" weight = \"4\" ];\npackage_884afb9c851443f871179dc0 -> package_57c57c07a5bca0ee4c17b142 [ label = \"5\" weight = \"5\" ];\npackage_ca30420dac77c856476365b1 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"7\" weight = \"7\" ];\npackage_ca30420dac77c856476365b1 -> package_430407bac0561c25bf36889d [ label = \"12\" weight = \"12\" color = \"red\" ];\npackage_d6156cb8cc463f7c0a8642e6 -> package_ebb7dcde9205bd371607c09b [ label = \"2\" weight = \"2\" ];\npackage_0ce60471b8c652f16eb24524 -> package_f77a9a3ce2a59ef8ddf2c7a8 [ label = \"2\" weight = \"2\" ];\npackage_0ce60471b8c652f16eb24524 -> package_3a322087a44efafbd4368a08 [ label = \"49\" weight = \"49\" ];\npackage_0ce60471b8c652f16eb24524 -> package_430407bac0561c25bf36889d [ label = \"33\" weight = \"33\" ];\npackage_0ce60471b8c652f16eb24524 -> package_ca30420dac77c856476365b1 [ label = \"7\" weight = \"7\" ];\npackage_0ce60471b8c652f16eb24524 -> package_0d5cc855f96914d3926ad59c [ label = \"1\" weight = \"1\" ];\npackage_0ce60471b8c652f16eb24524 -> package_57c57c07a5bca0ee4c17b142 [ label = \"8\" weight = \"8\" ];\npackage_0ce60471b8c652f16eb24524 -> package_ebb7dcde9205bd371607c09b [ label = \"2\" weight = \"2\" ];\npackage_0ce60471b8c652f16eb24524 -> package_d6156cb8cc463f7c0a8642e6 [ label = \"1\" weight = \"1\" ];\npackage_0ce60471b8c652f16eb24524 -> package_ccdae54bae7eac0c5941bcdb [ label = \"4\" weight = \"4\" ];\npackage_430407bac0561c25bf36889d -> package_3a322087a44efafbd4368a08 [ label = \"8\" weight = \"8\" ];\npackage_430407bac0561c25bf36889d -> package_63ec0cff5f640f6c4bea0fbf [ label = \"9\" weight = \"9\" ];\npackage_430407bac0561c25bf36889d -> package_ca30420dac77c856476365b1 [ label = \"6\" weight = \"6\" ];\npackage_430407bac0561c25bf36889d -> package_586bd4db20fb6988a9d4eaf8 [ label = \"26\" weight = \"26\" ];\npackage_430407bac0561c25bf36889d -> package_e98a44e5d67bad99f479d7c6 [ label = \"2\" weight = \"2\" ];\npackage_430407bac0561c25bf36889d -> package_08fe06d73182d2aba49f0a3b [ label = \"1\" weight = \"1\" ];\npackage_430407bac0561c25bf36889d -> package_884afb9c851443f871179dc0 [ label = \"3\" weight = \"3\" ];\npackage_63ec0cff5f640f6c4bea0fbf -> package_430407bac0561c25bf36889d [ label = \"44\" weight = \"44\" color = \"red\" ];\npackage_586bd4db20fb6988a9d4eaf8 -> package_430407bac0561c25bf36889d [ label = \"25\" weight = \"25\" color = \"red\" ];\npackage_586bd4db20fb6988a9d4eaf8 -> package_ca30420dac77c856476365b1 [ label = \"2\" weight = \"2\" color = \"red\" ];\npackage_430407bac0561c25bf36889d -> package_4b999d8089061c322291f538 [ label = \"3\" weight = \"3\" ];\npackage_430407bac0561c25bf36889d -> package_2a0e4fa3bf7e37ca1b867475 [ label = \"5\" weight = \"5\" color = \"red\" ];\npackage_430407bac0561c25bf36889d -> package_529853b483d236ddde25a3d4 [ label = \"2\" weight = \"2\" color = \"red\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_884afb9c851443f871179dc0 [ label = \"2\" weight = \"2\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_3a322087a44efafbd4368a08 [ label = \"160\" weight = \"160\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_4b999d8089061c322291f538 [ label = \"8\" weight = \"8\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_430407bac0561c25bf36889d [ label = \"40\" weight = \"40\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"13\" weight = \"13\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_2f7cd55814b0fa522b0d505b [ label = \"4\" weight = \"4\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_25c1ee20ce58bbdc8d3e4e83 [ label = \"13\" weight = \"13\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_ccdae54bae7eac0c5941bcdb [ label = \"10\" weight = \"10\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_57c57c07a5bca0ee4c17b142 [ label = \"10\" weight = \"10\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_0ce60471b8c652f16eb24524 [ label = \"31\" weight = \"31\" ];\npackage_3a322087a44efafbd4368a08 -> package_25c1ee20ce58bbdc8d3e4e83 [ label = \"2\" weight = \"2\" color = \"red\" ];\npackage_3a322087a44efafbd4368a08 -> package_ca30420dac77c856476365b1 [ label = \"4\" weight = \"4\" ];\npackage_3a322087a44efafbd4368a08 -> package_57c57c07a5bca0ee4c17b142 [ label = \"2\" weight = \"2\" ];\npackage_3a322087a44efafbd4368a08 -> package_430407bac0561c25bf36889d [ label = \"15\" weight = \"15\" color = \"red\" ];\npackage_3a322087a44efafbd4368a08 -> package_884afb9c851443f871179dc0 [ label = \"1\" weight = \"1\" ];\npackage_3a322087a44efafbd4368a08 -> package_4b999d8089061c322291f538 [ label = \"2\" weight = \"2\" ];\npackage_3a322087a44efafbd4368a08 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"4\" weight = \"4\" ];\npackage_7ece0e352e8696c73df41d29 -> package_77ce60de3666f8dc6de1e090 [ label = \"16\" weight = \"16\" color = \"red\" ];\npackage_7ece0e352e8696c73df41d29 -> package_3a322087a44efafbd4368a08 [ label = \"42\" weight = \"42\" ];\npackage_7ece0e352e8696c73df41d29 -> package_586bd4db20fb6988a9d4eaf8 [ label = \"1\" weight = \"1\" ];\npackage_7ece0e352e8696c73df41d29 -> package_ccdae54bae7eac0c5941bcdb [ label = \"4\" weight = \"4\" ];\npackage_7ece0e352e8696c73df41d29 -> package_430407bac0561c25bf36889d [ label = \"2\" weight = \"2\" ];\npackage_7ece0e352e8696c73df41d29 -> package_ca30420dac77c856476365b1 [ label = \"3\" weight = \"3\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_7ece0e352e8696c73df41d29 [ label = \"15\" weight = \"15\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_ca30420dac77c856476365b1 [ label = \"6\" weight = \"6\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_63ec0cff5f640f6c4bea0fbf [ label = \"17\" weight = \"17\" ];\npackage_77ce60de3666f8dc6de1e090 -> package_529853b483d236ddde25a3d4 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_4b999d8089061c322291f538 -> package_3a322087a44efafbd4368a08 [ label = \"31\" weight = \"31\" color = \"red\" ];\npackage_77ce60de3666f8dc6de1e090 [label=\"org.junit.runners\" color=red style=filled];\npackage_8121c686a17bf5f549e393d6 [label=\"org.junit.experimental.theories\" color=red style=filled];\npackage_8ee2c1f7beac932dbb525a9a [label=\"org.junit.experimental\"];\npackage_2f7cd55814b0fa522b0d505b [label=\"org.junit.internal.runners.rules\"];\npackage_2a0e4fa3bf7e37ca1b867475 [label=\"org.junit.internal.requests\"];\npackage_6f19bfeb0acefc8cdf5f6c84 [label=\"org.junit.experimental.results\"];\npackage_25c1ee20ce58bbdc8d3e4e83 [label=\"org.junit.internal.runners.model\"];\npackage_529853b483d236ddde25a3d4 [label=\"org.junit.internal.builders\"];\npackage_4a7bf01725342795a1658980 [label=\"junit.textui\"];\npackage_ecd46349524a87b5d286d241 [label=\"org.junit.experimental.categories\"];\npackage_0d5cc855f96914d3926ad59c [label=\"org.junit.function\"];\npackage_2c56d155865671623aa3e3cd [label=\"org.junit.experimental.theories.internal\"];\npackage_7ece0e352e8696c73df41d29 [label=\"org.junit.runners.parameterized\"];\npackage_9bf1e82bbcacae569c713bba [label=\"junit.extensions\"];\npackage_ccdae54bae7eac0c5941bcdb [label=\"org.junit.internal.runners.statements\"];\npackage_ad0c39b57276a6da897dffac [label=\"org.junit.experimental.max\"];\npackage_586bd4db20fb6988a9d4eaf8 [label=\"org.junit.runner.notification\" color=red style=filled];\npackage_43a57afdb19564533e19988f [label=\"org.junit.experimental.theories.suppliers\"];\npackage_d6156cb8cc463f7c0a8642e6 [label=\"org.junit.matchers\"];\npackage_63ec0cff5f640f6c4bea0fbf [label=\"org.junit.runner.manipulation\"];\npackage_f77a9a3ce2a59ef8ddf2c7a8 [label=\"org.junit.internal.management\"];\npackage_ebb7dcde9205bd371607c09b [label=\"org.junit.internal.matchers\"];\npackage_9d7b823b1681ca5a7ca0d3c3 [label=\"org.junit.experimental.runners\"];\npackage_0ce60471b8c652f16eb24524 [label=\"org.junit.rules\"];\npackage_3a322087a44efafbd4368a08 [label=\"org.junit.runners.model\"];\npackage_ca30420dac77c856476365b1 [label=\"org.junit.internal\" color=red style=filled];\npackage_e98a44e5d67bad99f479d7c6 [label=\"junit.runner\"];\npackage_430407bac0561c25bf36889d [label=\"org.junit.runner\"];\npackage_57c57c07a5bca0ee4c17b142 [label=\"org.junit\"];\npackage_4b999d8089061c322291f538 [label=\"org.junit.validator\"];\npackage_08fe06d73182d2aba49f0a3b [label=\"junit.framework\"];\npackage_884afb9c851443f871179dc0 [label=\"org.junit.internal.runners\" color=red style=filled];\n}", + "hasEdges": true + }, + "packageRelationshipsToRemove": { + "cycleCount": 5, + "relationshipsToRemoveCount": 18, + "hasRelationships": true, + "relationships": [ + { + "sourcePackage": "org.junit.internal", + "targetPackage": "org.junit.runners", + "sourceMarked": true, + "targetMarked": true, + "weight": 1, + "renderedLabel": "org.junit.internal* → org.junit.runners* : 1", + "priority": 1, + "cycleCount": 4, + "effortRank": 1, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.internal.MethodSorter", + "targetClass": "org.junit.runners.MethodSorters", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/MethodSorter.java", + "targetClassPath": "src/main/java/org/junit/runners/MethodSorters.java", + "simpleSourceClassName": "MethodSorter", + "simpleTargetClassName": "MethodSorters", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.validator.PublicClassValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 3, - "renderedLabel" : "PublicClassValidator → TestClass* : 3", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.runners", + "targetPackage": "org.junit.internal.builders", + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "renderedLabel": "org.junit.runners* → org.junit.internal.builders : 1", + "priority": 2, + "cycleCount": 4, + "effortRank": 1, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runners.Suite", + "targetClass": "org.junit.internal.builders.AllDefaultPossibilitiesBuilder", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runners/Suite.java", + "targetClassPath": "src/main/java/org/junit/internal/builders/AllDefaultPossibilitiesBuilder.java", + "simpleSourceClassName": "Suite", + "simpleTargetClassName": "AllDefaultPossibilitiesBuilder", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.validator.AnnotationsValidator$AnnotatableValidator", - "targetClass" : "org.junit.runners.model.TestClass", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 2, - "renderedLabel" : "AnnotationsValidator$AnnotatableValidator → TestClass* : 2", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.experimental.theories", - "targetPackage" : "org.junit.experimental.theories.internal", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 13, - "renderedLabel" : "org.junit.experimental.theories* → org.junit.experimental.theories.internal : 13", - "priority" : 17, - "cycleCount" : 1, - "effortRank" : 13, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.experimental.theories.FromDataPoints", - "targetClass" : "org.junit.experimental.theories.internal.SpecificDataPointsSupplier", - "sourceMarked" : false, - "targetMarked" : true, - "weight" : 1, - "renderedLabel" : "FromDataPoints → SpecificDataPointsSupplier* : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.runner", + "targetPackage": "org.junit.internal.builders", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "renderedLabel": "org.junit.runner → org.junit.internal.builders : 2", + "priority": 3, + "cycleCount": 4, + "effortRank": 2, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.internal.builders.AllDefaultPossibilitiesBuilder", + "sourceMarked": true, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/internal/builders/AllDefaultPossibilitiesBuilder.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "AllDefaultPossibilitiesBuilder", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.experimental.theories.Theories$TheoryAnchor", - "targetClass" : "org.junit.experimental.theories.internal.Assignments", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 11, - "renderedLabel" : "Theories$TheoryAnchor → Assignments : 11", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.runner", + "targetPackage": "org.junit.internal.requests", + "sourceMarked": false, + "targetMarked": false, + "weight": 5, + "renderedLabel": "org.junit.runner → org.junit.internal.requests : 5", + "priority": 4, + "cycleCount": 4, + "effortRank": 5, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.internal.requests.SortingRequest", + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/internal/requests/SortingRequest.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "SortingRequest", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.internal.requests.ClassRequest", + "sourceMarked": true, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/internal/requests/ClassRequest.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "ClassRequest", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.internal.requests.FilterRequest", + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/internal/requests/FilterRequest.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "FilterRequest", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.Request", + "targetClass": "org.junit.internal.requests.OrderingRequest", + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/Request.java", + "targetClassPath": "src/main/java/org/junit/internal/requests/OrderingRequest.java", + "simpleSourceClassName": "Request", + "simpleTargetClassName": "OrderingRequest", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.experimental.theories.Theories$TheoryAnchor", - "targetClass" : "org.junit.experimental.theories.internal.ParameterizedAssertionError", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Theories$TheoryAnchor → ParameterizedAssertionError : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - }, { - "sourcePackage" : "org.junit.runner.manipulation", - "targetPackage" : "org.junit.runner", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 44, - "renderedLabel" : "org.junit.runner.manipulation → org.junit.runner : 44", - "priority" : 18, - "cycleCount" : 1, - "effortRank" : 44, - "classRelationshipsToBreakPackage" : [ { - "sourceClass" : "org.junit.runner.manipulation.Ordering$1", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 1, - "renderedLabel" : "Ordering$1 → Description : 1", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.internal", + "targetPackage": "org.junit.runner", + "sourceMarked": true, + "targetMarked": false, + "weight": 12, + "renderedLabel": "org.junit.internal* → org.junit.runner : 12", + "priority": 5, + "cycleCount": 4, + "effortRank": 12, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.internal.TextListener", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/TextListener.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "TextListener", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.TextListener", + "targetClass": "org.junit.runner.Result", + "sourceMarked": false, + "targetMarked": false, + "weight": 10, + "sourceClassPath": "src/main/java/org/junit/internal/TextListener.java", + "targetClassPath": "src/main/java/org/junit/runner/Result.java", + "simpleSourceClassName": "TextListener", + "simpleTargetClassName": "Result", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.runner.manipulation.Ordering", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 7, - "renderedLabel" : "Ordering → Description : 7", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit", + "targetPackage": "org.junit.runners", + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "renderedLabel": "org.junit → org.junit.runners* : 1", + "priority": 6, + "cycleCount": 3, + "effortRank": 1, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.FixMethodOrder", + "targetClass": "org.junit.runners.MethodSorters", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/FixMethodOrder.java", + "targetClassPath": "src/main/java/org/junit/runners/MethodSorters.java", + "simpleSourceClassName": "FixMethodOrder", + "simpleTargetClassName": "MethodSorters", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.runner.manipulation.Sorter", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 11, - "renderedLabel" : "Sorter* → Description : 11", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.runner.notification", + "targetPackage": "org.junit.internal", + "sourceMarked": true, + "targetMarked": true, + "weight": 2, + "renderedLabel": "org.junit.runner.notification* → org.junit.internal* : 2", + "priority": 7, + "cycleCount": 3, + "effortRank": 2, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runner.notification.Failure", + "targetClass": "org.junit.internal.Throwables", + "sourceMarked": true, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/runner/notification/Failure.java", + "targetClassPath": "src/main/java/org/junit/internal/Throwables.java", + "simpleSourceClassName": "Failure", + "simpleTargetClassName": "Throwables", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.runner.manipulation.Filter", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 10, - "renderedLabel" : "Filter* → Description : 10", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.runners.model", + "targetPackage": "org.junit.internal.runners.model", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "renderedLabel": "org.junit.runners.model → org.junit.internal.runners.model : 2", + "priority": 8, + "cycleCount": 3, + "effortRank": 2, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runners.model.FrameworkMethod", + "targetClass": "org.junit.internal.runners.model.ReflectiveCallable", + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runners/model/FrameworkMethod.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/model/ReflectiveCallable.java", + "simpleSourceClassName": "FrameworkMethod", + "simpleTargetClassName": "ReflectiveCallable", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runners.model.MultipleFailureException", + "targetClass": "org.junit.internal.runners.model.MultipleFailureException", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runners/model/MultipleFailureException.java", + "targetClassPath": "src/main/java/org/junit/internal/runners/model/MultipleFailureException.java", + "simpleSourceClassName": "MultipleFailureException", + "simpleTargetClassName": "MultipleFailureException", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.runner.manipulation.Orderer", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : true, - "targetMarked" : false, - "weight" : 7, - "renderedLabel" : "Orderer* → Description : 7", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.internal.runners", + "targetPackage": "org.junit.runners.model", + "sourceMarked": true, + "targetMarked": false, + "weight": 5, + "renderedLabel": "org.junit.internal.runners* → org.junit.runners.model : 5", + "priority": 9, + "cycleCount": 3, + "effortRank": 5, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.internal.runners.ErrorReportingRunner", + "targetClass": "org.junit.runners.model.InvalidTestClassError", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/ErrorReportingRunner.java", + "targetClassPath": "src/main/java/org/junit/runners/model/InvalidTestClassError.java", + "simpleSourceClassName": "ErrorReportingRunner", + "simpleTargetClassName": "InvalidTestClassError", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.ErrorReportingRunner", + "targetClass": "org.junit.runners.model.InitializationError", + "sourceMarked": false, + "targetMarked": false, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/internal/runners/ErrorReportingRunner.java", + "targetClassPath": "src/main/java/org/junit/runners/model/InitializationError.java", + "simpleSourceClassName": "ErrorReportingRunner", + "simpleTargetClassName": "InitializationError", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.MethodRoadie", + "targetClass": "org.junit.runners.model.TestTimedOutException", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/MethodRoadie.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestTimedOutException.java", + "simpleSourceClassName": "MethodRoadie", + "simpleTargetClassName": "TestTimedOutException", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.runner.manipulation.Alphanumeric", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 5, - "renderedLabel" : "Alphanumeric → Description : 5", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 + { + "sourcePackage": "org.junit.internal", + "targetPackage": "org.junit", + "sourceMarked": true, + "targetMarked": false, + "weight": 8, + "renderedLabel": "org.junit.internal* → org.junit : 8", + "priority": 10, + "cycleCount": 3, + "effortRank": 8, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.internal.InexactComparisonCriteria", + "targetClass": "org.junit.Assert", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/InexactComparisonCriteria.java", + "targetClassPath": "src/main/java/org/junit/Assert.java", + "simpleSourceClassName": "InexactComparisonCriteria", + "simpleTargetClassName": "Assert", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.ExactComparisonCriteria", + "targetClass": "org.junit.Assert", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/ExactComparisonCriteria.java", + "targetClassPath": "src/main/java/org/junit/Assert.java", + "simpleSourceClassName": "ExactComparisonCriteria", + "simpleTargetClassName": "Assert", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.ComparisonCriteria", + "targetClass": "org.junit.Assert", + "sourceMarked": false, + "targetMarked": false, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/internal/ComparisonCriteria.java", + "targetClassPath": "src/main/java/org/junit/Assert.java", + "simpleSourceClassName": "ComparisonCriteria", + "simpleTargetClassName": "Assert", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.MethodSorter", + "targetClass": "org.junit.FixMethodOrder", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/MethodSorter.java", + "targetClassPath": "src/main/java/org/junit/FixMethodOrder.java", + "simpleSourceClassName": "MethodSorter", + "simpleTargetClassName": "FixMethodOrder", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] }, -{ - "sourceClass" : "org.junit.runner.manipulation.Ordering$Context", - "targetClass" : "org.junit.runner.Description", - "sourceMarked" : false, - "targetMarked" : false, - "weight" : 3, - "renderedLabel" : "Ordering$Context → Description : 3", - "priority" : 0, - "cycleCount" : 0, - "effortRank" : 0, - "alsoRemovesPackageRelationship" : false, - "packageCycleCount" : 0 - } ] - } ] + { + "sourcePackage": "org.junit.runners.model", + "targetPackage": "org.junit.runner", + "sourceMarked": false, + "targetMarked": false, + "weight": 15, + "renderedLabel": "org.junit.runners.model → org.junit.runner : 15", + "priority": 11, + "cycleCount": 3, + "effortRank": 15, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runners.model.RunnerBuilder", + "targetClass": "org.junit.runner.Description", + "sourceMarked": true, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/runners/model/RunnerBuilder.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "RunnerBuilder", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runners.model.RunnerBuilder", + "targetClass": "org.junit.runner.Runner", + "sourceMarked": true, + "targetMarked": false, + "weight": 11, + "sourceClassPath": "src/main/java/org/junit/runners/model/RunnerBuilder.java", + "targetClassPath": "src/main/java/org/junit/runner/Runner.java", + "simpleSourceClassName": "RunnerBuilder", + "simpleTargetClassName": "Runner", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runners.model.RunnerBuilder", + "targetClass": "org.junit.runner.OrderWith", + "sourceMarked": true, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/runners/model/RunnerBuilder.java", + "targetClassPath": "src/main/java/org/junit/runner/OrderWith.java", + "simpleSourceClassName": "RunnerBuilder", + "simpleTargetClassName": "OrderWith", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + { + "sourcePackage": "org.junit.runners.parameterized", + "targetPackage": "org.junit.runners", + "sourceMarked": false, + "targetMarked": true, + "weight": 16, + "renderedLabel": "org.junit.runners.parameterized → org.junit.runners* : 16", + "priority": 12, + "cycleCount": 3, + "effortRank": 16, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters", + "targetClass": "org.junit.runners.Parameterized$Parameter", + "sourceMarked": false, + "targetMarked": false, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java", + "targetClassPath": "src/main/java/org/junit/runners/Parameterized.java", + "simpleSourceClassName": "BlockJUnit4ClassRunnerWithParameters", + "simpleTargetClassName": "Parameterized$Parameter", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters", + "targetClass": "org.junit.runners.BlockJUnit4ClassRunner", + "sourceMarked": false, + "targetMarked": true, + "weight": 5, + "sourceClassPath": "src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java", + "targetClassPath": "src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java", + "simpleSourceClassName": "BlockJUnit4ClassRunnerWithParameters", + "simpleTargetClassName": "BlockJUnit4ClassRunner", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters", + "targetClass": "org.junit.runners.ParentRunner", + "sourceMarked": false, + "targetMarked": false, + "weight": 8, + "sourceClassPath": "src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java", + "targetClassPath": "src/main/java/org/junit/runners/ParentRunner.java", + "simpleSourceClassName": "BlockJUnit4ClassRunnerWithParameters", + "simpleTargetClassName": "ParentRunner", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + { + "sourcePackage": "org.junit.runner.notification", + "targetPackage": "org.junit.runner", + "sourceMarked": true, + "targetMarked": false, + "weight": 25, + "renderedLabel": "org.junit.runner.notification* → org.junit.runner : 25", + "priority": 13, + "cycleCount": 3, + "effortRank": 25, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runner.notification.RunListener", + "targetClass": "org.junit.runner.Result", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/notification/RunListener.java", + "targetClassPath": "src/main/java/org/junit/runner/Result.java", + "simpleSourceClassName": "RunListener", + "simpleTargetClassName": "Result", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.notification.RunListener", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 6, + "sourceClassPath": "src/main/java/org/junit/runner/notification/RunListener.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "RunListener", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.notification.SynchronizedRunListener", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 6, + "sourceClassPath": "src/main/java/org/junit/runner/notification/SynchronizedRunListener.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "SynchronizedRunListener", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.notification.RunNotifier", + "targetClass": "org.junit.runner.Result", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/notification/RunNotifier.java", + "targetClassPath": "src/main/java/org/junit/runner/Result.java", + "simpleSourceClassName": "RunNotifier", + "simpleTargetClassName": "Result", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.notification.Failure", + "targetClass": "org.junit.runner.Description", + "sourceMarked": true, + "targetMarked": false, + "weight": 4, + "sourceClassPath": "src/main/java/org/junit/runner/notification/Failure.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Failure", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.notification.RunNotifier", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 6, + "sourceClassPath": "src/main/java/org/junit/runner/notification/RunNotifier.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "RunNotifier", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.notification.SynchronizedRunListener", + "targetClass": "org.junit.runner.Result", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/notification/SynchronizedRunListener.java", + "targetClassPath": "src/main/java/org/junit/runner/Result.java", + "simpleSourceClassName": "SynchronizedRunListener", + "simpleTargetClassName": "Result", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + { + "sourcePackage": "junit.framework", + "targetPackage": "org.junit.runner", + "sourceMarked": false, + "targetMarked": false, + "weight": 39, + "renderedLabel": "junit.framework → org.junit.runner : 39", + "priority": 14, + "cycleCount": 3, + "effortRank": 39, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "junit.framework.JUnit4TestAdapter", + "targetClass": "org.junit.runner.Description", + "sourceMarked": true, + "targetMarked": false, + "weight": 13, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestAdapter.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "JUnit4TestAdapter", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "junit.framework.JUnit4TestAdapterCache", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 14, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestAdapterCache.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "JUnit4TestAdapterCache", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "junit.framework.JUnit4TestCaseFacade", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 4, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestCaseFacade.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "JUnit4TestCaseFacade", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "junit.framework.JUnit4TestCaseFacade", + "targetClass": "org.junit.runner.Describable", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestCaseFacade.java", + "targetClassPath": "src/main/java/org/junit/runner/Describable.java", + "simpleSourceClassName": "JUnit4TestCaseFacade", + "simpleTargetClassName": "Describable", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "junit.framework.JUnit4TestAdapter", + "targetClass": "org.junit.runner.Request", + "sourceMarked": true, + "targetMarked": true, + "weight": 2, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestAdapter.java", + "targetClassPath": "src/main/java/org/junit/runner/Request.java", + "simpleSourceClassName": "JUnit4TestAdapter", + "simpleTargetClassName": "Request", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "junit.framework.JUnit4TestAdapter", + "targetClass": "org.junit.runner.Runner", + "sourceMarked": true, + "targetMarked": false, + "weight": 4, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestAdapter.java", + "targetClassPath": "src/main/java/org/junit/runner/Runner.java", + "simpleSourceClassName": "JUnit4TestAdapter", + "simpleTargetClassName": "Runner", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "junit.framework.JUnit4TestAdapter", + "targetClass": "org.junit.runner.Describable", + "sourceMarked": true, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/junit/framework/JUnit4TestAdapter.java", + "targetClassPath": "src/main/java/org/junit/runner/Describable.java", + "simpleSourceClassName": "JUnit4TestAdapter", + "simpleTargetClassName": "Describable", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + { + "sourcePackage": "org.junit.internal.runners", + "targetPackage": "org.junit.runner", + "sourceMarked": true, + "targetMarked": false, + "weight": 41, + "renderedLabel": "org.junit.internal.runners* → org.junit.runner : 41", + "priority": 15, + "cycleCount": 3, + "effortRank": 41, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener", + "targetClass": "org.junit.runner.Describable", + "sourceMarked": false, + "targetMarked": false, + "weight": 4, + "sourceClassPath": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Describable.java", + "simpleSourceClassName": "JUnit38ClassRunner$OldTestClassAdaptingListener", + "simpleTargetClassName": "Describable", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.ErrorReportingRunner", + "targetClass": "org.junit.runner.Runner", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/ErrorReportingRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Runner.java", + "simpleSourceClassName": "ErrorReportingRunner", + "simpleTargetClassName": "Runner", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.ErrorReportingRunner", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 7, + "sourceClassPath": "src/main/java/org/junit/internal/runners/ErrorReportingRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "ErrorReportingRunner", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.JUnit38ClassRunner", + "targetClass": "org.junit.runner.Describable", + "sourceMarked": true, + "targetMarked": false, + "weight": 4, + "sourceClassPath": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Describable.java", + "simpleSourceClassName": "JUnit38ClassRunner", + "simpleTargetClassName": "Describable", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.JUnit38ClassRunner", + "targetClass": "org.junit.runner.Runner", + "sourceMarked": true, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Runner.java", + "simpleSourceClassName": "JUnit38ClassRunner", + "simpleTargetClassName": "Runner", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.JUnit4ClassRunner", + "targetClass": "org.junit.runner.Runner", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/internal/runners/JUnit4ClassRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Runner.java", + "simpleSourceClassName": "JUnit4ClassRunner", + "simpleTargetClassName": "Runner", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.JUnit38ClassRunner", + "targetClass": "org.junit.runner.Description", + "sourceMarked": true, + "targetMarked": false, + "weight": 8, + "sourceClassPath": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "JUnit38ClassRunner", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "JUnit38ClassRunner$OldTestClassAdaptingListener", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.ClassRoadie", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/runners/ClassRoadie.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "ClassRoadie", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.JUnit4ClassRunner", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 8, + "sourceClassPath": "src/main/java/org/junit/internal/runners/JUnit4ClassRunner.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "JUnit4ClassRunner", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.internal.runners.MethodRoadie", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/internal/runners/MethodRoadie.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "MethodRoadie", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + { + "sourcePackage": "org.junit.validator", + "targetPackage": "org.junit.runners.model", + "sourceMarked": false, + "targetMarked": false, + "weight": 31, + "renderedLabel": "org.junit.validator → org.junit.runners.model : 31", + "priority": 16, + "cycleCount": 2, + "effortRank": 31, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.validator.AnnotationsValidator$FieldValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "AnnotationsValidator$FieldValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationValidator", + "targetClass": "org.junit.runners.model.FrameworkMethod", + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/FrameworkMethod.java", + "simpleSourceClassName": "AnnotationValidator", + "simpleTargetClassName": "FrameworkMethod", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationsValidator$MethodValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "AnnotationsValidator$MethodValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationsValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "AnnotationsValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationsValidator$MethodValidator", + "targetClass": "org.junit.runners.model.FrameworkMethod", + "sourceMarked": false, + "targetMarked": true, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/FrameworkMethod.java", + "simpleSourceClassName": "AnnotationsValidator$MethodValidator", + "simpleTargetClassName": "FrameworkMethod", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationsValidator$AnnotatableValidator", + "targetClass": "org.junit.runners.model.Annotatable", + "sourceMarked": false, + "targetMarked": false, + "weight": 7, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/Annotatable.java", + "simpleSourceClassName": "AnnotationsValidator$AnnotatableValidator", + "simpleTargetClassName": "Annotatable", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationValidator", + "targetClass": "org.junit.runners.model.FrameworkField", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/FrameworkField.java", + "simpleSourceClassName": "AnnotationValidator", + "simpleTargetClassName": "FrameworkField", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.TestClassValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/validator/TestClassValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "TestClassValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationsValidator$FieldValidator", + "targetClass": "org.junit.runners.model.FrameworkField", + "sourceMarked": false, + "targetMarked": false, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/FrameworkField.java", + "simpleSourceClassName": "AnnotationsValidator$FieldValidator", + "simpleTargetClassName": "FrameworkField", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationsValidator$ClassValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 4, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "AnnotationsValidator$ClassValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "AnnotationValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.PublicClassValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/validator/PublicClassValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "PublicClassValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.validator.AnnotationsValidator$AnnotatableValidator", + "targetClass": "org.junit.runners.model.TestClass", + "sourceMarked": false, + "targetMarked": true, + "weight": 2, + "sourceClassPath": "src/main/java/org/junit/validator/AnnotationsValidator.java", + "targetClassPath": "src/main/java/org/junit/runners/model/TestClass.java", + "simpleSourceClassName": "AnnotationsValidator$AnnotatableValidator", + "simpleTargetClassName": "TestClass", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + { + "sourcePackage": "org.junit.experimental.theories", + "targetPackage": "org.junit.experimental.theories.internal", + "sourceMarked": true, + "targetMarked": false, + "weight": 13, + "renderedLabel": "org.junit.experimental.theories* → org.junit.experimental.theories.internal : 13", + "priority": 17, + "cycleCount": 1, + "effortRank": 13, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.experimental.theories.FromDataPoints", + "targetClass": "org.junit.experimental.theories.internal.SpecificDataPointsSupplier", + "sourceMarked": false, + "targetMarked": true, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/experimental/theories/FromDataPoints.java", + "targetClassPath": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java", + "simpleSourceClassName": "FromDataPoints", + "simpleTargetClassName": "SpecificDataPointsSupplier", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.experimental.theories.Theories$TheoryAnchor", + "targetClass": "org.junit.experimental.theories.internal.Assignments", + "sourceMarked": false, + "targetMarked": false, + "weight": 11, + "sourceClassPath": "src/main/java/org/junit/experimental/theories/Theories.java", + "targetClassPath": "src/main/java/org/junit/experimental/theories/internal/Assignments.java", + "simpleSourceClassName": "Theories$TheoryAnchor", + "simpleTargetClassName": "Assignments", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.experimental.theories.Theories$TheoryAnchor", + "targetClass": "org.junit.experimental.theories.internal.ParameterizedAssertionError", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/experimental/theories/Theories.java", + "targetClassPath": "src/main/java/org/junit/experimental/theories/internal/ParameterizedAssertionError.java", + "simpleSourceClassName": "Theories$TheoryAnchor", + "simpleTargetClassName": "ParameterizedAssertionError", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + }, + { + "sourcePackage": "org.junit.runner.manipulation", + "targetPackage": "org.junit.runner", + "sourceMarked": false, + "targetMarked": false, + "weight": 44, + "renderedLabel": "org.junit.runner.manipulation → org.junit.runner : 44", + "priority": 18, + "cycleCount": 1, + "effortRank": 44, + "classRelationshipsToBreakPackage": [ + { + "sourceClass": "org.junit.runner.manipulation.Ordering$1", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 1, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Ordering.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Ordering$1", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.manipulation.Ordering", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 7, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Ordering.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Ordering", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.manipulation.Sorter", + "targetClass": "org.junit.runner.Description", + "sourceMarked": true, + "targetMarked": false, + "weight": 11, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Sorter.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Sorter", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.manipulation.Filter", + "targetClass": "org.junit.runner.Description", + "sourceMarked": true, + "targetMarked": false, + "weight": 10, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Filter.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Filter", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.manipulation.Orderer", + "targetClass": "org.junit.runner.Description", + "sourceMarked": true, + "targetMarked": false, + "weight": 7, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Orderer.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Orderer", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.manipulation.Alphanumeric", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 5, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Alphanumeric.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Alphanumeric", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + }, + { + "sourceClass": "org.junit.runner.manipulation.Ordering$Context", + "targetClass": "org.junit.runner.Description", + "sourceMarked": false, + "targetMarked": false, + "weight": 3, + "sourceClassPath": "src/main/java/org/junit/runner/manipulation/Ordering.java", + "targetClassPath": "src/main/java/org/junit/runner/Description.java", + "simpleSourceClassName": "Ordering$Context", + "simpleTargetClassName": "Description", + "priority": 0, + "cycleCount": 0, + "effortRank": 0, + "alsoRemovesPackageRelationship": false, + "packageCycleCount": 0 + } + ] + } + ] }, - "hasDisharmonies" : true, - "disharmonies" : [ { - "type" : "God Class", - "anchorId" : "GOD", - "title" : "God Classes", - "methodLevel" : false, - "problem" : "God Classes take on too much responsibility,", - "solution" : "Extract related islands of functionality into separate classes. Leave God classes that don't change often alone.", - "maxPriority" : 2, - "chart" : { - "canvasId" : "chart_GOD", - "bubbles" : [ { - "id" : "BlockJUnit4ClassRunner.java", - "label" : "BlockJUnit4ClassRunner.java", - "x" : 1, - "y" : 2, - "r" : 24, - "priority" : 1, - "effortRank" : 1, - "changePronenessRank" : 2, - "color" : "rgba(235, 64, 52, 0.75)", - "borderColor" : "rgb(235, 64, 52)" - }, { - "id" : "ParentRunner.java", - "label" : "ParentRunner.java", - "x" : 2, - "y" : 1, - "r" : 6, - "priority" : 2, - "effortRank" : 2, - "changePronenessRank" : 1, - "color" : "rgba(39, 174, 96, 0.75)", - "borderColor" : "rgb(39, 174, 96)" - } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" - }, - "table" : { - "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], - "rows" : [ { - "cells" : [ { - "content" : "BlockJUnit4ClassRunner.java", - "align" : "left" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "3/14/19, 9:06 AM", - "align" : "right" - }, { - "content" : "104", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "ParentRunner.java", - "align" : "left" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "11/27/19, 1:46 PM", - "align" : "right" - }, { - "content" : "97", - "align" : "right" - } ] - } ] - } - }, { - "type" : "Data Class", - "anchorId" : "DATA_CLASS", - "title" : "Data Classes", - "methodLevel" : false, - "problem" : "Data Classes are dumb data holders that other classes rely on.", - "solution" : "Move the data/variable(s) to the same class as the operation.", - "maxPriority" : 2, - "chart" : { - "canvasId" : "chart_DATA_CLASS", - "bubbles" : [ { - "id" : "Failure.java", - "label" : "Failure.java", - "x" : 1, - "y" : 1, - "r" : 24, - "priority" : 1, - "effortRank" : 1, - "changePronenessRank" : 1, - "color" : "rgba(235, 64, 52, 0.75)", - "borderColor" : "rgb(235, 64, 52)" - }, { - "id" : "FrameworkField.java", - "label" : "FrameworkField.java", - "x" : 2, - "y" : 2, - "r" : 6, - "priority" : 2, - "effortRank" : 2, - "changePronenessRank" : 2, - "color" : "rgba(39, 174, 96, 0.75)", - "borderColor" : "rgb(39, 174, 96)" - } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "hasDisharmonies": true, + "disharmonies": [ + { + "type": "God Class", + "anchorId": "GOD", + "title": "God Classes", + "methodLevel": false, + "problem": "God Classes take on too much responsibility,", + "solution": "Extract related islands of functionality into separate classes. Leave God classes that don't change often alone.", + "maxPriority": 2, + "chart": { + "canvasId": "chart_GOD", + "bubbles": [ + { + "id": "BlockJUnit4ClassRunner.java", + "label": "BlockJUnit4ClassRunner.java", + "x": 1, + "y": 2, + "r": 24, + "priority": 1, + "effortRank": 1, + "changePronenessRank": 2, + "color": "rgba(235, 64, 52, 0.75)", + "borderColor": "rgb(235, 64, 52)" + }, + { + "id": "ParentRunner.java", + "label": "ParentRunner.java", + "x": 2, + "y": 1, + "r": 6, + "priority": 2, + "effortRank": 2, + "changePronenessRank": 1, + "color": "rgba(39, 174, 96, 0.75)", + "borderColor": "rgb(39, 174, 96)" + } + ], + "xaxisLabel": "Effort to refactor", + "yaxisLabel": "Relative churn (impact)" + }, + "table": { + "headers": [ + "Class", + "Priority", + "Change Proneness Rank", + "Effort Rank", + "Most Recent Commit Date", + "Commit Count" + ], + "rows": [ + { + "cells": [ + { + "content": "BlockJUnit4ClassRunner.java", + "align": "left" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "3/14/19, 9:06 AM", + "align": "right" + }, + { + "content": "104", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "ParentRunner.java", + "align": "left" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "11/27/19, 1:46 PM", + "align": "right" + }, + { + "content": "97", + "align": "right" + } + ] + } + ] + } }, - "table" : { - "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], - "rows" : [ { - "cells" : [ { - "content" : "Failure.java", - "align" : "left" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "2/5/17, 6:35 PM", - "align" : "right" - }, { - "content" : "13", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "FrameworkField.java", - "align" : "left" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "1/4/21, 4:01 PM", - "align" : "right" - }, { - "content" : "27", - "align" : "right" - } ] - } ] - } - }, { - "type" : "Refused Parent Bequest", - "anchorId" : "RPB", - "title" : "Refused Parent Bequest", - "methodLevel" : false, - "problem" : "Child class is large and often complex, but doesn't override or use many of the parent class's methods", - "solution" : "Do one or more of the following:
- Extract the child class into a separate class. Move the methods that are used from the parent class into the child class.
- Make unused protected members private in the parent class.
- If a parent class has multiple children, move methods not used by all descendants to another class.", - "maxPriority" : 14, - "chart" : { - "canvasId" : "chart_RPB", - "bubbles" : [ { - "id" : "Theories.java", - "label" : "Theories.java", - "x" : 5, - "y" : 12, - "r" : 24, - "priority" : 1, - "effortRank" : 5, - "changePronenessRank" : 12, - "color" : "rgba(235, 64, 52, 0.75)", - "borderColor" : "rgb(235, 64, 52)" - }, { - "id" : "BlockJUnit4ClassRunner.java", - "label" : "BlockJUnit4ClassRunner.java", - "x" : 8, - "y" : 14, - "r" : 23, - "priority" : 2, - "effortRank" : 8, - "changePronenessRank" : 14, - "color" : "rgba(220, 72, 55, 0.75)", - "borderColor" : "rgb(220, 72, 55)" - }, { - "id" : "ErrorReportingRunner.java", - "label" : "ErrorReportingRunner.java", - "x" : 1, - "y" : 6, - "r" : 21, - "priority" : 3, - "effortRank" : 1, - "changePronenessRank" : 6, - "color" : "rgba(205, 81, 59, 0.75)", - "borderColor" : "rgb(205, 81, 59)" - }, { - "id" : "Categories.java", - "label" : "Categories.java", - "x" : 6, - "y" : 11, - "r" : 20, - "priority" : 4, - "effortRank" : 6, - "changePronenessRank" : 11, - "color" : "rgba(190, 89, 62, 0.75)", - "borderColor" : "rgb(190, 89, 62)" - }, { - "id" : "Categories.java", - "label" : "Categories.java", - "x" : 9, - "y" : 11, - "r" : 18, - "priority" : 5, - "effortRank" : 9, - "changePronenessRank" : 11, - "color" : "rgba(175, 98, 66, 0.75)", - "borderColor" : "rgb(175, 98, 66)" - }, { - "id" : "TestRunner.java", - "label" : "TestRunner.java", - "x" : 2, - "y" : 2, - "r" : 17, - "priority" : 6, - "effortRank" : 2, - "changePronenessRank" : 2, - "color" : "rgba(160, 106, 69, 0.75)", - "borderColor" : "rgb(160, 106, 69)" - }, { - "id" : "JUnit4ClassRunner.java", - "label" : "JUnit4ClassRunner.java", - "x" : 3, - "y" : 3, - "r" : 16, - "priority" : 7, - "effortRank" : 3, - "changePronenessRank" : 3, - "color" : "rgba(145, 115, 72, 0.75)", - "borderColor" : "rgb(145, 115, 72)" - }, { - "id" : "JUnit38ClassRunner.java", - "label" : "JUnit38ClassRunner.java", - "x" : 4, - "y" : 4, - "r" : 14, - "priority" : 8, - "effortRank" : 4, - "changePronenessRank" : 4, - "color" : "rgba(129, 123, 76, 0.75)", - "borderColor" : "rgb(129, 123, 76)" - }, { - "id" : "ParentRunner.java", - "label" : "ParentRunner.java", - "x" : 13, - "y" : 13, - "r" : 13, - "priority" : 9, - "effortRank" : 13, - "changePronenessRank" : 13, - "color" : "rgba(114, 132, 79, 0.75)", - "borderColor" : "rgb(114, 132, 79)" - }, { - "id" : "FailOnTimeout.java", - "label" : "FailOnTimeout.java", - "x" : 10, - "y" : 9, - "r" : 12, - "priority" : 10, - "effortRank" : 10, - "changePronenessRank" : 9, - "color" : "rgba(99, 140, 82, 0.75)", - "borderColor" : "rgb(99, 140, 82)" - }, { - "id" : "BlockJUnit4ClassRunnerWithParameters.java", - "label" : "BlockJUnit4ClassRunnerWithParameters.java", - "x" : 7, - "y" : 5, - "r" : 10, - "priority" : 11, - "effortRank" : 7, - "changePronenessRank" : 5, - "color" : "rgba(84, 149, 86, 0.75)", - "borderColor" : "rgb(84, 149, 86)" - }, { - "id" : "TemporaryFolder.java", - "label" : "TemporaryFolder.java", - "x" : 11, - "y" : 8, - "r" : 9, - "priority" : 12, - "effortRank" : 11, - "changePronenessRank" : 8, - "color" : "rgba(69, 157, 89, 0.75)", - "borderColor" : "rgb(69, 157, 89)" - }, { - "id" : "AllMembersSupplier.java", - "label" : "AllMembersSupplier.java", - "x" : 12, - "y" : 7, - "r" : 7, - "priority" : 13, - "effortRank" : 12, - "changePronenessRank" : 7, - "color" : "rgba(54, 166, 93, 0.75)", - "borderColor" : "rgb(54, 166, 93)" - }, { - "id" : "TestCase.java", - "label" : "TestCase.java", - "x" : 10, - "y" : 1, - "r" : 6, - "priority" : 14, - "effortRank" : 10, - "changePronenessRank" : 1, - "color" : "rgba(39, 174, 96, 0.75)", - "borderColor" : "rgb(39, 174, 96)" - } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + { + "type": "Data Class", + "anchorId": "DATA_CLASS", + "title": "Data Classes", + "methodLevel": false, + "problem": "Data Classes are dumb data holders that other classes rely on.", + "solution": "Move the data/variable(s) to the same class as the operation.", + "maxPriority": 2, + "chart": { + "canvasId": "chart_DATA_CLASS", + "bubbles": [ + { + "id": "Failure.java", + "label": "Failure.java", + "x": 1, + "y": 1, + "r": 24, + "priority": 1, + "effortRank": 1, + "changePronenessRank": 1, + "color": "rgba(235, 64, 52, 0.75)", + "borderColor": "rgb(235, 64, 52)" + }, + { + "id": "FrameworkField.java", + "label": "FrameworkField.java", + "x": 2, + "y": 2, + "r": 6, + "priority": 2, + "effortRank": 2, + "changePronenessRank": 2, + "color": "rgba(39, 174, 96, 0.75)", + "borderColor": "rgb(39, 174, 96)" + } + ], + "xaxisLabel": "Effort to refactor", + "yaxisLabel": "Relative churn (impact)" + }, + "table": { + "headers": [ + "Class", + "Priority", + "Change Proneness Rank", + "Effort Rank", + "Most Recent Commit Date", + "Commit Count" + ], + "rows": [ + { + "cells": [ + { + "content": "Failure.java", + "align": "left" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "2/5/17, 6:35 PM", + "align": "right" + }, + { + "content": "13", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "FrameworkField.java", + "align": "left" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "1/4/21, 4:01 PM", + "align": "right" + }, + { + "content": "27", + "align": "right" + } + ] + } + ] + } }, - "table" : { - "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], - "rows" : [ { - "cells" : [ { - "content" : "Theories.java", - "align" : "left" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "12", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "5/25/17, 11:19 AM", - "align" : "right" - }, { - "content" : "46", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "BlockJUnit4ClassRunner.java", - "align" : "left" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "14", - "align" : "right" - }, { - "content" : "8", - "align" : "right" - }, { - "content" : "3/14/19, 9:06 AM", - "align" : "right" - }, { - "content" : "104", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "ErrorReportingRunner.java", - "align" : "left" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "6", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "10/10/22, 3:22 PM", - "align" : "right" - }, { - "content" : "28", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Categories.java", - "align" : "left" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "11", - "align" : "right" - }, { - "content" : "6", - "align" : "right" - }, { - "content" : "1/9/17, 9:18 PM", - "align" : "right" - }, { - "content" : "39", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Categories.java", - "align" : "left" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "11", - "align" : "right" - }, { - "content" : "9", - "align" : "right" - }, { - "content" : "1/9/17, 9:18 PM", - "align" : "right" - }, { - "content" : "39", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "TestRunner.java", - "align" : "left" - }, { - "content" : "6", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "3/29/15, 4:17 PM", - "align" : "right" - }, { - "content" : "6", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "JUnit4ClassRunner.java", - "align" : "left" - }, { - "content" : "7", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "9/12/14, 3:18 PM", - "align" : "right" - }, { - "content" : "16", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "JUnit38ClassRunner.java", - "align" : "left" - }, { - "content" : "8", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "7/30/18, 12:07 PM", - "align" : "right" - }, { - "content" : "23", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "ParentRunner.java", - "align" : "left" - }, { - "content" : "9", - "align" : "right" - }, { - "content" : "13", - "align" : "right" - }, { - "content" : "13", - "align" : "right" - }, { - "content" : "11/27/19, 1:46 PM", - "align" : "right" - }, { - "content" : "97", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "FailOnTimeout.java", - "align" : "left" - }, { - "content" : "10", - "align" : "right" - }, { - "content" : "9", - "align" : "right" - }, { - "content" : "10", - "align" : "right" - }, { - "content" : "12/30/21, 2:49 AM", - "align" : "right" - }, { - "content" : "40", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "BlockJUnit4ClassRunnerWithParameters.java", - "align" : "left" - }, { - "content" : "11", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "7", - "align" : "right" - }, { - "content" : "6/23/17, 4:16 PM", - "align" : "right" - }, { - "content" : "7", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "TemporaryFolder.java", - "align" : "left" - }, { - "content" : "12", - "align" : "right" - }, { - "content" : "8", - "align" : "right" - }, { - "content" : "11", - "align" : "right" - }, { - "content" : "10/11/20, 9:56 AM", - "align" : "right" - }, { - "content" : "34", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "AllMembersSupplier.java", - "align" : "left" - }, { - "content" : "13", - "align" : "right" - }, { - "content" : "7", - "align" : "right" - }, { - "content" : "12", - "align" : "right" - }, { - "content" : "6/18/14, 1:42 AM", - "align" : "right" - }, { - "content" : "33", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "TestCase.java", - "align" : "left" - }, { - "content" : "14", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "10", - "align" : "right" - }, { - "content" : "10/28/16, 3:01 PM", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - } ] - } ] - } - }, { - "type" : "Intensive Coupling", - "anchorId" : "INTENSIVE_COUPLING", - "title" : "Intensive Coupling", - "methodLevel" : true, - "problem" : "Method calls too many methods from a few unrelated classes (often in a separate package).", - "solution" : "Move the calling method to a class more closely related to the other classes that the original method can call.", - "maxPriority" : 4, - "chart" : { - "canvasId" : "chart_INTENSIVE_COUPLING", - "bubbles" : [ { - "id" : "ParentRunner.java", - "label" : "ParentRunner.java", - "x" : 1, - "y" : 4, - "r" : 24, - "priority" : 1, - "effortRank" : 1, - "changePronenessRank" : 4, - "color" : "rgba(235, 64, 52, 0.75)", - "borderColor" : "rgb(235, 64, 52)" - }, { - "id" : "Theories.java", - "label" : "Theories.java", - "x" : 2, - "y" : 3, - "r" : 18, - "priority" : 2, - "effortRank" : 2, - "changePronenessRank" : 3, - "color" : "rgba(170, 101, 67, 0.75)", - "borderColor" : "rgb(170, 101, 67)" - }, { - "id" : "MethodValidator.java", - "label" : "MethodValidator.java", - "x" : 1, - "y" : 1, - "r" : 12, - "priority" : 3, - "effortRank" : 1, - "changePronenessRank" : 1, - "color" : "rgba(104, 137, 81, 0.75)", - "borderColor" : "rgb(104, 137, 81)" - }, { - "id" : "AllMembersSupplier.java", - "label" : "AllMembersSupplier.java", - "x" : 3, - "y" : 2, - "r" : 6, - "priority" : 4, - "effortRank" : 3, - "changePronenessRank" : 2, - "color" : "rgba(39, 174, 96, 0.75)", - "borderColor" : "rgb(39, 174, 96)" - } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + { + "type": "Refused Parent Bequest", + "anchorId": "RPB", + "title": "Refused Parent Bequest", + "methodLevel": false, + "problem": "Child class is large and often complex, but doesn't override or use many of the parent class's methods", + "solution": "Do one or more of the following:
- Extract the child class into a separate class. Move the methods that are used from the parent class into the child class.
- Make unused protected members private in the parent class.
- If a parent class has multiple children, move methods not used by all descendants to another class.", + "maxPriority": 14, + "chart": { + "canvasId": "chart_RPB", + "bubbles": [ + { + "id": "Theories.java", + "label": "Theories.java", + "x": 5, + "y": 12, + "r": 24, + "priority": 1, + "effortRank": 5, + "changePronenessRank": 12, + "color": "rgba(235, 64, 52, 0.75)", + "borderColor": "rgb(235, 64, 52)" + }, + { + "id": "BlockJUnit4ClassRunner.java", + "label": "BlockJUnit4ClassRunner.java", + "x": 8, + "y": 14, + "r": 23, + "priority": 2, + "effortRank": 8, + "changePronenessRank": 14, + "color": "rgba(220, 72, 55, 0.75)", + "borderColor": "rgb(220, 72, 55)" + }, + { + "id": "ErrorReportingRunner.java", + "label": "ErrorReportingRunner.java", + "x": 1, + "y": 6, + "r": 21, + "priority": 3, + "effortRank": 1, + "changePronenessRank": 6, + "color": "rgba(205, 81, 59, 0.75)", + "borderColor": "rgb(205, 81, 59)" + }, + { + "id": "Categories.java", + "label": "Categories.java", + "x": 6, + "y": 11, + "r": 20, + "priority": 4, + "effortRank": 6, + "changePronenessRank": 11, + "color": "rgba(190, 89, 62, 0.75)", + "borderColor": "rgb(190, 89, 62)" + }, + { + "id": "Categories.java", + "label": "Categories.java", + "x": 9, + "y": 11, + "r": 18, + "priority": 5, + "effortRank": 9, + "changePronenessRank": 11, + "color": "rgba(175, 98, 66, 0.75)", + "borderColor": "rgb(175, 98, 66)" + }, + { + "id": "TestRunner.java", + "label": "TestRunner.java", + "x": 2, + "y": 2, + "r": 17, + "priority": 6, + "effortRank": 2, + "changePronenessRank": 2, + "color": "rgba(160, 106, 69, 0.75)", + "borderColor": "rgb(160, 106, 69)" + }, + { + "id": "JUnit4ClassRunner.java", + "label": "JUnit4ClassRunner.java", + "x": 3, + "y": 3, + "r": 16, + "priority": 7, + "effortRank": 3, + "changePronenessRank": 3, + "color": "rgba(145, 115, 72, 0.75)", + "borderColor": "rgb(145, 115, 72)" + }, + { + "id": "JUnit38ClassRunner.java", + "label": "JUnit38ClassRunner.java", + "x": 4, + "y": 4, + "r": 14, + "priority": 8, + "effortRank": 4, + "changePronenessRank": 4, + "color": "rgba(129, 123, 76, 0.75)", + "borderColor": "rgb(129, 123, 76)" + }, + { + "id": "ParentRunner.java", + "label": "ParentRunner.java", + "x": 13, + "y": 13, + "r": 13, + "priority": 9, + "effortRank": 13, + "changePronenessRank": 13, + "color": "rgba(114, 132, 79, 0.75)", + "borderColor": "rgb(114, 132, 79)" + }, + { + "id": "FailOnTimeout.java", + "label": "FailOnTimeout.java", + "x": 10, + "y": 9, + "r": 12, + "priority": 10, + "effortRank": 10, + "changePronenessRank": 9, + "color": "rgba(99, 140, 82, 0.75)", + "borderColor": "rgb(99, 140, 82)" + }, + { + "id": "BlockJUnit4ClassRunnerWithParameters.java", + "label": "BlockJUnit4ClassRunnerWithParameters.java", + "x": 7, + "y": 5, + "r": 10, + "priority": 11, + "effortRank": 7, + "changePronenessRank": 5, + "color": "rgba(84, 149, 86, 0.75)", + "borderColor": "rgb(84, 149, 86)" + }, + { + "id": "TemporaryFolder.java", + "label": "TemporaryFolder.java", + "x": 11, + "y": 8, + "r": 9, + "priority": 12, + "effortRank": 11, + "changePronenessRank": 8, + "color": "rgba(69, 157, 89, 0.75)", + "borderColor": "rgb(69, 157, 89)" + }, + { + "id": "AllMembersSupplier.java", + "label": "AllMembersSupplier.java", + "x": 12, + "y": 7, + "r": 7, + "priority": 13, + "effortRank": 12, + "changePronenessRank": 7, + "color": "rgba(54, 166, 93, 0.75)", + "borderColor": "rgb(54, 166, 93)" + }, + { + "id": "TestCase.java", + "label": "TestCase.java", + "x": 10, + "y": 1, + "r": 6, + "priority": 14, + "effortRank": 10, + "changePronenessRank": 1, + "color": "rgba(39, 174, 96, 0.75)", + "borderColor": "rgb(39, 174, 96)" + } + ], + "xaxisLabel": "Effort to refactor", + "yaxisLabel": "Relative churn (impact)" + }, + "table": { + "headers": [ + "Class", + "Priority", + "Change Proneness Rank", + "Effort Rank", + "Most Recent Commit Date", + "Commit Count" + ], + "rows": [ + { + "cells": [ + { + "content": "Theories.java", + "align": "left" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "12", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "5/25/17, 11:19 AM", + "align": "right" + }, + { + "content": "46", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "BlockJUnit4ClassRunner.java", + "align": "left" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "14", + "align": "right" + }, + { + "content": "8", + "align": "right" + }, + { + "content": "3/14/19, 9:06 AM", + "align": "right" + }, + { + "content": "104", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "ErrorReportingRunner.java", + "align": "left" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "6", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "10/10/22, 3:22 PM", + "align": "right" + }, + { + "content": "28", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Categories.java", + "align": "left" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "11", + "align": "right" + }, + { + "content": "6", + "align": "right" + }, + { + "content": "1/9/17, 9:18 PM", + "align": "right" + }, + { + "content": "39", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Categories.java", + "align": "left" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "11", + "align": "right" + }, + { + "content": "9", + "align": "right" + }, + { + "content": "1/9/17, 9:18 PM", + "align": "right" + }, + { + "content": "39", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "TestRunner.java", + "align": "left" + }, + { + "content": "6", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "3/29/15, 4:17 PM", + "align": "right" + }, + { + "content": "6", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "JUnit4ClassRunner.java", + "align": "left" + }, + { + "content": "7", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "9/12/14, 3:18 PM", + "align": "right" + }, + { + "content": "16", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "JUnit38ClassRunner.java", + "align": "left" + }, + { + "content": "8", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "7/30/18, 12:07 PM", + "align": "right" + }, + { + "content": "23", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "ParentRunner.java", + "align": "left" + }, + { + "content": "9", + "align": "right" + }, + { + "content": "13", + "align": "right" + }, + { + "content": "13", + "align": "right" + }, + { + "content": "11/27/19, 1:46 PM", + "align": "right" + }, + { + "content": "97", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "FailOnTimeout.java", + "align": "left" + }, + { + "content": "10", + "align": "right" + }, + { + "content": "9", + "align": "right" + }, + { + "content": "10", + "align": "right" + }, + { + "content": "12/30/21, 2:49 AM", + "align": "right" + }, + { + "content": "40", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "BlockJUnit4ClassRunnerWithParameters.java", + "align": "left" + }, + { + "content": "11", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "7", + "align": "right" + }, + { + "content": "6/23/17, 4:16 PM", + "align": "right" + }, + { + "content": "7", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "TemporaryFolder.java", + "align": "left" + }, + { + "content": "12", + "align": "right" + }, + { + "content": "8", + "align": "right" + }, + { + "content": "11", + "align": "right" + }, + { + "content": "10/11/20, 9:56 AM", + "align": "right" + }, + { + "content": "34", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "AllMembersSupplier.java", + "align": "left" + }, + { + "content": "13", + "align": "right" + }, + { + "content": "7", + "align": "right" + }, + { + "content": "12", + "align": "right" + }, + { + "content": "6/18/14, 1:42 AM", + "align": "right" + }, + { + "content": "33", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "TestCase.java", + "align": "left" + }, + { + "content": "14", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "10", + "align": "right" + }, + { + "content": "10/28/16, 3:01 PM", + "align": "right" + }, + { + "content": "5", + "align": "right" + } + ] + } + ] + } }, - "table" : { - "headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], - "rows" : [ { - "cells" : [ { - "content" : "ParentRunner.java", - "align" : "left" - }, { - "content" : "order(Orderer)", - "align" : "left" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "11/27/19, 1:46 PM", - "align" : "right" - }, { - "content" : "97", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Theories.java", - "align" : "left" - }, { - "content" : "validateTestMethods(List<Throwable>)", - "align" : "left" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "5/25/17, 11:19 AM", - "align" : "right" - }, { - "content" : "46", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "MethodValidator.java", - "align" : "left" - }, { - "content" : "validateTestMethods(Class<?>,boolean)", - "align" : "left" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "6/4/15, 11:26 PM", - "align" : "right" - }, { - "content" : "6", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "AllMembersSupplier.java", - "align" : "left" - }, { - "content" : "addMultiPointMethods(ParameterSignature,List<PotentialAssignment>)", - "align" : "left" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "6/18/14, 1:42 AM", - "align" : "right" - }, { - "content" : "33", - "align" : "right" - } ] - } ] - } - }, { - "type" : "Dispersed Coupling", - "anchorId" : "DISPERSED_COUPLING", - "title" : "Dispersed Coupling", - "methodLevel" : true, - "problem" : "Method calls a few methods in many classes", - "solution" : "Reduce the size of the calling method. Extract methods from the calling method into the target classes.", - "maxPriority" : 14, - "chart" : { - "canvasId" : "chart_DISPERSED_COUPLING", - "bubbles" : [ { - "id" : "ParentRunner.java", - "label" : "ParentRunner.java", - "x" : 1, - "y" : 14, - "r" : 24, - "priority" : 1, - "effortRank" : 1, - "changePronenessRank" : 14, - "color" : "rgba(235, 64, 52, 0.75)", - "borderColor" : "rgb(235, 64, 52)" - }, { - "id" : "Theories.java", - "label" : "Theories.java", - "x" : 3, - "y" : 12, - "r" : 23, - "priority" : 2, - "effortRank" : 3, - "changePronenessRank" : 12, - "color" : "rgba(220, 72, 55, 0.75)", - "borderColor" : "rgb(220, 72, 55)" - }, { - "id" : "Theories.java", - "label" : "Theories.java", - "x" : 3, - "y" : 12, - "r" : 21, - "priority" : 3, - "effortRank" : 3, - "changePronenessRank" : 12, - "color" : "rgba(205, 81, 59, 0.75)", - "borderColor" : "rgb(205, 81, 59)" - }, { - "id" : "Throwables.java", - "label" : "Throwables.java", - "x" : 2, - "y" : 9, - "r" : 20, - "priority" : 4, - "effortRank" : 2, - "changePronenessRank" : 9, - "color" : "rgba(190, 89, 62, 0.75)", - "borderColor" : "rgb(190, 89, 62)" - }, { - "id" : "Assert.java", - "label" : "Assert.java", - "x" : 6, - "y" : 13, - "r" : 18, - "priority" : 5, - "effortRank" : 6, - "changePronenessRank" : 13, - "color" : "rgba(175, 98, 66, 0.75)", - "borderColor" : "rgb(175, 98, 66)" - }, { - "id" : "Throwables.java", - "label" : "Throwables.java", - "x" : 3, - "y" : 9, - "r" : 17, - "priority" : 6, - "effortRank" : 3, - "changePronenessRank" : 9, - "color" : "rgba(160, 106, 69, 0.75)", - "borderColor" : "rgb(160, 106, 69)" - }, { - "id" : "TestRunner.java", - "label" : "TestRunner.java", - "x" : 1, - "y" : 5, - "r" : 16, - "priority" : 7, - "effortRank" : 1, - "changePronenessRank" : 5, - "color" : "rgba(145, 115, 72, 0.75)", - "borderColor" : "rgb(145, 115, 72)" - }, { - "id" : "BlockJUnit4ClassRunnerWithParameters.java", - "label" : "BlockJUnit4ClassRunnerWithParameters.java", - "x" : 7, - "y" : 10, - "r" : 14, - "priority" : 8, - "effortRank" : 7, - "changePronenessRank" : 10, - "color" : "rgba(129, 123, 76, 0.75)", - "borderColor" : "rgb(129, 123, 76)" - }, { - "id" : "BaseTestRunner.java", - "label" : "BaseTestRunner.java", - "x" : 4, - "y" : 6, - "r" : 13, - "priority" : 9, - "effortRank" : 4, - "changePronenessRank" : 6, - "color" : "rgba(114, 132, 79, 0.75)", - "borderColor" : "rgb(114, 132, 79)" - }, { - "id" : "JUnit38ClassRunner.java", - "label" : "JUnit38ClassRunner.java", - "x" : 5, - "y" : 7, - "r" : 12, - "priority" : 10, - "effortRank" : 5, - "changePronenessRank" : 7, - "color" : "rgba(99, 140, 82, 0.75)", - "borderColor" : "rgb(99, 140, 82)" - }, { - "id" : "SpecificDataPointsSupplier.java", - "label" : "SpecificDataPointsSupplier.java", - "x" : 5, - "y" : 4, - "r" : 10, - "priority" : 11, - "effortRank" : 5, - "changePronenessRank" : 4, - "color" : "rgba(84, 149, 86, 0.75)", - "borderColor" : "rgb(84, 149, 86)" - }, { - "id" : "SpecificDataPointsSupplier.java", - "label" : "SpecificDataPointsSupplier.java", - "x" : 5, - "y" : 4, - "r" : 9, - "priority" : 12, - "effortRank" : 5, - "changePronenessRank" : 4, - "color" : "rgba(69, 157, 89, 0.75)", - "borderColor" : "rgb(69, 157, 89)" - }, { - "id" : "SpecificDataPointsSupplier.java", - "label" : "SpecificDataPointsSupplier.java", - "x" : 5, - "y" : 4, - "r" : 7, - "priority" : 13, - "effortRank" : 5, - "changePronenessRank" : 4, - "color" : "rgba(54, 166, 93, 0.75)", - "borderColor" : "rgb(54, 166, 93)" - }, { - "id" : "SpecificDataPointsSupplier.java", - "label" : "SpecificDataPointsSupplier.java", - "x" : 5, - "y" : 4, - "r" : 6, - "priority" : 14, - "effortRank" : 5, - "changePronenessRank" : 4, - "color" : "rgba(39, 174, 96, 0.75)", - "borderColor" : "rgb(39, 174, 96)" - } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + { + "type": "Intensive Coupling", + "anchorId": "INTENSIVE_COUPLING", + "title": "Intensive Coupling", + "methodLevel": true, + "problem": "Method calls too many methods from a few unrelated classes (often in a separate package).", + "solution": "Move the calling method to a class more closely related to the other classes that the original method can call.", + "maxPriority": 4, + "chart": { + "canvasId": "chart_INTENSIVE_COUPLING", + "bubbles": [ + { + "id": "ParentRunner.java", + "label": "ParentRunner.java", + "x": 1, + "y": 4, + "r": 24, + "priority": 1, + "effortRank": 1, + "changePronenessRank": 4, + "color": "rgba(235, 64, 52, 0.75)", + "borderColor": "rgb(235, 64, 52)" + }, + { + "id": "Theories.java", + "label": "Theories.java", + "x": 2, + "y": 3, + "r": 18, + "priority": 2, + "effortRank": 2, + "changePronenessRank": 3, + "color": "rgba(170, 101, 67, 0.75)", + "borderColor": "rgb(170, 101, 67)" + }, + { + "id": "MethodValidator.java", + "label": "MethodValidator.java", + "x": 1, + "y": 1, + "r": 12, + "priority": 3, + "effortRank": 1, + "changePronenessRank": 1, + "color": "rgba(104, 137, 81, 0.75)", + "borderColor": "rgb(104, 137, 81)" + }, + { + "id": "AllMembersSupplier.java", + "label": "AllMembersSupplier.java", + "x": 3, + "y": 2, + "r": 6, + "priority": 4, + "effortRank": 3, + "changePronenessRank": 2, + "color": "rgba(39, 174, 96, 0.75)", + "borderColor": "rgb(39, 174, 96)" + } + ], + "xaxisLabel": "Effort to refactor", + "yaxisLabel": "Relative churn (impact)" + }, + "table": { + "headers": [ + "Class", + "Method", + "Priority", + "Change Proneness Rank", + "Effort Rank", + "Most Recent Commit Date", + "Commit Count" + ], + "rows": [ + { + "cells": [ + { + "content": "ParentRunner.java", + "align": "left" + }, + { + "content": "order(Orderer)", + "align": "left" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "11/27/19, 1:46 PM", + "align": "right" + }, + { + "content": "97", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Theories.java", + "align": "left" + }, + { + "content": "validateTestMethods(List<Throwable>)", + "align": "left" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "5/25/17, 11:19 AM", + "align": "right" + }, + { + "content": "46", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "MethodValidator.java", + "align": "left" + }, + { + "content": "validateTestMethods(Class<?>,boolean)", + "align": "left" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "6/4/15, 11:26 PM", + "align": "right" + }, + { + "content": "6", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "AllMembersSupplier.java", + "align": "left" + }, + { + "content": "addMultiPointMethods(ParameterSignature,List<PotentialAssignment>)", + "align": "left" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "6/18/14, 1:42 AM", + "align": "right" + }, + { + "content": "33", + "align": "right" + } + ] + } + ] + } }, - "table" : { - "headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], - "rows" : [ { - "cells" : [ { - "content" : "ParentRunner.java", - "align" : "left" - }, { - "content" : "filter(Filter)", - "align" : "left" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "14", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "11/27/19, 1:46 PM", - "align" : "right" - }, { - "content" : "97", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Theories.java", - "align" : "left" - }, { - "content" : "validateDataPointMethods(List<Throwable>)", - "align" : "left" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "12", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "5/25/17, 11:19 AM", - "align" : "right" - }, { - "content" : "46", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Theories.java", - "align" : "left" - }, { - "content" : "validateDataPointFields(List<Throwable>)", - "align" : "left" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "12", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "5/25/17, 11:19 AM", - "align" : "right" - }, { - "content" : "46", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Throwables.java", - "align" : "left" - }, { - "content" : "getCauseStackTraceLines(Throwable)", - "align" : "left" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "9", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "1/4/21, 4:25 PM", - "align" : "right" - }, { - "content" : "8", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Assert.java", - "align" : "left" - }, { - "content" : "assertThrows(String,Class<T>,ThrowingRunnable)", - "align" : "left" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "13", - "align" : "right" - }, { - "content" : "6", - "align" : "right" - }, { - "content" : "9/6/20, 12:53 PM", - "align" : "right" - }, { - "content" : "62", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Throwables.java", - "align" : "left" - }, { - "content" : "getTrimmedStackTraceLines(Throwable)", - "align" : "left" - }, { - "content" : "6", - "align" : "right" - }, { - "content" : "9", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "1/4/21, 4:25 PM", - "align" : "right" - }, { - "content" : "8", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "TestRunner.java", - "align" : "left" - }, { - "content" : "start(String[])", - "align" : "left" - }, { - "content" : "7", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "3/29/15, 4:17 PM", - "align" : "right" - }, { - "content" : "6", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "BlockJUnit4ClassRunnerWithParameters.java", - "align" : "left" - }, { - "content" : "createTestUsingFieldInjection()", - "align" : "left" - }, { - "content" : "8", - "align" : "right" - }, { - "content" : "10", - "align" : "right" - }, { - "content" : "7", - "align" : "right" - }, { - "content" : "6/23/17, 4:16 PM", - "align" : "right" - }, { - "content" : "7", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "BaseTestRunner.java", - "align" : "left" - }, { - "content" : "getTest(String)", - "align" : "left" - }, { - "content" : "9", - "align" : "right" - }, { - "content" : "6", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "10/14/16, 5:19 PM", - "align" : "right" - }, { - "content" : "9", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "JUnit38ClassRunner.java", - "align" : "left" - }, { - "content" : "makeDescription(Test)", - "align" : "left" - }, { - "content" : "10", - "align" : "right" - }, { - "content" : "7", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "7/30/18, 12:07 PM", - "align" : "right" - }, { - "content" : "23", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "SpecificDataPointsSupplier.java", - "align" : "left" - }, { - "content" : "getDataPointsMethods(ParameterSignature)", - "align" : "left" - }, { - "content" : "11", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "3/16/13, 7:30 PM", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "SpecificDataPointsSupplier.java", - "align" : "left" - }, { - "content" : "getDataPointsFields(ParameterSignature)", - "align" : "left" - }, { - "content" : "12", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "3/16/13, 7:30 PM", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "SpecificDataPointsSupplier.java", - "align" : "left" - }, { - "content" : "getSingleDataPointMethods(ParameterSignature)", - "align" : "left" - }, { - "content" : "13", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "3/16/13, 7:30 PM", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "SpecificDataPointsSupplier.java", - "align" : "left" - }, { - "content" : "getSingleDataPointFields(ParameterSignature)", - "align" : "left" - }, { - "content" : "14", - "align" : "right" - }, { - "content" : "4", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - }, { - "content" : "3/16/13, 7:30 PM", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - } ] - } ] - } - }, { - "type" : "Shotgun Surgery", - "anchorId" : "SHOTGUN_SURGERY", - "title" : "Shotgun Surgery", - "methodLevel" : true, - "problem" : "Method is called by many methods in many classes", - "solution" : "- Move the method closer to the calling classes (move the behavior closer to the data) if it is small.
- If it is a large method, treat it as a Brain Method and decompose it into two or more smaller methods.", - "maxPriority" : 3, - "chart" : { - "canvasId" : "chart_SHOTGUN_SURGERY", - "bubbles" : [ { - "id" : "FrameworkMethod.java", - "label" : "FrameworkMethod.java", - "x" : 1, - "y" : 2, - "r" : 24, - "priority" : 1, - "effortRank" : 1, - "changePronenessRank" : 2, - "color" : "rgba(235, 64, 52, 0.75)", - "borderColor" : "rgb(235, 64, 52)" - }, { - "id" : "TestClass.java", - "label" : "TestClass.java", - "x" : 2, - "y" : 3, - "r" : 15, - "priority" : 2, - "effortRank" : 2, - "changePronenessRank" : 3, - "color" : "rgba(137, 119, 74, 0.75)", - "borderColor" : "rgb(137, 119, 74)" - }, { - "id" : "Statement.java", - "label" : "Statement.java", - "x" : 3, - "y" : 1, - "r" : 6, - "priority" : 3, - "effortRank" : 3, - "changePronenessRank" : 1, - "color" : "rgba(39, 174, 96, 0.75)", - "borderColor" : "rgb(39, 174, 96)" - } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + { + "type": "Dispersed Coupling", + "anchorId": "DISPERSED_COUPLING", + "title": "Dispersed Coupling", + "methodLevel": true, + "problem": "Method calls a few methods in many classes", + "solution": "Reduce the size of the calling method. Extract methods from the calling method into the target classes.", + "maxPriority": 14, + "chart": { + "canvasId": "chart_DISPERSED_COUPLING", + "bubbles": [ + { + "id": "ParentRunner.java", + "label": "ParentRunner.java", + "x": 1, + "y": 14, + "r": 24, + "priority": 1, + "effortRank": 1, + "changePronenessRank": 14, + "color": "rgba(235, 64, 52, 0.75)", + "borderColor": "rgb(235, 64, 52)" + }, + { + "id": "Theories.java", + "label": "Theories.java", + "x": 3, + "y": 12, + "r": 23, + "priority": 2, + "effortRank": 3, + "changePronenessRank": 12, + "color": "rgba(220, 72, 55, 0.75)", + "borderColor": "rgb(220, 72, 55)" + }, + { + "id": "Theories.java", + "label": "Theories.java", + "x": 3, + "y": 12, + "r": 21, + "priority": 3, + "effortRank": 3, + "changePronenessRank": 12, + "color": "rgba(205, 81, 59, 0.75)", + "borderColor": "rgb(205, 81, 59)" + }, + { + "id": "Throwables.java", + "label": "Throwables.java", + "x": 2, + "y": 9, + "r": 20, + "priority": 4, + "effortRank": 2, + "changePronenessRank": 9, + "color": "rgba(190, 89, 62, 0.75)", + "borderColor": "rgb(190, 89, 62)" + }, + { + "id": "Assert.java", + "label": "Assert.java", + "x": 6, + "y": 13, + "r": 18, + "priority": 5, + "effortRank": 6, + "changePronenessRank": 13, + "color": "rgba(175, 98, 66, 0.75)", + "borderColor": "rgb(175, 98, 66)" + }, + { + "id": "Throwables.java", + "label": "Throwables.java", + "x": 3, + "y": 9, + "r": 17, + "priority": 6, + "effortRank": 3, + "changePronenessRank": 9, + "color": "rgba(160, 106, 69, 0.75)", + "borderColor": "rgb(160, 106, 69)" + }, + { + "id": "TestRunner.java", + "label": "TestRunner.java", + "x": 1, + "y": 5, + "r": 16, + "priority": 7, + "effortRank": 1, + "changePronenessRank": 5, + "color": "rgba(145, 115, 72, 0.75)", + "borderColor": "rgb(145, 115, 72)" + }, + { + "id": "BlockJUnit4ClassRunnerWithParameters.java", + "label": "BlockJUnit4ClassRunnerWithParameters.java", + "x": 7, + "y": 10, + "r": 14, + "priority": 8, + "effortRank": 7, + "changePronenessRank": 10, + "color": "rgba(129, 123, 76, 0.75)", + "borderColor": "rgb(129, 123, 76)" + }, + { + "id": "BaseTestRunner.java", + "label": "BaseTestRunner.java", + "x": 4, + "y": 6, + "r": 13, + "priority": 9, + "effortRank": 4, + "changePronenessRank": 6, + "color": "rgba(114, 132, 79, 0.75)", + "borderColor": "rgb(114, 132, 79)" + }, + { + "id": "JUnit38ClassRunner.java", + "label": "JUnit38ClassRunner.java", + "x": 5, + "y": 7, + "r": 12, + "priority": 10, + "effortRank": 5, + "changePronenessRank": 7, + "color": "rgba(99, 140, 82, 0.75)", + "borderColor": "rgb(99, 140, 82)" + }, + { + "id": "SpecificDataPointsSupplier.java", + "label": "SpecificDataPointsSupplier.java", + "x": 5, + "y": 4, + "r": 10, + "priority": 11, + "effortRank": 5, + "changePronenessRank": 4, + "color": "rgba(84, 149, 86, 0.75)", + "borderColor": "rgb(84, 149, 86)" + }, + { + "id": "SpecificDataPointsSupplier.java", + "label": "SpecificDataPointsSupplier.java", + "x": 5, + "y": 4, + "r": 9, + "priority": 12, + "effortRank": 5, + "changePronenessRank": 4, + "color": "rgba(69, 157, 89, 0.75)", + "borderColor": "rgb(69, 157, 89)" + }, + { + "id": "SpecificDataPointsSupplier.java", + "label": "SpecificDataPointsSupplier.java", + "x": 5, + "y": 4, + "r": 7, + "priority": 13, + "effortRank": 5, + "changePronenessRank": 4, + "color": "rgba(54, 166, 93, 0.75)", + "borderColor": "rgb(54, 166, 93)" + }, + { + "id": "SpecificDataPointsSupplier.java", + "label": "SpecificDataPointsSupplier.java", + "x": 5, + "y": 4, + "r": 6, + "priority": 14, + "effortRank": 5, + "changePronenessRank": 4, + "color": "rgba(39, 174, 96, 0.75)", + "borderColor": "rgb(39, 174, 96)" + } + ], + "xaxisLabel": "Effort to refactor", + "yaxisLabel": "Relative churn (impact)" + }, + "table": { + "headers": [ + "Class", + "Method", + "Priority", + "Change Proneness Rank", + "Effort Rank", + "Most Recent Commit Date", + "Commit Count" + ], + "rows": [ + { + "cells": [ + { + "content": "ParentRunner.java", + "align": "left" + }, + { + "content": "filter(Filter)", + "align": "left" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "14", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "11/27/19, 1:46 PM", + "align": "right" + }, + { + "content": "97", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Theories.java", + "align": "left" + }, + { + "content": "validateDataPointMethods(List<Throwable>)", + "align": "left" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "12", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "5/25/17, 11:19 AM", + "align": "right" + }, + { + "content": "46", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Theories.java", + "align": "left" + }, + { + "content": "validateDataPointFields(List<Throwable>)", + "align": "left" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "12", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "5/25/17, 11:19 AM", + "align": "right" + }, + { + "content": "46", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Throwables.java", + "align": "left" + }, + { + "content": "getCauseStackTraceLines(Throwable)", + "align": "left" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "9", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "1/4/21, 4:25 PM", + "align": "right" + }, + { + "content": "8", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Assert.java", + "align": "left" + }, + { + "content": "assertThrows(String,Class<T>,ThrowingRunnable)", + "align": "left" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "13", + "align": "right" + }, + { + "content": "6", + "align": "right" + }, + { + "content": "9/6/20, 12:53 PM", + "align": "right" + }, + { + "content": "62", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Throwables.java", + "align": "left" + }, + { + "content": "getTrimmedStackTraceLines(Throwable)", + "align": "left" + }, + { + "content": "6", + "align": "right" + }, + { + "content": "9", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "1/4/21, 4:25 PM", + "align": "right" + }, + { + "content": "8", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "TestRunner.java", + "align": "left" + }, + { + "content": "start(String[])", + "align": "left" + }, + { + "content": "7", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "3/29/15, 4:17 PM", + "align": "right" + }, + { + "content": "6", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "BlockJUnit4ClassRunnerWithParameters.java", + "align": "left" + }, + { + "content": "createTestUsingFieldInjection()", + "align": "left" + }, + { + "content": "8", + "align": "right" + }, + { + "content": "10", + "align": "right" + }, + { + "content": "7", + "align": "right" + }, + { + "content": "6/23/17, 4:16 PM", + "align": "right" + }, + { + "content": "7", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "BaseTestRunner.java", + "align": "left" + }, + { + "content": "getTest(String)", + "align": "left" + }, + { + "content": "9", + "align": "right" + }, + { + "content": "6", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "10/14/16, 5:19 PM", + "align": "right" + }, + { + "content": "9", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "JUnit38ClassRunner.java", + "align": "left" + }, + { + "content": "makeDescription(Test)", + "align": "left" + }, + { + "content": "10", + "align": "right" + }, + { + "content": "7", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "7/30/18, 12:07 PM", + "align": "right" + }, + { + "content": "23", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "SpecificDataPointsSupplier.java", + "align": "left" + }, + { + "content": "getDataPointsMethods(ParameterSignature)", + "align": "left" + }, + { + "content": "11", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "3/16/13, 7:30 PM", + "align": "right" + }, + { + "content": "2", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "SpecificDataPointsSupplier.java", + "align": "left" + }, + { + "content": "getDataPointsFields(ParameterSignature)", + "align": "left" + }, + { + "content": "12", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "3/16/13, 7:30 PM", + "align": "right" + }, + { + "content": "2", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "SpecificDataPointsSupplier.java", + "align": "left" + }, + { + "content": "getSingleDataPointMethods(ParameterSignature)", + "align": "left" + }, + { + "content": "13", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "3/16/13, 7:30 PM", + "align": "right" + }, + { + "content": "2", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "SpecificDataPointsSupplier.java", + "align": "left" + }, + { + "content": "getSingleDataPointFields(ParameterSignature)", + "align": "left" + }, + { + "content": "14", + "align": "right" + }, + { + "content": "4", + "align": "right" + }, + { + "content": "5", + "align": "right" + }, + { + "content": "3/16/13, 7:30 PM", + "align": "right" + }, + { + "content": "2", + "align": "right" + } + ] + } + ] + } }, - "table" : { - "headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], - "rows" : [ { - "cells" : [ { - "content" : "FrameworkMethod.java", - "align" : "left" - }, { - "content" : "getName()", - "align" : "left" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "4/3/18, 9:57 PM", - "align" : "right" - }, { - "content" : "34", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "TestClass.java", - "align" : "left" - }, { - "content" : "getAnnotatedMethods(Class<?>)", - "align" : "left" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "4/13/19, 5:49 PM", - "align" : "right" - }, { - "content" : "51", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "Statement.java", - "align" : "left" - }, { - "content" : "evaluate()", - "align" : "left" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "1", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "10/4/12, 3:16 PM", - "align" : "right" - }, { - "content" : "5", - "align" : "right" - } ] - } ] + { + "type": "Shotgun Surgery", + "anchorId": "SHOTGUN_SURGERY", + "title": "Shotgun Surgery", + "methodLevel": true, + "problem": "Method is called by many methods in many classes", + "solution": "- Move the method closer to the calling classes (move the behavior closer to the data) if it is small.
- If it is a large method, treat it as a Brain Method and decompose it into two or more smaller methods.", + "maxPriority": 3, + "chart": { + "canvasId": "chart_SHOTGUN_SURGERY", + "bubbles": [ + { + "id": "FrameworkMethod.java", + "label": "FrameworkMethod.java", + "x": 1, + "y": 2, + "r": 24, + "priority": 1, + "effortRank": 1, + "changePronenessRank": 2, + "color": "rgba(235, 64, 52, 0.75)", + "borderColor": "rgb(235, 64, 52)" + }, + { + "id": "TestClass.java", + "label": "TestClass.java", + "x": 2, + "y": 3, + "r": 15, + "priority": 2, + "effortRank": 2, + "changePronenessRank": 3, + "color": "rgba(137, 119, 74, 0.75)", + "borderColor": "rgb(137, 119, 74)" + }, + { + "id": "Statement.java", + "label": "Statement.java", + "x": 3, + "y": 1, + "r": 6, + "priority": 3, + "effortRank": 3, + "changePronenessRank": 1, + "color": "rgba(39, 174, 96, 0.75)", + "borderColor": "rgb(39, 174, 96)" + } + ], + "xaxisLabel": "Effort to refactor", + "yaxisLabel": "Relative churn (impact)" + }, + "table": { + "headers": [ + "Class", + "Method", + "Priority", + "Change Proneness Rank", + "Effort Rank", + "Most Recent Commit Date", + "Commit Count" + ], + "rows": [ + { + "cells": [ + { + "content": "FrameworkMethod.java", + "align": "left" + }, + { + "content": "getName()", + "align": "left" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "4/3/18, 9:57 PM", + "align": "right" + }, + { + "content": "34", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "TestClass.java", + "align": "left" + }, + { + "content": "getAnnotatedMethods(Class<?>)", + "align": "left" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "2", + "align": "right" + }, + { + "content": "4/13/19, 5:49 PM", + "align": "right" + }, + { + "content": "51", + "align": "right" + } + ] + }, + { + "cells": [ + { + "content": "Statement.java", + "align": "left" + }, + { + "content": "evaluate()", + "align": "left" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "1", + "align": "right" + }, + { + "content": "3", + "align": "right" + }, + { + "content": "10/4/12, 3:16 PM", + "align": "right" + }, + { + "content": "5", + "align": "right" + } + ] + } + ] + } } - } ], - "classCycles" : { - "hasCycles" : true, - "summary" : [ { - "cycleName" : "JUnitCore", - "priority" : 1, - "classCount" : 9, - "relationshipCount" : 16 - }, { - "cycleName" : "InexactComparisonCriteria", - "priority" : 2, - "classCount" : 7, - "relationshipCount" : 13 - }, { - "cycleName" : "RuleMemberValidator$MethodMustBeARule", - "priority" : 3, - "classCount" : 7, - "relationshipCount" : 12 - }, { - "cycleName" : "Ordering", - "priority" : 4, - "classCount" : 6, - "relationshipCount" : 11 - }, { - "cycleName" : "Throwables", - "priority" : 5, - "classCount" : 6, - "relationshipCount" : 10 - }, { - "cycleName" : "ComparisonFailure", - "priority" : 6, - "classCount" : 6, - "relationshipCount" : 11 - }, { - "cycleName" : "TestResult", - "priority" : 7, - "classCount" : 5, - "relationshipCount" : 9 - }, { - "cycleName" : "Result", - "priority" : 8, - "classCount" : 4, - "relationshipCount" : 7 - }, { - "cycleName" : "FilterFactories", - "priority" : 9, - "classCount" : 4, - "relationshipCount" : 6 - }, { - "cycleName" : "ComparisonFailure$ComparisonCompactor", - "priority" : 10, - "classCount" : 4, - "relationshipCount" : 5 - }, { - "cycleName" : "MaxHistory", - "priority" : 11, - "classCount" : 3, - "relationshipCount" : 4 - }, { - "cycleName" : "ComparisonCompactor", - "priority" : 12, - "classCount" : 3, - "relationshipCount" : 3 - }, { - "cycleName" : "Filterable", - "priority" : 13, - "classCount" : 3, - "relationshipCount" : 4 - }, { - "cycleName" : "Timeout$Builder", - "priority" : 14, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "Stopwatch$InternalWatcher", - "priority" : 15, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "JUnit4TestAdapter", - "priority" : 16, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "MultipleFailureException", - "priority" : 17, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "ExpectedException$ExpectedExceptionStatement", - "priority" : 18, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "TemporaryFolder$Builder", - "priority" : 19, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "RunNotifier$SafeNotifier", - "priority" : 20, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "AllMembersSupplier", - "priority" : 21, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "FromDataPoints", - "priority" : 22, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "TestedOn", - "priority" : 23, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "FailOnTimeout", - "priority" : 24, - "classCount" : 2, - "relationshipCount" : 2 - }, { - "cycleName" : "Categories", - "priority" : 25, - "classCount" : 2, - "relationshipCount" : 2 - } ], - "largestCycle" : { - "hasCycleMap" : true, - "cycleName" : "JUnitCore", - "cycleIdentifier" : "graph_JUnitCore_1l7a2el", - "classCount" : 9, - "relationshipCount" : 16, - "dot" : "strict digraph G {\nRequest -> JUnitCore [ label = \"1\" weight = \"1\" color = \"red\" ];\nJUnitCore -> JUnitCommandLineParseResult [ label = \"3\" weight = \"3\" ];\nJUnitCore -> Request [ label = \"3\" weight = \"3\" ];\nFilterRequest -> Request [ label = \"4\" weight = \"4\" ];\nMemoizingRequest -> Request [ label = \"1\" weight = \"1\" color = \"red\" ];\nOrderingRequest -> Request [ label = \"3\" weight = \"3\" color = \"red\" ];\nSortingRequest -> Request [ label = \"4\" weight = \"4\" ];\nFilterFactories -> Request [ label = \"2\" weight = \"2\" ];\nJUnitCommandLineParseResult -> Request [ label = \"8\" weight = \"8\" ];\nRequest -> ClassRequest [ label = \"2\" weight = \"2\" ];\nRequest -> FilterRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> SortingRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> OrderingRequest [ label = \"1\" weight = \"1\" ];\nOrderingRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nClassRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> FilterFactories [ label = \"1\" weight = \"1\" ];\nJUnitCore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCore.java\" target=\"_blank\"];\nRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Request.java\" target=\"_blank\" color=red style=filled];\nOrderingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/OrderingRequest.java\" target=\"_blank\"];\nMemoizingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/MemoizingRequest.java\" target=\"_blank\"];\nSortingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/SortingRequest.java\" target=\"_blank\"];\nFilterRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/FilterRequest.java\" target=\"_blank\"];\nClassRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\"];\nJUnitCommandLineParseResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCommandLineParseResult.java\" target=\"_blank\"];\nFilterFactories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactories.java\" target=\"_blank\"];\n}", - "dotThresholdExceeded" : false, - "breakdown" : [ { - "className" : "JUnitCore", - "edgesHtml" : "JUnitCore → JUnitCommandLineParseResult : 3
\nJUnitCore → Request : 3
\n" - }, { - "className" : "Request*", - "edgesHtml" : "Request → JUnitCore : 1*
\nRequest → ClassRequest : 2
\nRequest → FilterRequest : 1*
\nRequest → SortingRequest : 1*
\nRequest → OrderingRequest : 1
\n" - }, { - "className" : "OrderingRequest", - "edgesHtml" : "OrderingRequest → Request : 3*
\nOrderingRequest → MemoizingRequest : 1
\n" - }, { - "className" : "MemoizingRequest", - "edgesHtml" : "MemoizingRequest → Request : 1*
\n" - }, { - "className" : "SortingRequest", - "edgesHtml" : "SortingRequest → Request : 4
\n" - }, { - "className" : "FilterRequest", - "edgesHtml" : "FilterRequest → Request : 4
\n" - }, { - "className" : "ClassRequest", - "edgesHtml" : "ClassRequest → MemoizingRequest : 1
\n" - }, { - "className" : "JUnitCommandLineParseResult", - "edgesHtml" : "JUnitCommandLineParseResult → Request : 8
\nJUnitCommandLineParseResult → FilterFactories : 1
\n" - }, { - "className" : "FilterFactories", - "edgesHtml" : "FilterFactories → Request : 2
\n" - } ] + ], + "classCycles": { + "hasCycles": true, + "summary": [ + { + "cycleName": "JUnitCore", + "priority": 1, + "classCount": 9, + "relationshipCount": 16 + }, + { + "cycleName": "InexactComparisonCriteria", + "priority": 2, + "classCount": 7, + "relationshipCount": 13 + }, + { + "cycleName": "RuleMemberValidator$MethodMustBeARule", + "priority": 3, + "classCount": 7, + "relationshipCount": 12 + }, + { + "cycleName": "Ordering", + "priority": 4, + "classCount": 6, + "relationshipCount": 11 + }, + { + "cycleName": "Throwables", + "priority": 5, + "classCount": 6, + "relationshipCount": 10 + }, + { + "cycleName": "ComparisonFailure", + "priority": 6, + "classCount": 6, + "relationshipCount": 11 + }, + { + "cycleName": "TestResult", + "priority": 7, + "classCount": 5, + "relationshipCount": 9 + }, + { + "cycleName": "Result", + "priority": 8, + "classCount": 4, + "relationshipCount": 7 + }, + { + "cycleName": "FilterFactories", + "priority": 9, + "classCount": 4, + "relationshipCount": 6 + }, + { + "cycleName": "ComparisonFailure$ComparisonCompactor", + "priority": 10, + "classCount": 4, + "relationshipCount": 5 + }, + { + "cycleName": "MaxHistory", + "priority": 11, + "classCount": 3, + "relationshipCount": 4 + }, + { + "cycleName": "ComparisonCompactor", + "priority": 12, + "classCount": 3, + "relationshipCount": 3 + }, + { + "cycleName": "Filterable", + "priority": 13, + "classCount": 3, + "relationshipCount": 4 + }, + { + "cycleName": "Timeout$Builder", + "priority": 14, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "Stopwatch$InternalWatcher", + "priority": 15, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "JUnit4TestAdapter", + "priority": 16, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "MultipleFailureException", + "priority": 17, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "ExpectedException$ExpectedExceptionStatement", + "priority": 18, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "TemporaryFolder$Builder", + "priority": 19, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "RunNotifier$SafeNotifier", + "priority": 20, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "AllMembersSupplier", + "priority": 21, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "FromDataPoints", + "priority": 22, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "TestedOn", + "priority": 23, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "FailOnTimeout", + "priority": 24, + "classCount": 2, + "relationshipCount": 2 + }, + { + "cycleName": "Categories", + "priority": 25, + "classCount": 2, + "relationshipCount": 2 + } + ], + "largestCycle": { + "hasCycleMap": true, + "cycleName": "JUnitCore", + "cycleIdentifier": "graph_JUnitCore_1l7a2el", + "classCount": 9, + "relationshipCount": 16, + "dot": "strict digraph G {\nRequest -> JUnitCore [ label = \"1\" weight = \"1\" color = \"red\" ];\nJUnitCore -> JUnitCommandLineParseResult [ label = \"3\" weight = \"3\" ];\nJUnitCore -> Request [ label = \"3\" weight = \"3\" ];\nFilterRequest -> Request [ label = \"4\" weight = \"4\" ];\nMemoizingRequest -> Request [ label = \"1\" weight = \"1\" color = \"red\" ];\nOrderingRequest -> Request [ label = \"3\" weight = \"3\" color = \"red\" ];\nSortingRequest -> Request [ label = \"4\" weight = \"4\" ];\nFilterFactories -> Request [ label = \"2\" weight = \"2\" ];\nJUnitCommandLineParseResult -> Request [ label = \"8\" weight = \"8\" ];\nRequest -> ClassRequest [ label = \"2\" weight = \"2\" ];\nRequest -> FilterRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> SortingRequest [ label = \"1\" weight = \"1\" color = \"red\" ];\nRequest -> OrderingRequest [ label = \"1\" weight = \"1\" ];\nOrderingRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nClassRequest -> MemoizingRequest [ label = \"1\" weight = \"1\" ];\nJUnitCommandLineParseResult -> FilterFactories [ label = \"1\" weight = \"1\" ];\nJUnitCore [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCore.java\" target=\"_blank\"];\nRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/Request.java\" target=\"_blank\" color=red style=filled];\nOrderingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/OrderingRequest.java\" target=\"_blank\"];\nMemoizingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/MemoizingRequest.java\" target=\"_blank\"];\nSortingRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/SortingRequest.java\" target=\"_blank\"];\nFilterRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/FilterRequest.java\" target=\"_blank\"];\nClassRequest [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/internal/requests/ClassRequest.java\" target=\"_blank\"];\nJUnitCommandLineParseResult [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/JUnitCommandLineParseResult.java\" target=\"_blank\"];\nFilterFactories [URL=\"https://github.com/junit-team/junit4/blob/300468b1efd48d76fac2f7bd6d576846dcbbf5ed/src/main/java/org/junit/runner/FilterFactories.java\" target=\"_blank\"];\n}", + "dotThresholdExceeded": false, + "breakdown": [ + { + "className": "JUnitCore", + "edgesHtml": "JUnitCore → JUnitCommandLineParseResult : 3
\nJUnitCore → Request : 3
\n" + }, + { + "className": "Request*", + "edgesHtml": "Request → JUnitCore : 1*
\nRequest → ClassRequest : 2
\nRequest → FilterRequest : 1*
\nRequest → SortingRequest : 1*
\nRequest → OrderingRequest : 1
\n" + }, + { + "className": "OrderingRequest", + "edgesHtml": "OrderingRequest → Request : 3*
\nOrderingRequest → MemoizingRequest : 1
\n" + }, + { + "className": "MemoizingRequest", + "edgesHtml": "MemoizingRequest → Request : 1*
\n" + }, + { + "className": "SortingRequest", + "edgesHtml": "SortingRequest → Request : 4
\n" + }, + { + "className": "FilterRequest", + "edgesHtml": "FilterRequest → Request : 4
\n" + }, + { + "className": "ClassRequest", + "edgesHtml": "ClassRequest → MemoizingRequest : 1
\n" + }, + { + "className": "JUnitCommandLineParseResult", + "edgesHtml": "JUnitCommandLineParseResult → Request : 8
\nJUnitCommandLineParseResult → FilterFactories : 1
\n" + }, + { + "className": "FilterFactories", + "edgesHtml": "FilterFactories → Request : 2
\n" + } + ] } } } \ No newline at end of file diff --git a/tests/unit/renderer.test.js b/tests/unit/renderer.test.js index ff99e86..65b8f28 100644 --- a/tests/unit/renderer.test.js +++ b/tests/unit/renderer.test.js @@ -2,7 +2,7 @@ import { describe, it, expect } from 'bun:test'; import { JSDOM } from 'jsdom'; import { readFileSync } from 'node:fs'; import path from 'node:path'; -import { renderTemplate, initializeMustache, prepareReportData } from '../../lib/renderer.js'; +import { renderTemplate, initializeMustache, prepareReportData, classRelationshipMarkup } from '../../lib/renderer.js'; import { TABLE_CONFIG } from '../../lib/table-operations.js'; describe('Mustache Rendering', () => { @@ -185,11 +185,12 @@ describe('templating safety (repository-provided templates are untrusted)', () = }); // --------------------------------------------------------------------------- -// Source-link cell output: both report templates render the class- -// relationships cell inline; the rendering layer owns -// the link-safety behavior around it. These guards pin the rendered output -// so template or renderer changes cannot silently drop or weaken the -// source links. +// Source-link cell output: the report JSON carries the structured +// ClassRelationshipDTO fields (sourceClassPath/targetClassPath relative to +// the project root plus the simple class names), and the rendering layer +// combines them with project.repoUrl, owns the link-safety behavior and +// sanitizes the result. These guards pin the rendered output so template or +// renderer changes cannot silently drop or weaken the source links. // --------------------------------------------------------------------------- describe('source-link cell rendering (owned by the report rendering layer)', () => { @@ -197,52 +198,225 @@ describe('source-link cell rendering (owned by the report rendering layer)', () readFileSync(path.join(import.meta.dir, '../fixtures/junit4-report.json'), 'utf8') ); + const REPO_URL = + 'https://github.com/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/'; + const REPORT_WRITER_PATH = + 'report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java'; + + it('builds the class-relationship markup from repoUrl, class paths and simple class names', () => { + // The exact example: repoUrl + sourceClassPath/targetClassPath form the + // hyperlink targets, the simple class names the anchor text, separated + // by the → arrow. + expect(classRelationshipMarkup( + { + sourceClassPath: REPORT_WRITER_PATH, + targetClassPath: REPORT_WRITER_PATH, + simpleSourceClassName: 'ReportWriter$SecureDirectoryOps', + simpleTargetClassName: 'ReportWriter$FallbackDirectoryOps' + }, + REPO_URL + )).toBe( + 'ReportWriter$SecureDirectoryOps ' + + '→ ' + + 'ReportWriter$FallbackDirectoryOps' + ); + }); + + it('appends the removal marker to marked classes', () => { + expect(classRelationshipMarkup( + { + sourceClassPath: 'src/main/java/demo/A.java', + targetClassPath: 'src/main/java/demo/B.java', + simpleSourceClassName: 'A', + simpleTargetClassName: 'B', + sourceMarked: true, + targetMarked: true + }, + 'https://github.com/demo/repo/blob/main/' + )).toBe( + 'A* ' + + '→ ' + + 'B*' + ); + }); + + it('returns null for entries without the structured class-relationship fields', () => { + expect(classRelationshipMarkup(null, REPO_URL)).toBeNull(); + expect(classRelationshipMarkup('legacy label', REPO_URL)).toBeNull(); + expect(classRelationshipMarkup({ sourceClass: 'org.example.A' }, REPO_URL)).toBeNull(); + expect(classRelationshipMarkup({ renderedLabel: 'A' }, REPO_URL)).toBeNull(); + }); + for (const templatePath of ['assets', 'public/assets']) { - it(`restricts relationship labels to links and markers in ${templatePath}`, () => { + it(`renders hardened source links in the class-relationships cell (${templatePath})`, () => { const template = readFileSync( path.join(import.meta.dir, `../../${templatePath}/refactor-first-report.mustache`), 'utf8' ); - const renderedLabel = - '' + - '' + - '* → Target : 1' + - '' + - 'Unsafe'; - const data = structuredClone(junitFixture); - for (const key of ['classRelationshipsToRemove', 'packageRelationshipsToRemove']) { - data[key].relationships = [ - { ...data[key].relationships[0], renderedLabel, - safeRenderedLabel: '' }, - { priority: 2, renderedLabel: null, safeRenderedLabel: 'Forged' } - ]; - } + const data = { + project: { name: 'Demo', version: '1.0', repoUrl: REPO_URL }, + classRelationshipsToRemove: { + hasRelationships: true, + relationships: [ + { + sourceClassPath: REPORT_WRITER_PATH, + targetClassPath: REPORT_WRITER_PATH, + simpleSourceClassName: 'ReportWriter$SecureDirectoryOps', + simpleTargetClassName: 'ReportWriter$FallbackDirectoryOps', + sourceMarked: false, + targetMarked: false, + priority: 1, + cycleCount: 1, + effortRank: 1, + alsoRemovesPackageRelationship: false, + packageCycleCount: 0 + }, + // An entry without the structured fields renders an empty cell + { priority: 2 } + ] + }, + packageRelationshipsToRemove: { hasRelationships: false, relationships: [] } + }; const original = structuredClone(data); const html = renderTemplate(template, prepareReportData(data)); const doc = new JSDOM(html).window.document; expect(data).toEqual(original); - expect(html).not.toContain('body {'); - for (const table of ['class-relationships', 'package-relationships']) { - const cells = doc.querySelectorAll(`table[data-rf-table="${table}"] tbody tr td:first-child`); - const cell = cells[0]; - expect(cell.textContent).toContain('Source* → Target : 1'); - expect(cell.querySelector('strong')?.textContent).toBe('*'); - expect(cell.querySelector('a')?.getAttribute('href')).toBe('https://example.com/source'); - expect(cell.querySelector('a')?.getAttribute('target')).toBe('_blank'); - expect(cell.querySelector('a')?.getAttribute('rel')).toBe('noopener noreferrer'); - expect(cell.querySelector('a:last-child')?.hasAttribute('href')).toBe(false); - for (const element of cell.querySelectorAll('*')) { - expect(['A', 'STRONG']).toContain(element.tagName); - for (const attribute of element.attributes) { - expect(['href', 'target', 'rel']).toContain(attribute.name); - } + const cells = doc.querySelectorAll('table[data-rf-table="class-relationships"] tbody tr td:first-child'); + const cell = cells[0]; + const anchors = cell.querySelectorAll('a'); + expect(anchors.length).toBe(2); + expect(anchors[0].getAttribute('href')).toBe(REPO_URL + REPORT_WRITER_PATH); + expect(anchors[0].getAttribute('target')).toBe('_blank'); + expect(anchors[0].getAttribute('rel')).toBe('noopener noreferrer'); + expect(anchors[0].textContent).toBe('ReportWriter$SecureDirectoryOps'); + expect(anchors[1].getAttribute('href')).toBe(REPO_URL + REPORT_WRITER_PATH); + expect(anchors[1].textContent).toBe('ReportWriter$FallbackDirectoryOps'); + expect(cell.textContent).toBe('ReportWriter$SecureDirectoryOps → ReportWriter$FallbackDirectoryOps'); + for (const element of cell.querySelectorAll('*')) { + expect(element.tagName).toBe('A'); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); } - expect(cells[1].textContent).toBe(''); } + expect(cells[1].textContent).toBe(''); }); } + it('neutralizes hostile class-relationship fields down to links and markers', () => { + const template = readFileSync( + path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' + ); + const data = { + project: { + name: 'Demo', + version: '1.0', + repoUrl: 'https://github.com/demo/repo/blob/main/' + }, + classRelationshipsToRemove: { + hasRelationships: true, + relationships: [ + { + sourceClassPath: 'src/main/java/demo/A.java', + targetClassPath: 'src/main/java/demo/B.java', + simpleSourceClassName: 'Source', + simpleTargetClassName: 'Target', + sourceMarked: true, + targetMarked: false, + priority: 1, + cycleCount: 1, + effortRank: 1, + alsoRemovesPackageRelationship: false, + packageCycleCount: 0 + } + ] + }, + packageRelationshipsToRemove: { hasRelationships: false, relationships: [] } + }; + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="class-relationships"] tbody td.rf-text-left'); + expect(cell).not.toBeNull(); + // The hostile name is escaped into inert text; no img element is created + expect(cell.querySelector('img')).toBeNull(); + expect(cell.querySelectorAll('a').length).toBe(2); + expect(cell.textContent).toContain('Source'); + expect(cell.textContent).toContain('→ Target'); + for (const element of cell.querySelectorAll('*')) { + expect(element.tagName).toBe('A'); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } + }); + + it('strips javascript: URLs from class-relationship links', () => { + const template = readFileSync( + path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' + ); + const data = { + project: { name: 'Demo', version: '1.0', repoUrl: 'javascript:alert(1)//' }, + classRelationshipsToRemove: { + hasRelationships: true, + relationships: [ + { + sourceClassPath: 'src/main/java/demo/A.java', + targetClassPath: 'src/main/java/demo/B.java', + simpleSourceClassName: 'A', + simpleTargetClassName: 'B', + priority: 1, + cycleCount: 1, + effortRank: 1, + alsoRemovesPackageRelationship: false, + packageCycleCount: 0 + } + ] + }, + packageRelationshipsToRemove: { hasRelationships: false, relationships: [] } + }; + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="class-relationships"] tbody td.rf-text-left'); + expect(cell.querySelector('a[href]')).toBeNull(); + expect(cell.textContent).toContain('A → B'); + }); + + it('still restricts package relationship labels to links and markers', () => { + const template = readFileSync( + path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' + ); + const data = structuredClone(junitFixture); + const hostilePackageLabel = + '' + + '' + + '* → Target : 1' + + '' + + 'Unsafe'; + data.packageRelationshipsToRemove.relationships = [ + { ...data.packageRelationshipsToRemove.relationships[0], renderedLabel: hostilePackageLabel } + ]; + const original = structuredClone(data); + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + expect(data).toEqual(original); + expect(html).not.toContain('body {'); + const cell = doc.querySelector( + 'table[data-rf-table="package-relationships"] tbody tr td:first-child' + ); + expect(cell.textContent).toContain('Source* → Target : 1'); + expect(cell.querySelector('strong')?.textContent).toBe('*'); + expect(cell.querySelector('a')?.getAttribute('href')).toBe('https://example.com/source'); + expect(cell.querySelector('a')?.getAttribute('target')).toBe('_blank'); + expect(cell.querySelector('a')?.getAttribute('rel')).toBe('noopener noreferrer'); + expect(cell.querySelector('a:last-child')?.hasAttribute('href')).toBe(false); + for (const element of cell.querySelectorAll('*')) { + expect(['A', 'STRONG']).toContain(element.tagName); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } + }); + it('renders the class-relationships source-link cell with a hardened anchor', () => { const template = readFileSync( path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' @@ -272,7 +446,10 @@ describe('source-link cell rendering (owned by the report rendering layer)', () */ function synthRelationships(count) { return Array.from({ length: count }, (_, i) => ({ - renderedLabel: `Class${String(count - i)} > Class${i}`, + simpleSourceClassName: `Class${String(count - i)}`, + simpleTargetClassName: `Class${i}`, + sourceClassPath: `src/main/java/demo/Class${String(count - i)}.java`, + targetClassPath: `src/main/java/demo/Class${i}.java`, // start out of order (4, 5, 1, 2, 3, ...) so sorted assertions are meaningful priority: ((i + 3) % 5) + 1, cycleCount: i, @@ -294,7 +471,7 @@ function synthRelationships(count) { */ function synthReport({ classRows = 25, pkgRows = 5, disharmonyRows = 30, cycleRows = 21, breakdownRows = 3 } = {}) { return { - project: { name: 'Demo', version: '1.0' }, + project: { name: 'Demo', version: '1.0', repoUrl: 'https://github.com/demo/repo/blob/main/' }, classRelationshipsToRemove: { hasRelationships: classRows > 0, relationships: synthRelationships(classRows) @@ -406,7 +583,7 @@ describe('prepareReportData', () => { const ui = prepared.classRelationshipsToRemove.tableUi; expect(ui.sortKey).toBe('cycleCount'); expect(ui.sortDir).toBe('desc'); - // column order: renderedLabel, priority, cycleCount, effortRank, alsoRemoves, packageCycleCount + // column order: classRelationship, priority, cycleCount, effortRank, alsoRemoves, packageCycleCount expect(ui.colSort).toEqual(['none', 'none', 'descending', 'none', 'none', 'none']); expect(ui.colIndicator[2]).toBe('▼'); expect(ui.colIndicator[0]).toBe(''); @@ -425,7 +602,7 @@ describe('prepareReportData', () => { const ui = prepared.classRelationshipsToRemove.tableUi; expect(ui.sortKey).toBe('priority'); expect(ui.sortDir).toBe('asc'); - // column order: renderedLabel, priority, cycleCount, effortRank, alsoRemoves, packageCycleCount + // column order: classRelationship, priority, cycleCount, effortRank, alsoRemoves, packageCycleCount expect(ui.colSort).toEqual(['none', 'ascending', 'none', 'none', 'none', 'none']); expect(ui.colIndicator[1]).toBe('▲'); expect(ui.colIndicator[0]).toBe(''); @@ -476,8 +653,8 @@ describe('prepareReportData', () => { config.sorting.enabled = false; const prepared = prepareReportData(synthReport({ classRows: 5 }), {}, config); expect(prepared.classRelationshipsToRemove.tableUi.sortKey).toBe(''); - expect(prepared.classRelationshipsToRemove.relationships[0].renderedLabel) - .toContain('Class0'); + expect(prepared.classRelationshipsToRemove.relationships[0].simpleTargetClassName) + .toBe('Class0'); }); it('filters before sorting and paginating, carrying match metadata', () => { @@ -485,7 +662,7 @@ describe('prepareReportData', () => { 'class-relationships': { search: 'class5', sortKey: 'cycleCount', sortDir: 'desc' } }); const ui = prepared.classRelationshipsToRemove.tableUi; - // "class5" matches renderedLabel Class5 of exactly one row (and Class25/15 + // "class5" matches the Class5 simple class name of exactly one row (and Class25/15 // contain "class1"/"Class2..." -> assert against the real filter result). expect(ui.searchActive).toBe(true); expect(ui.matchCount).toBeLessThan(25); @@ -605,9 +782,12 @@ describe('prepareReportData', () => { // --------------------------------------------------------------------------- // Class relationships to break a package cycle: RefactorFirst serializes -// structured ClassRelationshipDTO objects, which must render through the -// package relationships table cell, sanitized to links and markers only. -// Pre-DTO string entries are no longer part of the schema and are dropped. +// structured ClassRelationshipDTO objects whose sourceClassPath/ +// targetClassPath and simple class names must be combined with +// project.repoUrl and rendered through the package relationships table cell, +// sanitized to links and markers only. Pre-DTO string entries and entries +// without the structured fields are no longer part of the schema and are +// dropped. // --------------------------------------------------------------------------- describe('class relationships to break a package cycle cell rendering', () => { @@ -615,26 +795,30 @@ describe('class relationships to break a package cycle cell rendering', () => { path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' ); + const REPO_URL = 'https://github.com/demo/repo/blob/main/'; + const structuredEntry = { sourceClass: 'org.junit.runner.Request', targetClass: 'org.junit.internal.requests.SortingRequest', + sourceClassPath: 'src/main/java/org/junit/runner/Request.java', + targetClassPath: 'src/main/java/org/junit/internal/requests/SortingRequest.java', + simpleSourceClassName: 'Request', + simpleTargetClassName: 'SortingRequest', sourceMarked: true, targetMarked: false, weight: 2, - renderedLabel: - 'Request* → ' + - 'SortingRequest : 2', cycleCount: 1 }; const secondEntry = { sourceClass: 'org.junit.internal.MethodSorter', targetClass: 'org.junit.runners.MethodSorters', + sourceClassPath: 'src/main/java/org/junit/internal/MethodSorter.java', + targetClassPath: 'src/main/java/org/junit/runners/MethodSorters.java', + simpleSourceClassName: 'MethodSorter', + simpleTargetClassName: 'MethodSorters', sourceMarked: false, targetMarked: false, weight: 1, - renderedLabel: - 'MethodSorter → ' + - 'MethodSorters : 1', cycleCount: 1 }; @@ -645,7 +829,7 @@ describe('class relationships to break a package cycle cell rendering', () => { */ function reportWithBreakEntries(entries) { return { - project: { name: 'Demo', version: '1.0' }, + project: { name: 'Demo', version: '1.0', repoUrl: REPO_URL }, packageRelationshipsToRemove: { hasRelationships: true, relationships: [ @@ -678,9 +862,11 @@ describe('class relationships to break a package cycle cell rendering', () => { it('renders structured ClassRelationshipDTO entries from current reports', () => { const html = renderTemplate(template, prepareReportData(reportWithBreakEntries([structuredEntry]))); const cell = breakCellOf(html); - expect(cell.textContent).toContain('Request* → SortingRequest : 2'); - expect(cell.querySelector('a')?.getAttribute('href')).toBe('https://example.com/Request.java'); - expect(cell.querySelector('a')?.getAttribute('rel')).toBe('noopener noreferrer'); + expect(cell.textContent).toContain('Request* → SortingRequest'); + const link = cell.querySelector('a'); + expect(link.getAttribute('href')).toBe(REPO_URL + 'src/main/java/org/junit/runner/Request.java'); + expect(link.getAttribute('target')).toBe('_blank'); + expect(link.getAttribute('rel')).toBe('noopener noreferrer'); }); it('drops pre-DTO string entries from older reports', () => { @@ -693,7 +879,21 @@ describe('class relationships to break a package cycle cell rendering', () => { ])) ); const cell = breakCellOf(html); - expect(cell.textContent).toContain('Request* → SortingRequest : 2'); + expect(cell.textContent).toContain('Request* → SortingRequest'); + expect(cell.textContent).not.toContain('MethodSorter'); + expect(cell.querySelectorAll('br').length).toBe(1); + }); + + it('drops entries without the structured class-relationship fields', () => { + const html = renderTemplate( + template, + prepareReportData(reportWithBreakEntries([ + structuredEntry, + { sourceClass: 'org.junit.internal.MethodSorter', renderedLabel: 'MethodSorter → MethodSorters : 1' } + ])) + ); + const cell = breakCellOf(html); + expect(cell.textContent).toContain('Request* → SortingRequest'); expect(cell.textContent).not.toContain('MethodSorter'); expect(cell.querySelectorAll('br').length).toBe(1); }); @@ -705,30 +905,33 @@ describe('class relationships to break a package cycle cell rendering', () => { ); const cell = breakCellOf(html); expect(cell.querySelectorAll('br').length).toBe(2); - expect(cell.textContent).toContain('Request* → SortingRequest : 2'); - expect(cell.textContent).toContain('MethodSorter → MethodSorters : 1'); + expect(cell.textContent).toContain('Request* → SortingRequest'); + expect(cell.textContent).toContain('MethodSorter → MethodSorters'); }); - it('sanitizes class-break labels to links and markers only', () => { + it('sanitizes hostile class-break fields to links and markers only', () => { const hostile = { ...structuredEntry, - renderedLabel: - '' + - 'X' + - '' + - 'Unsafe' + sourceClassPath: 'src/main/java/org/junit/runner/Request" onclick="alert(1)', + simpleSourceClassName: 'X' }; const html = renderTemplate(template, prepareReportData(reportWithBreakEntries([hostile]))); const cell = breakCellOf(html); expect(cell.textContent).toContain('X'); - expect(cell.innerHTML).not.toContain('body {'); - expect(cell.innerHTML).not.toContain('onclick'); - expect(cell.innerHTML).not.toContain('onerror'); - expect(cell.innerHTML).not.toContain('javascript:'); + // The quote in the hostile path is escaped inside the href value, so it + // cannot break out of the attribute: no img element and no event handler + // attributes are created. expect(cell.querySelector('img')).toBeNull(); + expect(cell.querySelector('[onclick]')).toBeNull(); + expect(cell.querySelectorAll('a').length).toBe(2); for (const element of cell.querySelectorAll('*')) { expect(['A', 'BR']).toContain(element.tagName); } + for (const anchor of cell.querySelectorAll('a')) { + for (const attribute of anchor.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } }); it('does not mutate the report data while normalizing entries', () => { diff --git a/tests/unit/table-enhancer.test.js b/tests/unit/table-enhancer.test.js index 5b3c353..2513ecc 100644 --- a/tests/unit/table-enhancer.test.js +++ b/tests/unit/table-enhancer.test.js @@ -20,13 +20,13 @@ function buildRoot({ rows = 3 } = {}) { Class relationships to remove, in priority order - + ${Array.from({ length: rows }, (_, i) => ` - Class${i} -> Target${i}${i + 1}`).join('')} + Class${i} → Target${i}${i + 1}`).join('')} @@ -43,8 +43,10 @@ function demoData() { return { classRelationshipsToRemove: { relationships: Array.from({ length: 3 }, (_, i) => ({ - renderedLabel: `Class${i} -> Target${i}`, - priority: i + 1, + simpleSourceClassName: `Class${i}`, + simpleTargetClassName: `Target${i}`, + sourceClassPath: `src/main/java/demo/Class${i}.java`, + targetClassPath: `src/main/java/demo/Target${i}.java`, priority: i + 1, cycleCount: i, effortRank: i * 2, alsoRemovesPackageRelationship: false, @@ -268,8 +270,8 @@ describe('sortable headers', () => { it('sorts ascending when a different column is clicked under the default sort', () => { setup(); - root.querySelector('[data-sort-key="renderedLabel"]').click(); - expect(actions[0].patch).toEqual({ sortKey: 'renderedLabel', sortDir: 'asc', page: 1 }); + root.querySelector('[data-sort-key="classRelationship"]').click(); + expect(actions[0].patch).toEqual({ sortKey: 'classRelationship', sortDir: 'asc', page: 1 }); }); it('toggles to descending when the sorted column is clicked again', () => { @@ -280,8 +282,8 @@ describe('sortable headers', () => { it('switches to ascending when another column is clicked', () => { setup({ tableStates: { 'class-relationships': { sortKey: 'priority', sortDir: 'desc' } } }); - root.querySelector('[data-sort-key="renderedLabel"]').click(); - expect(actions[0].patch).toEqual({ sortKey: 'renderedLabel', sortDir: 'asc', page: 1 }); + root.querySelector('[data-sort-key="classRelationship"]').click(); + expect(actions[0].patch).toEqual({ sortKey: 'classRelationship', sortDir: 'asc', page: 1 }); }); }); @@ -324,7 +326,7 @@ describe('CSV export', () => { expect(lines[0]).toBe('Class Relationship,Priority,In Class Cycles,Relationship Strength,Also Removes Pkg Cycle Relationship,In Package Cycles'); // all three rows match nothing about 'class1' except row index 1 -> 1 row expect(lines.length).toBe(2); - expect(lines[1]).toBe('Class1 -> Target1,2,1,2,false,0'); + expect(lines[1]).toBe('Class1 → Target1,2,1,2,false,0'); delete global.URL.createObjectURL; delete global.URL.revokeObjectURL; }); @@ -344,9 +346,9 @@ describe('CSV export', () => { expect(blobs.length).toBe(1); const lines = (await blobs[0].text()).split('\n'); expect(lines.length).toBe(4); - expect(lines[1]).toBe('Class1 -> Target1,1,1,2,false,0'); - expect(lines[2]).toBe('Class2 -> Target2,2,2,4,false,0'); - expect(lines[3]).toBe('Class0 -> Target0,3,0,0,false,0'); + expect(lines[1]).toBe('Class1 → Target1,1,1,2,false,0'); + expect(lines[2]).toBe('Class2 → Target2,2,2,4,false,0'); + expect(lines[3]).toBe('Class0 → Target0,3,0,0,false,0'); delete global.URL.createObjectURL; delete global.URL.revokeObjectURL; }); @@ -366,8 +368,8 @@ describe('CSV export', () => { root.querySelector('[data-rf-export="class-relationships"]').click(); expect(blobs.length).toBe(1); const lines = (await blobs[0].text()).split('\n'); - expect(lines[1]).toBe('Class0 -> Target0,2,0,0,false,0'); - expect(lines[2]).toBe('Class1 -> Target1,1,1,2,false,0'); + expect(lines[1]).toBe('Class0 → Target0,2,0,0,false,0'); + expect(lines[2]).toBe('Class1 → Target1,1,1,2,false,0'); delete global.URL.createObjectURL; delete global.URL.revokeObjectURL; }); @@ -501,8 +503,8 @@ describe('copy cell content', () => { const cell = root.querySelector('tbody td'); cell.click(); await new Promise(resolve => setTimeout(resolve, 10)); - expect(navigator.clipboard.writeText).toHaveBeenCalledWith('Class0 -> Target0'); - expect(copied).toEqual([{ ok: true, text: 'Class0 -> Target0' }]); + expect(navigator.clipboard.writeText).toHaveBeenCalledWith('Class0 → Target0'); + expect(copied).toEqual([{ ok: true, text: 'Class0 → Target0' }]); }); it('copies on Enter and Space keydown', async () => { @@ -528,6 +530,6 @@ describe('copy cell content', () => { setup({ onCopy: (ok, text) => copied.push({ ok, text }) }); root.querySelector('tbody td').click(); await new Promise(resolve => setTimeout(resolve, 10)); - expect(copied).toEqual([{ ok: false, text: 'Class0 -> Target0' }]); + expect(copied).toEqual([{ ok: false, text: 'Class0 → Target0' }]); }); }); diff --git a/tests/unit/table-operations.test.js b/tests/unit/table-operations.test.js index 545c7f0..f8c42ad 100644 --- a/tests/unit/table-operations.test.js +++ b/tests/unit/table-operations.test.js @@ -416,6 +416,31 @@ describe('TABLE_CONFIG defaults', () => { }); }); +describe('REPORT_TABLES class-relationships relationship column', () => { + const column = REPORT_TABLES['class-relationships'].columns[0]; + + it('derives the plain text from the simple class names and removal markers', () => { + expect(column.key).toBe('classRelationship'); + expect(column.label).toBe('Class Relationship'); + expect(columnValue(column, { + simpleSourceClassName: 'Request', + simpleTargetClassName: 'SortingRequest', + sourceMarked: true, + targetMarked: false + })).toBe('Request* → SortingRequest'); + expect(columnValue(column, { + simpleSourceClassName: 'A', + simpleTargetClassName: 'B' + })).toBe('A → B'); + }); + + it('falls back to an empty value when the structured fields are absent', () => { + expect(columnValue(column, {})).toBe(''); + expect(columnValue(column, { sourceClass: 'org.example.A' })).toBe(''); + expect(columnValue(column, { renderedLabel: 'A → B : 1' })).toBe(''); + }); +}); + describe('REPORT_TABLES package-relationships class-break column', () => { const column = REPORT_TABLES['package-relationships'].columns.find( col => col.key === 'classRelationshipsToBreakPackage' @@ -426,29 +451,29 @@ describe('REPORT_TABLES package-relationships class-break column', () => { expect(column.label).toBe('Class Relationships to Remove To Break Package Relationship'); }); - it('reads the rendered label of structured ClassRelationshipDTO entries', () => { + it('reads the simple class names of structured ClassRelationshipDTO entries', () => { const row = { classRelationshipsToBreakPackage: [ { sourceClass: 'org.junit.runner.Request', targetClass: 'org.junit.internal.requests.SortingRequest', + sourceClassPath: 'src/main/java/org/junit/runner/Request.java', + targetClassPath: 'src/main/java/org/junit/internal/requests/SortingRequest.java', + simpleSourceClassName: 'Request', + simpleTargetClassName: 'SortingRequest', sourceMarked: true, targetMarked: false, - weight: 2, - renderedLabel: - 'Request* → ' + - 'SortingRequest : 2' + weight: 2 }, { sourceClass: 'org.junit.runner.Request', targetClass: 'org.junit.internal.requests.ClassRequest', - renderedLabel: - 'Request → ' + - 'ClassRequest : 2' + simpleSourceClassName: 'Request', + simpleTargetClassName: 'ClassRequest' } ] }; - expect(columnValue(column, row)).toBe('Request * → SortingRequest : 2; Request → ClassRequest : 2'); + expect(columnValue(column, row)).toBe('Request* → SortingRequest; Request → ClassRequest'); }); it('ignores pre-DTO string entries from older reports', () => { @@ -469,6 +494,6 @@ describe('REPORT_TABLES package-relationships class-break column', () => { columnValue(column, { classRelationshipsToBreakPackage: [{ sourceClass: 'a.B' }, null, { renderedLabel: 'Plain label' }] }) - ).toBe('; ; Plain label'); + ).toBe('; ; '); }); }); From 39c05b985514af34ba5b6d8ce75f5a1c00b22d4c Mon Sep 17 00:00:00 2001 From: Jim Bethancourt Date: Mon, 5 Oct 2026 07:07:58 -0500 Subject: [PATCH 2/5] Assembling links instead of providing pre-rendered URL for package relationships and Disharmony charts --- assets/refactor-first-report.mustache | 2 +- lib/renderer.js | 63 +++++-- lib/report-view.js | 29 +++- lib/table-operations.js | 20 ++- public/assets/refactor-first-report.mustache | 2 +- tests/fixtures/junit4-report.json | 171 ++++++++++++------- tests/unit/renderer.test.js | 164 +++++++++++++++--- tests/unit/report-view.test.js | 70 +++++--- tests/unit/table-operations.test.js | 25 +++ 9 files changed, 416 insertions(+), 130 deletions(-) diff --git a/assets/refactor-first-report.mustache b/assets/refactor-first-report.mustache index 581ce1b..935dc83 100644 --- a/assets/refactor-first-report.mustache +++ b/assets/refactor-first-report.mustache @@ -569,7 +569,7 @@ Package relationships to remove, in priority order - + diff --git a/lib/renderer.js b/lib/renderer.js index 7d634ee..72832c5 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -86,6 +86,29 @@ function escapeHtml(value) { const RELATIONSHIP_ARROW = ' → '; +/** + * Builds the two-anchor markup shared by class and package relationships: + * linked source name (plus removal marker), the → arrow, then the linked + * target name (plus removal marker). All values are untrusted report data and + * are escaped before the markup is assembled. + * + * @param {string} repoUrl - Repository URL prefix from project metadata. + * @param {{path: *, name: *, marked: *}} source - Source path, name and marker. + * @param {{path: *, name: *, marked: *}} target - Target path, name and marker. + * @returns {string} The unsanitized relationship markup. + */ +function relationshipAnchorsMarkup(repoUrl, source, target) { + const base = typeof repoUrl === 'string' ? repoUrl : ''; + const anchor = (relationshipPath, name) => + '' + + escapeHtml(name) + ''; + return anchor(source.path, source.name) + + (source.marked ? '*' : '') + + RELATIONSHIP_ARROW + + anchor(target.path, target.name) + + (target.marked ? '*' : ''); +} + /** * Builds the raw markup of one class relationship from the structured * ClassRelationshipDTO fields: the hyperlink targets are project.repoUrl plus @@ -106,15 +129,34 @@ export function classRelationshipMarkup(relationship, repoUrl) { const hasStructuredFields = relationship.simpleSourceClassName != null || relationship.simpleTargetClassName != null; if (!hasStructuredFields) return null; - const base = typeof repoUrl === 'string' ? repoUrl : ''; - const anchor = (classPath, simpleName) => - '' - + escapeHtml(simpleName) + ''; - return anchor(relationship.sourceClassPath, relationship.simpleSourceClassName) - + (relationship.sourceMarked ? '*' : '') - + RELATIONSHIP_ARROW - + anchor(relationship.targetClassPath, relationship.simpleTargetClassName) - + (relationship.targetMarked ? '*' : ''); + return relationshipAnchorsMarkup( + repoUrl, + { path: relationship.sourceClassPath, name: relationship.simpleSourceClassName, marked: relationship.sourceMarked }, + { path: relationship.targetClassPath, name: relationship.simpleTargetClassName, marked: relationship.targetMarked }); +} + +/** + * Builds the raw markup of one package relationship from the structured + * PackageRelationshipDTO fields: the hyperlink targets are project.repoUrl plus + * sourcePackagePath/targetPackagePath (package directories relative to the + * project root), and the anchor texts are the package names themselves. As with + * class relationships, the two anchors are separated by the → arrow and + * a package marked for removal is followed by *. + * + * @param {*} relationship - Raw PackageRelationshipDTO entry. + * @param {string} repoUrl - Repository URL prefix from project metadata. + * @returns {string|null} The unsanitized relationship markup, or null when the + * entry is not a structured PackageRelationshipDTO. + */ +export function packageRelationshipMarkup(relationship, repoUrl) { + if (!relationship || typeof relationship !== 'object') return null; + const hasStructuredFields = relationship.sourcePackage != null + || relationship.targetPackage != null; + if (!hasStructuredFields) return null; + return relationshipAnchorsMarkup( + repoUrl, + { path: relationship.sourcePackagePath, name: relationship.sourcePackage, marked: relationship.sourceMarked }, + { path: relationship.targetPackagePath, name: relationship.targetPackage, marked: relationship.targetMarked }); } /** @@ -177,9 +219,10 @@ function prepareClassRelationship(relationship, repoUrl) { */ function preparePackageRelationship(relationship, repoUrl) { registerLinkSafetyHook(); + const markup = packageRelationshipMarkup(relationship, repoUrl); return { ...relationship, - safeRenderedLabel: sanitizeRelationshipLabel(relationship.renderedLabel), + safeRenderedLabel: markup == null ? '' : sanitizeRelationshipLabel(markup), classRelationshipsToBreakPackage: Array.isArray(relationship.classRelationshipsToBreakPackage) ? relationship.classRelationshipsToBreakPackage .map(entry => prepareClassBreakEntry(entry, repoUrl)) diff --git a/lib/report-view.js b/lib/report-view.js index fd13c59..7e232d0 100644 --- a/lib/report-view.js +++ b/lib/report-view.js @@ -541,7 +541,21 @@ export function isHttpUrl(value) { * @param {string} [chartData.yaxisLabel] - Overrides the relative churn axis label. * @returns {void} */ -export function initBubbleChart(canvas, title, chartData) { +/** + * Builds the source-file URL of one chart bubble from the report's repository + * URL and the bubble's path relative to the project root. The report payload + * lists only the path; repoUrl is specified once in the project metadata. + * + * @param {*} bubble - Raw chart bubble from the report payload. + * @param {*} repoUrl - Repository URL prefix from the project metadata. + * @returns {string|null} The combined URL, or null when it cannot be built. + */ +function bubbleUrl(bubble, repoUrl) { + if (typeof repoUrl !== 'string' || !bubble || typeof bubble.path !== 'string') return null; + return repoUrl + bubble.path; +} + +export function initBubbleChart(canvas, title, chartData, repoUrl) { const ChartLib = window.Chart; if (!ChartLib) { console.warn('Chart.js not loaded'); @@ -556,7 +570,7 @@ export function initBubbleChart(canvas, title, chartData) { data: { datasets: [{ label: title, - data: (chartData.bubbles || []).map(b => ({x: b.x, y: b.y, r: b.r, raw: b})), + data: (chartData.bubbles || []).map(b => ({x: b.x, y: b.y, r: b.r, raw: {...b, url: bubbleUrl(b, repoUrl)}})), backgroundColor: (chartData.bubbles || []).map(b => b.color), borderColor: (chartData.bubbles || []).map(b => b.borderColor), borderWidth: 1 @@ -566,8 +580,9 @@ export function initBubbleChart(canvas, title, chartData) { responsive: true, maintainAspectRatio: false, // Clicking a bubble opens the source file the report links it - // to (disharmonies[].chart.bubbles[].url) in a new tab, with - // noopener so the opened page can't reach back into this one. + // to (disharmonies[].chart.bubbles[].path combined with the + // project repoUrl) in a new tab, with noopener so the opened page + // can't reach back into this one. onClick: (event, elements, chart) => { const hit = elements && elements[0]; if (!hit || !chart || !chart.data || !chart.data.datasets) return; @@ -677,11 +692,11 @@ export function initBubbleChart(canvas, title, chartData) { bubbleCharts.set(canvas, chart); } -export function initDisharmonyCharts(disharmonies) { +export function initDisharmonyCharts(disharmonies, repoUrl) { (disharmonies || []).forEach(d => { const canvas = document.getElementById(`chart_${d.anchorId}`); if (canvas && d.chart && d.chart.bubbles) { - initBubbleChart(canvas, d.title, d.chart); + initBubbleChart(canvas, d.title, d.chart, repoUrl); } }); } @@ -917,6 +932,6 @@ export async function enhanceReport(root, data) { document.body.appendChild(script); } - initDisharmonyCharts(data.disharmonies); + initDisharmonyCharts(data.disharmonies, data.project && data.project.repoUrl); await initWasmGraphs(data); } diff --git a/lib/table-operations.js b/lib/table-operations.js index a786739..cd7b211 100644 --- a/lib/table-operations.js +++ b/lib/table-operations.js @@ -363,18 +363,26 @@ function fallbackCopy(text) { * @param {*} relationship - Raw ClassRelationshipDTO entry. * @returns {string} Plain-text relationship value. */ -function classRelationshipText(relationship) { +function relationshipText(relationship, sourceNameKey, targetNameKey) { if (!relationship || typeof relationship !== 'object') return ''; - const hasStructuredFields = relationship.simpleSourceClassName != null - || relationship.simpleTargetClassName != null; + const hasStructuredFields = relationship[sourceNameKey] != null + || relationship[targetNameKey] != null; if (!hasStructuredFields) return ''; - const source = String(relationship.simpleSourceClassName ?? '') + const source = String(relationship[sourceNameKey] ?? '') + (relationship.sourceMarked ? '*' : ''); - const target = String(relationship.simpleTargetClassName ?? '') + const target = String(relationship[targetNameKey] ?? '') + (relationship.targetMarked ? '*' : ''); return `${source} → ${target}`; } +function classRelationshipText(relationship) { + return relationshipText(relationship, 'simpleSourceClassName', 'simpleTargetClassName'); +} + +function packageRelationshipText(relationship) { + return relationshipText(relationship, 'sourcePackage', 'targetPackage'); +} + export const REPORT_TABLES = { 'class-relationships': { id: 'class-relationships', @@ -398,7 +406,7 @@ export const REPORT_TABLES = { caption: 'Package relationships to remove, in priority order', getRows: data => data?.packageRelationshipsToRemove?.relationships ?? [], columns: [ - { key: 'renderedLabel', label: 'Package Relationship', value: row => stripHtml(row.renderedLabel) }, + { key: 'packageRelationship', label: 'Package Relationship', value: packageRelationshipText }, { key: 'priority', label: 'Priority' }, { key: 'cycleCount', label: 'In Pkg Cycles' }, { key: 'effortRank', label: 'Relationship Strength' }, diff --git a/public/assets/refactor-first-report.mustache b/public/assets/refactor-first-report.mustache index 581ce1b..935dc83 100644 --- a/public/assets/refactor-first-report.mustache +++ b/public/assets/refactor-first-report.mustache @@ -569,7 +569,7 @@ Package relationships to remove, in priority order - + diff --git a/tests/fixtures/junit4-report.json b/tests/fixtures/junit4-report.json index ac0f21d..1d7b7cd 100644 --- a/tests/fixtures/junit4-report.json +++ b/tests/fixtures/junit4-report.json @@ -889,7 +889,8 @@ "sourceMarked": true, "targetMarked": true, "weight": 1, - "renderedLabel": "org.junit.internal* → org.junit.runners* : 1", + "sourcePackagePath": "src/main/java/org/junit/internal/", + "targetPackagePath": "src/main/java/org/junit/runners/", "priority": 1, "cycleCount": 4, "effortRank": 1, @@ -918,7 +919,8 @@ "sourceMarked": true, "targetMarked": false, "weight": 1, - "renderedLabel": "org.junit.runners* → org.junit.internal.builders : 1", + "sourcePackagePath": "src/main/java/org/junit/runners/", + "targetPackagePath": "src/main/java/org/junit/internal/builders/", "priority": 2, "cycleCount": 4, "effortRank": 1, @@ -947,7 +949,8 @@ "sourceMarked": false, "targetMarked": false, "weight": 2, - "renderedLabel": "org.junit.runner → org.junit.internal.builders : 2", + "sourcePackagePath": "src/main/java/org/junit/runner/", + "targetPackagePath": "src/main/java/org/junit/internal/builders/", "priority": 3, "cycleCount": 4, "effortRank": 2, @@ -976,7 +979,8 @@ "sourceMarked": false, "targetMarked": false, "weight": 5, - "renderedLabel": "org.junit.runner → org.junit.internal.requests : 5", + "sourcePackagePath": "src/main/java/org/junit/runner/", + "targetPackagePath": "src/main/java/org/junit/internal/requests/", "priority": 4, "cycleCount": 4, "effortRank": 5, @@ -1053,7 +1057,8 @@ "sourceMarked": true, "targetMarked": false, "weight": 12, - "renderedLabel": "org.junit.internal* → org.junit.runner : 12", + "sourcePackagePath": "src/main/java/org/junit/internal/", + "targetPackagePath": "src/main/java/org/junit/runner/", "priority": 5, "cycleCount": 4, "effortRank": 12, @@ -1098,7 +1103,8 @@ "sourceMarked": false, "targetMarked": true, "weight": 1, - "renderedLabel": "org.junit → org.junit.runners* : 1", + "sourcePackagePath": "src/main/java/org/junit/", + "targetPackagePath": "src/main/java/org/junit/runners/", "priority": 6, "cycleCount": 3, "effortRank": 1, @@ -1127,7 +1133,8 @@ "sourceMarked": true, "targetMarked": true, "weight": 2, - "renderedLabel": "org.junit.runner.notification* → org.junit.internal* : 2", + "sourcePackagePath": "src/main/java/org/junit/runner/notification/", + "targetPackagePath": "src/main/java/org/junit/internal/", "priority": 7, "cycleCount": 3, "effortRank": 2, @@ -1156,7 +1163,8 @@ "sourceMarked": false, "targetMarked": false, "weight": 2, - "renderedLabel": "org.junit.runners.model → org.junit.internal.runners.model : 2", + "sourcePackagePath": "src/main/java/org/junit/runners/model/", + "targetPackagePath": "src/main/java/org/junit/internal/runners/model/", "priority": 8, "cycleCount": 3, "effortRank": 2, @@ -1201,7 +1209,8 @@ "sourceMarked": true, "targetMarked": false, "weight": 5, - "renderedLabel": "org.junit.internal.runners* → org.junit.runners.model : 5", + "sourcePackagePath": "src/main/java/org/junit/internal/runners/", + "targetPackagePath": "src/main/java/org/junit/runners/model/", "priority": 9, "cycleCount": 3, "effortRank": 5, @@ -1262,7 +1271,8 @@ "sourceMarked": true, "targetMarked": false, "weight": 8, - "renderedLabel": "org.junit.internal* → org.junit : 8", + "sourcePackagePath": "src/main/java/org/junit/internal/", + "targetPackagePath": "src/main/java/org/junit/", "priority": 10, "cycleCount": 3, "effortRank": 8, @@ -1339,7 +1349,8 @@ "sourceMarked": false, "targetMarked": false, "weight": 15, - "renderedLabel": "org.junit.runners.model → org.junit.runner : 15", + "sourcePackagePath": "src/main/java/org/junit/runners/model/", + "targetPackagePath": "src/main/java/org/junit/runner/", "priority": 11, "cycleCount": 3, "effortRank": 15, @@ -1400,7 +1411,8 @@ "sourceMarked": false, "targetMarked": true, "weight": 16, - "renderedLabel": "org.junit.runners.parameterized → org.junit.runners* : 16", + "sourcePackagePath": "src/main/java/org/junit/runners/parameterized/", + "targetPackagePath": "src/main/java/org/junit/runners/", "priority": 12, "cycleCount": 3, "effortRank": 16, @@ -1461,7 +1473,8 @@ "sourceMarked": true, "targetMarked": false, "weight": 25, - "renderedLabel": "org.junit.runner.notification* → org.junit.runner : 25", + "sourcePackagePath": "src/main/java/org/junit/runner/notification/", + "targetPackagePath": "src/main/java/org/junit/runner/", "priority": 13, "cycleCount": 3, "effortRank": 25, @@ -1586,7 +1599,8 @@ "sourceMarked": false, "targetMarked": false, "weight": 39, - "renderedLabel": "junit.framework → org.junit.runner : 39", + "sourcePackagePath": "src/main/java/junit/framework/", + "targetPackagePath": "src/main/java/org/junit/runner/", "priority": 14, "cycleCount": 3, "effortRank": 39, @@ -1711,7 +1725,8 @@ "sourceMarked": true, "targetMarked": false, "weight": 41, - "renderedLabel": "org.junit.internal.runners* → org.junit.runner : 41", + "sourcePackagePath": "src/main/java/org/junit/internal/runners/", + "targetPackagePath": "src/main/java/org/junit/runner/", "priority": 15, "cycleCount": 3, "effortRank": 41, @@ -1900,7 +1915,8 @@ "sourceMarked": false, "targetMarked": false, "weight": 31, - "renderedLabel": "org.junit.validator → org.junit.runners.model : 31", + "sourcePackagePath": "src/main/java/org/junit/validator/", + "targetPackagePath": "src/main/java/org/junit/runners/model/", "priority": 16, "cycleCount": 2, "effortRank": 31, @@ -2121,7 +2137,8 @@ "sourceMarked": true, "targetMarked": false, "weight": 13, - "renderedLabel": "org.junit.experimental.theories* → org.junit.experimental.theories.internal : 13", + "sourcePackagePath": "src/main/java/org/junit/experimental/theories/", + "targetPackagePath": "src/main/java/org/junit/experimental/theories/internal/", "priority": 17, "cycleCount": 1, "effortRank": 13, @@ -2182,7 +2199,8 @@ "sourceMarked": false, "targetMarked": false, "weight": 44, - "renderedLabel": "org.junit.runner.manipulation → org.junit.runner : 44", + "sourcePackagePath": "src/main/java/org/junit/runner/manipulation/", + "targetPackagePath": "src/main/java/org/junit/runner/", "priority": 18, "cycleCount": 1, "effortRank": 44, @@ -2326,7 +2344,8 @@ "effortRank": 1, "changePronenessRank": 2, "color": "rgba(235, 64, 52, 0.75)", - "borderColor": "rgb(235, 64, 52)" + "borderColor": "rgb(235, 64, 52)", + "path": "src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java" }, { "id": "ParentRunner.java", @@ -2338,7 +2357,8 @@ "effortRank": 2, "changePronenessRank": 1, "color": "rgba(39, 174, 96, 0.75)", - "borderColor": "rgb(39, 174, 96)" + "borderColor": "rgb(39, 174, 96)", + "path": "src/main/java/org/junit/runners/ParentRunner.java" } ], "xaxisLabel": "Effort to refactor", @@ -2434,7 +2454,8 @@ "effortRank": 1, "changePronenessRank": 1, "color": "rgba(235, 64, 52, 0.75)", - "borderColor": "rgb(235, 64, 52)" + "borderColor": "rgb(235, 64, 52)", + "path": "src/main/java/org/junit/runner/notification/Failure.java" }, { "id": "FrameworkField.java", @@ -2446,7 +2467,8 @@ "effortRank": 2, "changePronenessRank": 2, "color": "rgba(39, 174, 96, 0.75)", - "borderColor": "rgb(39, 174, 96)" + "borderColor": "rgb(39, 174, 96)", + "path": "src/main/java/org/junit/runners/model/FrameworkField.java" } ], "xaxisLabel": "Effort to refactor", @@ -2542,7 +2564,8 @@ "effortRank": 5, "changePronenessRank": 12, "color": "rgba(235, 64, 52, 0.75)", - "borderColor": "rgb(235, 64, 52)" + "borderColor": "rgb(235, 64, 52)", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "id": "BlockJUnit4ClassRunner.java", @@ -2554,7 +2577,8 @@ "effortRank": 8, "changePronenessRank": 14, "color": "rgba(220, 72, 55, 0.75)", - "borderColor": "rgb(220, 72, 55)" + "borderColor": "rgb(220, 72, 55)", + "path": "src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java" }, { "id": "ErrorReportingRunner.java", @@ -2566,7 +2590,8 @@ "effortRank": 1, "changePronenessRank": 6, "color": "rgba(205, 81, 59, 0.75)", - "borderColor": "rgb(205, 81, 59)" + "borderColor": "rgb(205, 81, 59)", + "path": "src/main/java/org/junit/internal/runners/ErrorReportingRunner.java" }, { "id": "Categories.java", @@ -2578,7 +2603,8 @@ "effortRank": 6, "changePronenessRank": 11, "color": "rgba(190, 89, 62, 0.75)", - "borderColor": "rgb(190, 89, 62)" + "borderColor": "rgb(190, 89, 62)", + "path": "src/main/java/org/junit/experimental/categories/Categories.java" }, { "id": "Categories.java", @@ -2590,7 +2616,8 @@ "effortRank": 9, "changePronenessRank": 11, "color": "rgba(175, 98, 66, 0.75)", - "borderColor": "rgb(175, 98, 66)" + "borderColor": "rgb(175, 98, 66)", + "path": "src/main/java/org/junit/experimental/categories/Categories.java" }, { "id": "TestRunner.java", @@ -2602,7 +2629,8 @@ "effortRank": 2, "changePronenessRank": 2, "color": "rgba(160, 106, 69, 0.75)", - "borderColor": "rgb(160, 106, 69)" + "borderColor": "rgb(160, 106, 69)", + "path": "src/main/java/junit/textui/TestRunner.java" }, { "id": "JUnit4ClassRunner.java", @@ -2614,7 +2642,8 @@ "effortRank": 3, "changePronenessRank": 3, "color": "rgba(145, 115, 72, 0.75)", - "borderColor": "rgb(145, 115, 72)" + "borderColor": "rgb(145, 115, 72)", + "path": "src/main/java/org/junit/internal/runners/JUnit4ClassRunner.java" }, { "id": "JUnit38ClassRunner.java", @@ -2626,7 +2655,8 @@ "effortRank": 4, "changePronenessRank": 4, "color": "rgba(129, 123, 76, 0.75)", - "borderColor": "rgb(129, 123, 76)" + "borderColor": "rgb(129, 123, 76)", + "path": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java" }, { "id": "ParentRunner.java", @@ -2638,7 +2668,8 @@ "effortRank": 13, "changePronenessRank": 13, "color": "rgba(114, 132, 79, 0.75)", - "borderColor": "rgb(114, 132, 79)" + "borderColor": "rgb(114, 132, 79)", + "path": "src/main/java/org/junit/runners/ParentRunner.java" }, { "id": "FailOnTimeout.java", @@ -2650,7 +2681,8 @@ "effortRank": 10, "changePronenessRank": 9, "color": "rgba(99, 140, 82, 0.75)", - "borderColor": "rgb(99, 140, 82)" + "borderColor": "rgb(99, 140, 82)", + "path": "src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java" }, { "id": "BlockJUnit4ClassRunnerWithParameters.java", @@ -2662,7 +2694,8 @@ "effortRank": 7, "changePronenessRank": 5, "color": "rgba(84, 149, 86, 0.75)", - "borderColor": "rgb(84, 149, 86)" + "borderColor": "rgb(84, 149, 86)", + "path": "src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java" }, { "id": "TemporaryFolder.java", @@ -2674,7 +2707,8 @@ "effortRank": 11, "changePronenessRank": 8, "color": "rgba(69, 157, 89, 0.75)", - "borderColor": "rgb(69, 157, 89)" + "borderColor": "rgb(69, 157, 89)", + "path": "src/main/java/org/junit/rules/TemporaryFolder.java" }, { "id": "AllMembersSupplier.java", @@ -2686,7 +2720,8 @@ "effortRank": 12, "changePronenessRank": 7, "color": "rgba(54, 166, 93, 0.75)", - "borderColor": "rgb(54, 166, 93)" + "borderColor": "rgb(54, 166, 93)", + "path": "src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java" }, { "id": "TestCase.java", @@ -2698,7 +2733,8 @@ "effortRank": 10, "changePronenessRank": 1, "color": "rgba(39, 174, 96, 0.75)", - "borderColor": "rgb(39, 174, 96)" + "borderColor": "rgb(39, 174, 96)", + "path": "src/main/java/junit/framework/TestCase.java" } ], "xaxisLabel": "Effort to refactor", @@ -3130,7 +3166,8 @@ "effortRank": 1, "changePronenessRank": 4, "color": "rgba(235, 64, 52, 0.75)", - "borderColor": "rgb(235, 64, 52)" + "borderColor": "rgb(235, 64, 52)", + "path": "src/main/java/org/junit/runners/ParentRunner.java" }, { "id": "Theories.java", @@ -3142,7 +3179,8 @@ "effortRank": 2, "changePronenessRank": 3, "color": "rgba(170, 101, 67, 0.75)", - "borderColor": "rgb(170, 101, 67)" + "borderColor": "rgb(170, 101, 67)", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "id": "MethodValidator.java", @@ -3154,7 +3192,8 @@ "effortRank": 1, "changePronenessRank": 1, "color": "rgba(104, 137, 81, 0.75)", - "borderColor": "rgb(104, 137, 81)" + "borderColor": "rgb(104, 137, 81)", + "path": "src/main/java/org/junit/internal/runners/MethodValidator.java" }, { "id": "AllMembersSupplier.java", @@ -3166,7 +3205,8 @@ "effortRank": 3, "changePronenessRank": 2, "color": "rgba(39, 174, 96, 0.75)", - "borderColor": "rgb(39, 174, 96)" + "borderColor": "rgb(39, 174, 96)", + "path": "src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java" } ], "xaxisLabel": "Effort to refactor", @@ -3335,7 +3375,8 @@ "effortRank": 1, "changePronenessRank": 14, "color": "rgba(235, 64, 52, 0.75)", - "borderColor": "rgb(235, 64, 52)" + "borderColor": "rgb(235, 64, 52)", + "path": "src/main/java/org/junit/runners/ParentRunner.java" }, { "id": "Theories.java", @@ -3347,7 +3388,8 @@ "effortRank": 3, "changePronenessRank": 12, "color": "rgba(220, 72, 55, 0.75)", - "borderColor": "rgb(220, 72, 55)" + "borderColor": "rgb(220, 72, 55)", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "id": "Theories.java", @@ -3359,7 +3401,8 @@ "effortRank": 3, "changePronenessRank": 12, "color": "rgba(205, 81, 59, 0.75)", - "borderColor": "rgb(205, 81, 59)" + "borderColor": "rgb(205, 81, 59)", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "id": "Throwables.java", @@ -3371,7 +3414,8 @@ "effortRank": 2, "changePronenessRank": 9, "color": "rgba(190, 89, 62, 0.75)", - "borderColor": "rgb(190, 89, 62)" + "borderColor": "rgb(190, 89, 62)", + "path": "src/main/java/org/junit/internal/Throwables.java" }, { "id": "Assert.java", @@ -3383,7 +3427,8 @@ "effortRank": 6, "changePronenessRank": 13, "color": "rgba(175, 98, 66, 0.75)", - "borderColor": "rgb(175, 98, 66)" + "borderColor": "rgb(175, 98, 66)", + "path": "src/main/java/org/junit/Assert.java" }, { "id": "Throwables.java", @@ -3395,7 +3440,8 @@ "effortRank": 3, "changePronenessRank": 9, "color": "rgba(160, 106, 69, 0.75)", - "borderColor": "rgb(160, 106, 69)" + "borderColor": "rgb(160, 106, 69)", + "path": "src/main/java/org/junit/internal/Throwables.java" }, { "id": "TestRunner.java", @@ -3407,7 +3453,8 @@ "effortRank": 1, "changePronenessRank": 5, "color": "rgba(145, 115, 72, 0.75)", - "borderColor": "rgb(145, 115, 72)" + "borderColor": "rgb(145, 115, 72)", + "path": "src/main/java/junit/textui/TestRunner.java" }, { "id": "BlockJUnit4ClassRunnerWithParameters.java", @@ -3419,7 +3466,8 @@ "effortRank": 7, "changePronenessRank": 10, "color": "rgba(129, 123, 76, 0.75)", - "borderColor": "rgb(129, 123, 76)" + "borderColor": "rgb(129, 123, 76)", + "path": "src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java" }, { "id": "BaseTestRunner.java", @@ -3431,7 +3479,8 @@ "effortRank": 4, "changePronenessRank": 6, "color": "rgba(114, 132, 79, 0.75)", - "borderColor": "rgb(114, 132, 79)" + "borderColor": "rgb(114, 132, 79)", + "path": "src/main/java/junit/runner/BaseTestRunner.java" }, { "id": "JUnit38ClassRunner.java", @@ -3443,7 +3492,8 @@ "effortRank": 5, "changePronenessRank": 7, "color": "rgba(99, 140, 82, 0.75)", - "borderColor": "rgb(99, 140, 82)" + "borderColor": "rgb(99, 140, 82)", + "path": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java" }, { "id": "SpecificDataPointsSupplier.java", @@ -3455,7 +3505,8 @@ "effortRank": 5, "changePronenessRank": 4, "color": "rgba(84, 149, 86, 0.75)", - "borderColor": "rgb(84, 149, 86)" + "borderColor": "rgb(84, 149, 86)", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" }, { "id": "SpecificDataPointsSupplier.java", @@ -3467,7 +3518,8 @@ "effortRank": 5, "changePronenessRank": 4, "color": "rgba(69, 157, 89, 0.75)", - "borderColor": "rgb(69, 157, 89)" + "borderColor": "rgb(69, 157, 89)", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" }, { "id": "SpecificDataPointsSupplier.java", @@ -3479,7 +3531,8 @@ "effortRank": 5, "changePronenessRank": 4, "color": "rgba(54, 166, 93, 0.75)", - "borderColor": "rgb(54, 166, 93)" + "borderColor": "rgb(54, 166, 93)", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" }, { "id": "SpecificDataPointsSupplier.java", @@ -3491,7 +3544,8 @@ "effortRank": 5, "changePronenessRank": 4, "color": "rgba(39, 174, 96, 0.75)", - "borderColor": "rgb(39, 174, 96)" + "borderColor": "rgb(39, 174, 96)", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" } ], "xaxisLabel": "Effort to refactor", @@ -3980,7 +4034,8 @@ "effortRank": 1, "changePronenessRank": 2, "color": "rgba(235, 64, 52, 0.75)", - "borderColor": "rgb(235, 64, 52)" + "borderColor": "rgb(235, 64, 52)", + "path": "src/main/java/org/junit/runners/model/FrameworkMethod.java" }, { "id": "TestClass.java", @@ -3992,7 +4047,8 @@ "effortRank": 2, "changePronenessRank": 3, "color": "rgba(137, 119, 74, 0.75)", - "borderColor": "rgb(137, 119, 74)" + "borderColor": "rgb(137, 119, 74)", + "path": "src/main/java/org/junit/runners/model/TestClass.java" }, { "id": "Statement.java", @@ -4004,7 +4060,8 @@ "effortRank": 3, "changePronenessRank": 1, "color": "rgba(39, 174, 96, 0.75)", - "borderColor": "rgb(39, 174, 96)" + "borderColor": "rgb(39, 174, 96)", + "path": "src/main/java/org/junit/runners/model/Statement.java" } ], "xaxisLabel": "Effort to refactor", diff --git a/tests/unit/renderer.test.js b/tests/unit/renderer.test.js index 65b8f28..5b34504 100644 --- a/tests/unit/renderer.test.js +++ b/tests/unit/renderer.test.js @@ -2,7 +2,7 @@ import { describe, it, expect } from 'bun:test'; import { JSDOM } from 'jsdom'; import { readFileSync } from 'node:fs'; import path from 'node:path'; -import { renderTemplate, initializeMustache, prepareReportData, classRelationshipMarkup } from '../../lib/renderer.js'; +import { renderTemplate, initializeMustache, prepareReportData, classRelationshipMarkup, packageRelationshipMarkup } from '../../lib/renderer.js'; import { TABLE_CONFIG } from '../../lib/table-operations.js'; describe('Mustache Rendering', () => { @@ -247,6 +247,33 @@ describe('source-link cell rendering (owned by the report rendering layer)', () expect(classRelationshipMarkup({ renderedLabel: 'A' }, REPO_URL)).toBeNull(); }); + it('builds the package-relationship markup from repoUrl, package paths and package names', () => { + // The package names double as the anchor text; the hyperlink targets are + // project.repoUrl plus the package directory paths relative to the project root + expect(packageRelationshipMarkup( + { + sourcePackage: 'org.hjug.graphbuilder.metrics', + targetPackage: 'org.hjug.graphbuilder', + sourcePackagePath: 'codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/', + targetPackagePath: 'codebase-graph-builder/src/main/java/org/hjug/graphbuilder/', + sourceMarked: false, + targetMarked: true + }, + REPO_URL + )).toBe( + 'org.hjug.graphbuilder.metrics ' + + '→ ' + + 'org.hjug.graphbuilder*' + ); + }); + + it('returns null for entries without the structured package-relationship fields', () => { + expect(packageRelationshipMarkup(null, REPO_URL)).toBeNull(); + expect(packageRelationshipMarkup('legacy label', REPO_URL)).toBeNull(); + expect(packageRelationshipMarkup({ sourceMarked: true }, REPO_URL)).toBeNull(); + expect(packageRelationshipMarkup({ renderedLabel: 'org.a → org.b : 1' }, REPO_URL)).toBeNull(); + }); + for (const templatePath of ['assets', 'public/assets']) { it(`renders hardened source links in the class-relationships cell (${templatePath})`, () => { const template = readFileSync( @@ -379,38 +406,91 @@ describe('source-link cell rendering (owned by the report rendering layer)', () expect(cell.textContent).toContain('A → B'); }); - it('still restricts package relationship labels to links and markers', () => { + it('renders the package-relationships cell from repoUrl + package paths with hardened anchors', () => { const template = readFileSync( path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' ); - const data = structuredClone(junitFixture); - const hostilePackageLabel = - '' + - '' + - '* → Target : 1' + - '' + - 'Unsafe'; - data.packageRelationshipsToRemove.relationships = [ - { ...data.packageRelationshipsToRemove.relationships[0], renderedLabel: hostilePackageLabel } - ]; + const data = { + project: { name: 'Demo', version: '1.0', repoUrl: REPO_URL }, + classRelationshipsToRemove: { hasRelationships: false, relationships: [] }, + packageRelationshipsToRemove: { + hasRelationships: true, + relationships: [ + { + sourcePackage: 'org.hjug.graphbuilder.metrics', + targetPackage: 'org.hjug.graphbuilder', + sourcePackagePath: 'codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/', + targetPackagePath: 'codebase-graph-builder/src/main/java/org/hjug/graphbuilder/', + sourceMarked: false, + targetMarked: true, + priority: 1, + cycleCount: 1, + effortRank: 1, + classRelationshipsToBreakPackage: [] + } + ] + } + }; const original = structuredClone(data); const html = renderTemplate(template, prepareReportData(data)); const doc = new JSDOM(html).window.document; expect(data).toEqual(original); - expect(html).not.toContain('body {'); - const cell = doc.querySelector( - 'table[data-rf-table="package-relationships"] tbody tr td:first-child' + const cell = doc.querySelector('table[data-rf-table="package-relationships"] tbody tr td:first-child'); + expect(cell).not.toBeNull(); + const anchors = cell.querySelectorAll('a'); + expect(anchors.length).toBe(2); + expect(anchors[0].getAttribute('href')) + .toBe(REPO_URL + 'codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/'); + expect(anchors[0].getAttribute('target')).toBe('_blank'); + expect(anchors[0].getAttribute('rel')).toBe('noopener noreferrer'); + expect(anchors[0].textContent).toBe('org.hjug.graphbuilder.metrics'); + expect(anchors[1].textContent).toBe('org.hjug.graphbuilder'); + expect(cell.textContent).toBe('org.hjug.graphbuilder.metrics → org.hjug.graphbuilder*'); + for (const element of cell.querySelectorAll('*')) { + expect(element.tagName).toBe('A'); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } + }); + + it('neutralizes hostile package-relationship fields down to links and markers', () => { + const template = readFileSync( + path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' ); - expect(cell.textContent).toContain('Source* → Target : 1'); - expect(cell.querySelector('strong')?.textContent).toBe('*'); - expect(cell.querySelector('a')?.getAttribute('href')).toBe('https://example.com/source'); - expect(cell.querySelector('a')?.getAttribute('target')).toBe('_blank'); - expect(cell.querySelector('a')?.getAttribute('rel')).toBe('noopener noreferrer'); - expect(cell.querySelector('a:last-child')?.hasAttribute('href')).toBe(false); + const data = { + project: { name: 'Demo', version: '1.0', repoUrl: 'https://github.com/demo/repo/blob/main/' }, + classRelationshipsToRemove: { hasRelationships: false, relationships: [] }, + packageRelationshipsToRemove: { + hasRelationships: true, + relationships: [ + { + sourcePackage: 'org.demo.pkg', + targetPackage: 'org.demo.other', + sourcePackagePath: 'src/main/java/org/demo/pkg" onclick="alert(1)', + targetPackagePath: 'src/main/java/org/demo/other/', + sourceMarked: true, + targetMarked: false, + priority: 1, + cycleCount: 1, + effortRank: 1, + classRelationshipsToBreakPackage: [] + } + ] + } + }; + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="package-relationships"] tbody tr td:first-child'); + expect(cell).not.toBeNull(); + // The hostile name is escaped into inert text and the quote in the path cannot + // break out of the href attribute: no img element, no event handler attributes + expect(cell.querySelector('img')).toBeNull(); + expect(cell.querySelector('[onclick]')).toBeNull(); + expect(cell.textContent).toContain('org.demo.pkg'); + expect(cell.textContent).toContain('→ org.demo.other'); for (const element of cell.querySelectorAll('*')) { - expect(['A', 'STRONG']).toContain(element.tagName); + expect(element.tagName).toBe('A'); for (const attribute of element.attributes) { expect(['href', 'target', 'rel']).toContain(attribute.name); } @@ -459,6 +539,27 @@ function synthRelationships(count) { })); } +/** + * Builds package relationship fixtures with out-of-order priorities to exercise sorting. + * @param {number} count - Number of package relationship rows to generate. + * @returns {Array} Synthetic package relationship rows. + */ +function synthPackageRelationships(count) { + return Array.from({ length: count }, (_, i) => ({ + sourcePackage: `com.example.pkg${(i + 1) % count}`, + targetPackage: `com.example.pkg${i}`, + sourcePackagePath: `src/main/java/com/example/pkg${(i + 1) % count}/`, + targetPackagePath: `src/main/java/com/example/pkg${i}/`, + sourceMarked: i % 2 === 0, + targetMarked: false, + // start out of order (4, 5, 1, 2, 3, ...) so sorted assertions are meaningful + priority: ((i + 3) % 5) + 1, + cycleCount: i, + effortRank: i, + classRelationshipsToBreakPackage: [] + })); +} + /** * Builds a report fixture with configurable table sizes and unsorted priorities. * @param {object} [options] - Row counts for each report table. @@ -478,7 +579,7 @@ function synthReport({ classRows = 25, pkgRows = 5, disharmonyRows = 30, cycleRo }, packageRelationshipsToRemove: { hasRelationships: pkgRows > 0, - relationships: synthRelationships(pkgRows) + relationships: synthPackageRelationships(pkgRows) }, hasDisharmonies: true, disharmonies: [{ @@ -834,7 +935,12 @@ describe('class relationships to break a package cycle cell rendering', () => { hasRelationships: true, relationships: [ { - renderedLabel: 'org.junit.runner → org.junit.internal : 2', + sourcePackage: 'org.junit.runner', + targetPackage: 'org.junit.internal', + sourcePackagePath: 'src/main/java/org/junit/runner/', + targetPackagePath: 'src/main/java/org/junit/internal/', + sourceMarked: false, + targetMarked: false, priority: 1, cycleCount: 1, effortRank: 1, @@ -867,6 +973,12 @@ describe('class relationships to break a package cycle cell rendering', () => { expect(link.getAttribute('href')).toBe(REPO_URL + 'src/main/java/org/junit/runner/Request.java'); expect(link.getAttribute('target')).toBe('_blank'); expect(link.getAttribute('rel')).toBe('noopener noreferrer'); + // The package-relationship cell renders from the package fields too + const doc = new JSDOM(html).window.document; + const packageCell = doc.querySelector('table[data-rf-table="package-relationships"] tbody td:first-child'); + expect(packageCell.textContent).toBe('org.junit.runner → org.junit.internal'); + expect(packageCell.querySelector('a').getAttribute('href')) + .toBe(REPO_URL + 'src/main/java/org/junit/runner/'); }); it('drops pre-DTO string entries from older reports', () => { diff --git a/tests/unit/report-view.test.js b/tests/unit/report-view.test.js index 805245f..a766f17 100644 --- a/tests/unit/report-view.test.js +++ b/tests/unit/report-view.test.js @@ -144,6 +144,24 @@ describe('initBubbleChart', () => { delete window.Chart; }); + it('constructs the bubble source urls from the report repoUrl and the bubble paths', () => { + const created = []; + window.Chart = function (ctx, config) { created.push(config); }; + const canvas = document.getElementById('chart_GOD'); + initBubbleChart(canvas, 'God Classes', { + bubbles: [ + { x: 1, y: 1, r: 24, label: 'Foo.java', path: 'src/main/java/Foo.java' }, + { x: 2, y: 2, r: 12, label: 'Bar.java' } + ] + }, 'https://github.com/demo/repo/blob/main/'); + const data = created[0].data.datasets[0].data; + expect(data[0].raw.path).toBe('src/main/java/Foo.java'); + expect(data[0].raw.url).toBe('https://github.com/demo/repo/blob/main/src/main/java/Foo.java'); + // A bubble without a path gets no url and stays non-clickable + expect(data[1].raw.url).toBeNull(); + delete window.Chart; + }); + it('opens the clicked bubble source url in a new tab', () => { const created = []; window.Chart = function (ctx, config) { created.push(config); }; @@ -152,13 +170,10 @@ describe('initBubbleChart', () => { const opens = []; window.open = (...args) => { opens.push(args); }; initBubbleChart(canvas, 'God Classes', { - bubbles: [{ x: 1, y: 1, r: 24, label: 'Foo.java', url: 'https://example.com/Foo.java' }] - }); - const stubChart = { - data: { datasets: [{ data: [{ x: 1, y: 1, r: 24, raw: { url: 'https://example.com/Foo.java' } }] }] } - }; - created[0].options.onClick(new window.MouseEvent('click'), [{ datasetIndex: 0, index: 0 }], stubChart); - expect(opens).toEqual([['https://example.com/Foo.java', '_blank', 'noopener']]); + bubbles: [{ x: 1, y: 1, r: 24, label: 'Foo.java', path: 'src/main/java/Foo.java' }] + }, 'https://example.com/'); + created[0].options.onClick(new window.MouseEvent('click'), [{ datasetIndex: 0, index: 0 }], created[0]); + expect(opens).toEqual([['https://example.com/src/main/java/Foo.java', '_blank', 'noopener']]); window.open = originalOpen; }); @@ -170,12 +185,9 @@ describe('initBubbleChart', () => { const opens = []; window.open = (...args) => { opens.push(args); }; initBubbleChart(canvas, 'God Classes', { - bubbles: [{ x: 1, y: 1, r: 24, label: 'Foo.java', url: 'https://example.com/Foo.java' }] - }); - const stubChart = { - data: { datasets: [{ data: [{ x: 1, y: 1, r: 24, raw: { url: 'https://example.com/Foo.java' } }] }] } - }; - created[0].options.onClick(new window.MouseEvent('click'), [], stubChart); + bubbles: [{ x: 1, y: 1, r: 24, label: 'Foo.java', path: 'src/main/java/Foo.java' }] + }, 'https://example.com/'); + created[0].options.onClick(new window.MouseEvent('click'), [], created[0]); created[0].options.onClick( new window.MouseEvent('click'), [{ datasetIndex: 0, index: 0 }], @@ -193,8 +205,8 @@ describe('initBubbleChart', () => { const opens = []; window.open = (...args) => { opens.push(args); }; initBubbleChart(canvas, 'God Classes', { - bubbles: [{ x: 1, y: 1, r: 24, label: 'Foo.java', url: 'https://example.com/Foo.java' }] - }); + bubbles: [{ x: 1, y: 1, r: 24, label: 'Foo.java', path: 'src/main/java/Foo.java' }] + }, 'https://example.com/'); const onClick = created[0].options.onClick; const clickEvent = new window.MouseEvent('click'); for (const url of [ @@ -238,11 +250,11 @@ describe('initBubbleChart', () => { const canvas = document.getElementById('chart_GOD'); initBubbleChart(canvas, 'God Classes', { bubbles: [ - { x: 1, y: 1, r: 24, label: 'Foo.java', url: 'https://example.com/Foo.java' }, - { x: 2, y: 2, r: 24, label: 'Bar.java', url: 'javascript:alert(1)' }, + { x: 1, y: 1, r: 24, label: 'Foo.java', path: 'src/main/java/Foo.java' }, + { x: 2, y: 2, r: 24, label: 'Bar.java' }, { x: 3, y: 3, r: 24, label: 'Baz.java' } ] - }); + }, 'https://example.com/'); const onHover = created[0].options.onHover; const hoverEvent = { native: { target: canvas } }; onHover(hoverEvent, [{ datasetIndex: 0, index: 0 }], created[0]); @@ -541,10 +553,24 @@ describe('initDisharmonyCharts', () => { const created = []; window.Chart = function (ctx, config) { created.push(config); }; initDisharmonyCharts([ - { anchorId: 'GOD', title: 'God Classes', chart: { bubbles: [{ x: 1, y: 1, r: 5 }] } }, - { anchorId: 'BRAIN', title: 'Brain Methods', chart: { bubbles: [{ x: 2, y: 3, r: 2 }] } } - ]); + { anchorId: 'GOD', title: 'God Classes', chart: { bubbles: [{ x: 1, y: 1, r: 5, path: 'src/Foo.java' }] } }, + { anchorId: 'BRAIN', title: 'Brain Methods', chart: { bubbles: [{ x: 2, y: 3, r: 2, path: 'src/Bar.java' }] } } + ], 'https://example.com/'); expect(created.length).toBe(1); // no canvas for BRAIN + // The report repoUrl is combined with each bubble's path + expect(created[0].data.datasets[0].data[0].raw.url).toBe('https://example.com/src/Foo.java'); + delete window.Chart; + }); + + it('leaves bubble urls unset when no repoUrl is available', () => { + document.body.innerHTML = ''; + const created = []; + window.Chart = function (ctx, config) { created.push(config); }; + initDisharmonyCharts([ + { anchorId: 'GOD', title: 'God Classes', chart: { bubbles: [{ x: 1, y: 1, r: 5, path: 'src/Foo.java' }] } } + ]); + expect(created.length).toBe(1); + expect(created[0].data.datasets[0].data[0].raw.url).toBeNull(); delete window.Chart; }); @@ -552,7 +578,7 @@ describe('initDisharmonyCharts', () => { document.body.innerHTML = ''; const created = []; window.Chart = function (ctx, config) { created.push(config); }; - initDisharmonyCharts([{ anchorId: 'GOD', title: 'God Classes' }]); + initDisharmonyCharts([{ anchorId: 'GOD', title: 'God Classes' }], 'https://example.com/'); expect(created.length).toBe(0); delete window.Chart; }); diff --git a/tests/unit/table-operations.test.js b/tests/unit/table-operations.test.js index f8c42ad..66edbe3 100644 --- a/tests/unit/table-operations.test.js +++ b/tests/unit/table-operations.test.js @@ -441,6 +441,31 @@ describe('REPORT_TABLES class-relationships relationship column', () => { }); }); +describe('REPORT_TABLES package-relationships relationship column', () => { + const column = REPORT_TABLES['package-relationships'].columns[0]; + + it('derives the plain text from the package names and removal markers', () => { + expect(column.key).toBe('packageRelationship'); + expect(column.label).toBe('Package Relationship'); + expect(columnValue(column, { + sourcePackage: 'org.junit.runner', + targetPackage: 'org.junit.internal', + sourceMarked: false, + targetMarked: true + })).toBe('org.junit.runner → org.junit.internal*'); + expect(columnValue(column, { + sourcePackage: 'org.a', + targetPackage: 'org.b' + })).toBe('org.a → org.b'); + }); + + it('falls back to an empty value when the structured fields are absent', () => { + expect(columnValue(column, {})).toBe(''); + expect(columnValue(column, { sourceMarked: true })).toBe(''); + expect(columnValue(column, { renderedLabel: 'org.a → org.b : 1' })).toBe(''); + }); +}); + describe('REPORT_TABLES package-relationships class-break column', () => { const column = REPORT_TABLES['package-relationships'].columns.find( col => col.key === 'classRelationshipsToBreakPackage' From 254d88f597466a38ec6668b7562dbe01394bf477 Mon Sep 17 00:00:00 2001 From: Jim Bethancourt Date: Mon, 5 Oct 2026 07:54:38 -0500 Subject: [PATCH 3/5] Assembling links instead of providing pre-rendered URL for package relationships and Disharmony tables --- lib/renderer.js | 35 +++++- tests/fixtures/junit4-report.json | 195 ++++++++++++++++++------------ tests/unit/renderer.test.js | 92 ++++++++++++++ 3 files changed, 243 insertions(+), 79 deletions(-) diff --git a/lib/renderer.js b/lib/renderer.js index 72832c5..f49c22f 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -174,6 +174,26 @@ function safeClassRelationshipLabel(relationship, repoUrl) { return markup == null ? '' : sanitizeRelationshipLabel(markup); } +/** + * Builds the source-link markup for one disharmony table cell that carries a + * path relative to the project root: the hyperlink target is project.repoUrl + * plus the path, and the cell's existing text becomes the anchor text. The + * markup is sanitized down to a hardened link before it reaches the template; + * cells without a path are passed through untouched. + * + * @param {object} cell - Raw disharmony table cell. + * @param {string} repoUrl - Repository URL prefix from project metadata. + * @returns {object} The cell, or a copy whose content is the sanitized link. + */ +function prepareDisharmonyCell(cell, repoUrl) { + if (!cell || typeof cell !== 'object' || cell.path == null) return cell; + registerLinkSafetyHook(); + const base = typeof repoUrl === 'string' ? repoUrl : ''; + const markup = '' + + String(cell.content ?? '') + ''; + return { ...cell, content: sanitizeRelationshipLabel(markup) }; +} + /** * Adapts one "class relationship to break a package cycle" entry for the * template. Reports serialize structured ClassRelationshipDTO objects, and @@ -381,7 +401,20 @@ export function prepareReportData(data, tableStates = {}, config = TABLE_CONFIG) indicator: ui.colIndicator[columnIndex] ?? '', tableId: ui.tableId })); - return { ...disharmony, ui, table: { ...disharmony.table, headerObjs, rows } }; + return { + ...disharmony, + ui, + table: { + ...disharmony.table, + headerObjs, + rows: rows.map(row => ({ + ...row, + cells: Array.isArray(row.cells) + ? row.cells.map(cell => prepareDisharmonyCell(cell, repoUrl)) + : row.cells + })) + } + }; }); } diff --git a/tests/fixtures/junit4-report.json b/tests/fixtures/junit4-report.json index 1d7b7cd..56c6fe9 100644 --- a/tests/fixtures/junit4-report.json +++ b/tests/fixtures/junit4-report.json @@ -2377,8 +2377,9 @@ { "cells": [ { - "content": "BlockJUnit4ClassRunner.java", - "align": "left" + "content": "BlockJUnit4ClassRunner.java", + "align": "left", + "path": "src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java" }, { "content": "1", @@ -2405,8 +2406,9 @@ { "cells": [ { - "content": "ParentRunner.java", - "align": "left" + "content": "ParentRunner.java", + "align": "left", + "path": "src/main/java/org/junit/runners/ParentRunner.java" }, { "content": "2", @@ -2487,8 +2489,9 @@ { "cells": [ { - "content": "Failure.java", - "align": "left" + "content": "Failure.java", + "align": "left", + "path": "src/main/java/org/junit/runner/notification/Failure.java" }, { "content": "1", @@ -2515,8 +2518,9 @@ { "cells": [ { - "content": "FrameworkField.java", - "align": "left" + "content": "FrameworkField.java", + "align": "left", + "path": "src/main/java/org/junit/runners/model/FrameworkField.java" }, { "content": "2", @@ -2753,8 +2757,9 @@ { "cells": [ { - "content": "Theories.java", - "align": "left" + "content": "Theories.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "content": "1", @@ -2781,8 +2786,9 @@ { "cells": [ { - "content": "BlockJUnit4ClassRunner.java", - "align": "left" + "content": "BlockJUnit4ClassRunner.java", + "align": "left", + "path": "src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java" }, { "content": "2", @@ -2809,8 +2815,9 @@ { "cells": [ { - "content": "ErrorReportingRunner.java", - "align": "left" + "content": "ErrorReportingRunner.java", + "align": "left", + "path": "src/main/java/org/junit/internal/runners/ErrorReportingRunner.java" }, { "content": "3", @@ -2837,8 +2844,9 @@ { "cells": [ { - "content": "Categories.java", - "align": "left" + "content": "Categories.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/categories/Categories.java" }, { "content": "4", @@ -2865,8 +2873,9 @@ { "cells": [ { - "content": "Categories.java", - "align": "left" + "content": "Categories.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/categories/Categories.java" }, { "content": "5", @@ -2893,8 +2902,9 @@ { "cells": [ { - "content": "TestRunner.java", - "align": "left" + "content": "TestRunner.java", + "align": "left", + "path": "src/main/java/junit/textui/TestRunner.java" }, { "content": "6", @@ -2921,8 +2931,9 @@ { "cells": [ { - "content": "JUnit4ClassRunner.java", - "align": "left" + "content": "JUnit4ClassRunner.java", + "align": "left", + "path": "src/main/java/org/junit/internal/runners/JUnit4ClassRunner.java" }, { "content": "7", @@ -2949,8 +2960,9 @@ { "cells": [ { - "content": "JUnit38ClassRunner.java", - "align": "left" + "content": "JUnit38ClassRunner.java", + "align": "left", + "path": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java" }, { "content": "8", @@ -2977,8 +2989,9 @@ { "cells": [ { - "content": "ParentRunner.java", - "align": "left" + "content": "ParentRunner.java", + "align": "left", + "path": "src/main/java/org/junit/runners/ParentRunner.java" }, { "content": "9", @@ -3005,8 +3018,9 @@ { "cells": [ { - "content": "FailOnTimeout.java", - "align": "left" + "content": "FailOnTimeout.java", + "align": "left", + "path": "src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java" }, { "content": "10", @@ -3033,8 +3047,9 @@ { "cells": [ { - "content": "BlockJUnit4ClassRunnerWithParameters.java", - "align": "left" + "content": "BlockJUnit4ClassRunnerWithParameters.java", + "align": "left", + "path": "src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java" }, { "content": "11", @@ -3061,8 +3076,9 @@ { "cells": [ { - "content": "TemporaryFolder.java", - "align": "left" + "content": "TemporaryFolder.java", + "align": "left", + "path": "src/main/java/org/junit/rules/TemporaryFolder.java" }, { "content": "12", @@ -3089,8 +3105,9 @@ { "cells": [ { - "content": "AllMembersSupplier.java", - "align": "left" + "content": "AllMembersSupplier.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java" }, { "content": "13", @@ -3117,8 +3134,9 @@ { "cells": [ { - "content": "TestCase.java", - "align": "left" + "content": "TestCase.java", + "align": "left", + "path": "src/main/java/junit/framework/TestCase.java" }, { "content": "14", @@ -3226,8 +3244,9 @@ { "cells": [ { - "content": "ParentRunner.java", - "align": "left" + "content": "ParentRunner.java", + "align": "left", + "path": "src/main/java/org/junit/runners/ParentRunner.java" }, { "content": "order(Orderer)", @@ -3258,8 +3277,9 @@ { "cells": [ { - "content": "Theories.java", - "align": "left" + "content": "Theories.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "content": "validateTestMethods(List<Throwable>)", @@ -3290,8 +3310,9 @@ { "cells": [ { - "content": "MethodValidator.java", - "align": "left" + "content": "MethodValidator.java", + "align": "left", + "path": "src/main/java/org/junit/internal/runners/MethodValidator.java" }, { "content": "validateTestMethods(Class<?>,boolean)", @@ -3322,8 +3343,9 @@ { "cells": [ { - "content": "AllMembersSupplier.java", - "align": "left" + "content": "AllMembersSupplier.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java" }, { "content": "addMultiPointMethods(ParameterSignature,List<PotentialAssignment>)", @@ -3565,8 +3587,9 @@ { "cells": [ { - "content": "ParentRunner.java", - "align": "left" + "content": "ParentRunner.java", + "align": "left", + "path": "src/main/java/org/junit/runners/ParentRunner.java" }, { "content": "filter(Filter)", @@ -3597,8 +3620,9 @@ { "cells": [ { - "content": "Theories.java", - "align": "left" + "content": "Theories.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "content": "validateDataPointMethods(List<Throwable>)", @@ -3629,8 +3653,9 @@ { "cells": [ { - "content": "Theories.java", - "align": "left" + "content": "Theories.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/Theories.java" }, { "content": "validateDataPointFields(List<Throwable>)", @@ -3661,8 +3686,9 @@ { "cells": [ { - "content": "Throwables.java", - "align": "left" + "content": "Throwables.java", + "align": "left", + "path": "src/main/java/org/junit/internal/Throwables.java" }, { "content": "getCauseStackTraceLines(Throwable)", @@ -3693,8 +3719,9 @@ { "cells": [ { - "content": "Assert.java", - "align": "left" + "content": "Assert.java", + "align": "left", + "path": "src/main/java/org/junit/Assert.java" }, { "content": "assertThrows(String,Class<T>,ThrowingRunnable)", @@ -3725,8 +3752,9 @@ { "cells": [ { - "content": "Throwables.java", - "align": "left" + "content": "Throwables.java", + "align": "left", + "path": "src/main/java/org/junit/internal/Throwables.java" }, { "content": "getTrimmedStackTraceLines(Throwable)", @@ -3757,8 +3785,9 @@ { "cells": [ { - "content": "TestRunner.java", - "align": "left" + "content": "TestRunner.java", + "align": "left", + "path": "src/main/java/junit/textui/TestRunner.java" }, { "content": "start(String[])", @@ -3789,8 +3818,9 @@ { "cells": [ { - "content": "BlockJUnit4ClassRunnerWithParameters.java", - "align": "left" + "content": "BlockJUnit4ClassRunnerWithParameters.java", + "align": "left", + "path": "src/main/java/org/junit/runners/parameterized/BlockJUnit4ClassRunnerWithParameters.java" }, { "content": "createTestUsingFieldInjection()", @@ -3821,8 +3851,9 @@ { "cells": [ { - "content": "BaseTestRunner.java", - "align": "left" + "content": "BaseTestRunner.java", + "align": "left", + "path": "src/main/java/junit/runner/BaseTestRunner.java" }, { "content": "getTest(String)", @@ -3853,8 +3884,9 @@ { "cells": [ { - "content": "JUnit38ClassRunner.java", - "align": "left" + "content": "JUnit38ClassRunner.java", + "align": "left", + "path": "src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java" }, { "content": "makeDescription(Test)", @@ -3885,8 +3917,9 @@ { "cells": [ { - "content": "SpecificDataPointsSupplier.java", - "align": "left" + "content": "SpecificDataPointsSupplier.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" }, { "content": "getDataPointsMethods(ParameterSignature)", @@ -3917,8 +3950,9 @@ { "cells": [ { - "content": "SpecificDataPointsSupplier.java", - "align": "left" + "content": "SpecificDataPointsSupplier.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" }, { "content": "getDataPointsFields(ParameterSignature)", @@ -3949,8 +3983,9 @@ { "cells": [ { - "content": "SpecificDataPointsSupplier.java", - "align": "left" + "content": "SpecificDataPointsSupplier.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" }, { "content": "getSingleDataPointMethods(ParameterSignature)", @@ -3981,8 +4016,9 @@ { "cells": [ { - "content": "SpecificDataPointsSupplier.java", - "align": "left" + "content": "SpecificDataPointsSupplier.java", + "align": "left", + "path": "src/main/java/org/junit/experimental/theories/internal/SpecificDataPointsSupplier.java" }, { "content": "getSingleDataPointFields(ParameterSignature)", @@ -4081,8 +4117,9 @@ { "cells": [ { - "content": "FrameworkMethod.java", - "align": "left" + "content": "FrameworkMethod.java", + "align": "left", + "path": "src/main/java/org/junit/runners/model/FrameworkMethod.java" }, { "content": "getName()", @@ -4113,8 +4150,9 @@ { "cells": [ { - "content": "TestClass.java", - "align": "left" + "content": "TestClass.java", + "align": "left", + "path": "src/main/java/org/junit/runners/model/TestClass.java" }, { "content": "getAnnotatedMethods(Class<?>)", @@ -4145,8 +4183,9 @@ { "cells": [ { - "content": "Statement.java", - "align": "left" + "content": "Statement.java", + "align": "left", + "path": "src/main/java/org/junit/runners/model/Statement.java" }, { "content": "evaluate()", diff --git a/tests/unit/renderer.test.js b/tests/unit/renderer.test.js index 5b34504..d3a9a3f 100644 --- a/tests/unit/renderer.test.js +++ b/tests/unit/renderer.test.js @@ -514,6 +514,98 @@ describe('source-link cell rendering (owned by the report rendering layer)', () }); }); +// --------------------------------------------------------------------------- +// Disharmony table source-link cells: the report JSON carries the plain file +// name in the Class cell plus the source path relative to the project root; +// the rendering layer combines the path with project.repoUrl and sanitizes +// the anchor before it reaches the template. +// --------------------------------------------------------------------------- + +describe('disharmony table source-link cell rendering', () => { + const template = readFileSync( + path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' + ); + + /** + * Builds a one-row God Class findings report with the supplied Class cell. + * @param {object} classCell - Raw Class cell from the report JSON. + * @returns {object} Report fixture for the disharmony table. + */ + function reportWithClassCell(classCell) { + return { + project: { name: 'Demo', version: '1.0', repoUrl: 'https://github.com/demo/repo/blob/main/' }, + hasDisharmonies: true, + disharmonies: [{ + anchorId: 'GOD', + title: 'God Classes', + problem: 'problem', + solution: 'solution', + table: { + headers: ['Class', 'Priority'], + rows: [{ + cells: [classCell, { content: '1', align: 'right' }] + }] + } + }] + }; + } + + it('builds the Class cell link from repoUrl and the cell path', () => { + const data = reportWithClassCell({ + content: 'TestClass.java', + path: 'src/main/java/com/example/TestClass.java', + align: 'left' + }); + const original = structuredClone(data); + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + expect(data).toEqual(original); + const cell = doc.querySelector('table[data-rf-table="disharmony-GOD"] tbody td.rf-text-left'); + expect(cell).not.toBeNull(); + const link = cell.querySelector('a'); + expect(link.getAttribute('href')) + .toBe('https://github.com/demo/repo/blob/main/src/main/java/com/example/TestClass.java'); + expect(link.getAttribute('target')).toBe('_blank'); + expect(link.getAttribute('rel')).toBe('noopener noreferrer'); + expect(link.textContent).toBe('TestClass.java'); + for (const element of cell.querySelectorAll('*')) { + expect(element.tagName).toBe('A'); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } + }); + + it('neutralizes hostile disharmony cell fields down to a hardened link', () => { + const data = reportWithClassCell({ + content: 'TestClass.java', + path: 'src/main/java/com/example/TestClass" onclick="alert(1)', + align: 'left' + }); + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="disharmony-GOD"] tbody td.rf-text-left'); + expect(cell.querySelector('img')).toBeNull(); + expect(cell.querySelector('[onclick]')).toBeNull(); + expect(cell.textContent).toContain('TestClass.java'); + for (const element of cell.querySelectorAll('*')) { + expect(element.tagName).toBe('A'); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } + }); + + it('renders cells without a path as before', () => { + const data = reportWithClassCell({ content: 'TestClass.java', align: 'left' }); + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="disharmony-GOD"] tbody td.rf-text-left'); + expect(cell.querySelector('a')).toBeNull(); + expect(cell.textContent).toBe('TestClass.java'); + }); +}); + // --------------------------------------------------------------------------- // prepareReportData: filter -> sort -> paginate pipeline feeding the report // template with paginated rows and tableUi metadata (plan Phase 3). From 0c76e02422fbb2e971fb2008d43b3f27dcdeaa11 Mon Sep 17 00:00:00 2001 From: Jim Bethancourt Date: Mon, 5 Oct 2026 12:55:08 -0500 Subject: [PATCH 4/5] Assembling links instead of providing pre-rendered URL for the largest cycle breakdown table and applied Coderabbit suggestions --- assets/refactor-first-report.mustache | 2 +- lib/renderer.js | 29 ++++- lib/report-view.js | 5 +- lib/table-operations.js | 2 +- public/assets/refactor-first-report.mustache | 2 +- tests/fixtures/junit4-report.json | 54 ++++++---- tests/unit/renderer.test.js | 106 ++++++++++++++++++- tests/unit/report-view.test.js | 16 ++- 8 files changed, 188 insertions(+), 28 deletions(-) diff --git a/assets/refactor-first-report.mustache b/assets/refactor-first-report.mustache index 935dc83..5fe33ab 100644 --- a/assets/refactor-first-report.mustache +++ b/assets/refactor-first-report.mustache @@ -805,7 +805,7 @@ {{#classCycles.largestCycle.breakdown}} - {{{className}}} + {{{safeClassName}}} {{{edgesHtml}}} {{/classCycles.largestCycle.breakdown}} diff --git a/lib/renderer.js b/lib/renderer.js index f49c22f..7ea6403 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -194,6 +194,33 @@ function prepareDisharmonyCell(cell, repoUrl) { return { ...cell, content: sanitizeRelationshipLabel(markup) }; } +/** + * Builds the sanitized class-cell markup for one largest-cycle breakdown row + * from the structured CycleBreakdownRowDTO fields: the hyperlink target is + * project.repoUrl plus classPath, the anchor text is the simple class name, + * and a class marked for removal is followed by *. Rows without a path render + * as plain names (with the marker); the markup is sanitized to links and + * markers before it reaches the template. + * + * @param {object} row - Raw breakdown row. + * @param {string} repoUrl - Repository URL prefix from project metadata. + * @returns {object} Row copy with a restricted safeClassName label. + */ +function prepareCycleBreakdownRow(row, repoUrl) { + if (!row || typeof row !== 'object') return row; + registerLinkSafetyHook(); + const base = typeof repoUrl === 'string' ? repoUrl : ''; + let markup; + if (row.classPath != null) { + markup = '' + + escapeHtml(row.className) + ''; + } else { + markup = escapeHtml(row.className); + } + if (row.marked) markup += '*'; + return { ...row, safeClassName: sanitizeRelationshipLabel(markup) }; +} + /** * Adapts one "class relationship to break a package cycle" entry for the * template. Reports serialize structured ClassRelationshipDTO objects, and @@ -430,7 +457,7 @@ export function prepareReportData(data, tableStates = {}, config = TABLE_CONFIG) breakdownDescriptor, largestCycle.breakdown, stateOf(breakdownDescriptor.id), config); classCycles.largestCycle = { ...largestCycle, - breakdown: breakdown.rows, + breakdown: breakdown.rows.map(row => prepareCycleBreakdownRow(row, repoUrl)), breakdownUi: breakdown.ui }; } diff --git a/lib/report-view.js b/lib/report-view.js index 7e232d0..47871e5 100644 --- a/lib/report-view.js +++ b/lib/report-view.js @@ -570,7 +570,10 @@ export function initBubbleChart(canvas, title, chartData, repoUrl) { data: { datasets: [{ label: title, - data: (chartData.bubbles || []).map(b => ({x: b.x, y: b.y, r: b.r, raw: {...b, url: bubbleUrl(b, repoUrl)}})), + // The constructed repoUrl + path URL wins; a payload url is kept as a + // legacy fallback when no URL can be constructed, and null only when + // neither exists (the click/hover handlers still gate on isHttpUrl). + data: (chartData.bubbles || []).map(b => ({x: b.x, y: b.y, r: b.r, raw: {...b, url: bubbleUrl(b, repoUrl) ?? b.url ?? null}})), backgroundColor: (chartData.bubbles || []).map(b => b.color), borderColor: (chartData.bubbles || []).map(b => b.borderColor), borderWidth: 1 diff --git a/lib/table-operations.js b/lib/table-operations.js index cd7b211..e89f053 100644 --- a/lib/table-operations.js +++ b/lib/table-operations.js @@ -435,7 +435,7 @@ export const REPORT_TABLES = { caption: 'Classes and relationships in the largest cycle', getRows: data => data?.classCycles?.largestCycle?.breakdown ?? [], columns: [ - { key: 'className', label: 'Classes', value: row => stripHtml(row.className) }, + { key: 'className', label: 'Classes', value: row => stripHtml(row.className ?? '') + (row.marked ? '*' : '') }, { key: 'edgesHtml', label: 'Relationships', value: row => stripHtml(row.edgesHtml) } ] } diff --git a/public/assets/refactor-first-report.mustache b/public/assets/refactor-first-report.mustache index 935dc83..5fe33ab 100644 --- a/public/assets/refactor-first-report.mustache +++ b/public/assets/refactor-first-report.mustache @@ -805,7 +805,7 @@ {{#classCycles.largestCycle.breakdown}} - {{{className}}} + {{{safeClassName}}} {{{edgesHtml}}} {{/classCycles.largestCycle.breakdown}} diff --git a/tests/fixtures/junit4-report.json b/tests/fixtures/junit4-report.json index 56c6fe9..0a6a8c7 100644 --- a/tests/fixtures/junit4-report.json +++ b/tests/fixtures/junit4-report.json @@ -4381,40 +4381,58 @@ "dotThresholdExceeded": false, "breakdown": [ { - "className": "JUnitCore", - "edgesHtml": "JUnitCore → JUnitCommandLineParseResult : 3
\nJUnitCore → Request : 3
\n" + "className": "JUnitCore", + "edgesHtml": "JUnitCore → JUnitCommandLineParseResult : 3
\nJUnitCore → Request : 3
\n", + "classPath": "src/main/java/org/junit/runner/JUnitCore.java", + "marked": false }, { - "className": "Request*", - "edgesHtml": "Request → JUnitCore : 1*
\nRequest → ClassRequest : 2
\nRequest → FilterRequest : 1*
\nRequest → SortingRequest : 1*
\nRequest → OrderingRequest : 1
\n" + "className": "Request", + "edgesHtml": "Request → JUnitCore : 1*
\nRequest → ClassRequest : 2
\nRequest → FilterRequest : 1*
\nRequest → SortingRequest : 1*
\nRequest → OrderingRequest : 1
\n", + "classPath": "src/main/java/org/junit/runner/Request.java", + "marked": true }, { - "className": "OrderingRequest", - "edgesHtml": "OrderingRequest → Request : 3*
\nOrderingRequest → MemoizingRequest : 1
\n" + "className": "OrderingRequest", + "edgesHtml": "OrderingRequest → Request : 3*
\nOrderingRequest → MemoizingRequest : 1
\n", + "classPath": "src/main/java/org/junit/internal/requests/OrderingRequest.java", + "marked": false }, { - "className": "MemoizingRequest", - "edgesHtml": "MemoizingRequest → Request : 1*
\n" + "className": "MemoizingRequest", + "edgesHtml": "MemoizingRequest → Request : 1*
\n", + "classPath": "src/main/java/org/junit/internal/requests/MemoizingRequest.java", + "marked": false }, { - "className": "SortingRequest", - "edgesHtml": "SortingRequest → Request : 4
\n" + "className": "SortingRequest", + "edgesHtml": "SortingRequest → Request : 4
\n", + "classPath": "src/main/java/org/junit/internal/requests/SortingRequest.java", + "marked": false }, { - "className": "FilterRequest", - "edgesHtml": "FilterRequest → Request : 4
\n" + "className": "FilterRequest", + "edgesHtml": "FilterRequest → Request : 4
\n", + "classPath": "src/main/java/org/junit/internal/requests/FilterRequest.java", + "marked": false }, { - "className": "ClassRequest", - "edgesHtml": "ClassRequest → MemoizingRequest : 1
\n" + "className": "ClassRequest", + "edgesHtml": "ClassRequest → MemoizingRequest : 1
\n", + "classPath": "src/main/java/org/junit/internal/requests/ClassRequest.java", + "marked": false }, { - "className": "JUnitCommandLineParseResult", - "edgesHtml": "JUnitCommandLineParseResult → Request : 8
\nJUnitCommandLineParseResult → FilterFactories : 1
\n" + "className": "JUnitCommandLineParseResult", + "edgesHtml": "JUnitCommandLineParseResult → Request : 8
\nJUnitCommandLineParseResult → FilterFactories : 1
\n", + "classPath": "src/main/java/org/junit/runner/JUnitCommandLineParseResult.java", + "marked": false }, { - "className": "FilterFactories", - "edgesHtml": "FilterFactories → Request : 2
\n" + "className": "FilterFactories", + "edgesHtml": "FilterFactories → Request : 2
\n", + "classPath": "src/main/java/org/junit/runner/FilterFactories.java", + "marked": false } ] } diff --git a/tests/unit/renderer.test.js b/tests/unit/renderer.test.js index d3a9a3f..b64efca 100644 --- a/tests/unit/renderer.test.js +++ b/tests/unit/renderer.test.js @@ -606,6 +606,105 @@ describe('disharmony table source-link cell rendering', () => { }); }); +// --------------------------------------------------------------------------- +// Largest cycle breakdown source-link cells: the report JSON carries the +// simple class name, the source path relative to the project root and the +// removal marker; the rendering layer combines the path with project.repoUrl +// and sanitizes the anchor before it reaches the template. +// --------------------------------------------------------------------------- + +describe('largest cycle breakdown source-link cell rendering', () => { + const template = readFileSync( + path.join(import.meta.dir, '../../assets/refactor-first-report.mustache'), 'utf8' + ); + + /** + * Builds a report whose largest cycle breakdown holds the supplied rows. + * @param {Array} rows - Raw breakdown rows. + * @returns {object} Report fixture for the largest cycle table. + */ + function reportWithBreakdownRows(rows) { + return { + project: { name: 'Demo', version: '1.0', repoUrl: 'https://github.com/demo/repo/blob/main/' }, + classCycles: { + hasCycles: true, + summary: [], + largestCycle: { + hasCycleMap: true, + cycleName: 'A \u2192 B \u2192 A', + breakdown: rows + } + } + }; + } + + it('builds the class cell link from repoUrl and the row classPath', () => { + const data = reportWithBreakdownRows([ + { + className: 'ReportWriter$SecureDirectoryOps', + classPath: 'report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java', + marked: true, + edgesHtml: 'edge 1' + } + ]); + const original = structuredClone(data); + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + expect(data).toEqual(original); + const cell = doc.querySelector('table[data-rf-table="largest-cycle-breakdown"] tbody td.rf-text-left'); + expect(cell).not.toBeNull(); + const link = cell.querySelector('a'); + expect(link.getAttribute('href')) + .toBe('https://github.com/demo/repo/blob/main/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java'); + expect(link.getAttribute('target')).toBe('_blank'); + expect(link.getAttribute('rel')).toBe('noopener noreferrer'); + expect(link.textContent).toBe('ReportWriter$SecureDirectoryOps'); + expect(cell.textContent).toBe('ReportWriter$SecureDirectoryOps*'); + for (const element of cell.querySelectorAll('*')) { + expect(element.tagName).toBe('A'); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } + }); + + it('neutralizes hostile breakdown fields down to a hardened link', () => { + const data = reportWithBreakdownRows([ + { + className: 'Foo', + classPath: 'src/main/java/Foo" onclick="alert(1)', + marked: false, + edgesHtml: 'edge 1' + } + ]); + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="largest-cycle-breakdown"] tbody td.rf-text-left'); + expect(cell.querySelector('img')).toBeNull(); + expect(cell.querySelector('[onclick]')).toBeNull(); + expect(cell.textContent).toContain('Foo'); + for (const element of cell.querySelectorAll('*')) { + expect(element.tagName).toBe('A'); + for (const attribute of element.attributes) { + expect(['href', 'target', 'rel']).toContain(attribute.name); + } + } + }); + + it('renders rows without a class path as plain names with markers', () => { + const data = reportWithBreakdownRows([ + { className: 'Foo', marked: true, edgesHtml: 'edge 1' }, + { className: 'Bar', edgesHtml: 'edge 2' } + ]); + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cells = doc.querySelectorAll('table[data-rf-table="largest-cycle-breakdown"] tbody tr td:first-child'); + expect(cells[0].querySelector('a')).toBeNull(); + expect(cells[0].textContent).toBe('Foo*'); + expect(cells[1].textContent).toBe('Bar'); + }); +}); + // --------------------------------------------------------------------------- // prepareReportData: filter -> sort -> paginate pipeline feeding the report // template with paginated rows and tableUi metadata (plan Phase 3). @@ -700,7 +799,10 @@ function synthReport({ classRows = 25, pkgRows = 5, disharmonyRows = 30, cycleRo hasCycleMap: true, cycleName: 'cycle-0', breakdown: Array.from({ length: breakdownRows }, (_, i) => ({ - className: `CycleClass${i}`, edgesHtml: `edge ${i}` + className: `CycleClass${i}`, + classPath: `src/main/java/demo/CycleClass${i}.java`, + marked: i % 2 === 0, + edgesHtml: `edge ${i}` })) } } @@ -838,7 +940,7 @@ describe('prepareReportData', () => { expect(ui.colSort).toEqual(['none', 'none']); expect(ui.colIndicator).toEqual(['', '']); expect(prepared.classCycles.largestCycle.breakdown.map(row => row.className)) - .toEqual(['CycleClass0', 'CycleClass1', 'CycleClass2']); + .toEqual(['CycleClass0', 'CycleClass1', 'CycleClass2']); }); it('still forgoes any default sort when sorting is disabled', () => { diff --git a/tests/unit/report-view.test.js b/tests/unit/report-view.test.js index a766f17..bfde9e8 100644 --- a/tests/unit/report-view.test.js +++ b/tests/unit/report-view.test.js @@ -151,14 +151,24 @@ describe('initBubbleChart', () => { initBubbleChart(canvas, 'God Classes', { bubbles: [ { x: 1, y: 1, r: 24, label: 'Foo.java', path: 'src/main/java/Foo.java' }, - { x: 2, y: 2, r: 12, label: 'Bar.java' } + { + x: 2, y: 2, r: 20, label: 'Both.java', path: 'src/main/java/Both.java', + url: 'https://legacy.example/Both.java' + }, + { x: 3, y: 3, r: 16, label: 'Legacy.java', url: 'https://legacy.example/Legacy.java' }, + { x: 4, y: 4, r: 12, label: 'Bar.java' } ] }, 'https://github.com/demo/repo/blob/main/'); const data = created[0].data.datasets[0].data; expect(data[0].raw.path).toBe('src/main/java/Foo.java'); expect(data[0].raw.url).toBe('https://github.com/demo/repo/blob/main/src/main/java/Foo.java'); - // A bubble without a path gets no url and stays non-clickable - expect(data[1].raw.url).toBeNull(); + // The constructed repoUrl + path wins over a legacy embedded url + expect(data[1].raw.url).toBe('https://github.com/demo/repo/blob/main/src/main/java/Both.java'); + // A bubble without a path keeps the payload's legacy url (still gated by + // isHttpUrl in the click/hover handlers) + expect(data[2].raw.url).toBe('https://legacy.example/Legacy.java'); + // A bubble with neither a path nor a legacy url stays non-clickable + expect(data[3].raw.url).toBeNull(); delete window.Chart; }); From b1ba8f84c3fad3a5ec8eaeacaab63f0675bc8350 Mon Sep 17 00:00:00 2001 From: Jim Bethancourt Date: Mon, 5 Oct 2026 20:19:39 -0500 Subject: [PATCH 5/5] Applied Coderabbit suggestions --- lib/renderer.js | 12 +++---- lib/report-view.js | 6 ++-- lib/utils.js | 19 ++++++++++ tests/unit/renderer.test.js | 66 +++++++++++++++++++++++++++++++++- tests/unit/report-view.test.js | 26 ++++++++++++++ 5 files changed, 119 insertions(+), 10 deletions(-) diff --git a/lib/renderer.js b/lib/renderer.js index 7ea6403..d2413bb 100644 --- a/lib/renderer.js +++ b/lib/renderer.js @@ -5,6 +5,7 @@ // sanitizes the final HTML. import Mustache from 'mustache'; import DOMPurify from 'dompurify'; +import { sourceUrl } from './utils.js'; import { TABLE_CONFIG, REPORT_TABLES, @@ -98,9 +99,8 @@ const RELATIONSHIP_ARROW = ' → '; * @returns {string} The unsanitized relationship markup. */ function relationshipAnchorsMarkup(repoUrl, source, target) { - const base = typeof repoUrl === 'string' ? repoUrl : ''; const anchor = (relationshipPath, name) => - '' + '' + escapeHtml(name) + ''; return anchor(source.path, source.name) + (source.marked ? '*' : '') @@ -188,9 +188,8 @@ function safeClassRelationshipLabel(relationship, repoUrl) { function prepareDisharmonyCell(cell, repoUrl) { if (!cell || typeof cell !== 'object' || cell.path == null) return cell; registerLinkSafetyHook(); - const base = typeof repoUrl === 'string' ? repoUrl : ''; - const markup = '' - + String(cell.content ?? '') + ''; + const markup = '' + + escapeHtml(cell.content) + ''; return { ...cell, content: sanitizeRelationshipLabel(markup) }; } @@ -209,10 +208,9 @@ function prepareDisharmonyCell(cell, repoUrl) { function prepareCycleBreakdownRow(row, repoUrl) { if (!row || typeof row !== 'object') return row; registerLinkSafetyHook(); - const base = typeof repoUrl === 'string' ? repoUrl : ''; let markup; if (row.classPath != null) { - markup = '' + markup = '' + escapeHtml(row.className) + ''; } else { markup = escapeHtml(row.className); diff --git a/lib/report-view.js b/lib/report-view.js index 47871e5..b81f791 100644 --- a/lib/report-view.js +++ b/lib/report-view.js @@ -4,6 +4,8 @@ // vizdom WASM graph rendering. All CDN dependencies are optional — any // failure degrades to the static rendered report. +import { sourceUrl } from './utils.js'; + // --------------------------------------------------------------------------- // DOT exposure: popup buttons in the Mustache template reference globals. // --------------------------------------------------------------------------- @@ -551,8 +553,8 @@ export function isHttpUrl(value) { * @returns {string|null} The combined URL, or null when it cannot be built. */ function bubbleUrl(bubble, repoUrl) { - if (typeof repoUrl !== 'string' || !bubble || typeof bubble.path !== 'string') return null; - return repoUrl + bubble.path; + if (!bubble || typeof bubble.path !== 'string') return null; + return sourceUrl(repoUrl, bubble.path); } export function initBubbleChart(canvas, title, chartData, repoUrl) { diff --git a/lib/utils.js b/lib/utils.js index 198e136..3b64bcb 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -16,6 +16,25 @@ export function escapeHtml(value) { return String(value).replace(/[&<>"']/g, ch => HTML_ESCAPES[ch]); } +/** + * Builds the URL of a report-linked source file from the repository URL and + * the file path relative to the repository root. Each path segment is + * percent-encoded (keeping the / separators) so file-name characters such as + * # or ? stay part of the path instead of turning into URL fragment or + * query delimiters, and the join tolerates a repository URL without a + * trailing slash and a path with a leading slash. + * + * @param {*} repoUrl - Repository URL prefix from the project metadata. + * @param {*} path - File or directory path relative to the repository root. + * @returns {string|null} The combined URL, or null when it cannot be built. + */ +export function sourceUrl(repoUrl, path) { + if (typeof repoUrl !== 'string' || typeof path !== 'string') return null; + const base = repoUrl.endsWith('/') ? repoUrl : repoUrl + '/'; + const relative = path.startsWith('/') ? path.slice(1) : path; + return base + relative.split('/').map(encodeURIComponent).join('/'); +} + export function sortByRepository(repositories) { return [...repositories].sort((a, b) => a.repository.toLowerCase().localeCompare(b.repository.toLowerCase()) diff --git a/tests/unit/renderer.test.js b/tests/unit/renderer.test.js index b64efca..178d000 100644 --- a/tests/unit/renderer.test.js +++ b/tests/unit/renderer.test.js @@ -240,6 +240,22 @@ describe('source-link cell rendering (owned by the report rendering layer)', () ); }); + it('encodes class-relationship path segments and tolerates a missing repoUrl trailing slash', () => { + expect(classRelationshipMarkup( + { + sourceClassPath: 'src/main/java/C#Foo.java', + targetClassPath: 'src/main/java/B?ar.java', + simpleSourceClassName: 'Foo', + simpleTargetClassName: 'Bar' + }, + 'https://github.com/demo/repo' + )).toBe( + 'Foo ' + + '→ ' + + 'Bar' + ); + }); + it('returns null for entries without the structured class-relationship fields', () => { expect(classRelationshipMarkup(null, REPO_URL)).toBeNull(); expect(classRelationshipMarkup('legacy label', REPO_URL)).toBeNull(); @@ -267,6 +283,22 @@ describe('source-link cell rendering (owned by the report rendering layer)', () ); }); + it('encodes package-relationship path segments and tolerates a missing repoUrl trailing slash', () => { + expect(packageRelationshipMarkup( + { + sourcePackage: 'org.demo.pkg', + targetPackage: 'org.demo.other', + sourcePackagePath: 'src/main/java/org/demo/pkg#dir/', + targetPackagePath: 'src/main/java/org/demo/other?dir/' + }, + 'https://github.com/demo/repo' + )).toBe( + 'org.demo.pkg ' + + '→ ' + + 'org.demo.other' + ); + }); + it('returns null for entries without the structured package-relationship fields', () => { expect(packageRelationshipMarkup(null, REPO_URL)).toBeNull(); expect(packageRelationshipMarkup('legacy label', REPO_URL)).toBeNull(); @@ -587,7 +619,8 @@ describe('disharmony table source-link cell rendering', () => { const cell = doc.querySelector('table[data-rf-table="disharmony-GOD"] tbody td.rf-text-left'); expect(cell.querySelector('img')).toBeNull(); expect(cell.querySelector('[onclick]')).toBeNull(); - expect(cell.textContent).toContain('TestClass.java'); + // The hostile content is escaped as inert anchor text, not nested HTML + expect(cell.textContent).toContain('TestClass.java'); for (const element of cell.querySelectorAll('*')) { expect(element.tagName).toBe('A'); for (const attribute of element.attributes) { @@ -596,6 +629,20 @@ describe('disharmony table source-link cell rendering', () => { } }); + it('encodes disharmony cell path segments and tolerates a missing repoUrl trailing slash', () => { + const data = reportWithClassCell({ + content: 'C#Foo.java', + path: 'src/main/java/C#Foo.java', + align: 'left' + }); + data.project.repoUrl = 'https://github.com/demo/repo'; + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="disharmony-GOD"] tbody td.rf-text-left'); + expect(cell.querySelector('a').getAttribute('href')) + .toBe('https://github.com/demo/repo/src/main/java/C%23Foo.java'); + }); + it('renders cells without a path as before', () => { const data = reportWithClassCell({ content: 'TestClass.java', align: 'left' }); const html = renderTemplate(template, prepareReportData(data)); @@ -691,6 +738,23 @@ describe('largest cycle breakdown source-link cell rendering', () => { } }); + it('encodes breakdown class path segments and tolerates a missing repoUrl trailing slash', () => { + const data = reportWithBreakdownRows([ + { + className: 'C#Foo', + classPath: 'src/main/java/C#Foo.java', + marked: false, + edgesHtml: 'edge 1' + } + ]); + data.project.repoUrl = 'https://github.com/demo/repo'; + const html = renderTemplate(template, prepareReportData(data)); + const doc = new JSDOM(html).window.document; + const cell = doc.querySelector('table[data-rf-table="largest-cycle-breakdown"] tbody tr td:first-child'); + expect(cell.querySelector('a').getAttribute('href')) + .toBe('https://github.com/demo/repo/src/main/java/C%23Foo.java'); + }); + it('renders rows without a class path as plain names with markers', () => { const data = reportWithBreakdownRows([ { className: 'Foo', marked: true, edgesHtml: 'edge 1' }, diff --git a/tests/unit/report-view.test.js b/tests/unit/report-view.test.js index bfde9e8..b1bb87a 100644 --- a/tests/unit/report-view.test.js +++ b/tests/unit/report-view.test.js @@ -172,6 +172,32 @@ describe('initBubbleChart', () => { delete window.Chart; }); + it('encodes each path segment while preserving the / separators', () => { + const created = []; + window.Chart = function (ctx, config) { created.push(config); }; + const canvas = document.getElementById('chart_GOD'); + initBubbleChart(canvas, 'God Classes', { + bubbles: [{ x: 1, y: 1, r: 24, label: 'C#Foo.java', path: 'src/main/java/C#Foo.java? v=1.java' }] + }, 'https://github.com/demo/repo/blob/main/'); + // File-name characters such as # and ? stay part of the path instead of + // becoming URL fragment or query delimiters + expect(created[0].data.datasets[0].data[0].raw.url) + .toBe('https://github.com/demo/repo/blob/main/src/main/java/C%23Foo.java%3F%20v%3D1.java'); + delete window.Chart; + }); + + it('inserts the separator when the repository url lacks a trailing slash', () => { + const created = []; + window.Chart = function (ctx, config) { created.push(config); }; + const canvas = document.getElementById('chart_GOD'); + initBubbleChart(canvas, 'God Classes', { + bubbles: [{ x: 1, y: 1, r: 24, label: 'Foo.java', path: 'src/Foo.java' }] + }, 'https://github.com/demo/repo'); + expect(created[0].data.datasets[0].data[0].raw.url) + .toBe('https://github.com/demo/repo/src/Foo.java'); + delete window.Chart; + }); + it('opens the clicked bubble source url in a new tab', () => { const created = []; window.Chart = function (ctx, config) { created.push(config); };