int runSpecificGraphTest(char *command, char *infileName) { char *commandLine[] = { "planarity", "-s", "C", "infile", "outfile", "outfile2" }; char *outfileName = ConstructPrimaryOutputFilename(infileName, NULL, command[1]); char *outfile2Name = ""; char *testfileName = strdup(outfileName); int Result = 0; if (testfileName == NULL) return -1; outfileName = strdup(strcat(outfileName, ".test.txt")); if (outfileName == NULL) { free(testfileName); return -1; } // 'planarity -s [-q] C I O [O2]': Specific graph commandLine[2] = command; commandLine[3] = infileName; commandLine[4] = outfileName; commandLine[5] = outfile2Name; Result = callSpecificGraph(6, commandLine); if (Result == OK || Result == NONEMBEDDABLE) Result = 0; else { ErrorMessage("Test failed (graph processor returned failure result).\n"); Result = -1; } if (Result == 0) { if (FilesEqual(testfileName, outfileName) == TRUE) { Message("Test succeeded (result equal to exemplar).\n"); unlink(outfileName); } else { ErrorMessage("Test failed (result not equal to exemplar).\n"); Result = -1; } } // For graph drawing, secondary file is outfileName + ".render.txt" if (command[1] == 'd' && Result == 0) { outfile2Name = ConstructPrimaryOutputFilename(NULL, outfileName, command[1]); free(outfileName); outfileName = strdup(strcat(outfile2Name, ".render.txt")); free(testfileName); testfileName = ConstructPrimaryOutputFilename(infileName, NULL, command[1]); testfileName = strdup(strcat(testfileName, ".render.txt")); if (Result == 0) { if (FilesEqual(testfileName, outfileName) == TRUE) { Message("Test succeeded (secondary result equal to exemplar).\n"); unlink(outfileName); } else { ErrorMessage("Test failed (secondary result not equal to exemplar).\n"); Result = -1; } } } Message("\n"); free(outfileName); free(testfileName); return Result; }
int SpecificGraph(char command, char *infileName, char *outfileName, char *outfile2Name) { graphP theGraph, origGraph; platform_time start, end; int Result; // Get the filename of the graph to test if ((infileName = ConstructInputFilename(infileName)) == NULL) return NOTOK; // Create the graph and, if needed, attach the correct algorithm to it theGraph = gp_New(); switch (command) { case 'd' : gp_AttachDrawPlanar(theGraph); break; case '2' : gp_AttachK23Search(theGraph); break; case '3' : gp_AttachK33Search(theGraph); break; case '4' : gp_AttachK4Search(theGraph); break; case 'c' : gp_AttachColorVertices(theGraph); break; } // Read the graph into memory Result = gp_Read(theGraph, infileName); if (Result == NONEMBEDDABLE) { Message("The graph contains too many edges.\n"); // Some of the algorithms will still run correctly with some edges removed. if (strchr("pdo234", command)) { Message("Some edges were removed, but the algorithm will still run correctly.\n"); Result = OK; } } // If there was an unrecoverable error, report it if (Result != OK) ErrorMessage("Failed to read graph\n"); // Otherwise, call the correct algorithm on it else { // Copy the graph for integrity checking origGraph = gp_DupGraph(theGraph); // Run the algorithm if (strchr("pdo234", command)) { int embedFlags = GetEmbedFlags(command); platform_GetTime(start); // gp_CreateDFSTree(theGraph); // gp_SortVertices(theGraph); // gp_Write(theGraph, "debug.before.txt", WRITE_DEBUGINFO); // gp_SortVertices(theGraph); Result = gp_Embed(theGraph, embedFlags); platform_GetTime(end); Result = gp_TestEmbedResultIntegrity(theGraph, origGraph, Result); } else { platform_GetTime(start); if (command == 'c') { if ((Result = gp_ColorVertices(theGraph)) == OK) Result = gp_ColorVerticesIntegrityCheck(theGraph, origGraph); } else Result = NOTOK; platform_GetTime(end); } // Write what the algorithm determined and how long it took WriteAlgorithmResults(theGraph, Result, command, start, end, infileName); // Free the graph obtained for integrity checking. gp_Free(&origGraph); } // Report an error, if there was one, free the graph, and return if (Result != OK && Result != NONEMBEDDABLE) { ErrorMessage("AN ERROR HAS BEEN DETECTED\n"); Result = NOTOK; // gp_Write(theGraph, "debug.after.txt", WRITE_DEBUGINFO); } // Provide the output file(s) else { // Restore the vertex ordering of the original graph (undo DFS numbering) if (strchr("pdo234", command)) gp_SortVertices(theGraph); // Determine the name of the primary output file outfileName = ConstructPrimaryOutputFilename(infileName, outfileName, command); // For some algorithms, the primary output file is not always written if ((strchr("pdo", command) && Result == NONEMBEDDABLE) || (strchr("234", command) && Result == OK)) { // Do not write the file } // Write the primary output file, if appropriate to do so else { gp_Write(theGraph, outfileName, WRITE_ADJLIST); } // NOW WE WANT TO WRITE THE SECONDARY OUTPUT FILE // When called from the menu system, we want to write the planar or outerplanar // obstruction, if one exists. For planar graph drawing, we want the character // art rendition. An empty but non-NULL string is passed to indicate the necessity // of selecting a default name for the second output file. if (outfile2Name != NULL) { if ((command == 'p' || command == 'o') && Result == NONEMBEDDABLE) { // By default, use the same name as the primary output filename if (strlen(outfile2Name) == 0) outfile2Name = outfileName; gp_Write(theGraph, outfile2Name, WRITE_ADJLIST); } else if (command == 'd' && Result == OK) { // By default, add ".render.txt" to the primary output filename if (strlen(outfile2Name) == 0) strcat((outfile2Name = outfileName), ".render.txt"); gp_DrawPlanar_RenderToFile(theGraph, outfile2Name); } } } // Free the graph gp_Free(&theGraph); // Flush any remaining message content to the user, and return the result FlushConsole(stdout); return Result; }