Imported Upstream version 3.4
[platform/upstream/ccache.git] / unittest / test_args.c
1 // Copyright (C) 2010-2018 Joel Rosdahl
2 //
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)
6 // any later version.
7 //
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
11 // more details.
12 //
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
16
17 // This file contains tests for the functions operating on struct args.
18
19 #include "../src/ccache.h"
20 #include "framework.h"
21 #include "util.h"
22
23 TEST_SUITE(args)
24
25 TEST(args_init_empty)
26 {
27         struct args *args = args_init(0, NULL);
28         CHECK(args);
29         CHECK_INT_EQ(0, args->argc);
30         CHECK(!args->argv[0]);
31         args_free(args);
32 }
33
34 TEST(args_init_populated)
35 {
36         char *argv[] = {"first", "second"};
37         struct args *args = args_init(2, argv);
38         CHECK(args);
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]);
43         args_free(args);
44 }
45
46 TEST(args_init_from_string)
47 {
48         struct args *args = args_init_from_string("first second\tthird\nfourth");
49         CHECK(args);
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]);
56         args_free(args);
57 }
58
59 TEST(args_init_from_gcc_atfile)
60 {
61         struct args *args;
62         const char *argtext =
63           "first\rsec\\\tond\tthi\\\\rd\nfourth  \tfif\\ th \"si'x\\\" th\""
64           " 'seve\nth'\\";
65
66         create_file("gcc_atfile", argtext);
67
68         args = args_init_from_gcc_atfile("gcc_atfile");
69         CHECK(args);
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]);
77 #ifndef _WIN32
78         CHECK_STR_EQ("seve\nth", args->argv[6]);
79 #else
80         CHECK_STR_EQ("seve\r\nth", args->argv[6]);
81 #endif
82         CHECK(!args->argv[7]);
83         args_free(args);
84 }
85
86 TEST(args_copy)
87 {
88         struct args *args1 = args_init_from_string("foo");
89         struct args *args2 = args_copy(args1);
90         CHECK_ARGS_EQ_FREE12(args1, args2);
91 }
92
93 TEST(args_add)
94 {
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]);
101         args_free(args);
102 }
103
104 TEST(args_extend)
105 {
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]);
114         args_free(args1);
115         args_free(args2);
116 }
117
118 TEST(args_pop)
119 {
120         struct args *args = args_init_from_string("first second third");
121         args_pop(args, 2);
122         CHECK_INT_EQ(1, args->argc);
123         CHECK_STR_EQ("first", args->argv[0]);
124         CHECK(!args->argv[1]);
125         args_free(args);
126 }
127
128 TEST(args_set)
129 {
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]);
137         args_free(args);
138 }
139
140 TEST(args_remove_first)
141 {
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);
146 }
147
148 TEST(args_add_prefix)
149 {
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);
154 }
155
156 TEST(args_strip)
157 {
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);
162 }
163
164 TEST(args_to_string)
165 {
166         struct args *args = args_init_from_string("first second");
167         CHECK_STR_EQ_FREE2("first second", args_to_string(args));
168         args_free(args);
169 }
170
171 TEST(args_insert)
172 {
173         struct args *args = args_init_from_string("first second third fourth fifth");
174
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("");
181
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);
194
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);
200         CHECK_STR_EQ_FREE2(
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);
205         CHECK_STR_EQ_FREE2(
206           "first one alpha beta gamma second beta gamma fourth fifth",
207           args_to_string(args));
208         CHECK_INT_EQ(10, args->argc);
209
210         args_free(args);
211 }
212
213 TEST_SUITE_END