diff options
Diffstat (limited to 'test/test_args.c')
-rw-r--r-- | test/test_args.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/test/test_args.c b/test/test_args.c new file mode 100644 index 0000000..6b11dc4 --- /dev/null +++ b/test/test_args.c @@ -0,0 +1,213 @@ +// Copyright (C) 2010-2016 Joel Rosdahl +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3 of the License, or (at your option) +// any later version. +// +// 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., 51 +// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// This file contains tests for the functions operating on struct args. + +#include "../ccache.h" +#include "framework.h" +#include "util.h" + +TEST_SUITE(args) + +TEST(args_init_empty) +{ + struct args *args = args_init(0, NULL); + CHECK(args); + CHECK_INT_EQ(0, args->argc); + CHECK(!args->argv[0]); + args_free(args); +} + +TEST(args_init_populated) +{ + char *argv[] = {"first", "second"}; + struct args *args = args_init(2, argv); + CHECK(args); + CHECK_INT_EQ(2, args->argc); + CHECK_STR_EQ("first", args->argv[0]); + CHECK_STR_EQ("second", args->argv[1]); + CHECK(!args->argv[2]); + args_free(args); +} + +TEST(args_init_from_string) +{ + struct args *args = args_init_from_string("first second\tthird\nfourth"); + CHECK(args); + CHECK_INT_EQ(4, args->argc); + CHECK_STR_EQ("first", args->argv[0]); + CHECK_STR_EQ("second", args->argv[1]); + CHECK_STR_EQ("third", args->argv[2]); + CHECK_STR_EQ("fourth", args->argv[3]); + CHECK(!args->argv[4]); + args_free(args); +} + +TEST(args_init_from_gcc_atfile) +{ + struct args *args; + const char *argtext = + "first\rsec\\\tond\tthi\\\\rd\nfourth \tfif\\ th \"si'x\\\" th\"" + " 'seve\nth'\\"; + + create_file("gcc_atfile", argtext); + + args = args_init_from_gcc_atfile("gcc_atfile"); + CHECK(args); + CHECK_INT_EQ(7, args->argc); + CHECK_STR_EQ("first", args->argv[0]); + CHECK_STR_EQ("sec\tond", args->argv[1]); + CHECK_STR_EQ("thi\\rd", args->argv[2]); + CHECK_STR_EQ("fourth", args->argv[3]); + CHECK_STR_EQ("fif th", args->argv[4]); + CHECK_STR_EQ("si'x\" th", args->argv[5]); +#ifndef _WIN32 + CHECK_STR_EQ("seve\nth", args->argv[6]); +#else + CHECK_STR_EQ("seve\r\nth", args->argv[6]); +#endif + CHECK(!args->argv[7]); + args_free(args); +} + +TEST(args_copy) +{ + struct args *args1 = args_init_from_string("foo"); + struct args *args2 = args_copy(args1); + CHECK_ARGS_EQ_FREE12(args1, args2); +} + +TEST(args_add) +{ + struct args *args = args_init_from_string("first"); + CHECK_INT_EQ(1, args->argc); + args_add(args, "second"); + CHECK_INT_EQ(2, args->argc); + CHECK_STR_EQ("second", args->argv[1]); + CHECK(!args->argv[2]); + args_free(args); +} + +TEST(args_extend) +{ + struct args *args1 = args_init_from_string("first"); + struct args *args2 = args_init_from_string("second third"); + CHECK_INT_EQ(1, args1->argc); + args_extend(args1, args2); + CHECK_INT_EQ(3, args1->argc); + CHECK_STR_EQ("second", args1->argv[1]); + CHECK_STR_EQ("third", args1->argv[2]); + CHECK(!args1->argv[3]); + args_free(args1); + args_free(args2); +} + +TEST(args_pop) +{ + struct args *args = args_init_from_string("first second third"); + args_pop(args, 2); + CHECK_INT_EQ(1, args->argc); + CHECK_STR_EQ("first", args->argv[0]); + CHECK(!args->argv[1]); + args_free(args); +} + +TEST(args_set) +{ + struct args *args = args_init_from_string("first second third"); + args_set(args, 1, "2nd"); + CHECK_INT_EQ(3, args->argc); + CHECK_STR_EQ("first", args->argv[0]); + CHECK_STR_EQ("2nd", args->argv[1]); + CHECK_STR_EQ("third", args->argv[2]); + CHECK(!args->argv[3]); + args_free(args); +} + +TEST(args_remove_first) +{ + struct args *args1 = args_init_from_string("first second third"); + struct args *args2 = args_init_from_string("second third"); + args_remove_first(args1); + CHECK_ARGS_EQ_FREE12(args1, args2); +} + +TEST(args_add_prefix) +{ + struct args *args1 = args_init_from_string("second third"); + struct args *args2 = args_init_from_string("first second third"); + args_add_prefix(args1, "first"); + CHECK_ARGS_EQ_FREE12(args1, args2); +} + +TEST(args_strip) +{ + struct args *args1 = args_init_from_string("first xsecond third xfourth"); + struct args *args2 = args_init_from_string("first third"); + args_strip(args1, "x"); + CHECK_ARGS_EQ_FREE12(args1, args2); +} + +TEST(args_to_string) +{ + struct args *args = args_init_from_string("first second"); + CHECK_STR_EQ_FREE2("first second", args_to_string(args)); + args_free(args); +} + +TEST(args_insert) +{ + struct args *args = args_init_from_string("first second third fourth fifth"); + + struct args *src1 = args_init_from_string("alpha beta gamma"); + struct args *src2 = args_init_from_string("one"); + struct args *src3 = args_init_from_string(""); + struct args *src4 = args_init_from_string("alpha beta gamma"); + struct args *src5 = args_init_from_string("one"); + struct args *src6 = args_init_from_string(""); + + args_insert(args, 2, src1, true); + CHECK_STR_EQ_FREE2("first second alpha beta gamma fourth fifth", + args_to_string(args)); + CHECK_INT_EQ(7, args->argc); + args_insert(args, 2, src2, true); + CHECK_STR_EQ_FREE2("first second one beta gamma fourth fifth", + args_to_string(args)); + CHECK_INT_EQ(7, args->argc); + args_insert(args, 2, src3, true); + CHECK_STR_EQ_FREE2("first second beta gamma fourth fifth", + args_to_string(args)); + CHECK_INT_EQ(6, args->argc); + + args_insert(args, 1, src4, false); + CHECK_STR_EQ_FREE2("first alpha beta gamma second beta gamma fourth fifth", + args_to_string(args)); + CHECK_INT_EQ(9, args->argc); + args_insert(args, 1, src5, false); + CHECK_STR_EQ_FREE2( + "first one alpha beta gamma second beta gamma fourth fifth", + args_to_string(args)); + CHECK_INT_EQ(10, args->argc); + args_insert(args, 1, src6, false); + CHECK_STR_EQ_FREE2( + "first one alpha beta gamma second beta gamma fourth fifth", + args_to_string(args)); + CHECK_INT_EQ(10, args->argc); + + args_free(args); +} + +TEST_SUITE_END |