// verifyControlFlowGraphs is an helper method for tests to check if the generated expectedCfGraph
// is equal the actual graph.
func VerifyControlFlowGraphs(expectedCfGraph *cfgraph.ControlFlowGraph, correctCfGraph *graph.Graph) error {
	if expectedCfGraph.GetNumberOfNodes() != correctCfGraph.GetNumberOfNodes() {
		return fmt.Errorf("Number of nodes in graph should be %d, but are %d!", correctCfGraph.GetNumberOfNodes(),
			expectedCfGraph.GetNumberOfNodes())
	}
	if expectedCfGraph.GetNumberOfEdges() != correctCfGraph.GetNumberOfEdges() {
		return fmt.Errorf("Number of edges in graph should be %d, but are %d!", correctCfGraph.GetNumberOfEdges(),
			expectedCfGraph.GetNumberOfEdges())
	}

	for key, correctNode := range correctCfGraph.Nodes {
		if expectedNode, ok := expectedCfGraph.Nodes[key]; ok {
			//Node exist in graph, now check its edges.
			for index, correctEdge := range correctNode.GetOutNodes() {
				if correctNode.GetOutDegree() != expectedNode.GetOutDegree() {
					return fmt.Errorf("Node %s should have %d out-edges!\n", correctNode, correctNode.GetOutDegree())
				}
				if correctEdge.UID() != expectedNode.GetOutNodes()[index].UID() {
					return fmt.Errorf("Edge ( %s -> %s ) should not be present!", correctNode, correctEdge.Value)
				}
			}

		} else {
			return fmt.Errorf("Node %s is not found in the graph!", correctNode)
		}
	}
	return nil
}
Example #2
0
func GetCyclomaticComplexity(cfg *cfgraph.ControlFlowGraph) int {
	return cfg.GetNumberOfEdges() - cfg.GetNumberOfNodes() + cfg.GetNumberOfSCComponents()
}