diff --git a/Makefile b/Makefile index 0c1f25d5..76a97725 100644 --- a/Makefile +++ b/Makefile @@ -499,6 +499,16 @@ test-json: json-formatter-test done \ } +test-string-table: string-table-test + @echo " [TEST] string-table formatting" + @{ \ + max=`./string-table-test`; \ + for testno in `seq 1 $$max`; do \ + echo " [TEST/s-t] $$testno"; \ + ./string-table-test $$testno ; \ + done \ + } + test: test-check test-check-lowmem test-mkfs test-misc test-cli test-convert test-fuzz testsuite: btrfs-corrupt-block btrfs-find-root btrfs-select-super fssum fsstress @@ -748,6 +758,10 @@ json-formatter-test: tests/json-formatter-test.c $(objects) libbtrfsutil.a @echo " [LD] $@" $(Q)$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) +string-table-test: tests/string-table-test.c $(objects) libbtrfsutil.a + @echo " [LD] $@" + $(Q)$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) + test-build: test-build-pre test-build-real test-build-pre: diff --git a/tests/string-table-test.c b/tests/string-table-test.c new file mode 100644 index 00000000..5c8cff00 --- /dev/null +++ b/tests/string-table-test.c @@ -0,0 +1,132 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + +#include +#include +#include "common/utils.h" +#include "common/string-table.h" + +void test_simple_create_free() +{ + struct string_table *tab; + + tab = table_create(2, 2); + if (!tab) { + fprintf(stderr, "ERROR: cannot alocate table\n"); + return; + } + table_printf(tab, 0, 0, ">00"); + table_printf(tab, 0, 1, "<01"); + table_printf(tab, 1, 0, ">10"); + table_printf(tab, 1, 1, "<11"); + + table_dump(tab); + + table_free(tab); +} + +void test_simple_header() +{ + struct string_table *tab; + int i; + + tab = table_create(2, 6); + if (!tab) { + fprintf(stderr, "ERROR: cannot alocate table\n"); + return; + } + tab->hrows = 2; + table_printf(tab, 0, 0, ">Id"); + table_printf(tab, 1, 0, ">Name"); + table_printf(tab, 0, 1, "*-"); + table_printf(tab, 1, 1, "*-"); + + for (i = tab->hrows; i < tab->nrows; i++) { + table_printf(tab, 0, i, ">%d", 1U << i); + table_printf(tab, 1, i, "<%d", 100 * i); + } + + puts("start"); + table_dump_header(tab); + puts("separator"); + table_dump_body(tab); + puts("end"); + + table_free(tab); +} + +void test_simple_paginate() +{ + struct string_table *tab; + unsigned int page_size = 4; + unsigned int pages = 4; + int i; + + tab = table_create(2, 2 + page_size * pages); + if (!tab) { + fprintf(stderr, "ERROR: cannot alocate table\n"); + return; + } + tab->hrows = 2; + table_printf(tab, 0, 0, ">Id"); + table_printf(tab, 1, 0, ">Name"); + table_printf(tab, 0, 1, "*-"); + table_printf(tab, 1, 1, "*-"); + + for (i = tab->hrows; i < tab->nrows; i++) { + table_printf(tab, 0, i, ">%d", 10 * (i - tab->hrows + 1)); + table_printf(tab, 1, i, "hrows + i * page_size; + + table_dump_header(tab); + table_dump_range(tab, start, start + page_size - 1); + puts("paginator"); + } + puts("end"); + + table_free(tab); +} + +int main(int argc, char **argv) +{ + int testno; + static void (*tests[])() = { + test_simple_create_free, + test_simple_header, + test_simple_paginate, + }; + + /* Without arguments, print the number of tests available */ + if (argc == 1) { + printf("%zu\n", ARRAY_SIZE(tests)); + return 0; + } + testno = atoi(argv[1]); + testno--; + + if (testno < 0 || testno >= ARRAY_SIZE(tests)) { + fprintf(stderr, "ERROR: test number %d is out of range (max %zu)\n", + testno + 1, ARRAY_SIZE(tests)); + return 1; + } + tests[testno](); + + return 0; +}