9 #include "solverdebug.h"
12 static struct resultflags2str {
15 } resultflags2str[] = {
16 { TESTCASE_RESULT_TRANSACTION, "transaction" },
17 { TESTCASE_RESULT_PROBLEMS, "problems" },
18 { TESTCASE_RESULT_ORPHANED, "orphaned" },
19 { TESTCASE_RESULT_RECOMMENDED, "recommended" },
20 { TESTCASE_RESULT_UNNEEDED, "unneeded" },
27 fprintf(ex ? stderr : stdout, "Usage: testsolv <testcase>\n");
31 struct reportsolutiondata {
37 reportsolutioncb(Solver *solv, void *cbdata)
39 struct reportsolutiondata *sd = cbdata;
43 res = testcase_solverresult(solv, TESTCASE_RESULT_TRANSACTION);
48 sprintf(prefix, "callback%d:", sd->count);
49 while ((p2 = strchr(p, '\n')) != 0)
53 sd->result = solv_dupappend(sd->result, prefix, p);
63 main(int argc, char **argv)
82 while ((c = getopt(argc, argv, "vmrhl:s:")) >= 0)
102 if ((p = strchr(optarg, ':')))
103 queue_push2(&solq, atoi(optarg), atoi(p + 1));
105 queue_push2(&solq, 1, atoi(optarg));
114 for (; optind < argc; optind++)
116 pool = pool_create();
117 pool_setdebuglevel(pool, debuglevel);
119 fp = fopen(argv[optind], "r");
122 perror(argv[optind]);
130 solv = testcase_read(pool, fp, argv[optind], &job, &result, &resultflags);
137 if (!multijob && !feof(fp))
141 printf("test %d:\n", multijob++);
144 int selflags = SELECTION_NAME|SELECTION_PROVIDES|SELECTION_CANON|SELECTION_DOTARCH|SELECTION_REL|SELECTION_GLOB|SELECTION_FLAT;
146 selflags |= SELECTION_FILELIST;
148 selection_make(pool, &job, list, selflags);
150 printf("No match\n");
156 selection_solvables(pool, &job, &q);
157 for (i = 0; i < q.count; i++)
158 printf(" - %s\n", testcase_solvid2str(pool, q.elements[i]));
162 else if (result || writeresult)
164 char *myresult, *resultdiff;
165 struct reportsolutiondata reportsolutiondata;
166 memset(&reportsolutiondata, 0, sizeof(reportsolutiondata));
169 solv->solution_callback = reportsolutioncb;
170 solv->solution_callback_data = &reportsolutiondata;
172 solver_solve(solv, &job);
173 solv->solution_callback = 0;
174 solv->solution_callback_data = 0;
176 resultflags = TESTCASE_RESULT_TRANSACTION | TESTCASE_RESULT_PROBLEMS;
177 myresult = testcase_solverresult(solv, resultflags);
178 if (rescallback && reportsolutiondata.result)
180 reportsolutiondata.result = solv_dupjoin(reportsolutiondata.result, myresult, 0);
182 myresult = reportsolutiondata.result;
195 for (i = 0; resultflags2str[i].str; i++)
196 if ((resultflags & resultflags2str[i].flag) != 0)
198 printf(p, resultflags2str[i].str);
201 printf(" <inline>\n");
205 const char *p2 = strchr(p, '\n');
206 p2 = p2 ? p2 + 1 : p + strlen(p);
207 printf("#>%.*s", (int)(p2 - p), p);
212 printf("%s", myresult);
217 resultdiff = testcase_resultdiff(result, myresult);
220 printf("Results differ:\n%s", resultdiff);
222 solv_free(resultdiff);
230 int pcnt = solver_solve(solv, &job);
231 if (pcnt && solq.count)
234 for (i = 0; i < solq.count; i += 2)
236 if (solq.elements[i] > 0 && solq.elements[i] <= pcnt)
237 if (solq.elements[i + 1] > 0 && solq.elements[i + 1] <= solver_solution_count(solv, solq.elements[i]))
239 printf("problem %d: taking solution %d\n", solq.elements[i], solq.elements[i + 1]);
240 solver_take_solution(solv, solq.elements[i], solq.elements[i + 1], &job);
245 pcnt = solver_solve(solv, &job);
249 int problem, solution, scnt;
250 printf("Found %d problems:\n", pcnt);
251 for (problem = 1; problem <= pcnt; problem++)
253 printf("Problem %d:\n", problem);
255 solver_printprobleminfo(solv, problem);
261 solver_findallproblemrules(solv, problem, &pq);
262 for (j = 0; j < pq.count; j++)
263 solver_printproblemruleinfo(solv, pq.elements[j]);
268 scnt = solver_solution_count(solv, problem);
269 for (solution = 1; solution <= scnt; solution++)
271 printf("Solution %d:\n", solution);
272 solver_printsolution(solv, problem, solution);
279 Transaction *trans = solver_create_transaction(solv);
280 printf("Transaction summary:\n\n");
281 transaction_print(trans);
282 transaction_free(trans);