We used to prefer to build up examples using previous ones, but this broke
for tests which were to be executed. But list.h relied on the buildup
behavior, so return to that unless we see "// Given" comments indicating
an execution test.
+/* If an example has expected output, it's complete and should not be
+ * included in future examples. */
+static bool has_expected_output(char **lines)
+{
+ unsigned int i;
+
+ for (i = 0; lines[i]; i++) {
+ char *p = lines[i] + strspn(lines[i], " \t");
+ if (!strstarts(p, "//"))
+ continue;
+ p += strspn(p, "/ ");
+ if (strncasecmp(p, "given", strlen("given")) == 0)
+ return true;
+ }
+ return false;
+}
+
static void build_examples(struct manifest *m, bool keep,
unsigned int *timeleft, struct score *score)
{
static void build_examples(struct manifest *m, bool keep,
unsigned int *timeleft, struct score *score)
{
strip_leading_whitespace(get_ccan_file_lines(i));
ret = compile(i, m, i, keep);
if (!ret) {
strip_leading_whitespace(get_ccan_file_lines(i));
ret = compile(i, m, i, keep);
if (!ret) {
- prev = get_ccan_file_lines(i);
+ char **lines = get_ccan_file_lines(i);
+ if (!has_expected_output(lines))
+ prev = lines;
score->score++;
continue;
}
score->score++;
continue;
}
- /* Try standalone. */
- mangle1 = mangle_example(m, i, get_ccan_file_lines(i), keep);
- ret1 = compile(i, m, mangle1, keep);
- if (!ret1) {
- prev = get_ccan_file_lines(i);
- score->score++;
- continue;
- }
-
- /* Try combining with previous (successful) example... */
if (prev) {
char **new = combine(i, get_ccan_file_lines(i), prev);
mangle2 = mangle_example(m, i, new, keep);
ret2 = compile(i, m, mangle2, keep);
if (!ret2) {
if (prev) {
char **new = combine(i, get_ccan_file_lines(i), prev);
mangle2 = mangle_example(m, i, new, keep);
ret2 = compile(i, m, mangle2, keep);
if (!ret2) {
+ if (!has_expected_output(new))
+ prev = new;
score->score++;
continue;
}
}
score->score++;
continue;
}
}
+ /* Try standalone. */
+ mangle1 = mangle_example(m, i, get_ccan_file_lines(i), keep);
+ ret1 = compile(i, m, mangle1, keep);
+ if (!ret1) {
+ char **lines = get_ccan_file_lines(i);
+ if (!has_expected_output(lines))
+ prev = lines;
+ score->score++;
+ continue;
+ }
+
score->pass = false;
score->error = "Compiling extracted examples failed";
if (!verbose) {
score->pass = false;
score->error = "Compiling extracted examples failed";
if (!verbose) {