1 // Copyright (C) 2010-2016 Joel Rosdahl
3 // This program is free software; you can redistribute it and/or modify it
4 // under the terms of the GNU General Public License as published by the Free
5 // Software Foundation; either version 3 of the License, or (at your option)
8 // This program is distributed in the hope that it will be useful, but WITHOUT
9 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 // You should have received a copy of the GNU General Public License along with
14 // this program; if not, write to the Free Software Foundation, Inc., 51
15 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 // This file contains tests for the functions operating on struct args.
19 #include "../ccache.h"
20 #include "framework.h"
27 struct args *args = args_init(0, NULL);
29 CHECK_INT_EQ(0, args->argc);
30 CHECK(!args->argv[0]);
34 TEST(args_init_populated)
36 char *argv[] = {"first", "second"};
37 struct args *args = args_init(2, argv);
39 CHECK_INT_EQ(2, args->argc);
40 CHECK_STR_EQ("first", args->argv[0]);
41 CHECK_STR_EQ("second", args->argv[1]);
42 CHECK(!args->argv[2]);
46 TEST(args_init_from_string)
48 struct args *args = args_init_from_string("first second\tthird\nfourth");
50 CHECK_INT_EQ(4, args->argc);
51 CHECK_STR_EQ("first", args->argv[0]);
52 CHECK_STR_EQ("second", args->argv[1]);
53 CHECK_STR_EQ("third", args->argv[2]);
54 CHECK_STR_EQ("fourth", args->argv[3]);
55 CHECK(!args->argv[4]);
59 TEST(args_init_from_gcc_atfile)
63 "first\rsec\\\tond\tthi\\\\rd\nfourth \tfif\\ th \"si'x\\\" th\""
66 create_file("gcc_atfile", argtext);
68 args = args_init_from_gcc_atfile("gcc_atfile");
70 CHECK_INT_EQ(7, args->argc);
71 CHECK_STR_EQ("first", args->argv[0]);
72 CHECK_STR_EQ("sec\tond", args->argv[1]);
73 CHECK_STR_EQ("thi\\rd", args->argv[2]);
74 CHECK_STR_EQ("fourth", args->argv[3]);
75 CHECK_STR_EQ("fif th", args->argv[4]);
76 CHECK_STR_EQ("si'x\" th", args->argv[5]);
78 CHECK_STR_EQ("seve\nth", args->argv[6]);
80 CHECK_STR_EQ("seve\r\nth", args->argv[6]);
82 CHECK(!args->argv[7]);
88 struct args *args1 = args_init_from_string("foo");
89 struct args *args2 = args_copy(args1);
90 CHECK_ARGS_EQ_FREE12(args1, args2);
95 struct args *args = args_init_from_string("first");
96 CHECK_INT_EQ(1, args->argc);
97 args_add(args, "second");
98 CHECK_INT_EQ(2, args->argc);
99 CHECK_STR_EQ("second", args->argv[1]);
100 CHECK(!args->argv[2]);
106 struct args *args1 = args_init_from_string("first");
107 struct args *args2 = args_init_from_string("second third");
108 CHECK_INT_EQ(1, args1->argc);
109 args_extend(args1, args2);
110 CHECK_INT_EQ(3, args1->argc);
111 CHECK_STR_EQ("second", args1->argv[1]);
112 CHECK_STR_EQ("third", args1->argv[2]);
113 CHECK(!args1->argv[3]);
120 struct args *args = args_init_from_string("first second third");
122 CHECK_INT_EQ(1, args->argc);
123 CHECK_STR_EQ("first", args->argv[0]);
124 CHECK(!args->argv[1]);
130 struct args *args = args_init_from_string("first second third");
131 args_set(args, 1, "2nd");
132 CHECK_INT_EQ(3, args->argc);
133 CHECK_STR_EQ("first", args->argv[0]);
134 CHECK_STR_EQ("2nd", args->argv[1]);
135 CHECK_STR_EQ("third", args->argv[2]);
136 CHECK(!args->argv[3]);
140 TEST(args_remove_first)
142 struct args *args1 = args_init_from_string("first second third");
143 struct args *args2 = args_init_from_string("second third");
144 args_remove_first(args1);
145 CHECK_ARGS_EQ_FREE12(args1, args2);
148 TEST(args_add_prefix)
150 struct args *args1 = args_init_from_string("second third");
151 struct args *args2 = args_init_from_string("first second third");
152 args_add_prefix(args1, "first");
153 CHECK_ARGS_EQ_FREE12(args1, args2);
158 struct args *args1 = args_init_from_string("first xsecond third xfourth");
159 struct args *args2 = args_init_from_string("first third");
160 args_strip(args1, "x");
161 CHECK_ARGS_EQ_FREE12(args1, args2);
166 struct args *args = args_init_from_string("first second");
167 CHECK_STR_EQ_FREE2("first second", args_to_string(args));
173 struct args *args = args_init_from_string("first second third fourth fifth");
175 struct args *src1 = args_init_from_string("alpha beta gamma");
176 struct args *src2 = args_init_from_string("one");
177 struct args *src3 = args_init_from_string("");
178 struct args *src4 = args_init_from_string("alpha beta gamma");
179 struct args *src5 = args_init_from_string("one");
180 struct args *src6 = args_init_from_string("");
182 args_insert(args, 2, src1, true);
183 CHECK_STR_EQ_FREE2("first second alpha beta gamma fourth fifth",
184 args_to_string(args));
185 CHECK_INT_EQ(7, args->argc);
186 args_insert(args, 2, src2, true);
187 CHECK_STR_EQ_FREE2("first second one beta gamma fourth fifth",
188 args_to_string(args));
189 CHECK_INT_EQ(7, args->argc);
190 args_insert(args, 2, src3, true);
191 CHECK_STR_EQ_FREE2("first second beta gamma fourth fifth",
192 args_to_string(args));
193 CHECK_INT_EQ(6, args->argc);
195 args_insert(args, 1, src4, false);
196 CHECK_STR_EQ_FREE2("first alpha beta gamma second beta gamma fourth fifth",
197 args_to_string(args));
198 CHECK_INT_EQ(9, args->argc);
199 args_insert(args, 1, src5, false);
201 "first one alpha beta gamma second beta gamma fourth fifth",
202 args_to_string(args));
203 CHECK_INT_EQ(10, args->argc);
204 args_insert(args, 1, src6, false);
206 "first one alpha beta gamma second beta gamma fourth fifth",
207 args_to_string(args));
208 CHECK_INT_EQ(10, args->argc);