From abf0b309f6ee22d82ae0989fb78970afc4a105bc Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 11 May 2019 11:41:59 +1000 Subject: [PATCH] oceani: mark code that doesn't need testing. Some code is included to check and report impossible conditions. Failure to exercise this code shouldn't be seen as a failure of test coverage. So mark such code as //NOTEST and exclude it from statistics. This brings test coverage up to 93% Signed-off-by: NeilBrown --- csrc/oceani-tests.mdc | 4 +-- csrc/oceani.mdc | 80 +++++++++++++++++++++---------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index 8649f6e..9850f25 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -72,9 +72,9 @@ arguments separated from the name by commas. For each test, there is a section @gcov -o coverage oceani.mdc > /dev/null 2> /dev/null @mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage - @ awk '/^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \ + @ awk '/NOTEST/ { next } /^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \ END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \ - if (ran < (ran + skip) *0.90) exit(1) }' \ + if (ran < (ran + skip) *0.93) exit(1) }' \ coverage/oceani.mdc.gcov @rm -f .tmp* diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index b47383a..de899a2 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -375,8 +375,8 @@ context so indicate that parsing failed. } fmt++; switch (*fmt) { - case '%': fputc(*fmt, stderr); break; - default: fputc('?', stderr); break; + case '%': fputc(*fmt, stderr); break; // NOTEST + default: fputc('?', stderr); break; // NOTEST case '1': type_print(t1, stderr); break; @@ -523,7 +523,7 @@ which are often passed around by value. else if (type->print_type) type->print_type(type, f); else - fputs("*invalid*type*", f); + fputs("*invalid*type*", f); // NOTEST } static struct value val_prepare(struct type *type) @@ -567,7 +567,7 @@ which are often passed around by value. if (v.type && v.type->print) v.type->print(v); else - printf("*Unknown*"); + printf("*Unknown*"); // NOTEST } static struct value parse_value(struct type *type, char *arg) @@ -576,8 +576,8 @@ which are often passed around by value. if (type && type->parse) return type->parse(type, arg); - rv.type = NULL; - return rv; + rv.type = NULL; // NOTEST + return rv; // NOTEST } ###### forward decls @@ -685,8 +685,8 @@ to parse each type from a string. rv.type = type; switch(type->vtype) { - case Vnone: - break; + case Vnone: // NOTEST + break; // NOTEST case Vnum: mpq_init(rv.num); break; case Vstr: @@ -696,9 +696,9 @@ to parse each type from a string. case Vbool: rv.bool = 0; break; - case Vlabel: - rv.label = NULL; - break; + case Vlabel: // NOTEST + rv.label = NULL; // NOTEST + break; // NOTEST } return rv; } @@ -708,8 +708,8 @@ to parse each type from a string. struct value rv; rv.type = v.type; switch (rv.type->vtype) { - case Vnone: - break; + case Vnone: // NOTEST + break; // NOTEST case Vlabel: rv.label = v.label; break; @@ -733,13 +733,13 @@ to parse each type from a string. { int cmp; if (left.type != right.type) - return left.type - right.type; + return left.type - right.type; // NOTEST switch (left.type->vtype) { case Vlabel: cmp = left.label == right.label ? 0 : 1; break; case Vnum: cmp = mpq_cmp(left.num, right.num); break; case Vstr: cmp = text_cmp(left.str, right.str); break; case Vbool: cmp = left.bool - right.bool; break; - case Vnone: cmp = 0; + case Vnone: cmp = 0; // NOTEST } return cmp; } @@ -747,10 +747,10 @@ to parse each type from a string. static void _print_value(struct value v) { switch (v.type->vtype) { - case Vnone: - printf("*no-value*"); break; - case Vlabel: - printf("*label-%p*", v.label); break; + case Vnone: // NOTEST + printf("*no-value*"); break; // NOTEST + case Vlabel: // NOTEST + printf("*label-%p*", v.label); break; // NOTEST case Vstr: printf("%.*s", v.str.len, v.str.txt); break; case Vbool: @@ -776,10 +776,10 @@ to parse each type from a string. val.type = type; switch(type->vtype) { - case Vlabel: - case Vnone: - val.type = NULL; - break; + case Vlabel: // NOTEST + case Vnone: // NOTEST + val.type = NULL; // NOTEST + break; // NOTEST case Vstr: val.str.len = strlen(arg); val.str.txt = malloc(val.str.len); @@ -1317,7 +1317,7 @@ subclasses, and to access these we need to be able to `cast` the static int __fput_loc(struct exec *loc, FILE *f) { if (!loc) - return 0; + return 0; // NOTEST if (loc->line >= 0) { fprintf(f, "%d:%d: ", loc->line, loc->column); return 1; @@ -1330,7 +1330,7 @@ subclasses, and to access these we need to be able to `cast` the static void fput_loc(struct exec *loc, FILE *f) { if (!__fput_loc(loc, f)) - fprintf(f, "??:??: "); + fprintf(f, "??:??: "); // NOTEST } Each different type of `exec` node needs a number of functions @@ -1401,7 +1401,7 @@ also want to know what sort of bracketing to use. static void print_exec(struct exec *e, int indent, int bracket) { if (!e) - return; + return; // NOTEST switch (e->type) { case Xbinode: print_binode(cast(binode, e), indent, bracket); break; @@ -2024,9 +2024,9 @@ link to find the primary instance. struct binding *b = v->var->name; fprintf(stderr, "%.*s", b->name.len, b->name.txt); } else - fputs("???", stderr); + fputs("???", stderr); // NOTEST } else - fputs("NOTVAR", stderr); + fputs("NOTVAR", stderr); // NOTEST break; ###### propagate exec cases @@ -2036,9 +2036,9 @@ link to find the primary instance. struct var *var = cast(var, prog); struct variable *v = var->var; if (!v) { - type_err(c, "%d:BUG: no variable!!", prog, Tnone, 0, Tnone); - *ok = 0; - return Tnone; + type_err(c, "%d:BUG: no variable!!", prog, Tnone, 0, Tnone); // NOTEST + *ok = 0; // NOTEST + return Tnone; // NOTEST } if (v->merged) v = v->merged; @@ -2357,7 +2357,7 @@ expression operator. case GtrEq: printf(" >= "); break; case Eql: printf(" == "); break; case NEql: printf(" != "); break; - default: abort(); + default: abort(); // NOTEST } print_exec(b->right, -1, 0); break; @@ -2405,7 +2405,7 @@ expression operator. case GtrEq: rv.bool = cmp >= 0; break; case Eql: rv.bool = cmp == 0; break; case NEql: rv.bool = cmp != 0; break; - default: rv.bool = 0; break; + default: rv.bool = 0; break; // NOTEST } break; } @@ -2494,8 +2494,8 @@ precedence is handled better I might be able to discard this. case Divide: fputs(" / ", stdout); break; case Rem: fputs(" % ", stdout); break; case Concat: fputs(" ++ ", stdout); break; - default: abort(); - } + default: abort(); // NOTEST + } // NOTEST print_exec(b->right, indent, 0); break; case Absolute: @@ -3009,7 +3009,7 @@ it is declared, and error will be raised as the name is created as free_value(*lleft); *lleft = right; } else - free_value(right); + free_value(right); // NOTEST right.type = NULL; break; @@ -3610,7 +3610,7 @@ analysis is a bit more interesting at this level. break; ###### propagate binode cases - case Program: abort(); + case Program: abort(); // NOTEST ###### core functions @@ -3620,7 +3620,7 @@ analysis is a bit more interesting at this level. int ok = 1; if (!b) - return 0; + return 0; // NOTEST do { ok = 1; propagate_types(b->right, c, &ok, Tnone, 0); @@ -3655,7 +3655,7 @@ analysis is a bit more interesting at this level. struct value v; if (!prog) - return; + return; // NOTEST al = cast(binode, p->left); while (al) { struct var *v = cast(var, al->left); @@ -3677,7 +3677,7 @@ analysis is a bit more interesting at this level. } ###### interp binode cases - case Program: abort(); + case Program: abort(); // NOTEST ## And now to test it out. -- 2.43.0