Skip to content

Commit c6b8174

Browse files
Merge remote-tracking branch 'origin/use-ClassRelationshipDTO-in-package-cycles' into use-ClassRelationshipDTO-in-package-cycles
2 parents 05502a5 + fe223df commit c6b8174

4 files changed

Lines changed: 13 additions & 0 deletions

File tree

‎graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ private E selectHighestScoredEdge(Map<LineVertex<V, E>, Double> pageRankScores)
137137
return best != null ? best.getOriginalEdge() : null;
138138
}
139139

140+
/** Returns whether the candidate precedes the incumbent in canonical source/target order. */
140141
private boolean isCanonicallyBefore(LineVertex<V, E> candidate, LineVertex<V, E> incumbent) {
141142
return lineVertexOrder().compare(candidate, incumbent) < 0;
142143
}

‎graph-algorithms/src/test/java/org/hjug/feedback/arc/pageRank/PageRankFASDeterminismTest.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ private Graph<String, DefaultEdge> createFeedbackPackageScc() {
4343
return graph;
4444
}
4545

46+
/** Copies the graph topology with fresh edges so each run can remove edges independently. */
4647
private Graph<String, DefaultEdge> copyGraph(Graph<String, DefaultEdge> original) {
4748
Graph<String, DefaultEdge> copy = new DefaultDirectedGraph<>(DefaultEdge.class);
4849
original.vertexSet().forEach(copy::addVertex);
@@ -52,6 +53,7 @@ private Graph<String, DefaultEdge> copyGraph(Graph<String, DefaultEdge> original
5253
return copy;
5354
}
5455

56+
/** Converts edges to sorted source/target keys for comparison across graph copies. */
5557
private Set<String> edgeKeys(Graph<String, DefaultEdge> graph, Set<DefaultEdge> edges) {
5658
Set<String> keys = new TreeSet<>();
5759
for (DefaultEdge edge : edges) {
@@ -60,6 +62,7 @@ private Set<String> edgeKeys(Graph<String, DefaultEdge> graph, Set<DefaultEdge>
6062
return keys;
6163
}
6264

65+
/** Verifies repeated runs select the same edges and break both cycles in the package SCC. */
6366
@DisplayName("computeFeedbackArcSet selects the same edges on every run for the feedback package SCC")
6467
@Test
6568
void computeFeedbackArcSet_isDeterministicAcrossRuns() {
@@ -94,6 +97,7 @@ void computeFeedbackArcSet_isDeterministicAcrossRuns() {
9497
"Removing the feedback arc set must leave the graph acyclic");
9598
}
9699

100+
/** Verifies repeatable feedback arc selection and cycle removal in a larger symmetric graph. */
97101
@DisplayName("computeFeedbackArcSet is deterministic for a graph with parallel tie candidates")
98102
@Test
99103
void computeFeedbackArcSet_isDeterministicForLargerTiedGraph() {
@@ -134,6 +138,7 @@ void computeFeedbackArcSet_isDeterministicForLargerTiedGraph() {
134138
"Removing the feedback arc set must leave the graph acyclic");
135139
}
136140

141+
/** Verifies edge insertion order does not change feedback arc selection for overlapping cycles. */
137142
@DisplayName("computeFeedbackArcSet is independent of the order edges were added to the graph")
138143
@Test
139144
void computeFeedbackArcSet_isDeterministicAcrossEdgeInsertionOrders() {

‎report/src/test/java/org/hjug/refactorfirst/report/PackageRelationshipClassEdgeCycleCountTest.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,14 @@ private Graph<String, DefaultWeightedEdge> createClassGraph() {
5151
return classGraph;
5252
}
5353

54+
/** Creates a DTO mock with no source paths so relationships render without file links. */
5455
private CodebaseGraphDTO mockDto() {
5556
CodebaseGraphDTO dto = Mockito.mock(CodebaseGraphDTO.class);
5657
Mockito.when(dto.getClassToSourceFilePathMapping()).thenReturn(new HashMap<>());
5758
return dto;
5859
}
5960

61+
/** Verifies nested relationships count detected class cycles even outside the feedback arc set. */
6062
@DisplayName("nested class relationships report their real class-cycle membership, not a defaulted zero")
6163
@Test
6264
void buildClassRelationshipsToBreakPackage_reportsActualCycleMembership() throws Exception {

‎report/src/test/java/org/hjug/refactorfirst/report/PackageRelationshipClassEdgeOrderTest.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,14 @@ private Set<DefaultWeightedEdge> newSetInOrder(Collection<DefaultWeightedEdge> e
8888
return new HashSet<>(rotated);
8989
}
9090

91+
/** Injects a graph fixture into a field declared by the shared HTML report base class. */
9192
private void setField(Object target, String fieldName, Object value) throws Exception {
9293
Field field = SimpleHtmlReport.class.getDeclaredField(fieldName);
9394
field.setAccessible(true);
9495
field.set(target, value);
9596
}
9697

98+
/** Maps the package edge to its class edges in a DTO mock with no source file paths. */
9799
private CodebaseGraphDTO mockDto(DefaultWeightedEdge packageEdge, Set<DefaultWeightedEdge> classEdges) {
98100
CodebaseGraphDTO dto = Mockito.mock(CodebaseGraphDTO.class);
99101
Map<DefaultWeightedEdge, Set<DefaultWeightedEdge>> relationships = new HashMap<>();
@@ -103,6 +105,7 @@ private CodebaseGraphDTO mockDto(DefaultWeightedEdge packageEdge, Set<DefaultWei
103105
return dto;
104106
}
105107

108+
/** Creates a ranked package-edge fixture with priority, cycle count and effort rank set to one. */
106109
private RankedDisharmony mockRankedDisharmony(DefaultWeightedEdge packageEdge) {
107110
RankedDisharmony edgeInfo = Mockito.mock(RankedDisharmony.class);
108111
Mockito.when(edgeInfo.getEdge()).thenReturn(packageEdge);
@@ -132,6 +135,7 @@ private List<ClassRelationshipDTO> buildJsonList(JsonGenerator generator, Codeba
132135
dto.getClassRelationshipsInPackageRelationship().get(packageEdge), REPO_URL, dto);
133136
}
134137

138+
/** Verifies HTML and JSON use the same source/target order across class-edge set insertions. */
135139
@DisplayName(
136140
"class relationships behind a package edge render in the same deterministic order regardless of set insertion order")
137141
@Test
@@ -222,6 +226,7 @@ void classRelationshipsToBreakPackage_areOrderedDeterministically() throws Excep
222226
"HTML must render same-source targets in the same order as the JSON report");
223227
}
224228

229+
/** Extracts the final name segment from a fully qualified class name for expected HTML labels. */
225230
private static String simpleName(String fqn) {
226231
return fqn.substring(fqn.lastIndexOf('.') + 1);
227232
}

0 commit comments

Comments
 (0)