git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/3] test-parse-options: --expect=<string> option to simplify tests

From
Junio C Hamano <gitster@pobox.com>
Date
May 5, 2016, 21:50 UTC
Message-ID
<20160505215056.28224-4-gitster@pobox.com>
In-Reply-To
<20160505215056.28224-1-gitster@pobox.com>
Existing tests in t0040 follow a rather verbose pattern:
        cat >expect <<\EOF
        boolean: 0
        integer: 0
        magnitude: 0
        timestamp: 0
        string: (not set)
        abbrev: 7
        verbose: 0
        quiet: 3
        dry run: no
        file: (not set)
        EOF
        test_expect_success 'multiple quiet levels' '
                test-parse-options -q -q -q >output 2>output.err &&
                test_must_be_empty output.err &&
                test_cmp expect output
        '

But the only thing this test cares about is if "quiet: 3" is in the output. We should be able to write the above 18 lines with just four lines, like this:

	test_expect_success 'multiple quiet levels' '
		test-parse-options --expect="quiet: 3" -q -q -q
	'
Teach the new --expect=<string> option to test-parse-options helper.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t0040-parse-options.sh |  1 +
 test-parse-options.c     | 68 +++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 66 insertions(+), 3 deletions(-)
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index dbaee55..d678fbf 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -45,6 +45,7 @@ Standard options
     -v, --verbose         be verbose
     -n, --dry-run         dry run
     -q, --quiet           be quiet
+    --expect <string>     expected output in the variable dump
 
 EOF
 
diff --git a/test-parse-options.c b/test-parse-options.c
index 3db4332..010f3b2 100644
--- a/test-parse-options.c
+++ b/test-parse-options.c
@@ -14,6 +14,7 @@ static char *string = NULL;
 static char *file = NULL;
 static int ambiguous;
 static struct string_list list;
+static struct string_list expect;
 
 static struct {
 	int called;
@@ -40,6 +41,62 @@ static int number_callback(const struct option *opt, const char *arg, int unset)
 	return 0;
 }
 
+/*
+ * See if expect->string ("label: value") has a line in output that
+ * begins with "label:", and if the line in output matches it.
+ */
+static int match_line(struct string_list_item *expect, struct strbuf *output)
+{
+	const char *label = expect->string;
+	const char *colon = strchr(label, ':');
+	const char *scan = output->buf;
+	size_t label_len, expect_len;
+
+	if (!colon)
+		die("Malformed --expect value: %s", label);
+	label_len = colon - label;
+
+	while (scan < output->buf + output->len) {
+		const char *next;
+		scan = memmem(scan, output->buf + output->len - scan,
+			      label, label_len);
+		if (!scan)
+			return 0;
+		if (scan == output->buf || scan[-1] == '\n')
+			break;
+		next = strchr(scan + label_len, '\n');
+		if (!next)
+			return 0;
+		scan = next + 1;
+	}
+
+	/*
+	 * scan points at a line that begins with the label we are
+	 * looking for.  Does it match?
+	 */
+	expect_len = strlen(expect->string);
+
+	if (output->buf + output->len <= scan + expect_len)
+		return 0; /* value not long enough */
+	if (memcmp(scan, expect->string, expect_len))
+		return 0; /* does not match */
+
+	return (scan + expect_len < output->buf + output->len &&
+		scan[expect_len] == '\n');
+}
+
+static int show_expected(struct string_list *list, struct strbuf *output)
+{
+	struct string_list_item *expect;
+	int found_mismatch = 0;
+
+	for_each_string_list_item(expect, list) {
+		if (!match_line(expect, output))
+			found_mismatch = 1;
+	}
+	return found_mismatch;
+}
+
 int main(int argc, char **argv)
 {
 	const char *prefix = "prefix/";
@@ -87,6 +144,8 @@ int main(int argc, char **argv)
 		OPT__VERBOSE(&verbose, "be verbose"),
 		OPT__DRY_RUN(&dry_run, "dry run"),
 		OPT__QUIET(&quiet, "be quiet"),
+		OPT_STRING_LIST(0, "expect", &expect, "string",
+				"expected output in the variable dump"),
 		OPT_END(),
 	};
 	int i;
@@ -117,7 +176,10 @@ int main(int argc, char **argv)
 	for (i = 0; i < argc; i++)
 		strbuf_addf(&output, "arg %02d: %s\n", i, argv[i]);
 
-	printf("%s", output.buf);
-
-	return 0;
+	if (expect.nr)
+		return show_expected(&expect, &output);
+	else {
+		printf("%s", output.buf);
+		return 0;
+	}
 }
-- 
2.8.2-505-gdbd0e1d
Previous: Junio C HamanoNext: Stefan Beller
Message 35 of 53 in “t0040-test-parse-options.sh: fix style issues”
  1. 1/7 t0040-test-parse-options.sh: fix style issuesPranit Bauva, Apr 30, 2016
  2. 2/7 test-parse-options: print quiet as integerPranit Bauva, Apr 30, 2016
  3. 3/7 t0040-parse-options: improve test coveragePranit Bauva, Apr 30, 2016
  4. Eric SunshineMay 4, 2016
  5. Pranit BauvaMay 5, 2016
  6. 4/7 parse-options.c: make OPTION_COUNTUP respect "unspecified" valuesPranit Bauva, Apr 30, 2016
  7. 5/7 t7507-commit-verbose: improve test coverage by testing number of diffsPranit Bauva, Apr 30, 2016
  8. 6/7 commit: add a commit.verbose config variablePranit Bauva, Apr 30, 2016
  9. 7/7 t/t7507: tests for broken behavior of statusPranit Bauva, Apr 30, 2016
  10. Junio C HamanoMay 2, 2016
  11. Pranit BauvaMay 3, 2016
  12. Eric SunshineMay 3, 2016
  13. Pranit BauvaMay 3, 2016
  14. Eric SunshineMay 3, 2016
  15. Pranit BauvaMay 3, 2016
  16. Eric SunshineMay 3, 2016
  17. Pranit BauvaMay 3, 2016
  18. Junio C HamanoMay 3, 2016
  19. 0/7 config commit verbosePranit Bauva, May 5, 2016
  20. 1/7 t0040-test-parse-options.sh: fix style issuesPranit Bauva, May 5, 2016
  21. 2/7 test-parse-options: print quiet as integerPranit Bauva, May 5, 2016
  22. 3/7 t0040-parse-options: improve test coveragePranit Bauva, May 5, 2016
  23. 4/7 t/t7507: improve test coveragePranit Bauva, May 5, 2016
  24. 5/7 parse-options.c: make OPTION_COUNTUP respect "unspecified" valuesPranit Bauva, May 5, 2016
  25. 6/7 t7507-commit-verbose: improve test coverage by testing number of diffsPranit Bauva, May 5, 2016
  26. 7/7 commit: add a commit.verbose config variablePranit Bauva, May 5, 2016
  27. Junio C HamanoMay 5, 2016
  28. Pranit BauvaMay 6, 2016
  29. Pranit BauvaMay 6, 2016
  30. Eric SunshineMay 6, 2016
  31. Junio C HamanoMay 5, 2016
  32. 0/3 test-parse-options updateJunio C Hamano, May 5, 2016
  33. 1/3 test-parse-options: fix output when callback option failsJunio C Hamano, May 5, 2016
  34. 2/3 test-parse-options: hold output in a strbufJunio C Hamano, May 5, 2016
  35. 3/3 test-parse-options: --expect=<string> option to simplify testsJunio C Hamano, May 5, 2016
  36. Stefan BellerMay 6, 2016
  37. Eric SunshineMay 6, 2016
  38. Junio C HamanoMay 6, 2016
  39. Stefan BellerMay 6, 2016
  40. Junio C HamanoMay 6, 2016
  41. Junio C HamanoMay 6, 2016
  42. t0040: remove unused test helpersJunio C Hamano, May 6, 2016
  43. Eric SunshineMay 6, 2016
  44. SZEDER GáborMay 6, 2016
  45. Junio C HamanoMay 6, 2016
  46. Jeff KingMay 7, 2016
  47. Ævar Arnfjörð BjarmasonMay 7, 2016
  48. Junio C HamanoMay 8, 2016
  49. Jeff KingMay 9, 2016
  50. Junio C HamanoMay 9, 2016
  51. Pranit BauvaMay 6, 2016
  52. Ævar Arnfjörð BjarmasonMay 6, 2016
  53. Junio C HamanoMay 6, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.