package brainslug.util; import brainslug.flow.definition.EnumIdentifier; import brainslug.flow.definition.FlowDefinition; import brainslug.flow.definition.Identifier; import brainslug.flow.node.FlowNodeDefinition; import brainslug.flow.path.FlowEdgeDefinition; import org.assertj.core.api.AbstractAssert; import org.assertj.core.api.Assertions; public class FlowDefinitionAssert extends AbstractAssert<FlowDefinitionAssert, FlowDefinition> { protected FlowDefinitionAssert(FlowDefinition actual, Class<?> selfType) { super(actual, selfType); } public static FlowDefinitionAssert assertThat(FlowDefinition flowDefinition) { return new FlowDefinitionAssert(flowDefinition, FlowDefinitionAssert.class); } public FlowDefinitionAssert hasTotalNodes(int expectedCount) { Assertions.assertThat(actual.getNodes().size()).isEqualTo(expectedCount); return this; } public FlowDefinitionAssert hasTotalEdges(int expectedCount) { int actualEdgeCount = 0; for(FlowNodeDefinition<?> node : actual.getNodes()) { actualEdgeCount += node.getOutgoing().size(); } Assertions.assertThat(actualEdgeCount).isEqualTo(expectedCount); return this; } public FlowDefinitionAssert hasNodesWithMarker(int expectedCount, Class<?> markerClass) { int actualCount = 0; for(FlowNodeDefinition node : actual.getNodes()){ if (node.is(markerClass)) { actualCount++; } } Assertions.assertThat(actualCount).isEqualTo(expectedCount); return this; } public FlowDefinitionAssert hasNodesWithType(int expectedCount, Class<?> typeClass) { int actualCount = 0; for(FlowNodeDefinition node : actual.getNodes()){ if (typeClass.isInstance(node)) { actualCount++; } } Assertions.assertThat(actualCount).isEqualTo(expectedCount); return this; } public FlowDefinitionAssert hasEdge(Identifier source, Identifier target) { FlowEdgeDefinition edgeToFind = new FlowEdgeDefinition(actual.getNode(source), actual.getNode(target)); for(FlowNodeDefinition node : actual.getNodes()){ if (node.getOutgoing().contains(edgeToFind)) { return this; } } throw new AssertionError("edge " + edgeToFind + "not found"); } public FlowDefinitionAssert hasEdge(Enum source, Enum target) { return hasEdge(new EnumIdentifier(source), new EnumIdentifier(target)); } }