summaryrefslogtreecommitdiff
path: root/test/test_args.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_args.c')
-rw-r--r--test/test_args.c213
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