vcs-svn: make test-line-buffer input format more flexible
Imitate the input format of test-obj-pool to support arbitrary sequences of commands rather than alternating read/copy. This should make it easier to add tests that exercise other line_buffer functions. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
This commit is contained in:
@ -85,40 +85,40 @@ test_expect_success 'line buffer' '
|
|||||||
printf "%s\n" "" foo >expected6 &&
|
printf "%s\n" "" foo >expected6 &&
|
||||||
|
|
||||||
test-line-buffer <<-\EOF >actual1 &&
|
test-line-buffer <<-\EOF >actual1 &&
|
||||||
5
|
read 5
|
||||||
HELLO
|
HELLO
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
test-line-buffer <<-\EOF >actual2 &&
|
test-line-buffer <<-\EOF >actual2 &&
|
||||||
0
|
read 0
|
||||||
|
|
||||||
5
|
copy 5
|
||||||
HELLO
|
HELLO
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
q_to_nul <<-\EOF |
|
q_to_nul <<-\EOF |
|
||||||
1
|
read 1
|
||||||
Q
|
Q
|
||||||
EOF
|
EOF
|
||||||
test-line-buffer >actual3 &&
|
test-line-buffer >actual3 &&
|
||||||
|
|
||||||
q_to_nul <<-\EOF |
|
q_to_nul <<-\EOF |
|
||||||
0
|
read 0
|
||||||
|
|
||||||
1
|
copy 1
|
||||||
Q
|
Q
|
||||||
EOF
|
EOF
|
||||||
test-line-buffer >actual4 &&
|
test-line-buffer >actual4 &&
|
||||||
|
|
||||||
test-line-buffer <<-\EOF >actual5 &&
|
test-line-buffer <<-\EOF >actual5 &&
|
||||||
5
|
read 5
|
||||||
foo
|
foo
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
test-line-buffer <<-\EOF >actual6 &&
|
test-line-buffer <<-\EOF >actual6 &&
|
||||||
0
|
read 0
|
||||||
|
|
||||||
5
|
copy 5
|
||||||
foo
|
foo
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
@ -1,11 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* test-line-buffer.c: code to exercise the svn importer's input helper
|
* test-line-buffer.c: code to exercise the svn importer's input helper
|
||||||
*
|
|
||||||
* Input format:
|
|
||||||
* number NL
|
|
||||||
* (number bytes) NL
|
|
||||||
* number NL
|
|
||||||
* ...
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "git-compat-util.h"
|
#include "git-compat-util.h"
|
||||||
@ -20,28 +14,50 @@ static uint32_t strtouint32(const char *s)
|
|||||||
return (uint32_t) n;
|
return (uint32_t) n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_command(const char *command, const char *arg, struct line_buffer *buf)
|
||||||
|
{
|
||||||
|
switch (*command) {
|
||||||
|
case 'c':
|
||||||
|
if (!prefixcmp(command, "copy ")) {
|
||||||
|
buffer_copy_bytes(buf, strtouint32(arg) + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case 'r':
|
||||||
|
if (!prefixcmp(command, "read ")) {
|
||||||
|
const char *s = buffer_read_string(buf, strtouint32(arg));
|
||||||
|
printf("%s\n", s);
|
||||||
|
buffer_skip_bytes(buf, 1); /* consume newline */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
die("unrecognized command: %s", command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_line(const char *line, struct line_buffer *stdin_buf)
|
||||||
|
{
|
||||||
|
const char *arg = strchr(line, ' ');
|
||||||
|
if (!arg)
|
||||||
|
die("no argument in line: %s", line);
|
||||||
|
handle_command(line, arg + 1, stdin_buf);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct line_buffer buf = LINE_BUFFER_INIT;
|
struct line_buffer stdin_buf = LINE_BUFFER_INIT;
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
if (argc != 1)
|
if (argc != 1)
|
||||||
usage("test-line-buffer < input.txt");
|
usage("test-line-buffer < script");
|
||||||
if (buffer_init(&buf, NULL))
|
|
||||||
|
if (buffer_init(&stdin_buf, NULL))
|
||||||
die_errno("open error");
|
die_errno("open error");
|
||||||
while ((s = buffer_read_line(&buf))) {
|
while ((s = buffer_read_line(&stdin_buf)))
|
||||||
s = buffer_read_string(&buf, strtouint32(s));
|
handle_line(s, &stdin_buf);
|
||||||
fputs(s, stdout);
|
if (buffer_deinit(&stdin_buf))
|
||||||
fputc('\n', stdout);
|
|
||||||
buffer_skip_bytes(&buf, 1);
|
|
||||||
if (!(s = buffer_read_line(&buf)))
|
|
||||||
break;
|
|
||||||
buffer_copy_bytes(&buf, strtouint32(s) + 1);
|
|
||||||
}
|
|
||||||
if (buffer_deinit(&buf))
|
|
||||||
die("input error");
|
die("input error");
|
||||||
if (ferror(stdout))
|
if (ferror(stdout))
|
||||||
die("output error");
|
die("output error");
|
||||||
buffer_reset(&buf);
|
buffer_reset(&stdin_buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user