Message ID | 27383a5b084b5e68152b08eb96fb4ddaf6d87f82.1577727747.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | t: rework tests for --pathspec-from-file | expand |
"Alexandr Miloslavskiy via GitGitGadget" <gitgitgadget@gmail.com> writes: > diff --git a/t/helper/test-parse-pathspec-file.c b/t/helper/test-parse-pathspec-file.c > new file mode 100644 > index 0000000000..e7f525feb9 > --- /dev/null > +++ b/t/helper/test-parse-pathspec-file.c > @@ -0,0 +1,34 @@ > +#include "test-tool.h" > +#include "parse-options.h" > +#include "pathspec.h" > +#include "gettext.h" > + ... > + parse_pathspec_file(&pathspec, 0, 0, 0, pathspec_from_file, > + pathspec_file_nul); > + > + for (i = 0; i < pathspec.nr; i++) { > + printf("%s\n", pathspec.items[i].original); > + } No need for {} around a single statement block. > diff --git a/t/t0067-parse_pathspec_file.sh b/t/t0067-parse_pathspec_file.sh > new file mode 100755 > index 0000000000..df7b319713 > --- /dev/null > +++ b/t/t0067-parse_pathspec_file.sh > @@ -0,0 +1,89 @@ > +#!/bin/sh > + > +test_description='Test parse_pathspec_file()' > + > +. ./test-lib.sh > + > +test_expect_success 'one item from stdin' ' > + echo fileA.t | test-tool parse-pathspec-file --pathspec-from-file=- >actual && > + > + cat >expect <<-\EOF && > + fileA.t > + EOF > + test_cmp expect actual > +' The use of the blank lines are somewhat inconsistent here. > + ... > +test_expect_success 'NUL delimiters' ' > + printf "fileA.t\0fileB.t\0" | test-tool parse-pathspec-file --pathspec-from-file=- --pathspec-file-nul >actual && Fold line immediately after the pipe (same for the earlier and later ones). > + cat >expect <<-\EOF && > + fileA.t > + fileB.t > + EOF > + test_cmp expect actual > +' If you want to have a gap between the steps, i.e. "capturing the actual output", "creating the ideal output", and "seeing how they differ", using blank like this is OK: printf "fileA.t\0fileB.t\0" | test-tool parse-pathspec-file --pathspec-from-file=- --pathspec-file-nul >actual && cat >expect <<-\EOF && fileA.t fileB.t EOF test_cmp expect actual I thought we typically prepare the ideal output sample before capturing the actual output, so if we follow that convention, the above becomes cat >expect <<-\EOF && fileA.t fileB.t EOF printf "fileA.t\0fileB.t\0" | test-tool parse-pathspec-file --pathspec-from-file=- --pathspec-file-nul >actual && test_cmp expect actual > +test_expect_success 'quotes' ' > + # shell takes \\\\101 and spits \\101 > + # printf takes \\101 and spits \101 > + # git takes \101 and spits A > + printf "\"file\\\\101.t\"" | test-tool parse-pathspec-file --pathspec-from-file=- >actual && > + > + cat >expect <<-\EOF && > + fileA.t > + EOF > + test_cmp expect actual > +' > + > +test_expect_success '--pathspec-file-nul takes quotes literally' ' > + # shell takes \\\\101 and spits \\101 > + # printf takes \\101 and spits \101 > + printf "\"file\\\\101.t\"" | test-tool parse-pathspec-file --pathspec-from-file=- --pathspec-file-nul >actual && > + > + cat >expect <<-\EOF && > + "file\101.t" > + EOF > + test_cmp expect actual > +' Testing low level machinery like this is of course a good idea, in addition to the end-to-end tests that make sure that the machinery is called correctly from the higher layer. Thanks.
Thanks for having a look! I think I have fixed all mentioned issues in V2.
diff --git a/Makefile b/Makefile index 09f98b777c..0061f96e8a 100644 --- a/Makefile +++ b/Makefile @@ -721,6 +721,7 @@ TEST_BUILTINS_OBJS += test-mktemp.o TEST_BUILTINS_OBJS += test-oidmap.o TEST_BUILTINS_OBJS += test-online-cpus.o TEST_BUILTINS_OBJS += test-parse-options.o +TEST_BUILTINS_OBJS += test-parse-pathspec-file.o TEST_BUILTINS_OBJS += test-path-utils.o TEST_BUILTINS_OBJS += test-pkt-line.o TEST_BUILTINS_OBJS += test-prio-queue.o diff --git a/t/helper/test-parse-pathspec-file.c b/t/helper/test-parse-pathspec-file.c new file mode 100644 index 0000000000..e7f525feb9 --- /dev/null +++ b/t/helper/test-parse-pathspec-file.c @@ -0,0 +1,34 @@ +#include "test-tool.h" +#include "parse-options.h" +#include "pathspec.h" +#include "gettext.h" + +int cmd__parse_pathspec_file(int argc, const char **argv) +{ + struct pathspec pathspec; + const char *pathspec_from_file = 0; + int pathspec_file_nul = 0, i; + + static const char *const usage[] = { + "test-tool parse-pathspec-file --pathspec-from-file [--pathspec-file-nul]", + NULL + }; + + struct option options[] = { + OPT_PATHSPEC_FROM_FILE(&pathspec_from_file), + OPT_PATHSPEC_FILE_NUL(&pathspec_file_nul), + OPT_END() + }; + + parse_options(argc, argv, 0, options, usage, 0); + + parse_pathspec_file(&pathspec, 0, 0, 0, pathspec_from_file, + pathspec_file_nul); + + for (i = 0; i < pathspec.nr; i++) { + printf("%s\n", pathspec.items[i].original); + } + + clear_pathspec(&pathspec); + return 0; +} diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c index f20989d449..c9a232d238 100644 --- a/t/helper/test-tool.c +++ b/t/helper/test-tool.c @@ -39,6 +39,7 @@ static struct test_cmd cmds[] = { { "oidmap", cmd__oidmap }, { "online-cpus", cmd__online_cpus }, { "parse-options", cmd__parse_options }, + { "parse-pathspec-file", cmd__parse_pathspec_file }, { "path-utils", cmd__path_utils }, { "pkt-line", cmd__pkt_line }, { "prio-queue", cmd__prio_queue }, diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h index 8ed2af71d1..c8549fd87f 100644 --- a/t/helper/test-tool.h +++ b/t/helper/test-tool.h @@ -29,6 +29,7 @@ int cmd__mktemp(int argc, const char **argv); int cmd__oidmap(int argc, const char **argv); int cmd__online_cpus(int argc, const char **argv); int cmd__parse_options(int argc, const char **argv); +int cmd__parse_pathspec_file(int argc, const char** argv); int cmd__path_utils(int argc, const char **argv); int cmd__pkt_line(int argc, const char **argv); int cmd__prio_queue(int argc, const char **argv); diff --git a/t/t0067-parse_pathspec_file.sh b/t/t0067-parse_pathspec_file.sh new file mode 100755 index 0000000000..df7b319713 --- /dev/null +++ b/t/t0067-parse_pathspec_file.sh @@ -0,0 +1,89 @@ +#!/bin/sh + +test_description='Test parse_pathspec_file()' + +. ./test-lib.sh + +test_expect_success 'one item from stdin' ' + echo fileA.t | test-tool parse-pathspec-file --pathspec-from-file=- >actual && + + cat >expect <<-\EOF && + fileA.t + EOF + test_cmp expect actual +' + +test_expect_success 'one item from file' ' + echo fileA.t >list && + test-tool parse-pathspec-file --pathspec-from-file=list >actual && + + cat >expect <<-\EOF && + fileA.t + EOF + test_cmp expect actual +' + +test_expect_success 'NUL delimiters' ' + printf "fileA.t\0fileB.t\0" | test-tool parse-pathspec-file --pathspec-from-file=- --pathspec-file-nul >actual && + + cat >expect <<-\EOF && + fileA.t + fileB.t + EOF + test_cmp expect actual +' + +test_expect_success 'LF delimiters' ' + printf "fileA.t\nfileB.t\n" | test-tool parse-pathspec-file --pathspec-from-file=- >actual && + + cat >expect <<-\EOF && + fileA.t + fileB.t + EOF + test_cmp expect actual +' + +test_expect_success 'no trailing delimiter' ' + printf "fileA.t\nfileB.t" | test-tool parse-pathspec-file --pathspec-from-file=- >actual && + + cat >expect <<-\EOF && + fileA.t + fileB.t + EOF + test_cmp expect actual +' + +test_expect_success 'CRLF delimiters' ' + printf "fileA.t\r\nfileB.t\r\n" | test-tool parse-pathspec-file --pathspec-from-file=- >actual && + + cat >expect <<-\EOF && + fileA.t + fileB.t + EOF + test_cmp expect actual +' + +test_expect_success 'quotes' ' + # shell takes \\\\101 and spits \\101 + # printf takes \\101 and spits \101 + # git takes \101 and spits A + printf "\"file\\\\101.t\"" | test-tool parse-pathspec-file --pathspec-from-file=- >actual && + + cat >expect <<-\EOF && + fileA.t + EOF + test_cmp expect actual +' + +test_expect_success '--pathspec-file-nul takes quotes literally' ' + # shell takes \\\\101 and spits \\101 + # printf takes \\101 and spits \101 + printf "\"file\\\\101.t\"" | test-tool parse-pathspec-file --pathspec-from-file=- --pathspec-file-nul >actual && + + cat >expect <<-\EOF && + "file\101.t" + EOF + test_cmp expect actual +' + +test_done