]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
allow dumping of all rules in testcases
authorMichael Schroeder <mls@suse.de>
Fri, 20 Mar 2015 15:31:54 +0000 (16:31 +0100)
committerMichael Schroeder <mls@suse.de>
Fri, 20 Mar 2015 15:31:54 +0000 (16:31 +0100)
We can use this to write tests for the rule generation of
complex dependencies.

ext/testcase.c
ext/testcase.h
src/rules.c

index c808c0e3185cb1a8fd10f11139f630c39660d247..8da4ca66efdd3cff24e62423b07db06c01fc5fb8 100644 (file)
@@ -78,6 +78,7 @@ static struct resultflags2str {
   { TESTCASE_RESULT_RECOMMENDED,       "recommended" },
   { TESTCASE_RESULT_UNNEEDED,          "unneeded" },
   { TESTCASE_RESULT_ALTERNATIVES,      "alternatives" },
+  { TESTCASE_RESULT_RULES,             "rules" },
   { 0, 0 }
 };
 
@@ -1883,6 +1884,72 @@ testcase_solverresult(Solver *solv, int resultflags)
       queue_free(&q);
       queue_free(&rq);
     }
+  if ((resultflags & TESTCASE_RESULT_RULES) != 0)
+    {
+      /* dump all rules */
+      Id rid;
+      SolverRuleinfo rclass;
+      Queue q;
+      int i;
+
+      queue_init(&q);
+      for (rid = 1; (rclass = solver_ruleclass(solv, rid)) != SOLVER_RULE_UNKNOWN; rid++)
+       {
+         char *prefix;
+         switch (rclass)
+           {
+           case SOLVER_RULE_PKG:
+             prefix = "pkg ";
+             break;
+           case SOLVER_RULE_UPDATE:
+             prefix = "update ";
+             break;
+           case SOLVER_RULE_FEATURE:
+             prefix = "feature ";
+             break;
+           case SOLVER_RULE_JOB:
+             prefix = "job ";
+             break;
+           case SOLVER_RULE_DISTUPGRADE:
+             prefix = "distupgrade ";
+             break;
+           case SOLVER_RULE_INFARCH:
+             prefix = "infarch ";
+             break;
+           case SOLVER_RULE_CHOICE:
+             prefix = "choice ";
+             break;
+           case SOLVER_RULE_LEARNT:
+             prefix = "learnt ";
+             break;
+           case SOLVER_RULE_BEST:
+             prefix = "best ";
+             break;
+           case SOLVER_RULE_YUMOBS:
+             prefix = "yumobs ";
+             break;
+           default:
+             prefix = "unknown ";
+             break;
+           }
+         prefix = solv_dupjoin("rule ", prefix, testcase_ruleid(solv, rid));
+         solver_ruleliterals(solv, rid, &q);
+         if (rclass == SOLVER_RULE_FEATURE && q.count == 1 && q.elements[0] == -SYSTEMSOLVABLE)
+           continue;
+         for (i = 0; i < q.count; i++)
+           {
+             Id p = q.elements[i];
+             const char *s;
+             if (p < 0)
+               s = pool_tmpjoin(pool, prefix, " -", testcase_solvid2str(pool, -p));
+             else
+               s = pool_tmpjoin(pool, prefix, "  ", testcase_solvid2str(pool, p));
+             strqueue_push(&sq, s);
+           }
+         solv_free(prefix);
+       }
+      queue_free(&q);
+    }
 
   strqueue_sort(&sq);
   result = strqueue_join(&sq);
index 14a2ccab56605d54acfbb1c87f9dde0d3715b640..d85153af36e2ebd6cf03ba6e1a3fe298374ada0f 100644 (file)
@@ -15,6 +15,7 @@
 #define TESTCASE_RESULT_RECOMMENDED    (1 << 3)
 #define TESTCASE_RESULT_UNNEEDED       (1 << 4)
 #define TESTCASE_RESULT_ALTERNATIVES   (1 << 5)
+#define TESTCASE_RESULT_RULES          (1 << 6)
 
 extern Id testcase_str2dep(Pool *pool, const char *s);
 extern const char *testcase_dep2str(Pool *pool, Id id);
index 039eb867e89ca3a28a01e379e2004a5232216b55..cbf3138083299dd341b227ee9bf6065eb28464f2 100644 (file)
@@ -2710,7 +2710,7 @@ solver_ruleclass(Solver *solv, Id rid)
     return SOLVER_RULE_YUMOBS;
   if (rid >= solv->choicerules && rid < solv->choicerules_end)
     return SOLVER_RULE_CHOICE;
-  if (rid >= solv->learntrules)
+  if (rid >= solv->learntrules && rid < solv->nrules)
     return SOLVER_RULE_LEARNT;
   return SOLVER_RULE_UNKNOWN;
 }