]> jfr.im git - solanum.git/blame - tests/msgbuf_parse1.c
check bans and quiets for cmode -n/nonmember PRIVMSG
[solanum.git] / tests / msgbuf_parse1.c
CommitLineData
05a16d98
SA
1/*
2 * msgbuf_parse1.c: Test msgbuf under various conditions
3 * Copyright 2017 Simon Arlott
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
18 * USA
19 */
20#include <stdio.h>
21#include <string.h>
22#include <stdlib.h>
23#include <unistd.h>
24#include "tap/basic.h"
25
26#include "stdinc.h"
27#include "ircd_defs.h"
28#include "msgbuf.h"
29#include "client.h"
30
31#define MSG "%s:%d (%s)", __FILE__, __LINE__, __FUNCTION__
32
33struct Client me;
34static char tmp[2048];
35static const char text[] =
36"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
37"ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
38"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
39"ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
40"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
41"ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
42"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
43"ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
44"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
45"ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
46;
47
48#define MKTEXT(n) &text[sizeof(text) - ((n) + 1)]
49
50static void basic_tags1(void)
51{
52 struct MsgBuf msgbuf;
53
54 memset(&msgbuf, 0, sizeof(msgbuf));
55 strcpy(tmp, "@tag=value PRIVMSG #test :test");
56
57 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
58 if (is_int(1, msgbuf.n_tags, MSG)) {
59 is_string("tag", msgbuf.tags[0].key, MSG);
60 is_string("value", msgbuf.tags[0].value, MSG);
61 }
62
63 is_string("PRIVMSG", msgbuf.cmd, MSG);
64 if (is_int(3, msgbuf.n_para, MSG)) {
65 is_string("PRIVMSG", msgbuf.para[0], MSG);
66 is_string("#test", msgbuf.para[1], MSG);
67 is_string("test", msgbuf.para[2], MSG);
68 }
69 }
70}
71
72static void basic_tags2(void)
73{
74 struct MsgBuf msgbuf;
75
76 memset(&msgbuf, 0, sizeof(msgbuf));
77 strcpy(tmp, "@tag0=value0;tag1=value1 PRIVMSG #test :test");
78
79 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
80 if (is_int(2, msgbuf.n_tags, MSG)) {
81 is_string("tag0", msgbuf.tags[0].key, MSG);
82 is_string("value0", msgbuf.tags[0].value, MSG);
83
84 is_string("tag1", msgbuf.tags[1].key, MSG);
85 is_string("value1", msgbuf.tags[1].value, MSG);
86 }
87
88 is_string("PRIVMSG", msgbuf.cmd, MSG);
89 if (is_int(3, msgbuf.n_para, MSG)) {
90 is_string("PRIVMSG", msgbuf.para[0], MSG);
91 is_string("#test", msgbuf.para[1], MSG);
92 is_string("test", msgbuf.para[2], MSG);
93 }
94 }
95}
96
97static void basic_tags3(void)
98{
99 struct MsgBuf msgbuf;
100
101 memset(&msgbuf, 0, sizeof(msgbuf));
102 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2 PRIVMSG #test :test");
103
104 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
105 if (is_int(3, msgbuf.n_tags, MSG)) {
106 is_string("tag0", msgbuf.tags[0].key, MSG);
107 is_string("value0", msgbuf.tags[0].value, MSG);
108
109 is_string("tag1", msgbuf.tags[1].key, MSG);
110 is_string("value1", msgbuf.tags[1].value, MSG);
111
112 is_string("tag2", msgbuf.tags[2].key, MSG);
113 is_string("value2", msgbuf.tags[2].value, MSG);
114 }
115
116 is_string("PRIVMSG", msgbuf.cmd, MSG);
117 if (is_int(3, msgbuf.n_para, MSG)) {
118 is_string("PRIVMSG", msgbuf.para[0], MSG);
119 is_string("#test", msgbuf.para[1], MSG);
120 is_string("test", msgbuf.para[2], MSG);
121 }
122 }
123}
124
125static void basic_tags4(void)
126{
127 struct MsgBuf msgbuf;
128
129 memset(&msgbuf, 0, sizeof(msgbuf));
130 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3 PRIVMSG #test :test");
131
132 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
133 if (is_int(4, msgbuf.n_tags, MSG)) {
134 is_string("tag0", msgbuf.tags[0].key, MSG);
135 is_string("value0", msgbuf.tags[0].value, MSG);
136
137 is_string("tag1", msgbuf.tags[1].key, MSG);
138 is_string("value1", msgbuf.tags[1].value, MSG);
139
140 is_string("tag2", msgbuf.tags[2].key, MSG);
141 is_string("value2", msgbuf.tags[2].value, MSG);
142
143 is_string("tag3", msgbuf.tags[3].key, MSG);
144 is_string("value3", msgbuf.tags[3].value, MSG);
145 }
146
147 is_string("PRIVMSG", msgbuf.cmd, MSG);
148 if (is_int(3, msgbuf.n_para, MSG)) {
149 is_string("PRIVMSG", msgbuf.para[0], MSG);
150 is_string("#test", msgbuf.para[1], MSG);
151 is_string("test", msgbuf.para[2], MSG);
152 }
153 }
154}
155
156static void basic_tags5a(void)
157{
158 struct MsgBuf msgbuf;
159
160 memset(&msgbuf, 0, sizeof(msgbuf));
161 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4 PRIVMSG #test :test");
162
163 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
164 if (is_int(5, msgbuf.n_tags, MSG)) {
165 is_string("tag0", msgbuf.tags[0].key, MSG);
166 is_string("value0", msgbuf.tags[0].value, MSG);
167
168 is_string("tag1", msgbuf.tags[1].key, MSG);
169 is_string("value1", msgbuf.tags[1].value, MSG);
170
171 is_string("tag2", msgbuf.tags[2].key, MSG);
172 is_string("value2", msgbuf.tags[2].value, MSG);
173
174 is_string("tag3", msgbuf.tags[3].key, MSG);
175 is_string("value3", msgbuf.tags[3].value, MSG);
176
177 is_string("tag4", msgbuf.tags[4].key, MSG);
178 is_string("value4", msgbuf.tags[4].value, MSG);
179 }
180
181 is_string("PRIVMSG", msgbuf.cmd, MSG);
182 if (is_int(3, msgbuf.n_para, MSG)) {
183 is_string("PRIVMSG", msgbuf.para[0], MSG);
184 is_string("#test", msgbuf.para[1], MSG);
185 is_string("test", msgbuf.para[2], MSG);
186 }
187 }
188}
189
190static void basic_tags5b(void)
191{
192 struct MsgBuf msgbuf;
193
194 memset(&msgbuf, 0, sizeof(msgbuf));
195 strcpy(tmp, "@tag0=val=ue0;tag1=val=ue1;tag2=val=ue2;tag3=val=ue3;tag4=val=ue4 PRIVMSG #test :test");
196
197 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
198 if (is_int(5, msgbuf.n_tags, MSG)) {
199 is_string("tag0", msgbuf.tags[0].key, MSG);
200 is_string("val=ue0", msgbuf.tags[0].value, MSG);
201
202 is_string("tag1", msgbuf.tags[1].key, MSG);
203 is_string("val=ue1", msgbuf.tags[1].value, MSG);
204
205 is_string("tag2", msgbuf.tags[2].key, MSG);
206 is_string("val=ue2", msgbuf.tags[2].value, MSG);
207
208 is_string("tag3", msgbuf.tags[3].key, MSG);
209 is_string("val=ue3", msgbuf.tags[3].value, MSG);
210
211 is_string("tag4", msgbuf.tags[4].key, MSG);
212 is_string("val=ue4", msgbuf.tags[4].value, MSG);
213 }
214
215 is_string("PRIVMSG", msgbuf.cmd, MSG);
216 if (is_int(3, msgbuf.n_para, MSG)) {
217 is_string("PRIVMSG", msgbuf.para[0], MSG);
218 is_string("#test", msgbuf.para[1], MSG);
219 is_string("test", msgbuf.para[2], MSG);
220 }
221 }
222}
223
224static void basic_tags13(void)
225{
226 struct MsgBuf msgbuf;
227
228 memset(&msgbuf, 0, sizeof(msgbuf));
229 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12 PRIVMSG #test :test");
230
231 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
232 if (is_int(13, msgbuf.n_tags, MSG)) {
233 is_string("tag0", msgbuf.tags[0].key, MSG);
234 is_string("value0", msgbuf.tags[0].value, MSG);
235
236 is_string("tag1", msgbuf.tags[1].key, MSG);
237 is_string("value1", msgbuf.tags[1].value, MSG);
238
239 is_string("tag2", msgbuf.tags[2].key, MSG);
240 is_string("value2", msgbuf.tags[2].value, MSG);
241
242 is_string("tag3", msgbuf.tags[3].key, MSG);
243 is_string("value3", msgbuf.tags[3].value, MSG);
244
245 is_string("tag4", msgbuf.tags[4].key, MSG);
246 is_string("value4", msgbuf.tags[4].value, MSG);
247
248 is_string("tag5", msgbuf.tags[5].key, MSG);
249 is_string("value5", msgbuf.tags[5].value, MSG);
250
251 is_string("tag6", msgbuf.tags[6].key, MSG);
252 is_string("value6", msgbuf.tags[6].value, MSG);
253
254 is_string("tag7", msgbuf.tags[7].key, MSG);
255 is_string("value7", msgbuf.tags[7].value, MSG);
256
257 is_string("tag8", msgbuf.tags[8].key, MSG);
258 is_string("value8", msgbuf.tags[8].value, MSG);
259
260 is_string("tag9", msgbuf.tags[9].key, MSG);
261 is_string("value9", msgbuf.tags[9].value, MSG);
262
263 is_string("tag10", msgbuf.tags[10].key, MSG);
264 is_string("value10", msgbuf.tags[10].value, MSG);
265
266 is_string("tag11", msgbuf.tags[11].key, MSG);
267 is_string("value11", msgbuf.tags[11].value, MSG);
268
269 is_string("tag12", msgbuf.tags[12].key, MSG);
270 is_string("value12", msgbuf.tags[12].value, MSG);
271 }
272
273 is_string("PRIVMSG", msgbuf.cmd, MSG);
274 if (is_int(3, msgbuf.n_para, MSG)) {
275 is_string("PRIVMSG", msgbuf.para[0], MSG);
276 is_string("#test", msgbuf.para[1], MSG);
277 is_string("test", msgbuf.para[2], MSG);
278 }
279 }
280}
281
282static void basic_tags14(void)
283{
284 struct MsgBuf msgbuf;
285
286 memset(&msgbuf, 0, sizeof(msgbuf));
287 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13 PRIVMSG #test :test");
288
289 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
290 if (is_int(14, msgbuf.n_tags, MSG)) {
291 is_string("tag0", msgbuf.tags[0].key, MSG);
292 is_string("value0", msgbuf.tags[0].value, MSG);
293
294 is_string("tag1", msgbuf.tags[1].key, MSG);
295 is_string("value1", msgbuf.tags[1].value, MSG);
296
297 is_string("tag2", msgbuf.tags[2].key, MSG);
298 is_string("value2", msgbuf.tags[2].value, MSG);
299
300 is_string("tag3", msgbuf.tags[3].key, MSG);
301 is_string("value3", msgbuf.tags[3].value, MSG);
302
303 is_string("tag4", msgbuf.tags[4].key, MSG);
304 is_string("value4", msgbuf.tags[4].value, MSG);
305
306 is_string("tag5", msgbuf.tags[5].key, MSG);
307 is_string("value5", msgbuf.tags[5].value, MSG);
308
309 is_string("tag6", msgbuf.tags[6].key, MSG);
310 is_string("value6", msgbuf.tags[6].value, MSG);
311
312 is_string("tag7", msgbuf.tags[7].key, MSG);
313 is_string("value7", msgbuf.tags[7].value, MSG);
314
315 is_string("tag8", msgbuf.tags[8].key, MSG);
316 is_string("value8", msgbuf.tags[8].value, MSG);
317
318 is_string("tag9", msgbuf.tags[9].key, MSG);
319 is_string("value9", msgbuf.tags[9].value, MSG);
320
321 is_string("tag10", msgbuf.tags[10].key, MSG);
322 is_string("value10", msgbuf.tags[10].value, MSG);
323
324 is_string("tag11", msgbuf.tags[11].key, MSG);
325 is_string("value11", msgbuf.tags[11].value, MSG);
326
327 is_string("tag12", msgbuf.tags[12].key, MSG);
328 is_string("value12", msgbuf.tags[12].value, MSG);
329
330 is_string("tag13", msgbuf.tags[13].key, MSG);
331 is_string("value13", msgbuf.tags[13].value, MSG);
332 }
333
334 is_string("PRIVMSG", msgbuf.cmd, MSG);
335 if (is_int(3, msgbuf.n_para, MSG)) {
336 is_string("PRIVMSG", msgbuf.para[0], MSG);
337 is_string("#test", msgbuf.para[1], MSG);
338 is_string("test", msgbuf.para[2], MSG);
339 }
340 }
341}
342
343static void basic_tags15(void)
344{
345 struct MsgBuf msgbuf;
346
347 memset(&msgbuf, 0, sizeof(msgbuf));
348 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=value14 PRIVMSG #test :test");
349
350 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
351 if (is_int(15, msgbuf.n_tags, MSG)) {
352 is_string("tag0", msgbuf.tags[0].key, MSG);
353 is_string("value0", msgbuf.tags[0].value, MSG);
354
355 is_string("tag1", msgbuf.tags[1].key, MSG);
356 is_string("value1", msgbuf.tags[1].value, MSG);
357
358 is_string("tag2", msgbuf.tags[2].key, MSG);
359 is_string("value2", msgbuf.tags[2].value, MSG);
360
361 is_string("tag3", msgbuf.tags[3].key, MSG);
362 is_string("value3", msgbuf.tags[3].value, MSG);
363
364 is_string("tag4", msgbuf.tags[4].key, MSG);
365 is_string("value4", msgbuf.tags[4].value, MSG);
366
367 is_string("tag5", msgbuf.tags[5].key, MSG);
368 is_string("value5", msgbuf.tags[5].value, MSG);
369
370 is_string("tag6", msgbuf.tags[6].key, MSG);
371 is_string("value6", msgbuf.tags[6].value, MSG);
372
373 is_string("tag7", msgbuf.tags[7].key, MSG);
374 is_string("value7", msgbuf.tags[7].value, MSG);
375
376 is_string("tag8", msgbuf.tags[8].key, MSG);
377 is_string("value8", msgbuf.tags[8].value, MSG);
378
379 is_string("tag9", msgbuf.tags[9].key, MSG);
380 is_string("value9", msgbuf.tags[9].value, MSG);
381
382 is_string("tag10", msgbuf.tags[10].key, MSG);
383 is_string("value10", msgbuf.tags[10].value, MSG);
384
385 is_string("tag11", msgbuf.tags[11].key, MSG);
386 is_string("value11", msgbuf.tags[11].value, MSG);
387
388 is_string("tag12", msgbuf.tags[12].key, MSG);
389 is_string("value12", msgbuf.tags[12].value, MSG);
390
391 is_string("tag13", msgbuf.tags[13].key, MSG);
392 is_string("value13", msgbuf.tags[13].value, MSG);
393
394 is_string("tag14", msgbuf.tags[14].key, MSG);
395 is_string("value14", msgbuf.tags[14].value, MSG);
396 }
397
398 is_string("PRIVMSG", msgbuf.cmd, MSG);
399 if (is_int(3, msgbuf.n_para, MSG)) {
400 is_string("PRIVMSG", msgbuf.para[0], MSG);
401 is_string("#test", msgbuf.para[1], MSG);
402 is_string("test", msgbuf.para[2], MSG);
403 }
404 }
405}
406
407static void basic_tags16(void)
408{
409 struct MsgBuf msgbuf;
410
411 memset(&msgbuf, 0, sizeof(msgbuf));
412 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=value14;tag15=value15 PRIVMSG #test :test");
413
414 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
415 if (is_int(15, msgbuf.n_tags, MSG)) {
416 is_string("tag0", msgbuf.tags[0].key, MSG);
417 is_string("value0", msgbuf.tags[0].value, MSG);
418
419 is_string("tag1", msgbuf.tags[1].key, MSG);
420 is_string("value1", msgbuf.tags[1].value, MSG);
421
422 is_string("tag2", msgbuf.tags[2].key, MSG);
423 is_string("value2", msgbuf.tags[2].value, MSG);
424
425 is_string("tag3", msgbuf.tags[3].key, MSG);
426 is_string("value3", msgbuf.tags[3].value, MSG);
427
428 is_string("tag4", msgbuf.tags[4].key, MSG);
429 is_string("value4", msgbuf.tags[4].value, MSG);
430
431 is_string("tag5", msgbuf.tags[5].key, MSG);
432 is_string("value5", msgbuf.tags[5].value, MSG);
433
434 is_string("tag6", msgbuf.tags[6].key, MSG);
435 is_string("value6", msgbuf.tags[6].value, MSG);
436
437 is_string("tag7", msgbuf.tags[7].key, MSG);
438 is_string("value7", msgbuf.tags[7].value, MSG);
439
440 is_string("tag8", msgbuf.tags[8].key, MSG);
441 is_string("value8", msgbuf.tags[8].value, MSG);
442
443 is_string("tag9", msgbuf.tags[9].key, MSG);
444 is_string("value9", msgbuf.tags[9].value, MSG);
445
446 is_string("tag10", msgbuf.tags[10].key, MSG);
447 is_string("value10", msgbuf.tags[10].value, MSG);
448
449 is_string("tag11", msgbuf.tags[11].key, MSG);
450 is_string("value11", msgbuf.tags[11].value, MSG);
451
452 is_string("tag12", msgbuf.tags[12].key, MSG);
453 is_string("value12", msgbuf.tags[12].value, MSG);
454
455 is_string("tag13", msgbuf.tags[13].key, MSG);
456 is_string("value13", msgbuf.tags[13].value, MSG);
457
458 is_string("tag14", msgbuf.tags[14].key, MSG);
459 is_string("value14", msgbuf.tags[14].value, MSG);
460 }
461
462 is_string("PRIVMSG", msgbuf.cmd, MSG);
463 if (is_int(3, msgbuf.n_para, MSG)) {
464 is_string("PRIVMSG", msgbuf.para[0], MSG);
465 is_string("#test", msgbuf.para[1], MSG);
466 is_string("test", msgbuf.para[2], MSG);
467 }
468 }
469}
470
471static void basic_tags17(void)
472{
473 struct MsgBuf msgbuf;
474
475 memset(&msgbuf, 0, sizeof(msgbuf));
476 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=value14;tag15=value15;tag16=value16 PRIVMSG #test :test");
477
478 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
479 if (is_int(15, msgbuf.n_tags, MSG)) {
480 is_string("tag0", msgbuf.tags[0].key, MSG);
481 is_string("value0", msgbuf.tags[0].value, MSG);
482
483 is_string("tag1", msgbuf.tags[1].key, MSG);
484 is_string("value1", msgbuf.tags[1].value, MSG);
485
486 is_string("tag2", msgbuf.tags[2].key, MSG);
487 is_string("value2", msgbuf.tags[2].value, MSG);
488
489 is_string("tag3", msgbuf.tags[3].key, MSG);
490 is_string("value3", msgbuf.tags[3].value, MSG);
491
492 is_string("tag4", msgbuf.tags[4].key, MSG);
493 is_string("value4", msgbuf.tags[4].value, MSG);
494
495 is_string("tag5", msgbuf.tags[5].key, MSG);
496 is_string("value5", msgbuf.tags[5].value, MSG);
497
498 is_string("tag6", msgbuf.tags[6].key, MSG);
499 is_string("value6", msgbuf.tags[6].value, MSG);
500
501 is_string("tag7", msgbuf.tags[7].key, MSG);
502 is_string("value7", msgbuf.tags[7].value, MSG);
503
504 is_string("tag8", msgbuf.tags[8].key, MSG);
505 is_string("value8", msgbuf.tags[8].value, MSG);
506
507 is_string("tag9", msgbuf.tags[9].key, MSG);
508 is_string("value9", msgbuf.tags[9].value, MSG);
509
510 is_string("tag10", msgbuf.tags[10].key, MSG);
511 is_string("value10", msgbuf.tags[10].value, MSG);
512
513 is_string("tag11", msgbuf.tags[11].key, MSG);
514 is_string("value11", msgbuf.tags[11].value, MSG);
515
516 is_string("tag12", msgbuf.tags[12].key, MSG);
517 is_string("value12", msgbuf.tags[12].value, MSG);
518
519 is_string("tag13", msgbuf.tags[13].key, MSG);
520 is_string("value13", msgbuf.tags[13].value, MSG);
521
522 is_string("tag14", msgbuf.tags[14].key, MSG);
523 is_string("value14", msgbuf.tags[14].value, MSG);
524 }
525
526 is_string("PRIVMSG", msgbuf.cmd, MSG);
527 if (is_int(3, msgbuf.n_para, MSG)) {
528 is_string("PRIVMSG", msgbuf.para[0], MSG);
529 is_string("#test", msgbuf.para[1], MSG);
530 is_string("test", msgbuf.para[2], MSG);
531 }
532 }
533}
534
535static void too_long_tags15a(void)
536{
537 struct MsgBuf msgbuf;
538
539 memset(&msgbuf, 0, sizeof(msgbuf));
540 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
541 strcat(tmp, MKTEXT(328));
542 is_int(511, strlen(tmp), MSG);
543 strcat(tmp, " PRIVMSG #test :test");
544
545 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
546 if (is_int(15, msgbuf.n_tags, MSG)) {
547 is_string("tag0", msgbuf.tags[0].key, MSG);
548 is_string("value0", msgbuf.tags[0].value, MSG);
549
550 is_string("tag1", msgbuf.tags[1].key, MSG);
551 is_string("value1", msgbuf.tags[1].value, MSG);
552
553 is_string("tag2", msgbuf.tags[2].key, MSG);
554 is_string("value2", msgbuf.tags[2].value, MSG);
555
556 is_string("tag3", msgbuf.tags[3].key, MSG);
557 is_string("value3", msgbuf.tags[3].value, MSG);
558
559 is_string("tag4", msgbuf.tags[4].key, MSG);
560 is_string("value4", msgbuf.tags[4].value, MSG);
561
562 is_string("tag5", msgbuf.tags[5].key, MSG);
563 is_string("value5", msgbuf.tags[5].value, MSG);
564
565 is_string("tag6", msgbuf.tags[6].key, MSG);
566 is_string("value6", msgbuf.tags[6].value, MSG);
567
568 is_string("tag7", msgbuf.tags[7].key, MSG);
569 is_string("value7", msgbuf.tags[7].value, MSG);
570
571 is_string("tag8", msgbuf.tags[8].key, MSG);
572 is_string("value8", msgbuf.tags[8].value, MSG);
573
574 is_string("tag9", msgbuf.tags[9].key, MSG);
575 is_string("value9", msgbuf.tags[9].value, MSG);
576
577 is_string("tag10", msgbuf.tags[10].key, MSG);
578 is_string("value10", msgbuf.tags[10].value, MSG);
579
580 is_string("tag11", msgbuf.tags[11].key, MSG);
581 is_string("value11", msgbuf.tags[11].value, MSG);
582
583 is_string("tag12", msgbuf.tags[12].key, MSG);
584 is_string("value12", msgbuf.tags[12].value, MSG);
585
586 is_string("tag13", msgbuf.tags[13].key, MSG);
587 is_string("value13", msgbuf.tags[13].value, MSG);
588
589 is_string("tag14", msgbuf.tags[14].key, MSG);
590 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
591 }
592
593 is_string("PRIVMSG", msgbuf.cmd, MSG);
594 if (is_int(3, msgbuf.n_para, MSG)) {
595 is_string("PRIVMSG", msgbuf.para[0], MSG);
596 is_string("#test", msgbuf.para[1], MSG);
597 is_string("test", msgbuf.para[2], MSG);
598 }
599 }
600}
601
602static void too_long_tags15b(void)
603{
604 struct MsgBuf msgbuf;
605
606 memset(&msgbuf, 0, sizeof(msgbuf));
607 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
608 strcat(tmp, MKTEXT(329)); /* final character will be replaced with ' ' */
609 is_int(512, strlen(tmp), MSG);
610 strcat(tmp, "PRIVMSG #test :test");
611
612 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
613 if (is_int(15, msgbuf.n_tags, MSG)) {
614 char tmp2[2048];
615
616 /* the value will be truncated */
617 strcpy(tmp2, MKTEXT(329));
618 tmp2[strlen(tmp2) - 1] = 0;
619
620 is_string("tag0", msgbuf.tags[0].key, MSG);
621 is_string("value0", msgbuf.tags[0].value, MSG);
622
623 is_string("tag1", msgbuf.tags[1].key, MSG);
624 is_string("value1", msgbuf.tags[1].value, MSG);
625
626 is_string("tag2", msgbuf.tags[2].key, MSG);
627 is_string("value2", msgbuf.tags[2].value, MSG);
628
629 is_string("tag3", msgbuf.tags[3].key, MSG);
630 is_string("value3", msgbuf.tags[3].value, MSG);
631
632 is_string("tag4", msgbuf.tags[4].key, MSG);
633 is_string("value4", msgbuf.tags[4].value, MSG);
634
635 is_string("tag5", msgbuf.tags[5].key, MSG);
636 is_string("value5", msgbuf.tags[5].value, MSG);
637
638 is_string("tag6", msgbuf.tags[6].key, MSG);
639 is_string("value6", msgbuf.tags[6].value, MSG);
640
641 is_string("tag7", msgbuf.tags[7].key, MSG);
642 is_string("value7", msgbuf.tags[7].value, MSG);
643
644 is_string("tag8", msgbuf.tags[8].key, MSG);
645 is_string("value8", msgbuf.tags[8].value, MSG);
646
647 is_string("tag9", msgbuf.tags[9].key, MSG);
648 is_string("value9", msgbuf.tags[9].value, MSG);
649
650 is_string("tag10", msgbuf.tags[10].key, MSG);
651 is_string("value10", msgbuf.tags[10].value, MSG);
652
653 is_string("tag11", msgbuf.tags[11].key, MSG);
654 is_string("value11", msgbuf.tags[11].value, MSG);
655
656 is_string("tag12", msgbuf.tags[12].key, MSG);
657 is_string("value12", msgbuf.tags[12].value, MSG);
658
659 is_string("tag13", msgbuf.tags[13].key, MSG);
660 is_string("value13", msgbuf.tags[13].value, MSG);
661
662 is_string("tag14", msgbuf.tags[14].key, MSG);
663 is_string(tmp2, msgbuf.tags[14].value, MSG);
664 }
665
666 is_string("PRIVMSG", msgbuf.cmd, MSG);
667 if (is_int(3, msgbuf.n_para, MSG)) {
668 is_string("PRIVMSG", msgbuf.para[0], MSG);
669 is_string("#test", msgbuf.para[1], MSG);
670 is_string("test", msgbuf.para[2], MSG);
671 }
672 }
673}
674
675static void too_long_tags16a(void)
676{
677 struct MsgBuf msgbuf;
678
679 memset(&msgbuf, 0, sizeof(msgbuf));
680 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=value14;tag15=");
681 strcat(tmp, MKTEXT(314));
682 is_int(511, strlen(tmp), MSG);
683 strcat(tmp, " PRIVMSG #test :test");
684
685 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
686 if (is_int(15, msgbuf.n_tags, MSG)) {
687 is_string("tag0", msgbuf.tags[0].key, MSG);
688 is_string("value0", msgbuf.tags[0].value, MSG);
689
690 is_string("tag1", msgbuf.tags[1].key, MSG);
691 is_string("value1", msgbuf.tags[1].value, MSG);
692
693 is_string("tag2", msgbuf.tags[2].key, MSG);
694 is_string("value2", msgbuf.tags[2].value, MSG);
695
696 is_string("tag3", msgbuf.tags[3].key, MSG);
697 is_string("value3", msgbuf.tags[3].value, MSG);
698
699 is_string("tag4", msgbuf.tags[4].key, MSG);
700 is_string("value4", msgbuf.tags[4].value, MSG);
701
702 is_string("tag5", msgbuf.tags[5].key, MSG);
703 is_string("value5", msgbuf.tags[5].value, MSG);
704
705 is_string("tag6", msgbuf.tags[6].key, MSG);
706 is_string("value6", msgbuf.tags[6].value, MSG);
707
708 is_string("tag7", msgbuf.tags[7].key, MSG);
709 is_string("value7", msgbuf.tags[7].value, MSG);
710
711 is_string("tag8", msgbuf.tags[8].key, MSG);
712 is_string("value8", msgbuf.tags[8].value, MSG);
713
714 is_string("tag9", msgbuf.tags[9].key, MSG);
715 is_string("value9", msgbuf.tags[9].value, MSG);
716
717 is_string("tag10", msgbuf.tags[10].key, MSG);
718 is_string("value10", msgbuf.tags[10].value, MSG);
719
720 is_string("tag11", msgbuf.tags[11].key, MSG);
721 is_string("value11", msgbuf.tags[11].value, MSG);
722
723 is_string("tag12", msgbuf.tags[12].key, MSG);
724 is_string("value12", msgbuf.tags[12].value, MSG);
725
726 is_string("tag13", msgbuf.tags[13].key, MSG);
727 is_string("value13", msgbuf.tags[13].value, MSG);
728
729 is_string("tag14", msgbuf.tags[14].key, MSG);
730 is_string("value14", msgbuf.tags[14].value, MSG);
731 }
732
733 is_string("PRIVMSG", msgbuf.cmd, MSG);
734 if (is_int(3, msgbuf.n_para, MSG)) {
735 is_string("PRIVMSG", msgbuf.para[0], MSG);
736 is_string("#test", msgbuf.para[1], MSG);
737 is_string("test", msgbuf.para[2], MSG);
738 }
739 }
740}
741
742static void too_long_tags16b(void)
743{
744 struct MsgBuf msgbuf;
745
746 memset(&msgbuf, 0, sizeof(msgbuf));
747 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=value14;tag15=");
748 strcat(tmp, MKTEXT(315)); /* final character will be replaced with ' ' */
749 is_int(512, strlen(tmp), MSG);
750 strcat(tmp, "PRIVMSG #test :test");
751
752 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
753 if (is_int(15, msgbuf.n_tags, MSG)) {
754 is_string("tag0", msgbuf.tags[0].key, MSG);
755 is_string("value0", msgbuf.tags[0].value, MSG);
756
757 is_string("tag1", msgbuf.tags[1].key, MSG);
758 is_string("value1", msgbuf.tags[1].value, MSG);
759
760 is_string("tag2", msgbuf.tags[2].key, MSG);
761 is_string("value2", msgbuf.tags[2].value, MSG);
762
763 is_string("tag3", msgbuf.tags[3].key, MSG);
764 is_string("value3", msgbuf.tags[3].value, MSG);
765
766 is_string("tag4", msgbuf.tags[4].key, MSG);
767 is_string("value4", msgbuf.tags[4].value, MSG);
768
769 is_string("tag5", msgbuf.tags[5].key, MSG);
770 is_string("value5", msgbuf.tags[5].value, MSG);
771
772 is_string("tag6", msgbuf.tags[6].key, MSG);
773 is_string("value6", msgbuf.tags[6].value, MSG);
774
775 is_string("tag7", msgbuf.tags[7].key, MSG);
776 is_string("value7", msgbuf.tags[7].value, MSG);
777
778 is_string("tag8", msgbuf.tags[8].key, MSG);
779 is_string("value8", msgbuf.tags[8].value, MSG);
780
781 is_string("tag9", msgbuf.tags[9].key, MSG);
782 is_string("value9", msgbuf.tags[9].value, MSG);
783
784 is_string("tag10", msgbuf.tags[10].key, MSG);
785 is_string("value10", msgbuf.tags[10].value, MSG);
786
787 is_string("tag11", msgbuf.tags[11].key, MSG);
788 is_string("value11", msgbuf.tags[11].value, MSG);
789
790 is_string("tag12", msgbuf.tags[12].key, MSG);
791 is_string("value12", msgbuf.tags[12].value, MSG);
792
793 is_string("tag13", msgbuf.tags[13].key, MSG);
794 is_string("value13", msgbuf.tags[13].value, MSG);
795
796 is_string("tag14", msgbuf.tags[14].key, MSG);
797 is_string("value14", msgbuf.tags[14].value, MSG);
798 }
799
800 is_string("PRIVMSG", msgbuf.cmd, MSG);
801 if (is_int(3, msgbuf.n_para, MSG)) {
802 is_string("PRIVMSG", msgbuf.para[0], MSG);
803 is_string("#test", msgbuf.para[1], MSG);
804 is_string("test", msgbuf.para[2], MSG);
805 }
806 }
807}
808
809static void too_long_tags17a(void)
810{
811 struct MsgBuf msgbuf;
812
813 memset(&msgbuf, 0, sizeof(msgbuf));
814 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=value14;tag15=value15;tag16=");
815 strcat(tmp, MKTEXT(300));
816 is_int(511, strlen(tmp), MSG);
817 strcat(tmp, " PRIVMSG #test :test");
818
819 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
820 if (is_int(15, msgbuf.n_tags, MSG)) {
821 is_string("tag0", msgbuf.tags[0].key, MSG);
822 is_string("value0", msgbuf.tags[0].value, MSG);
823
824 is_string("tag1", msgbuf.tags[1].key, MSG);
825 is_string("value1", msgbuf.tags[1].value, MSG);
826
827 is_string("tag2", msgbuf.tags[2].key, MSG);
828 is_string("value2", msgbuf.tags[2].value, MSG);
829
830 is_string("tag3", msgbuf.tags[3].key, MSG);
831 is_string("value3", msgbuf.tags[3].value, MSG);
832
833 is_string("tag4", msgbuf.tags[4].key, MSG);
834 is_string("value4", msgbuf.tags[4].value, MSG);
835
836 is_string("tag5", msgbuf.tags[5].key, MSG);
837 is_string("value5", msgbuf.tags[5].value, MSG);
838
839 is_string("tag6", msgbuf.tags[6].key, MSG);
840 is_string("value6", msgbuf.tags[6].value, MSG);
841
842 is_string("tag7", msgbuf.tags[7].key, MSG);
843 is_string("value7", msgbuf.tags[7].value, MSG);
844
845 is_string("tag8", msgbuf.tags[8].key, MSG);
846 is_string("value8", msgbuf.tags[8].value, MSG);
847
848 is_string("tag9", msgbuf.tags[9].key, MSG);
849 is_string("value9", msgbuf.tags[9].value, MSG);
850
851 is_string("tag10", msgbuf.tags[10].key, MSG);
852 is_string("value10", msgbuf.tags[10].value, MSG);
853
854 is_string("tag11", msgbuf.tags[11].key, MSG);
855 is_string("value11", msgbuf.tags[11].value, MSG);
856
857 is_string("tag12", msgbuf.tags[12].key, MSG);
858 is_string("value12", msgbuf.tags[12].value, MSG);
859
860 is_string("tag13", msgbuf.tags[13].key, MSG);
861 is_string("value13", msgbuf.tags[13].value, MSG);
862
863 is_string("tag14", msgbuf.tags[14].key, MSG);
864 is_string("value14", msgbuf.tags[14].value, MSG);
865 }
866
867 is_string("PRIVMSG", msgbuf.cmd, MSG);
868 if (is_int(3, msgbuf.n_para, MSG)) {
869 is_string("PRIVMSG", msgbuf.para[0], MSG);
870 is_string("#test", msgbuf.para[1], MSG);
871 is_string("test", msgbuf.para[2], MSG);
872 }
873 }
874}
875
876static void too_long_tags17b(void)
877{
878 struct MsgBuf msgbuf;
879
880 memset(&msgbuf, 0, sizeof(msgbuf));
881 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=value14;tag15=value15;tag16=");
882 strcat(tmp, MKTEXT(301)); /* final character will be replaced with ' ' */
883 is_int(512, strlen(tmp), MSG);
884 strcat(tmp, "PRIVMSG #test :test");
885
886 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
887 if (is_int(15, msgbuf.n_tags, MSG)) {
888 is_string("tag0", msgbuf.tags[0].key, MSG);
889 is_string("value0", msgbuf.tags[0].value, MSG);
890
891 is_string("tag1", msgbuf.tags[1].key, MSG);
892 is_string("value1", msgbuf.tags[1].value, MSG);
893
894 is_string("tag2", msgbuf.tags[2].key, MSG);
895 is_string("value2", msgbuf.tags[2].value, MSG);
896
897 is_string("tag3", msgbuf.tags[3].key, MSG);
898 is_string("value3", msgbuf.tags[3].value, MSG);
899
900 is_string("tag4", msgbuf.tags[4].key, MSG);
901 is_string("value4", msgbuf.tags[4].value, MSG);
902
903 is_string("tag5", msgbuf.tags[5].key, MSG);
904 is_string("value5", msgbuf.tags[5].value, MSG);
905
906 is_string("tag6", msgbuf.tags[6].key, MSG);
907 is_string("value6", msgbuf.tags[6].value, MSG);
908
909 is_string("tag7", msgbuf.tags[7].key, MSG);
910 is_string("value7", msgbuf.tags[7].value, MSG);
911
912 is_string("tag8", msgbuf.tags[8].key, MSG);
913 is_string("value8", msgbuf.tags[8].value, MSG);
914
915 is_string("tag9", msgbuf.tags[9].key, MSG);
916 is_string("value9", msgbuf.tags[9].value, MSG);
917
918 is_string("tag10", msgbuf.tags[10].key, MSG);
919 is_string("value10", msgbuf.tags[10].value, MSG);
920
921 is_string("tag11", msgbuf.tags[11].key, MSG);
922 is_string("value11", msgbuf.tags[11].value, MSG);
923
924 is_string("tag12", msgbuf.tags[12].key, MSG);
925 is_string("value12", msgbuf.tags[12].value, MSG);
926
927 is_string("tag13", msgbuf.tags[13].key, MSG);
928 is_string("value13", msgbuf.tags[13].value, MSG);
929
930 is_string("tag14", msgbuf.tags[14].key, MSG);
931 is_string("value14", msgbuf.tags[14].value, MSG);
932 }
933
934 is_string("PRIVMSG", msgbuf.cmd, MSG);
935 if (is_int(3, msgbuf.n_para, MSG)) {
936 is_string("PRIVMSG", msgbuf.para[0], MSG);
937 is_string("#test", msgbuf.para[1], MSG);
938 is_string("test", msgbuf.para[2], MSG);
939 }
940 }
941}
942
943static void empty_value1(void)
944{
945 struct MsgBuf msgbuf;
946
947 memset(&msgbuf, 0, sizeof(msgbuf));
948 strcpy(tmp, "@tag= PRIVMSG #test :test");
949
950 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
951 if (is_int(1, msgbuf.n_tags, MSG)) {
952 is_string("tag", msgbuf.tags[0].key, MSG);
953 is_string("", msgbuf.tags[0].value, MSG);
954 }
955
956 is_string("PRIVMSG", msgbuf.cmd, MSG);
957 if (is_int(3, msgbuf.n_para, MSG)) {
958 is_string("PRIVMSG", msgbuf.para[0], MSG);
959 is_string("#test", msgbuf.para[1], MSG);
960 is_string("test", msgbuf.para[2], MSG);
961 }
962 }
963}
964
965static void empty_value2(void)
966{
967 struct MsgBuf msgbuf;
968
969 memset(&msgbuf, 0, sizeof(msgbuf));
970 strcpy(tmp, "@tag PRIVMSG #test :test");
971
972 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
973 if (is_int(1, msgbuf.n_tags, MSG)) {
974 is_string("tag", msgbuf.tags[0].key, MSG);
975 is_string(NULL, msgbuf.tags[0].value, MSG);
976 }
977
978 is_string("PRIVMSG", msgbuf.cmd, MSG);
979 if (is_int(3, msgbuf.n_para, MSG)) {
980 is_string("PRIVMSG", msgbuf.para[0], MSG);
981 is_string("#test", msgbuf.para[1], MSG);
982 is_string("test", msgbuf.para[2], MSG);
983 }
984 }
985}
986
987static void malformed1a(void)
988{
989 struct MsgBuf msgbuf;
990
991 memset(&msgbuf, 0, sizeof(msgbuf));
992 strcpy(tmp, "@=value PRIVMSG #test :test");
993
994 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
995 is_int(0, msgbuf.n_tags, MSG);
996
997 is_string("PRIVMSG", msgbuf.cmd, MSG);
998 if (is_int(3, msgbuf.n_para, MSG)) {
999 is_string("PRIVMSG", msgbuf.para[0], MSG);
1000 is_string("#test", msgbuf.para[1], MSG);
1001 is_string("test", msgbuf.para[2], MSG);
1002 }
1003 }
1004}
1005
1006static void malformed2a(void)
1007{
1008 struct MsgBuf msgbuf;
1009
1010 memset(&msgbuf, 0, sizeof(msgbuf));
1011 strcpy(tmp, "@= PRIVMSG #test :test");
1012
1013 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1014 is_int(0, msgbuf.n_tags, MSG);
1015
1016 is_string("PRIVMSG", msgbuf.cmd, MSG);
1017 if (is_int(3, msgbuf.n_para, MSG)) {
1018 is_string("PRIVMSG", msgbuf.para[0], MSG);
1019 is_string("#test", msgbuf.para[1], MSG);
1020 is_string("test", msgbuf.para[2], MSG);
1021 }
1022 }
1023}
1024
1025static void malformed1b(void)
1026{
1027 struct MsgBuf msgbuf;
1028
1029 memset(&msgbuf, 0, sizeof(msgbuf));
1030 strcpy(tmp, "@=value;tag2=value2 PRIVMSG #test :test");
1031
1032 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1033 if (is_int(1, msgbuf.n_tags, MSG)) {
1034 is_string("tag2", msgbuf.tags[0].key, MSG);
1035 is_string("value2", msgbuf.tags[0].value, MSG);
1036 }
1037
1038 is_string("PRIVMSG", msgbuf.cmd, MSG);
1039 if (is_int(3, msgbuf.n_para, MSG)) {
1040 is_string("PRIVMSG", msgbuf.para[0], MSG);
1041 is_string("#test", msgbuf.para[1], MSG);
1042 is_string("test", msgbuf.para[2], MSG);
1043 }
1044 }
1045}
1046
1047static void malformed2b(void)
1048{
1049 struct MsgBuf msgbuf;
1050
1051 memset(&msgbuf, 0, sizeof(msgbuf));
1052 strcpy(tmp, "@=;tag2=value2 PRIVMSG #test :test");
1053
1054 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1055 if (is_int(1, msgbuf.n_tags, MSG)) {
1056 is_string("tag2", msgbuf.tags[0].key, MSG);
1057 is_string("value2", msgbuf.tags[0].value, MSG);
1058 }
1059
1060 is_string("PRIVMSG", msgbuf.cmd, MSG);
1061 if (is_int(3, msgbuf.n_para, MSG)) {
1062 is_string("PRIVMSG", msgbuf.para[0], MSG);
1063 is_string("#test", msgbuf.para[1], MSG);
1064 is_string("test", msgbuf.para[2], MSG);
1065 }
1066 }
1067}
1068
1069static void malformed3(void)
1070{
1071 struct MsgBuf msgbuf;
1072
1073 memset(&msgbuf, 0, sizeof(msgbuf));
1074 strcpy(tmp, "@ta g=value PRIVMSG #test :test");
1075
1076 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1077 if (is_int(1, msgbuf.n_tags, MSG)) {
1078 is_string("ta", msgbuf.tags[0].key, MSG);
1079 is_string(NULL, msgbuf.tags[0].value, MSG);
1080 }
1081
1082 is_string("g=value", msgbuf.cmd, MSG);
1083 if (is_int(4, msgbuf.n_para, MSG)) {
1084 is_string("g=value", msgbuf.para[0], MSG);
1085 is_string("PRIVMSG", msgbuf.para[1], MSG);
1086 is_string("#test", msgbuf.para[2], MSG);
1087 is_string("test", msgbuf.para[3], MSG);
1088 }
1089 }
1090}
1091
1092static void malformed4(void)
1093{
1094 struct MsgBuf msgbuf;
1095
1096 memset(&msgbuf, 0, sizeof(msgbuf));
1097 strcpy(tmp, "@tag=va lue PRIVMSG #test :test");
1098
1099 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1100 if (is_int(1, msgbuf.n_tags, MSG)) {
1101 is_string("tag", msgbuf.tags[0].key, MSG);
1102 is_string("va", msgbuf.tags[0].value, MSG);
1103 }
1104
1105 is_string("lue", msgbuf.cmd, MSG);
1106 if (is_int(4, msgbuf.n_para, MSG)) {
1107 is_string("lue", msgbuf.para[0], MSG);
1108 is_string("PRIVMSG", msgbuf.para[1], MSG);
1109 is_string("#test", msgbuf.para[2], MSG);
1110 is_string("test", msgbuf.para[3], MSG);
1111 }
1112 }
1113}
1114
1115static void malformed5(void)
1116{
1117 struct MsgBuf msgbuf;
1118
1119 memset(&msgbuf, 0, sizeof(msgbuf));
1120 strcpy(tmp, "@ta g=va lue PRIVMSG #test :test");
1121
1122 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1123 if (is_int(1, msgbuf.n_tags, MSG)) {
1124 is_string("ta", msgbuf.tags[0].key, MSG);
1125 is_string(NULL, msgbuf.tags[0].value, MSG);
1126 }
1127
1128 is_string("g=va", msgbuf.cmd, MSG);
1129 if (is_int(5, msgbuf.n_para, MSG)) {
1130 is_string("g=va", msgbuf.para[0], MSG);
1131 is_string("lue", msgbuf.para[1], MSG);
1132 is_string("PRIVMSG", msgbuf.para[2], MSG);
1133 is_string("#test", msgbuf.para[3], MSG);
1134 is_string("test", msgbuf.para[4], MSG);
1135 }
1136 }
1137}
1138
1139static void malformed6(void)
1140{
1141 struct MsgBuf msgbuf;
1142
1143 memset(&msgbuf, 0, sizeof(msgbuf));
1144 strcpy(tmp, "@tag =value PRIVMSG #test :test");
1145
1146 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1147 if (is_int(1, msgbuf.n_tags, MSG)) {
1148 is_string("tag", msgbuf.tags[0].key, MSG);
1149 is_string(NULL, msgbuf.tags[0].value, MSG);
1150 }
1151
1152 is_string("=value", msgbuf.cmd, MSG);
1153 if (is_int(4, msgbuf.n_para, MSG)) {
1154 is_string("=value", msgbuf.para[0], MSG);
1155 is_string("PRIVMSG", msgbuf.para[1], MSG);
1156 is_string("#test", msgbuf.para[2], MSG);
1157 is_string("test", msgbuf.para[3], MSG);
1158 }
1159 }
1160}
1161
1162static void malformed7(void)
1163{
1164 struct MsgBuf msgbuf;
1165
1166 memset(&msgbuf, 0, sizeof(msgbuf));
1167 strcpy(tmp, "@tag= value PRIVMSG #test :test");
1168
1169 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1170 if (is_int(1, msgbuf.n_tags, MSG)) {
1171 is_string("tag", msgbuf.tags[0].key, MSG);
1172 is_string("", msgbuf.tags[0].value, MSG);
1173 }
1174
1175 is_string("value", msgbuf.cmd, MSG);
1176 if (is_int(4, msgbuf.n_para, MSG)) {
1177 is_string("value", msgbuf.para[0], MSG);
1178 is_string("PRIVMSG", msgbuf.para[1], MSG);
1179 is_string("#test", msgbuf.para[2], MSG);
1180 is_string("test", msgbuf.para[3], MSG);
1181 }
1182 }
1183}
1184
1185static void long_tag1(void)
1186{
1187 struct MsgBuf msgbuf;
1188
1189 memset(&msgbuf, 0, sizeof(msgbuf));
1190 strcpy(tmp, "@");
1191 strcat(tmp, MKTEXT(509));
1192 strcat(tmp, "= PRIVMSG #test :test");
1193
1194 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1195 if (is_int(1, msgbuf.n_tags, MSG)) {
1196 is_string(MKTEXT(509), msgbuf.tags[0].key, MSG);
1197 is_string("", msgbuf.tags[0].value, MSG);
1198 }
1199
1200 is_string("PRIVMSG", msgbuf.cmd, MSG);
1201 if (is_int(3, msgbuf.n_para, MSG)) {
1202 is_string("PRIVMSG", msgbuf.para[0], MSG);
1203 is_string("#test", msgbuf.para[1], MSG);
1204 is_string("test", msgbuf.para[2], MSG);
1205 }
1206 }
1207}
1208
1209static void long_tag2(void)
1210{
1211 struct MsgBuf msgbuf;
1212
1213 memset(&msgbuf, 0, sizeof(msgbuf));
1214 strcpy(tmp, "@");
1215 strcat(tmp, MKTEXT(510));
1216 strcat(tmp, " PRIVMSG #test :test");
1217
1218 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1219 if (is_int(1, msgbuf.n_tags, MSG)) {
1220 is_string(MKTEXT(510), msgbuf.tags[0].key, MSG);
1221 is_string(NULL, msgbuf.tags[0].value, MSG);
1222 }
1223
1224 is_string("PRIVMSG", msgbuf.cmd, MSG);
1225 if (is_int(3, msgbuf.n_para, MSG)) {
1226 is_string("PRIVMSG", msgbuf.para[0], MSG);
1227 is_string("#test", msgbuf.para[1], MSG);
1228 is_string("test", msgbuf.para[2], MSG);
1229 }
1230 }
1231}
1232
1233static void long_value1(void)
1234{
1235 struct MsgBuf msgbuf;
1236
1237 memset(&msgbuf, 0, sizeof(msgbuf));
1238 strcpy(tmp, "@");
1239 strcat(tmp, MKTEXT(1));
1240 strcat(tmp, "=");
1241 strcat(tmp, MKTEXT(508));
1242 strcat(tmp, " PRIVMSG #test :test");
1243
1244 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1245 if (is_int(1, msgbuf.n_tags, MSG)) {
1246 is_string(MKTEXT(1), msgbuf.tags[0].key, MSG);
1247 is_string(MKTEXT(508), msgbuf.tags[0].value, MSG);
1248 }
1249
1250 is_string("PRIVMSG", msgbuf.cmd, MSG);
1251 if (is_int(3, msgbuf.n_para, MSG)) {
1252 is_string("PRIVMSG", msgbuf.para[0], MSG);
1253 is_string("#test", msgbuf.para[1], MSG);
1254 is_string("test", msgbuf.para[2], MSG);
1255 }
1256 }
1257}
1258
1259static void too_long_tag1(void)
1260{
1261 struct MsgBuf msgbuf;
1262
1263 memset(&msgbuf, 0, sizeof(msgbuf));
1264 strcpy(tmp, "@");
1265 strcat(tmp, MKTEXT(510));
1266 is_int(511, strlen(tmp), MSG);
1267 /* the '=' will be replaced with a ' ' when parsing */
1268 strcat(tmp, "=PRIVMSG #test :test");
1269
1270 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1271 if (is_int(1, msgbuf.n_tags, MSG)) {
1272 is_string(MKTEXT(510), msgbuf.tags[0].key, MSG);
1273 is_string(NULL, msgbuf.tags[0].value, MSG);
1274 }
1275
1276 is_string("PRIVMSG", msgbuf.cmd, MSG);
1277 if (is_int(3, msgbuf.n_para, MSG)) {
1278 is_string("PRIVMSG", msgbuf.para[0], MSG);
1279 is_string("#test", msgbuf.para[1], MSG);
1280 is_string("test", msgbuf.para[2], MSG);
1281 }
1282 }
1283}
1284
1285static void too_long_tag2(void)
1286{
1287 struct MsgBuf msgbuf;
1288
1289 memset(&msgbuf, 0, sizeof(msgbuf));
1290 strcpy(tmp, "@");
1291 strcat(tmp, MKTEXT(511)); /* the last byte will be replaced with a ' ' when parsing */
1292 is_int(512, strlen(tmp), MSG);
1293 strcat(tmp, "PRIVMSG #test :test");
1294
1295 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1296 char tmp2[2048];
1297
1298 /* the tag will be truncated */
1299 strcpy(tmp2, MKTEXT(511));
1300 tmp2[strlen(tmp2) - 1] = 0;
1301
1302 if (is_int(1, msgbuf.n_tags, MSG)) {
1303 is_string(tmp2, msgbuf.tags[0].key, MSG);
1304 is_string(NULL, msgbuf.tags[0].value, MSG);
1305 }
1306
1307 is_string("PRIVMSG", msgbuf.cmd, MSG);
1308 if (is_int(3, msgbuf.n_para, MSG)) {
1309 is_string("PRIVMSG", msgbuf.para[0], MSG);
1310 is_string("#test", msgbuf.para[1], MSG);
1311 is_string("test", msgbuf.para[2], MSG);
1312 }
1313 }
1314}
1315
1316static void too_long_tag3(void)
1317{
1318 struct MsgBuf msgbuf;
1319
1320 memset(&msgbuf, 0, sizeof(msgbuf));
1321 strcpy(tmp, "@");
1322 strcat(tmp, MKTEXT(510));
1323 is_int(511, strlen(tmp), MSG);
1324 /* the ';' will be replaced with a ' ' when parsing */
1325 strcat(tmp, ";PRIVMSG #test :test");
1326
1327 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1328 if (is_int(1, msgbuf.n_tags, MSG)) {
1329 is_string(MKTEXT(510), msgbuf.tags[0].key, MSG);
1330 is_string(NULL, msgbuf.tags[0].value, MSG);
1331 }
1332
1333 is_string("PRIVMSG", msgbuf.cmd, MSG);
1334 if (is_int(3, msgbuf.n_para, MSG)) {
1335 is_string("PRIVMSG", msgbuf.para[0], MSG);
1336 is_string("#test", msgbuf.para[1], MSG);
1337 is_string("test", msgbuf.para[2], MSG);
1338 }
1339 }
1340}
1341
1342static void too_long_value1(void)
1343{
1344 struct MsgBuf msgbuf;
1345
1346 memset(&msgbuf, 0, sizeof(msgbuf));
1347 strcpy(tmp, "@");
1348 strcat(tmp, MKTEXT(1));
1349 strcat(tmp, "=");
1350 strcat(tmp, MKTEXT(508));
1351 is_int(511, strlen(tmp), MSG);
1352 /* the ';' will be replaced with a ' ' when parsing */
1353 strcat(tmp, ";PRIVMSG #test :test");
1354
1355 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1356 if (is_int(1, msgbuf.n_tags, MSG)) {
1357 is_string(MKTEXT(1), msgbuf.tags[0].key, MSG);
1358 is_string(MKTEXT(508), msgbuf.tags[0].value, MSG);
1359 }
1360
1361 is_string("PRIVMSG", msgbuf.cmd, MSG);
1362 if (is_int(3, msgbuf.n_para, MSG)) {
1363 is_string("PRIVMSG", msgbuf.para[0], MSG);
1364 is_string("#test", msgbuf.para[1], MSG);
1365 is_string("test", msgbuf.para[2], MSG);
1366 }
1367 }
1368}
1369
1370static void too_long_value2(void)
1371{
1372 struct MsgBuf msgbuf;
1373
1374 memset(&msgbuf, 0, sizeof(msgbuf));
1375 strcpy(tmp, "@");
1376 strcat(tmp, MKTEXT(1));
1377 strcat(tmp, "=");
1378 strcat(tmp, MKTEXT(509)); /* the last byte will be replaced with a ' ' when parsing */
1379 is_int(512, strlen(tmp), MSG);
1380 strcat(tmp, "PRIVMSG #test :test");
1381
1382 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1383 char tmp2[2048];
1384
1385 /* the value will be truncated */
1386 strcpy(tmp2, MKTEXT(509));
1387 tmp2[strlen(tmp2) - 1] = 0;
1388
1389 if (is_int(1, msgbuf.n_tags, MSG)) {
1390 is_string(MKTEXT(1), msgbuf.tags[0].key, MSG);
1391 is_string(tmp2, msgbuf.tags[0].value, MSG);
1392 }
1393
1394 is_string("PRIVMSG", msgbuf.cmd, MSG);
1395 if (is_int(3, msgbuf.n_para, MSG)) {
1396 is_string("PRIVMSG", msgbuf.para[0], MSG);
1397 is_string("#test", msgbuf.para[1], MSG);
1398 is_string("test", msgbuf.para[2], MSG);
1399 }
1400 }
1401}
1402
1403static void too_long_value3(void)
1404{
1405 struct MsgBuf msgbuf;
1406
1407 memset(&msgbuf, 0, sizeof(msgbuf));
1408 strcpy(tmp, "@");
1409 strcat(tmp, MKTEXT(1));
1410 strcat(tmp, "=");
1411 strcat(tmp, MKTEXT(510)); /* the second-last byte will be replaced with a ' ' when parsing */
1412 is_int(513, strlen(tmp), MSG);
1413 strcat(tmp, "PRIVMSG #test :test");
1414
1415 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1416 char tmp2[2048];
1417
1418 /* the value will be truncated */
1419 strcpy(tmp2, MKTEXT(510));
1420 tmp2[strlen(tmp2) - 2] = 0;
1421
1422 if (is_int(1, msgbuf.n_tags, MSG)) {
1423 is_string(MKTEXT(1), msgbuf.tags[0].key, MSG);
1424 is_string(tmp2, msgbuf.tags[0].value, MSG);
1425 }
1426
1427 is_string("ZPRIVMSG", msgbuf.cmd, MSG);
1428 if (is_int(3, msgbuf.n_para, MSG)) {
1429 is_string("ZPRIVMSG", msgbuf.para[0], MSG);
1430 is_string("#test", msgbuf.para[1], MSG);
1431 is_string("test", msgbuf.para[2], MSG);
1432 }
1433 }
1434}
1435
1436static void basic_para3a(void)
1437{
1438 struct MsgBuf msgbuf;
1439
1440 memset(&msgbuf, 0, sizeof(msgbuf));
1441 strcpy(tmp, "@tag=value PRIVMSG #test :");
1442
1443 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1444 if (is_int(1, msgbuf.n_tags, MSG)) {
1445 is_string("tag", msgbuf.tags[0].key, MSG);
1446 is_string("value", msgbuf.tags[0].value, MSG);
1447 }
1448
1449 is_string("PRIVMSG", msgbuf.cmd, MSG);
1450 if (is_int(3, msgbuf.n_para, MSG)) {
1451 is_string("PRIVMSG", msgbuf.para[0], MSG);
1452 is_string("#test", msgbuf.para[1], MSG);
1453 is_string("", msgbuf.para[2], MSG);
1454 }
1455 }
1456}
1457
1458static void basic_para3b(void)
1459{
1460 struct MsgBuf msgbuf;
1461
1462 memset(&msgbuf, 0, sizeof(msgbuf));
1463 strcpy(tmp, "@tag=value PRIVMSG #test :test D E F G H I J K");
1464
1465 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1466 if (is_int(1, msgbuf.n_tags, MSG)) {
1467 is_string("tag", msgbuf.tags[0].key, MSG);
1468 is_string("value", msgbuf.tags[0].value, MSG);
1469 }
1470
1471 is_string("PRIVMSG", msgbuf.cmd, MSG);
1472 if (is_int(3, msgbuf.n_para, MSG)) {
1473 is_string("PRIVMSG", msgbuf.para[0], MSG);
1474 is_string("#test", msgbuf.para[1], MSG);
1475 is_string("test D E F G H I J K", msgbuf.para[2], MSG);
1476 }
1477 }
1478}
1479
1480static void basic_para13(void)
1481{
1482 struct MsgBuf msgbuf;
1483
1484 memset(&msgbuf, 0, sizeof(msgbuf));
1485 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M");
1486
1487 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1488 if (is_int(1, msgbuf.n_tags, MSG)) {
1489 is_string("tag", msgbuf.tags[0].key, MSG);
1490 is_string("value", msgbuf.tags[0].value, MSG);
1491 }
1492
1493 is_string("PRIVMSG", msgbuf.cmd, MSG);
1494 if (is_int(13, msgbuf.n_para, MSG)) {
1495 is_string("PRIVMSG", msgbuf.para[0], MSG);
1496 is_string("#test", msgbuf.para[1], MSG);
1497 is_string("test", msgbuf.para[2], MSG);
1498 is_string("D", msgbuf.para[3], MSG);
1499 is_string("E", msgbuf.para[4], MSG);
1500 is_string("F", msgbuf.para[5], MSG);
1501 is_string("G", msgbuf.para[6], MSG);
1502 is_string("H", msgbuf.para[7], MSG);
1503 is_string("I", msgbuf.para[8], MSG);
1504 is_string("J", msgbuf.para[9], MSG);
1505 is_string("K", msgbuf.para[10], MSG);
1506 is_string("L", msgbuf.para[11], MSG);
1507 is_string("M", msgbuf.para[12], MSG);
1508 }
1509 }
1510}
1511
1512static void basic_para14a(void)
1513{
1514 struct MsgBuf msgbuf;
1515
1516 memset(&msgbuf, 0, sizeof(msgbuf));
1517 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N");
1518
1519 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1520 if (is_int(1, msgbuf.n_tags, MSG)) {
1521 is_string("tag", msgbuf.tags[0].key, MSG);
1522 is_string("value", msgbuf.tags[0].value, MSG);
1523 }
1524
1525 is_string("PRIVMSG", msgbuf.cmd, MSG);
1526 if (is_int(14, msgbuf.n_para, MSG)) {
1527 is_string("PRIVMSG", msgbuf.para[0], MSG);
1528 is_string("#test", msgbuf.para[1], MSG);
1529 is_string("test", msgbuf.para[2], MSG);
1530 is_string("D", msgbuf.para[3], MSG);
1531 is_string("E", msgbuf.para[4], MSG);
1532 is_string("F", msgbuf.para[5], MSG);
1533 is_string("G", msgbuf.para[6], MSG);
1534 is_string("H", msgbuf.para[7], MSG);
1535 is_string("I", msgbuf.para[8], MSG);
1536 is_string("J", msgbuf.para[9], MSG);
1537 is_string("K", msgbuf.para[10], MSG);
1538 is_string("L", msgbuf.para[11], MSG);
1539 is_string("M", msgbuf.para[12], MSG);
1540 is_string("N", msgbuf.para[13], MSG);
1541 }
1542 }
1543}
1544
1545static void basic_para14b(void)
1546{
1547 struct MsgBuf msgbuf;
1548
1549 memset(&msgbuf, 0, sizeof(msgbuf));
1550 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M :N");
1551
1552 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1553 if (is_int(1, msgbuf.n_tags, MSG)) {
1554 is_string("tag", msgbuf.tags[0].key, MSG);
1555 is_string("value", msgbuf.tags[0].value, MSG);
1556 }
1557
1558 is_string("PRIVMSG", msgbuf.cmd, MSG);
1559 if (is_int(14, msgbuf.n_para, MSG)) {
1560 is_string("PRIVMSG", msgbuf.para[0], MSG);
1561 is_string("#test", msgbuf.para[1], MSG);
1562 is_string("test", msgbuf.para[2], MSG);
1563 is_string("D", msgbuf.para[3], MSG);
1564 is_string("E", msgbuf.para[4], MSG);
1565 is_string("F", msgbuf.para[5], MSG);
1566 is_string("G", msgbuf.para[6], MSG);
1567 is_string("H", msgbuf.para[7], MSG);
1568 is_string("I", msgbuf.para[8], MSG);
1569 is_string("J", msgbuf.para[9], MSG);
1570 is_string("K", msgbuf.para[10], MSG);
1571 is_string("L", msgbuf.para[11], MSG);
1572 is_string("M", msgbuf.para[12], MSG);
1573 is_string("N", msgbuf.para[13], MSG);
1574 }
1575 }
1576}
1577
1578static void basic_para14c(void)
1579{
1580 struct MsgBuf msgbuf;
1581
1582 memset(&msgbuf, 0, sizeof(msgbuf));
1583 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M :N O P");
1584
1585 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1586 if (is_int(1, msgbuf.n_tags, MSG)) {
1587 is_string("tag", msgbuf.tags[0].key, MSG);
1588 is_string("value", msgbuf.tags[0].value, MSG);
1589 }
1590
1591 is_string("PRIVMSG", msgbuf.cmd, MSG);
1592 if (is_int(14, msgbuf.n_para, MSG)) {
1593 is_string("PRIVMSG", msgbuf.para[0], MSG);
1594 is_string("#test", msgbuf.para[1], MSG);
1595 is_string("test", msgbuf.para[2], MSG);
1596 is_string("D", msgbuf.para[3], MSG);
1597 is_string("E", msgbuf.para[4], MSG);
1598 is_string("F", msgbuf.para[5], MSG);
1599 is_string("G", msgbuf.para[6], MSG);
1600 is_string("H", msgbuf.para[7], MSG);
1601 is_string("I", msgbuf.para[8], MSG);
1602 is_string("J", msgbuf.para[9], MSG);
1603 is_string("K", msgbuf.para[10], MSG);
1604 is_string("L", msgbuf.para[11], MSG);
1605 is_string("M", msgbuf.para[12], MSG);
1606 is_string("N O P", msgbuf.para[13], MSG);
1607 }
1608 }
1609}
1610
1611static void basic_para15a(void)
1612{
1613 struct MsgBuf msgbuf;
1614
1615 memset(&msgbuf, 0, sizeof(msgbuf));
1616 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N O");
1617
1618 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1619 if (is_int(1, msgbuf.n_tags, MSG)) {
1620 is_string("tag", msgbuf.tags[0].key, MSG);
1621 is_string("value", msgbuf.tags[0].value, MSG);
1622 }
1623
1624 is_string("PRIVMSG", msgbuf.cmd, MSG);
1625 if (is_int(15, msgbuf.n_para, MSG)) {
1626 is_string("PRIVMSG", msgbuf.para[0], MSG);
1627 is_string("#test", msgbuf.para[1], MSG);
1628 is_string("test", msgbuf.para[2], MSG);
1629 is_string("D", msgbuf.para[3], MSG);
1630 is_string("E", msgbuf.para[4], MSG);
1631 is_string("F", msgbuf.para[5], MSG);
1632 is_string("G", msgbuf.para[6], MSG);
1633 is_string("H", msgbuf.para[7], MSG);
1634 is_string("I", msgbuf.para[8], MSG);
1635 is_string("J", msgbuf.para[9], MSG);
1636 is_string("K", msgbuf.para[10], MSG);
1637 is_string("L", msgbuf.para[11], MSG);
1638 is_string("M", msgbuf.para[12], MSG);
1639 is_string("N", msgbuf.para[13], MSG);
1640 is_string("O", msgbuf.para[14], MSG);
1641 }
1642 }
1643}
1644
1645static void basic_para15b(void)
1646{
1647 struct MsgBuf msgbuf;
1648
1649 memset(&msgbuf, 0, sizeof(msgbuf));
1650 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N :O");
1651
1652 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1653 if (is_int(1, msgbuf.n_tags, MSG)) {
1654 is_string("tag", msgbuf.tags[0].key, MSG);
1655 is_string("value", msgbuf.tags[0].value, MSG);
1656 }
1657
1658 is_string("PRIVMSG", msgbuf.cmd, MSG);
1659 if (is_int(15, msgbuf.n_para, MSG)) {
1660 is_string("PRIVMSG", msgbuf.para[0], MSG);
1661 is_string("#test", msgbuf.para[1], MSG);
1662 is_string("test", msgbuf.para[2], MSG);
1663 is_string("D", msgbuf.para[3], MSG);
1664 is_string("E", msgbuf.para[4], MSG);
1665 is_string("F", msgbuf.para[5], MSG);
1666 is_string("G", msgbuf.para[6], MSG);
1667 is_string("H", msgbuf.para[7], MSG);
1668 is_string("I", msgbuf.para[8], MSG);
1669 is_string("J", msgbuf.para[9], MSG);
1670 is_string("K", msgbuf.para[10], MSG);
1671 is_string("L", msgbuf.para[11], MSG);
1672 is_string("M", msgbuf.para[12], MSG);
1673 is_string("N", msgbuf.para[13], MSG);
1674 is_string("O", msgbuf.para[14], MSG);
1675 }
1676 }
1677}
1678
1679static void basic_para15c(void)
1680{
1681 struct MsgBuf msgbuf;
1682
1683 memset(&msgbuf, 0, sizeof(msgbuf));
1684 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N O ");
1685
1686 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1687 if (is_int(1, msgbuf.n_tags, MSG)) {
1688 is_string("tag", msgbuf.tags[0].key, MSG);
1689 is_string("value", msgbuf.tags[0].value, MSG);
1690 }
1691
1692 is_string("PRIVMSG", msgbuf.cmd, MSG);
1693 if (is_int(15, msgbuf.n_para, MSG)) {
1694 is_string("PRIVMSG", msgbuf.para[0], MSG);
1695 is_string("#test", msgbuf.para[1], MSG);
1696 is_string("test", msgbuf.para[2], MSG);
1697 is_string("D", msgbuf.para[3], MSG);
1698 is_string("E", msgbuf.para[4], MSG);
1699 is_string("F", msgbuf.para[5], MSG);
1700 is_string("G", msgbuf.para[6], MSG);
1701 is_string("H", msgbuf.para[7], MSG);
1702 is_string("I", msgbuf.para[8], MSG);
1703 is_string("J", msgbuf.para[9], MSG);
1704 is_string("K", msgbuf.para[10], MSG);
1705 is_string("L", msgbuf.para[11], MSG);
1706 is_string("M", msgbuf.para[12], MSG);
1707 is_string("N", msgbuf.para[13], MSG);
1708 is_string("O ", msgbuf.para[14], MSG);
1709 }
1710 }
1711}
1712
1713static void basic_para15d(void)
1714{
1715 struct MsgBuf msgbuf;
1716
1717 memset(&msgbuf, 0, sizeof(msgbuf));
1718 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N :O ");
1719
1720 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1721 if (is_int(1, msgbuf.n_tags, MSG)) {
1722 is_string("tag", msgbuf.tags[0].key, MSG);
1723 is_string("value", msgbuf.tags[0].value, MSG);
1724 }
1725
1726 is_string("PRIVMSG", msgbuf.cmd, MSG);
1727 if (is_int(15, msgbuf.n_para, MSG)) {
1728 is_string("PRIVMSG", msgbuf.para[0], MSG);
1729 is_string("#test", msgbuf.para[1], MSG);
1730 is_string("test", msgbuf.para[2], MSG);
1731 is_string("D", msgbuf.para[3], MSG);
1732 is_string("E", msgbuf.para[4], MSG);
1733 is_string("F", msgbuf.para[5], MSG);
1734 is_string("G", msgbuf.para[6], MSG);
1735 is_string("H", msgbuf.para[7], MSG);
1736 is_string("I", msgbuf.para[8], MSG);
1737 is_string("J", msgbuf.para[9], MSG);
1738 is_string("K", msgbuf.para[10], MSG);
1739 is_string("L", msgbuf.para[11], MSG);
1740 is_string("M", msgbuf.para[12], MSG);
1741 is_string("N", msgbuf.para[13], MSG);
1742 is_string("O ", msgbuf.para[14], MSG);
1743 }
1744 }
1745}
1746
1747static void basic_para16a(void)
1748{
1749 struct MsgBuf msgbuf;
1750
1751 memset(&msgbuf, 0, sizeof(msgbuf));
1752 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N O P");
1753
1754 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1755 if (is_int(1, msgbuf.n_tags, MSG)) {
1756 is_string("tag", msgbuf.tags[0].key, MSG);
1757 is_string("value", msgbuf.tags[0].value, MSG);
1758 }
1759
1760 is_string("PRIVMSG", msgbuf.cmd, MSG);
1761 if (is_int(15, msgbuf.n_para, MSG)) {
1762 is_string("PRIVMSG", msgbuf.para[0], MSG);
1763 is_string("#test", msgbuf.para[1], MSG);
1764 is_string("test", msgbuf.para[2], MSG);
1765 is_string("D", msgbuf.para[3], MSG);
1766 is_string("E", msgbuf.para[4], MSG);
1767 is_string("F", msgbuf.para[5], MSG);
1768 is_string("G", msgbuf.para[6], MSG);
1769 is_string("H", msgbuf.para[7], MSG);
1770 is_string("I", msgbuf.para[8], MSG);
1771 is_string("J", msgbuf.para[9], MSG);
1772 is_string("K", msgbuf.para[10], MSG);
1773 is_string("L", msgbuf.para[11], MSG);
1774 is_string("M", msgbuf.para[12], MSG);
1775 is_string("N", msgbuf.para[13], MSG);
1776 is_string("O P", msgbuf.para[14], MSG);
1777 }
1778 }
1779}
1780
1781static void basic_para16b(void)
1782{
1783 struct MsgBuf msgbuf;
1784
1785 memset(&msgbuf, 0, sizeof(msgbuf));
1786 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N O :P");
1787
1788 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1789 if (is_int(1, msgbuf.n_tags, MSG)) {
1790 is_string("tag", msgbuf.tags[0].key, MSG);
1791 is_string("value", msgbuf.tags[0].value, MSG);
1792 }
1793
1794 is_string("PRIVMSG", msgbuf.cmd, MSG);
1795 if (is_int(15, msgbuf.n_para, MSG)) {
1796 is_string("PRIVMSG", msgbuf.para[0], MSG);
1797 is_string("#test", msgbuf.para[1], MSG);
1798 is_string("test", msgbuf.para[2], MSG);
1799 is_string("D", msgbuf.para[3], MSG);
1800 is_string("E", msgbuf.para[4], MSG);
1801 is_string("F", msgbuf.para[5], MSG);
1802 is_string("G", msgbuf.para[6], MSG);
1803 is_string("H", msgbuf.para[7], MSG);
1804 is_string("I", msgbuf.para[8], MSG);
1805 is_string("J", msgbuf.para[9], MSG);
1806 is_string("K", msgbuf.para[10], MSG);
1807 is_string("L", msgbuf.para[11], MSG);
1808 is_string("M", msgbuf.para[12], MSG);
1809 is_string("N", msgbuf.para[13], MSG);
1810 is_string("O :P", msgbuf.para[14], MSG);
1811 }
1812 }
1813}
1814
1815static void basic_para16c(void)
1816{
1817 struct MsgBuf msgbuf;
1818
1819 memset(&msgbuf, 0, sizeof(msgbuf));
1820 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N :O P");
1821
1822 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1823 if (is_int(1, msgbuf.n_tags, MSG)) {
1824 is_string("tag", msgbuf.tags[0].key, MSG);
1825 is_string("value", msgbuf.tags[0].value, MSG);
1826 }
1827
1828 is_string("PRIVMSG", msgbuf.cmd, MSG);
1829 if (is_int(15, msgbuf.n_para, MSG)) {
1830 is_string("PRIVMSG", msgbuf.para[0], MSG);
1831 is_string("#test", msgbuf.para[1], MSG);
1832 is_string("test", msgbuf.para[2], MSG);
1833 is_string("D", msgbuf.para[3], MSG);
1834 is_string("E", msgbuf.para[4], MSG);
1835 is_string("F", msgbuf.para[5], MSG);
1836 is_string("G", msgbuf.para[6], MSG);
1837 is_string("H", msgbuf.para[7], MSG);
1838 is_string("I", msgbuf.para[8], MSG);
1839 is_string("J", msgbuf.para[9], MSG);
1840 is_string("K", msgbuf.para[10], MSG);
1841 is_string("L", msgbuf.para[11], MSG);
1842 is_string("M", msgbuf.para[12], MSG);
1843 is_string("N", msgbuf.para[13], MSG);
1844 is_string("O P", msgbuf.para[14], MSG);
1845 }
1846 }
1847}
1848
1849static void basic_para17a(void)
1850{
1851 struct MsgBuf msgbuf;
1852
1853 memset(&msgbuf, 0, sizeof(msgbuf));
1854 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N O P Q");
1855
1856 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1857 if (is_int(1, msgbuf.n_tags, MSG)) {
1858 is_string("tag", msgbuf.tags[0].key, MSG);
1859 is_string("value", msgbuf.tags[0].value, MSG);
1860 }
1861
1862 is_string("PRIVMSG", msgbuf.cmd, MSG);
1863 if (is_int(15, msgbuf.n_para, MSG)) {
1864 is_string("PRIVMSG", msgbuf.para[0], MSG);
1865 is_string("#test", msgbuf.para[1], MSG);
1866 is_string("test", msgbuf.para[2], MSG);
1867 is_string("D", msgbuf.para[3], MSG);
1868 is_string("E", msgbuf.para[4], MSG);
1869 is_string("F", msgbuf.para[5], MSG);
1870 is_string("G", msgbuf.para[6], MSG);
1871 is_string("H", msgbuf.para[7], MSG);
1872 is_string("I", msgbuf.para[8], MSG);
1873 is_string("J", msgbuf.para[9], MSG);
1874 is_string("K", msgbuf.para[10], MSG);
1875 is_string("L", msgbuf.para[11], MSG);
1876 is_string("M", msgbuf.para[12], MSG);
1877 is_string("N", msgbuf.para[13], MSG);
1878 is_string("O P Q", msgbuf.para[14], MSG);
1879 }
1880 }
1881}
1882
1883static void basic_para17b(void)
1884{
1885 struct MsgBuf msgbuf;
1886
1887 memset(&msgbuf, 0, sizeof(msgbuf));
1888 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N O P :Q");
1889
1890 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1891 if (is_int(1, msgbuf.n_tags, MSG)) {
1892 is_string("tag", msgbuf.tags[0].key, MSG);
1893 is_string("value", msgbuf.tags[0].value, MSG);
1894 }
1895
1896 is_string("PRIVMSG", msgbuf.cmd, MSG);
1897 if (is_int(15, msgbuf.n_para, MSG)) {
1898 is_string("PRIVMSG", msgbuf.para[0], MSG);
1899 is_string("#test", msgbuf.para[1], MSG);
1900 is_string("test", msgbuf.para[2], MSG);
1901 is_string("D", msgbuf.para[3], MSG);
1902 is_string("E", msgbuf.para[4], MSG);
1903 is_string("F", msgbuf.para[5], MSG);
1904 is_string("G", msgbuf.para[6], MSG);
1905 is_string("H", msgbuf.para[7], MSG);
1906 is_string("I", msgbuf.para[8], MSG);
1907 is_string("J", msgbuf.para[9], MSG);
1908 is_string("K", msgbuf.para[10], MSG);
1909 is_string("L", msgbuf.para[11], MSG);
1910 is_string("M", msgbuf.para[12], MSG);
1911 is_string("N", msgbuf.para[13], MSG);
1912 is_string("O P :Q", msgbuf.para[14], MSG);
1913 }
1914 }
1915}
1916
1917static void basic_para17c(void)
1918{
1919 struct MsgBuf msgbuf;
1920
1921 memset(&msgbuf, 0, sizeof(msgbuf));
1922 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N O :P Q");
1923
1924 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1925 if (is_int(1, msgbuf.n_tags, MSG)) {
1926 is_string("tag", msgbuf.tags[0].key, MSG);
1927 is_string("value", msgbuf.tags[0].value, MSG);
1928 }
1929
1930 is_string("PRIVMSG", msgbuf.cmd, MSG);
1931 if (is_int(15, msgbuf.n_para, MSG)) {
1932 is_string("PRIVMSG", msgbuf.para[0], MSG);
1933 is_string("#test", msgbuf.para[1], MSG);
1934 is_string("test", msgbuf.para[2], MSG);
1935 is_string("D", msgbuf.para[3], MSG);
1936 is_string("E", msgbuf.para[4], MSG);
1937 is_string("F", msgbuf.para[5], MSG);
1938 is_string("G", msgbuf.para[6], MSG);
1939 is_string("H", msgbuf.para[7], MSG);
1940 is_string("I", msgbuf.para[8], MSG);
1941 is_string("J", msgbuf.para[9], MSG);
1942 is_string("K", msgbuf.para[10], MSG);
1943 is_string("L", msgbuf.para[11], MSG);
1944 is_string("M", msgbuf.para[12], MSG);
1945 is_string("N", msgbuf.para[13], MSG);
1946 is_string("O :P Q", msgbuf.para[14], MSG);
1947 }
1948 }
1949}
1950
1951static void basic_para17d(void)
1952{
1953 struct MsgBuf msgbuf;
1954
1955 memset(&msgbuf, 0, sizeof(msgbuf));
1956 strcpy(tmp, "@tag=value PRIVMSG #test test D E F G H I J K L M N :O P Q");
1957
1958 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1959 if (is_int(1, msgbuf.n_tags, MSG)) {
1960 is_string("tag", msgbuf.tags[0].key, MSG);
1961 is_string("value", msgbuf.tags[0].value, MSG);
1962 }
1963
1964 is_string("PRIVMSG", msgbuf.cmd, MSG);
1965 if (is_int(15, msgbuf.n_para, MSG)) {
1966 is_string("PRIVMSG", msgbuf.para[0], MSG);
1967 is_string("#test", msgbuf.para[1], MSG);
1968 is_string("test", msgbuf.para[2], MSG);
1969 is_string("D", msgbuf.para[3], MSG);
1970 is_string("E", msgbuf.para[4], MSG);
1971 is_string("F", msgbuf.para[5], MSG);
1972 is_string("G", msgbuf.para[6], MSG);
1973 is_string("H", msgbuf.para[7], MSG);
1974 is_string("I", msgbuf.para[8], MSG);
1975 is_string("J", msgbuf.para[9], MSG);
1976 is_string("K", msgbuf.para[10], MSG);
1977 is_string("L", msgbuf.para[11], MSG);
1978 is_string("M", msgbuf.para[12], MSG);
1979 is_string("N", msgbuf.para[13], MSG);
1980 is_string("O P Q", msgbuf.para[14], MSG);
1981 }
1982 }
1983}
1984
1985static void long_para1(void)
1986{
1987 struct MsgBuf msgbuf;
1988
1989 memset(&msgbuf, 0, sizeof(msgbuf));
1990 strcpy(tmp, "@tag=value PRIVMSG #test ");
1991 strcat(tmp, MKTEXT(496));
1992 is_int(510, strlen(strchr(tmp, ' ')+1), MSG);
1993
1994 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
1995 if (is_int(1, msgbuf.n_tags, MSG)) {
1996 is_string("tag", msgbuf.tags[0].key, MSG);
1997 is_string("value", msgbuf.tags[0].value, MSG);
1998 }
1999
2000 is_string("PRIVMSG", msgbuf.cmd, MSG);
2001 if (is_int(3, msgbuf.n_para, MSG)) {
2002 is_string("PRIVMSG", msgbuf.para[0], MSG);
2003 is_string("#test", msgbuf.para[1], MSG);
2004 is_string(MKTEXT(496), msgbuf.para[2], MSG);
2005 }
2006 }
2007}
2008
2009static void long_para2(void)
2010{
2011 struct MsgBuf msgbuf;
2012
2013 memset(&msgbuf, 0, sizeof(msgbuf));
2014 strcpy(tmp, "@tag=value PRIVMSG #test ");
2015 strcat(tmp, MKTEXT(494));
2016 strcat(tmp, " :");
2017 is_int(510, strlen(strchr(tmp, ' ')+1), MSG);
2018
2019 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2020 if (is_int(1, msgbuf.n_tags, MSG)) {
2021 is_string("tag", msgbuf.tags[0].key, MSG);
2022 is_string("value", msgbuf.tags[0].value, MSG);
2023 }
2024
2025 is_string("PRIVMSG", msgbuf.cmd, MSG);
2026 if (is_int(4, msgbuf.n_para, MSG)) {
2027 is_string("PRIVMSG", msgbuf.para[0], MSG);
2028 is_string("#test", msgbuf.para[1], MSG);
2029 is_string(MKTEXT(494), msgbuf.para[2], MSG);
2030 is_string("", msgbuf.para[3], MSG);
2031 }
2032 }
2033}
2034
2035static void long_para3(void)
2036{
2037 struct MsgBuf msgbuf;
2038
2039 memset(&msgbuf, 0, sizeof(msgbuf));
2040 strcpy(tmp, "@tag=value PRIVMSG #test ");
2041 strcat(tmp, MKTEXT(495));
2042 strcat(tmp, " ");
2043 is_int(510, strlen(strchr(tmp, ' ')+1), MSG);
2044
2045 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2046 if (is_int(1, msgbuf.n_tags, MSG)) {
2047 is_string("tag", msgbuf.tags[0].key, MSG);
2048 is_string("value", msgbuf.tags[0].value, MSG);
2049 }
2050
2051 is_string("PRIVMSG", msgbuf.cmd, MSG);
2052 if (is_int(3, msgbuf.n_para, MSG)) {
2053 is_string("PRIVMSG", msgbuf.para[0], MSG);
2054 is_string("#test", msgbuf.para[1], MSG);
2055 is_string(MKTEXT(495), msgbuf.para[2], MSG);
2056 }
2057 }
2058}
2059
2060static void long_para4(void)
2061{
2062 struct MsgBuf msgbuf;
2063
2064 memset(&msgbuf, 0, sizeof(msgbuf));
2065 strcpy(tmp, "@tag=value PRIVMSG #test ");
2066 strcat(tmp, MKTEXT(493));
2067 strcat(tmp, " :x");
2068 is_int(510, strlen(strchr(tmp, ' ')+1), MSG);
2069
2070 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2071 if (is_int(1, msgbuf.n_tags, MSG)) {
2072 is_string("tag", msgbuf.tags[0].key, MSG);
2073 is_string("value", msgbuf.tags[0].value, MSG);
2074 }
2075
2076 is_string("PRIVMSG", msgbuf.cmd, MSG);
2077 if (is_int(4, msgbuf.n_para, MSG)) {
2078 is_string("PRIVMSG", msgbuf.para[0], MSG);
2079 is_string("#test", msgbuf.para[1], MSG);
2080 is_string(MKTEXT(493), msgbuf.para[2], MSG);
2081 is_string("x", msgbuf.para[3], MSG);
2082 }
2083 }
2084}
2085
2086static void too_long_para1(void)
2087{
2088 struct MsgBuf msgbuf;
2089
2090 memset(&msgbuf, 0, sizeof(msgbuf));
2091 strcpy(tmp, "@tag=value PRIVMSG #test :");
2092 strcat(tmp, MKTEXT(496));
2093 is_int(511, strlen(strchr(tmp, ' ')+1), MSG);
2094
2095 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2096 char tmp2[2048];
2097
2098 /* the text will be truncated */
2099 strcpy(tmp2, MKTEXT(496));
2100 tmp2[strlen(tmp2) - 1] = 0;
2101
2102 if (is_int(1, msgbuf.n_tags, MSG)) {
2103 is_string("tag", msgbuf.tags[0].key, MSG);
2104 is_string("value", msgbuf.tags[0].value, MSG);
2105 }
2106
2107 is_string("PRIVMSG", msgbuf.cmd, MSG);
2108 if (is_int(3, msgbuf.n_para, MSG)) {
2109 is_string("PRIVMSG", msgbuf.para[0], MSG);
2110 is_string("#test", msgbuf.para[1], MSG);
2111 is_string(tmp2, msgbuf.para[2], MSG);
2112 }
2113 }
2114}
2115
2116static void too_long_para2(void)
2117{
2118 struct MsgBuf msgbuf;
2119
2120 memset(&msgbuf, 0, sizeof(msgbuf));
2121 strcpy(tmp, "@tag=value PRIVMSG #test :");
2122 strcat(tmp, MKTEXT(497));
2123 is_int(512, strlen(strchr(tmp, ' ')+1), MSG);
2124
2125 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2126 char tmp2[2048];
2127
2128 /* the text will be truncated */
2129 strcpy(tmp2, MKTEXT(497));
2130 tmp2[strlen(tmp2) - 2] = 0;
2131
2132 if (is_int(1, msgbuf.n_tags, MSG)) {
2133 is_string("tag", msgbuf.tags[0].key, MSG);
2134 is_string("value", msgbuf.tags[0].value, MSG);
2135 }
2136
2137 is_string("PRIVMSG", msgbuf.cmd, MSG);
2138 if (is_int(3, msgbuf.n_para, MSG)) {
2139 is_string("PRIVMSG", msgbuf.para[0], MSG);
2140 is_string("#test", msgbuf.para[1], MSG);
2141 is_string(tmp2, msgbuf.para[2], MSG);
2142 }
2143 }
2144}
2145
2146static void long_everything1(void)
2147{
2148 struct MsgBuf msgbuf;
2149
2150 memset(&msgbuf, 0, sizeof(msgbuf));
2151 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2152 strcat(tmp, MKTEXT(328));
2153 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K L ");
2154 strcat(tmp, MKTEXT(472));
2155 is_int(512+510, strlen(tmp), MSG);
2156
2157 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2158 if (is_int(15, msgbuf.n_tags, MSG)) {
2159 is_string("tag0", msgbuf.tags[0].key, MSG);
2160 is_string("value0", msgbuf.tags[0].value, MSG);
2161
2162 is_string("tag1", msgbuf.tags[1].key, MSG);
2163 is_string("value1", msgbuf.tags[1].value, MSG);
2164
2165 is_string("tag2", msgbuf.tags[2].key, MSG);
2166 is_string("value2", msgbuf.tags[2].value, MSG);
2167
2168 is_string("tag3", msgbuf.tags[3].key, MSG);
2169 is_string("value3", msgbuf.tags[3].value, MSG);
2170
2171 is_string("tag4", msgbuf.tags[4].key, MSG);
2172 is_string("value4", msgbuf.tags[4].value, MSG);
2173
2174 is_string("tag5", msgbuf.tags[5].key, MSG);
2175 is_string("value5", msgbuf.tags[5].value, MSG);
2176
2177 is_string("tag6", msgbuf.tags[6].key, MSG);
2178 is_string("value6", msgbuf.tags[6].value, MSG);
2179
2180 is_string("tag7", msgbuf.tags[7].key, MSG);
2181 is_string("value7", msgbuf.tags[7].value, MSG);
2182
2183 is_string("tag8", msgbuf.tags[8].key, MSG);
2184 is_string("value8", msgbuf.tags[8].value, MSG);
2185
2186 is_string("tag9", msgbuf.tags[9].key, MSG);
2187 is_string("value9", msgbuf.tags[9].value, MSG);
2188
2189 is_string("tag10", msgbuf.tags[10].key, MSG);
2190 is_string("value10", msgbuf.tags[10].value, MSG);
2191
2192 is_string("tag11", msgbuf.tags[11].key, MSG);
2193 is_string("value11", msgbuf.tags[11].value, MSG);
2194
2195 is_string("tag12", msgbuf.tags[12].key, MSG);
2196 is_string("value12", msgbuf.tags[12].value, MSG);
2197
2198 is_string("tag13", msgbuf.tags[13].key, MSG);
2199 is_string("value13", msgbuf.tags[13].value, MSG);
2200
2201 is_string("tag14", msgbuf.tags[14].key, MSG);
2202 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2203 }
2204
2205 is_string("PRIVMSG", msgbuf.cmd, MSG);
2206 if (is_int(15, msgbuf.n_para, MSG)) {
2207 is_string("PRIVMSG", msgbuf.para[0], MSG);
2208 is_string("#test", msgbuf.para[1], MSG);
2209 is_string("A", msgbuf.para[2], MSG);
2210 is_string("B", msgbuf.para[3], MSG);
2211 is_string("C", msgbuf.para[4], MSG);
2212 is_string("D", msgbuf.para[5], MSG);
2213 is_string("E", msgbuf.para[6], MSG);
2214 is_string("F", msgbuf.para[7], MSG);
2215 is_string("G", msgbuf.para[8], MSG);
2216 is_string("H", msgbuf.para[9], MSG);
2217 is_string("I", msgbuf.para[10], MSG);
2218 is_string("J", msgbuf.para[11], MSG);
2219 is_string("K", msgbuf.para[12], MSG);
2220 is_string("L", msgbuf.para[13], MSG);
2221 is_string(MKTEXT(472), msgbuf.para[14], MSG);
2222 }
2223 }
2224}
2225
2226static void too_long_everything1(void)
2227{
2228 struct MsgBuf msgbuf;
2229
2230 memset(&msgbuf, 0, sizeof(msgbuf));
2231 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2232 strcat(tmp, MKTEXT(328));
2233 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K L ");
2234 strcat(tmp, MKTEXT(472));
2235 strcat(tmp, "X");
2236 is_int(512+511, strlen(tmp), MSG);
2237
2238 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2239 if (is_int(15, msgbuf.n_tags, MSG)) {
2240 is_string("tag0", msgbuf.tags[0].key, MSG);
2241 is_string("value0", msgbuf.tags[0].value, MSG);
2242
2243 is_string("tag1", msgbuf.tags[1].key, MSG);
2244 is_string("value1", msgbuf.tags[1].value, MSG);
2245
2246 is_string("tag2", msgbuf.tags[2].key, MSG);
2247 is_string("value2", msgbuf.tags[2].value, MSG);
2248
2249 is_string("tag3", msgbuf.tags[3].key, MSG);
2250 is_string("value3", msgbuf.tags[3].value, MSG);
2251
2252 is_string("tag4", msgbuf.tags[4].key, MSG);
2253 is_string("value4", msgbuf.tags[4].value, MSG);
2254
2255 is_string("tag5", msgbuf.tags[5].key, MSG);
2256 is_string("value5", msgbuf.tags[5].value, MSG);
2257
2258 is_string("tag6", msgbuf.tags[6].key, MSG);
2259 is_string("value6", msgbuf.tags[6].value, MSG);
2260
2261 is_string("tag7", msgbuf.tags[7].key, MSG);
2262 is_string("value7", msgbuf.tags[7].value, MSG);
2263
2264 is_string("tag8", msgbuf.tags[8].key, MSG);
2265 is_string("value8", msgbuf.tags[8].value, MSG);
2266
2267 is_string("tag9", msgbuf.tags[9].key, MSG);
2268 is_string("value9", msgbuf.tags[9].value, MSG);
2269
2270 is_string("tag10", msgbuf.tags[10].key, MSG);
2271 is_string("value10", msgbuf.tags[10].value, MSG);
2272
2273 is_string("tag11", msgbuf.tags[11].key, MSG);
2274 is_string("value11", msgbuf.tags[11].value, MSG);
2275
2276 is_string("tag12", msgbuf.tags[12].key, MSG);
2277 is_string("value12", msgbuf.tags[12].value, MSG);
2278
2279 is_string("tag13", msgbuf.tags[13].key, MSG);
2280 is_string("value13", msgbuf.tags[13].value, MSG);
2281
2282 is_string("tag14", msgbuf.tags[14].key, MSG);
2283 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2284 }
2285
2286 is_string("PRIVMSG", msgbuf.cmd, MSG);
2287 if (is_int(15, msgbuf.n_para, MSG)) {
2288 is_string("PRIVMSG", msgbuf.para[0], MSG);
2289 is_string("#test", msgbuf.para[1], MSG);
2290 is_string("A", msgbuf.para[2], MSG);
2291 is_string("B", msgbuf.para[3], MSG);
2292 is_string("C", msgbuf.para[4], MSG);
2293 is_string("D", msgbuf.para[5], MSG);
2294 is_string("E", msgbuf.para[6], MSG);
2295 is_string("F", msgbuf.para[7], MSG);
2296 is_string("G", msgbuf.para[8], MSG);
2297 is_string("H", msgbuf.para[9], MSG);
2298 is_string("I", msgbuf.para[10], MSG);
2299 is_string("J", msgbuf.para[11], MSG);
2300 is_string("K", msgbuf.para[12], MSG);
2301 is_string("L", msgbuf.para[13], MSG);
2302 is_string(MKTEXT(472), msgbuf.para[14], MSG);
2303 }
2304 }
2305}
2306
2307static void long_everything2(void)
2308{
2309 struct MsgBuf msgbuf;
2310
2311 memset(&msgbuf, 0, sizeof(msgbuf));
2312 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2313 strcat(tmp, MKTEXT(328));
2314 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K ");
2315 strcat(tmp, MKTEXT(472));
2316 strcat(tmp, " :");
2317 is_int(512+510, strlen(tmp), MSG);
2318
2319 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2320 if (is_int(15, msgbuf.n_tags, MSG)) {
2321 is_string("tag0", msgbuf.tags[0].key, MSG);
2322 is_string("value0", msgbuf.tags[0].value, MSG);
2323
2324 is_string("tag1", msgbuf.tags[1].key, MSG);
2325 is_string("value1", msgbuf.tags[1].value, MSG);
2326
2327 is_string("tag2", msgbuf.tags[2].key, MSG);
2328 is_string("value2", msgbuf.tags[2].value, MSG);
2329
2330 is_string("tag3", msgbuf.tags[3].key, MSG);
2331 is_string("value3", msgbuf.tags[3].value, MSG);
2332
2333 is_string("tag4", msgbuf.tags[4].key, MSG);
2334 is_string("value4", msgbuf.tags[4].value, MSG);
2335
2336 is_string("tag5", msgbuf.tags[5].key, MSG);
2337 is_string("value5", msgbuf.tags[5].value, MSG);
2338
2339 is_string("tag6", msgbuf.tags[6].key, MSG);
2340 is_string("value6", msgbuf.tags[6].value, MSG);
2341
2342 is_string("tag7", msgbuf.tags[7].key, MSG);
2343 is_string("value7", msgbuf.tags[7].value, MSG);
2344
2345 is_string("tag8", msgbuf.tags[8].key, MSG);
2346 is_string("value8", msgbuf.tags[8].value, MSG);
2347
2348 is_string("tag9", msgbuf.tags[9].key, MSG);
2349 is_string("value9", msgbuf.tags[9].value, MSG);
2350
2351 is_string("tag10", msgbuf.tags[10].key, MSG);
2352 is_string("value10", msgbuf.tags[10].value, MSG);
2353
2354 is_string("tag11", msgbuf.tags[11].key, MSG);
2355 is_string("value11", msgbuf.tags[11].value, MSG);
2356
2357 is_string("tag12", msgbuf.tags[12].key, MSG);
2358 is_string("value12", msgbuf.tags[12].value, MSG);
2359
2360 is_string("tag13", msgbuf.tags[13].key, MSG);
2361 is_string("value13", msgbuf.tags[13].value, MSG);
2362
2363 is_string("tag14", msgbuf.tags[14].key, MSG);
2364 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2365 }
2366
2367 is_string("PRIVMSG", msgbuf.cmd, MSG);
2368 if (is_int(15, msgbuf.n_para, MSG)) {
2369 is_string("PRIVMSG", msgbuf.para[0], MSG);
2370 is_string("#test", msgbuf.para[1], MSG);
2371 is_string("A", msgbuf.para[2], MSG);
2372 is_string("B", msgbuf.para[3], MSG);
2373 is_string("C", msgbuf.para[4], MSG);
2374 is_string("D", msgbuf.para[5], MSG);
2375 is_string("E", msgbuf.para[6], MSG);
2376 is_string("F", msgbuf.para[7], MSG);
2377 is_string("G", msgbuf.para[8], MSG);
2378 is_string("H", msgbuf.para[9], MSG);
2379 is_string("I", msgbuf.para[10], MSG);
2380 is_string("J", msgbuf.para[11], MSG);
2381 is_string("K", msgbuf.para[12], MSG);
2382 is_string(MKTEXT(472), msgbuf.para[13], MSG);
2383 is_string("", msgbuf.para[14], MSG);
2384 }
2385 }
2386}
2387
2388static void too_long_everything2(void)
2389{
2390 struct MsgBuf msgbuf;
2391
2392 memset(&msgbuf, 0, sizeof(msgbuf));
2393 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2394 strcat(tmp, MKTEXT(328));
2395 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K ");
2396 strcat(tmp, MKTEXT(472));
2397 strcat(tmp, " :");
2398 strcat(tmp, "X");
2399 is_int(512+511, strlen(tmp), MSG);
2400
2401 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2402 if (is_int(15, msgbuf.n_tags, MSG)) {
2403 is_string("tag0", msgbuf.tags[0].key, MSG);
2404 is_string("value0", msgbuf.tags[0].value, MSG);
2405
2406 is_string("tag1", msgbuf.tags[1].key, MSG);
2407 is_string("value1", msgbuf.tags[1].value, MSG);
2408
2409 is_string("tag2", msgbuf.tags[2].key, MSG);
2410 is_string("value2", msgbuf.tags[2].value, MSG);
2411
2412 is_string("tag3", msgbuf.tags[3].key, MSG);
2413 is_string("value3", msgbuf.tags[3].value, MSG);
2414
2415 is_string("tag4", msgbuf.tags[4].key, MSG);
2416 is_string("value4", msgbuf.tags[4].value, MSG);
2417
2418 is_string("tag5", msgbuf.tags[5].key, MSG);
2419 is_string("value5", msgbuf.tags[5].value, MSG);
2420
2421 is_string("tag6", msgbuf.tags[6].key, MSG);
2422 is_string("value6", msgbuf.tags[6].value, MSG);
2423
2424 is_string("tag7", msgbuf.tags[7].key, MSG);
2425 is_string("value7", msgbuf.tags[7].value, MSG);
2426
2427 is_string("tag8", msgbuf.tags[8].key, MSG);
2428 is_string("value8", msgbuf.tags[8].value, MSG);
2429
2430 is_string("tag9", msgbuf.tags[9].key, MSG);
2431 is_string("value9", msgbuf.tags[9].value, MSG);
2432
2433 is_string("tag10", msgbuf.tags[10].key, MSG);
2434 is_string("value10", msgbuf.tags[10].value, MSG);
2435
2436 is_string("tag11", msgbuf.tags[11].key, MSG);
2437 is_string("value11", msgbuf.tags[11].value, MSG);
2438
2439 is_string("tag12", msgbuf.tags[12].key, MSG);
2440 is_string("value12", msgbuf.tags[12].value, MSG);
2441
2442 is_string("tag13", msgbuf.tags[13].key, MSG);
2443 is_string("value13", msgbuf.tags[13].value, MSG);
2444
2445 is_string("tag14", msgbuf.tags[14].key, MSG);
2446 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2447 }
2448
2449 is_string("PRIVMSG", msgbuf.cmd, MSG);
2450 if (is_int(15, msgbuf.n_para, MSG)) {
2451 is_string("PRIVMSG", msgbuf.para[0], MSG);
2452 is_string("#test", msgbuf.para[1], MSG);
2453 is_string("A", msgbuf.para[2], MSG);
2454 is_string("B", msgbuf.para[3], MSG);
2455 is_string("C", msgbuf.para[4], MSG);
2456 is_string("D", msgbuf.para[5], MSG);
2457 is_string("E", msgbuf.para[6], MSG);
2458 is_string("F", msgbuf.para[7], MSG);
2459 is_string("G", msgbuf.para[8], MSG);
2460 is_string("H", msgbuf.para[9], MSG);
2461 is_string("I", msgbuf.para[10], MSG);
2462 is_string("J", msgbuf.para[11], MSG);
2463 is_string("K", msgbuf.para[12], MSG);
2464 is_string(MKTEXT(472), msgbuf.para[13], MSG);
2465 is_string("", msgbuf.para[14], MSG);
2466 }
2467 }
2468}
2469
2470static void long_everything3a(void)
2471{
2472 struct MsgBuf msgbuf;
2473
2474 memset(&msgbuf, 0, sizeof(msgbuf));
2475 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2476 strcat(tmp, MKTEXT(328));
2477 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K L ");
2478 strcat(tmp, MKTEXT(471));
2479 strcat(tmp, " ");
2480 is_int(512+510, strlen(tmp), MSG);
2481
2482 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2483 char tmp2[2048];
2484
2485 /* last para has a space at the end */
2486 memset(tmp2, 0, sizeof(tmp2));
2487 strcat(tmp2, MKTEXT(471));
2488 strcat(tmp2, " ");
2489
2490 if (is_int(15, msgbuf.n_tags, MSG)) {
2491 is_string("tag0", msgbuf.tags[0].key, MSG);
2492 is_string("value0", msgbuf.tags[0].value, MSG);
2493
2494 is_string("tag1", msgbuf.tags[1].key, MSG);
2495 is_string("value1", msgbuf.tags[1].value, MSG);
2496
2497 is_string("tag2", msgbuf.tags[2].key, MSG);
2498 is_string("value2", msgbuf.tags[2].value, MSG);
2499
2500 is_string("tag3", msgbuf.tags[3].key, MSG);
2501 is_string("value3", msgbuf.tags[3].value, MSG);
2502
2503 is_string("tag4", msgbuf.tags[4].key, MSG);
2504 is_string("value4", msgbuf.tags[4].value, MSG);
2505
2506 is_string("tag5", msgbuf.tags[5].key, MSG);
2507 is_string("value5", msgbuf.tags[5].value, MSG);
2508
2509 is_string("tag6", msgbuf.tags[6].key, MSG);
2510 is_string("value6", msgbuf.tags[6].value, MSG);
2511
2512 is_string("tag7", msgbuf.tags[7].key, MSG);
2513 is_string("value7", msgbuf.tags[7].value, MSG);
2514
2515 is_string("tag8", msgbuf.tags[8].key, MSG);
2516 is_string("value8", msgbuf.tags[8].value, MSG);
2517
2518 is_string("tag9", msgbuf.tags[9].key, MSG);
2519 is_string("value9", msgbuf.tags[9].value, MSG);
2520
2521 is_string("tag10", msgbuf.tags[10].key, MSG);
2522 is_string("value10", msgbuf.tags[10].value, MSG);
2523
2524 is_string("tag11", msgbuf.tags[11].key, MSG);
2525 is_string("value11", msgbuf.tags[11].value, MSG);
2526
2527 is_string("tag12", msgbuf.tags[12].key, MSG);
2528 is_string("value12", msgbuf.tags[12].value, MSG);
2529
2530 is_string("tag13", msgbuf.tags[13].key, MSG);
2531 is_string("value13", msgbuf.tags[13].value, MSG);
2532
2533 is_string("tag14", msgbuf.tags[14].key, MSG);
2534 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2535 }
2536
2537 is_string("PRIVMSG", msgbuf.cmd, MSG);
2538 if (is_int(15, msgbuf.n_para, MSG)) {
2539 is_string("PRIVMSG", msgbuf.para[0], MSG);
2540 is_string("#test", msgbuf.para[1], MSG);
2541 is_string("A", msgbuf.para[2], MSG);
2542 is_string("B", msgbuf.para[3], MSG);
2543 is_string("C", msgbuf.para[4], MSG);
2544 is_string("D", msgbuf.para[5], MSG);
2545 is_string("E", msgbuf.para[6], MSG);
2546 is_string("F", msgbuf.para[7], MSG);
2547 is_string("G", msgbuf.para[8], MSG);
2548 is_string("H", msgbuf.para[9], MSG);
2549 is_string("I", msgbuf.para[10], MSG);
2550 is_string("J", msgbuf.para[11], MSG);
2551 is_string("K", msgbuf.para[12], MSG);
2552 is_string("L", msgbuf.para[13], MSG);
2553 is_string(tmp2, msgbuf.para[14], MSG);
2554 }
2555 }
2556}
2557
2558static void too_long_everything3a(void)
2559{
2560 struct MsgBuf msgbuf;
2561
2562 memset(&msgbuf, 0, sizeof(msgbuf));
2563 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2564 strcat(tmp, MKTEXT(328));
2565 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K L ");
2566 strcat(tmp, MKTEXT(471));
2567 strcat(tmp, " ");
2568 strcat(tmp, "X");
2569 is_int(512+511, strlen(tmp), MSG);
2570
2571 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2572 char tmp2[2048];
2573
2574 /* last para has a space at the end */
2575 memset(tmp2, 0, sizeof(tmp2));
2576 strcat(tmp2, MKTEXT(471));
2577 strcat(tmp2, " ");
2578
2579 if (is_int(15, msgbuf.n_tags, MSG)) {
2580 is_string("tag0", msgbuf.tags[0].key, MSG);
2581 is_string("value0", msgbuf.tags[0].value, MSG);
2582
2583 is_string("tag1", msgbuf.tags[1].key, MSG);
2584 is_string("value1", msgbuf.tags[1].value, MSG);
2585
2586 is_string("tag2", msgbuf.tags[2].key, MSG);
2587 is_string("value2", msgbuf.tags[2].value, MSG);
2588
2589 is_string("tag3", msgbuf.tags[3].key, MSG);
2590 is_string("value3", msgbuf.tags[3].value, MSG);
2591
2592 is_string("tag4", msgbuf.tags[4].key, MSG);
2593 is_string("value4", msgbuf.tags[4].value, MSG);
2594
2595 is_string("tag5", msgbuf.tags[5].key, MSG);
2596 is_string("value5", msgbuf.tags[5].value, MSG);
2597
2598 is_string("tag6", msgbuf.tags[6].key, MSG);
2599 is_string("value6", msgbuf.tags[6].value, MSG);
2600
2601 is_string("tag7", msgbuf.tags[7].key, MSG);
2602 is_string("value7", msgbuf.tags[7].value, MSG);
2603
2604 is_string("tag8", msgbuf.tags[8].key, MSG);
2605 is_string("value8", msgbuf.tags[8].value, MSG);
2606
2607 is_string("tag9", msgbuf.tags[9].key, MSG);
2608 is_string("value9", msgbuf.tags[9].value, MSG);
2609
2610 is_string("tag10", msgbuf.tags[10].key, MSG);
2611 is_string("value10", msgbuf.tags[10].value, MSG);
2612
2613 is_string("tag11", msgbuf.tags[11].key, MSG);
2614 is_string("value11", msgbuf.tags[11].value, MSG);
2615
2616 is_string("tag12", msgbuf.tags[12].key, MSG);
2617 is_string("value12", msgbuf.tags[12].value, MSG);
2618
2619 is_string("tag13", msgbuf.tags[13].key, MSG);
2620 is_string("value13", msgbuf.tags[13].value, MSG);
2621
2622 is_string("tag14", msgbuf.tags[14].key, MSG);
2623 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2624 }
2625
2626 is_string("PRIVMSG", msgbuf.cmd, MSG);
2627 if (is_int(15, msgbuf.n_para, MSG)) {
2628 is_string("PRIVMSG", msgbuf.para[0], MSG);
2629 is_string("#test", msgbuf.para[1], MSG);
2630 is_string("A", msgbuf.para[2], MSG);
2631 is_string("B", msgbuf.para[3], MSG);
2632 is_string("C", msgbuf.para[4], MSG);
2633 is_string("D", msgbuf.para[5], MSG);
2634 is_string("E", msgbuf.para[6], MSG);
2635 is_string("F", msgbuf.para[7], MSG);
2636 is_string("G", msgbuf.para[8], MSG);
2637 is_string("H", msgbuf.para[9], MSG);
2638 is_string("I", msgbuf.para[10], MSG);
2639 is_string("J", msgbuf.para[11], MSG);
2640 is_string("K", msgbuf.para[12], MSG);
2641 is_string("L", msgbuf.para[13], MSG);
2642 is_string(tmp2, msgbuf.para[14], MSG);
2643 }
2644 }
2645}
2646
2647static void long_everything3b(void)
2648{
2649 struct MsgBuf msgbuf;
2650
2651 memset(&msgbuf, 0, sizeof(msgbuf));
2652 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2653 strcat(tmp, MKTEXT(328));
2654 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K ");
2655 strcat(tmp, MKTEXT(473));
2656 strcat(tmp, " ");
2657 is_int(512+510, strlen(tmp), MSG);
2658
2659 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2660 if (is_int(15, msgbuf.n_tags, MSG)) {
2661 is_string("tag0", msgbuf.tags[0].key, MSG);
2662 is_string("value0", msgbuf.tags[0].value, MSG);
2663
2664 is_string("tag1", msgbuf.tags[1].key, MSG);
2665 is_string("value1", msgbuf.tags[1].value, MSG);
2666
2667 is_string("tag2", msgbuf.tags[2].key, MSG);
2668 is_string("value2", msgbuf.tags[2].value, MSG);
2669
2670 is_string("tag3", msgbuf.tags[3].key, MSG);
2671 is_string("value3", msgbuf.tags[3].value, MSG);
2672
2673 is_string("tag4", msgbuf.tags[4].key, MSG);
2674 is_string("value4", msgbuf.tags[4].value, MSG);
2675
2676 is_string("tag5", msgbuf.tags[5].key, MSG);
2677 is_string("value5", msgbuf.tags[5].value, MSG);
2678
2679 is_string("tag6", msgbuf.tags[6].key, MSG);
2680 is_string("value6", msgbuf.tags[6].value, MSG);
2681
2682 is_string("tag7", msgbuf.tags[7].key, MSG);
2683 is_string("value7", msgbuf.tags[7].value, MSG);
2684
2685 is_string("tag8", msgbuf.tags[8].key, MSG);
2686 is_string("value8", msgbuf.tags[8].value, MSG);
2687
2688 is_string("tag9", msgbuf.tags[9].key, MSG);
2689 is_string("value9", msgbuf.tags[9].value, MSG);
2690
2691 is_string("tag10", msgbuf.tags[10].key, MSG);
2692 is_string("value10", msgbuf.tags[10].value, MSG);
2693
2694 is_string("tag11", msgbuf.tags[11].key, MSG);
2695 is_string("value11", msgbuf.tags[11].value, MSG);
2696
2697 is_string("tag12", msgbuf.tags[12].key, MSG);
2698 is_string("value12", msgbuf.tags[12].value, MSG);
2699
2700 is_string("tag13", msgbuf.tags[13].key, MSG);
2701 is_string("value13", msgbuf.tags[13].value, MSG);
2702
2703 is_string("tag14", msgbuf.tags[14].key, MSG);
2704 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2705 }
2706
2707 is_string("PRIVMSG", msgbuf.cmd, MSG);
2708 if (is_int(14, msgbuf.n_para, MSG)) {
2709 is_string("PRIVMSG", msgbuf.para[0], MSG);
2710 is_string("#test", msgbuf.para[1], MSG);
2711 is_string("A", msgbuf.para[2], MSG);
2712 is_string("B", msgbuf.para[3], MSG);
2713 is_string("C", msgbuf.para[4], MSG);
2714 is_string("D", msgbuf.para[5], MSG);
2715 is_string("E", msgbuf.para[6], MSG);
2716 is_string("F", msgbuf.para[7], MSG);
2717 is_string("G", msgbuf.para[8], MSG);
2718 is_string("H", msgbuf.para[9], MSG);
2719 is_string("I", msgbuf.para[10], MSG);
2720 is_string("J", msgbuf.para[11], MSG);
2721 is_string("K", msgbuf.para[12], MSG);
2722 is_string(MKTEXT(473), msgbuf.para[13], MSG);
2723 }
2724 }
2725}
2726
2727static void too_long_everything3b(void)
2728{
2729 struct MsgBuf msgbuf;
2730
2731 memset(&msgbuf, 0, sizeof(msgbuf));
2732 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2733 strcat(tmp, MKTEXT(328));
2734 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K ");
2735 strcat(tmp, MKTEXT(473));
2736 strcat(tmp, " ");
2737 strcat(tmp, "X");
2738 is_int(512+511, strlen(tmp), MSG);
2739
2740 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2741 if (is_int(15, msgbuf.n_tags, MSG)) {
2742 is_string("tag0", msgbuf.tags[0].key, MSG);
2743 is_string("value0", msgbuf.tags[0].value, MSG);
2744
2745 is_string("tag1", msgbuf.tags[1].key, MSG);
2746 is_string("value1", msgbuf.tags[1].value, MSG);
2747
2748 is_string("tag2", msgbuf.tags[2].key, MSG);
2749 is_string("value2", msgbuf.tags[2].value, MSG);
2750
2751 is_string("tag3", msgbuf.tags[3].key, MSG);
2752 is_string("value3", msgbuf.tags[3].value, MSG);
2753
2754 is_string("tag4", msgbuf.tags[4].key, MSG);
2755 is_string("value4", msgbuf.tags[4].value, MSG);
2756
2757 is_string("tag5", msgbuf.tags[5].key, MSG);
2758 is_string("value5", msgbuf.tags[5].value, MSG);
2759
2760 is_string("tag6", msgbuf.tags[6].key, MSG);
2761 is_string("value6", msgbuf.tags[6].value, MSG);
2762
2763 is_string("tag7", msgbuf.tags[7].key, MSG);
2764 is_string("value7", msgbuf.tags[7].value, MSG);
2765
2766 is_string("tag8", msgbuf.tags[8].key, MSG);
2767 is_string("value8", msgbuf.tags[8].value, MSG);
2768
2769 is_string("tag9", msgbuf.tags[9].key, MSG);
2770 is_string("value9", msgbuf.tags[9].value, MSG);
2771
2772 is_string("tag10", msgbuf.tags[10].key, MSG);
2773 is_string("value10", msgbuf.tags[10].value, MSG);
2774
2775 is_string("tag11", msgbuf.tags[11].key, MSG);
2776 is_string("value11", msgbuf.tags[11].value, MSG);
2777
2778 is_string("tag12", msgbuf.tags[12].key, MSG);
2779 is_string("value12", msgbuf.tags[12].value, MSG);
2780
2781 is_string("tag13", msgbuf.tags[13].key, MSG);
2782 is_string("value13", msgbuf.tags[13].value, MSG);
2783
2784 is_string("tag14", msgbuf.tags[14].key, MSG);
2785 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2786 }
2787
2788 is_string("PRIVMSG", msgbuf.cmd, MSG);
2789 if (is_int(14, msgbuf.n_para, MSG)) {
2790 is_string("PRIVMSG", msgbuf.para[0], MSG);
2791 is_string("#test", msgbuf.para[1], MSG);
2792 is_string("A", msgbuf.para[2], MSG);
2793 is_string("B", msgbuf.para[3], MSG);
2794 is_string("C", msgbuf.para[4], MSG);
2795 is_string("D", msgbuf.para[5], MSG);
2796 is_string("E", msgbuf.para[6], MSG);
2797 is_string("F", msgbuf.para[7], MSG);
2798 is_string("G", msgbuf.para[8], MSG);
2799 is_string("H", msgbuf.para[9], MSG);
2800 is_string("I", msgbuf.para[10], MSG);
2801 is_string("J", msgbuf.para[11], MSG);
2802 is_string("K", msgbuf.para[12], MSG);
2803 is_string(MKTEXT(473), msgbuf.para[13], MSG);
2804 }
2805 }
2806}
2807
2808static void long_everything4(void)
2809{
2810 struct MsgBuf msgbuf;
2811
2812 memset(&msgbuf, 0, sizeof(msgbuf));
2813 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2814 strcat(tmp, MKTEXT(328));
2815 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K ");
2816 strcat(tmp, MKTEXT(471));
2817 strcat(tmp, " :L");
2818 is_int(512+510, strlen(tmp), MSG);
2819
2820 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2821 if (is_int(15, msgbuf.n_tags, MSG)) {
2822 is_string("tag0", msgbuf.tags[0].key, MSG);
2823 is_string("value0", msgbuf.tags[0].value, MSG);
2824
2825 is_string("tag1", msgbuf.tags[1].key, MSG);
2826 is_string("value1", msgbuf.tags[1].value, MSG);
2827
2828 is_string("tag2", msgbuf.tags[2].key, MSG);
2829 is_string("value2", msgbuf.tags[2].value, MSG);
2830
2831 is_string("tag3", msgbuf.tags[3].key, MSG);
2832 is_string("value3", msgbuf.tags[3].value, MSG);
2833
2834 is_string("tag4", msgbuf.tags[4].key, MSG);
2835 is_string("value4", msgbuf.tags[4].value, MSG);
2836
2837 is_string("tag5", msgbuf.tags[5].key, MSG);
2838 is_string("value5", msgbuf.tags[5].value, MSG);
2839
2840 is_string("tag6", msgbuf.tags[6].key, MSG);
2841 is_string("value6", msgbuf.tags[6].value, MSG);
2842
2843 is_string("tag7", msgbuf.tags[7].key, MSG);
2844 is_string("value7", msgbuf.tags[7].value, MSG);
2845
2846 is_string("tag8", msgbuf.tags[8].key, MSG);
2847 is_string("value8", msgbuf.tags[8].value, MSG);
2848
2849 is_string("tag9", msgbuf.tags[9].key, MSG);
2850 is_string("value9", msgbuf.tags[9].value, MSG);
2851
2852 is_string("tag10", msgbuf.tags[10].key, MSG);
2853 is_string("value10", msgbuf.tags[10].value, MSG);
2854
2855 is_string("tag11", msgbuf.tags[11].key, MSG);
2856 is_string("value11", msgbuf.tags[11].value, MSG);
2857
2858 is_string("tag12", msgbuf.tags[12].key, MSG);
2859 is_string("value12", msgbuf.tags[12].value, MSG);
2860
2861 is_string("tag13", msgbuf.tags[13].key, MSG);
2862 is_string("value13", msgbuf.tags[13].value, MSG);
2863
2864 is_string("tag14", msgbuf.tags[14].key, MSG);
2865 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2866 }
2867
2868 is_string("PRIVMSG", msgbuf.cmd, MSG);
2869 if (is_int(15, msgbuf.n_para, MSG)) {
2870 is_string("PRIVMSG", msgbuf.para[0], MSG);
2871 is_string("#test", msgbuf.para[1], MSG);
2872 is_string("A", msgbuf.para[2], MSG);
2873 is_string("B", msgbuf.para[3], MSG);
2874 is_string("C", msgbuf.para[4], MSG);
2875 is_string("D", msgbuf.para[5], MSG);
2876 is_string("E", msgbuf.para[6], MSG);
2877 is_string("F", msgbuf.para[7], MSG);
2878 is_string("G", msgbuf.para[8], MSG);
2879 is_string("H", msgbuf.para[9], MSG);
2880 is_string("I", msgbuf.para[10], MSG);
2881 is_string("J", msgbuf.para[11], MSG);
2882 is_string("K", msgbuf.para[12], MSG);
2883 is_string(MKTEXT(471), msgbuf.para[13], MSG);
2884 is_string("L", msgbuf.para[14], MSG);
2885 }
2886 }
2887}
2888
2889static void too_long_everything4(void)
2890{
2891 struct MsgBuf msgbuf;
2892
2893 memset(&msgbuf, 0, sizeof(msgbuf));
2894 strcpy(tmp, "@tag0=value0;tag1=value1;tag2=value2;tag3=value3;tag4=value4;tag5=value5;tag6=value6;tag7=value7;tag8=value8;tag9=value9;tag10=value10;tag11=value11;tag12=value12;tag13=value13;tag14=");
2895 strcat(tmp, MKTEXT(328));
2896 strcat(tmp, " PRIVMSG #test A B C D E F G H I J K ");
2897 strcat(tmp, MKTEXT(471));
2898 strcat(tmp, " :L");
2899 strcat(tmp, "X");
2900 is_int(512+511, strlen(tmp), MSG);
2901
2902 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
2903 if (is_int(15, msgbuf.n_tags, MSG)) {
2904 is_string("tag0", msgbuf.tags[0].key, MSG);
2905 is_string("value0", msgbuf.tags[0].value, MSG);
2906
2907 is_string("tag1", msgbuf.tags[1].key, MSG);
2908 is_string("value1", msgbuf.tags[1].value, MSG);
2909
2910 is_string("tag2", msgbuf.tags[2].key, MSG);
2911 is_string("value2", msgbuf.tags[2].value, MSG);
2912
2913 is_string("tag3", msgbuf.tags[3].key, MSG);
2914 is_string("value3", msgbuf.tags[3].value, MSG);
2915
2916 is_string("tag4", msgbuf.tags[4].key, MSG);
2917 is_string("value4", msgbuf.tags[4].value, MSG);
2918
2919 is_string("tag5", msgbuf.tags[5].key, MSG);
2920 is_string("value5", msgbuf.tags[5].value, MSG);
2921
2922 is_string("tag6", msgbuf.tags[6].key, MSG);
2923 is_string("value6", msgbuf.tags[6].value, MSG);
2924
2925 is_string("tag7", msgbuf.tags[7].key, MSG);
2926 is_string("value7", msgbuf.tags[7].value, MSG);
2927
2928 is_string("tag8", msgbuf.tags[8].key, MSG);
2929 is_string("value8", msgbuf.tags[8].value, MSG);
2930
2931 is_string("tag9", msgbuf.tags[9].key, MSG);
2932 is_string("value9", msgbuf.tags[9].value, MSG);
2933
2934 is_string("tag10", msgbuf.tags[10].key, MSG);
2935 is_string("value10", msgbuf.tags[10].value, MSG);
2936
2937 is_string("tag11", msgbuf.tags[11].key, MSG);
2938 is_string("value11", msgbuf.tags[11].value, MSG);
2939
2940 is_string("tag12", msgbuf.tags[12].key, MSG);
2941 is_string("value12", msgbuf.tags[12].value, MSG);
2942
2943 is_string("tag13", msgbuf.tags[13].key, MSG);
2944 is_string("value13", msgbuf.tags[13].value, MSG);
2945
2946 is_string("tag14", msgbuf.tags[14].key, MSG);
2947 is_string(MKTEXT(328), msgbuf.tags[14].value, MSG);
2948 }
2949
2950 is_string("PRIVMSG", msgbuf.cmd, MSG);
2951 if (is_int(15, msgbuf.n_para, MSG)) {
2952 is_string("PRIVMSG", msgbuf.para[0], MSG);
2953 is_string("#test", msgbuf.para[1], MSG);
2954 is_string("A", msgbuf.para[2], MSG);
2955 is_string("B", msgbuf.para[3], MSG);
2956 is_string("C", msgbuf.para[4], MSG);
2957 is_string("D", msgbuf.para[5], MSG);
2958 is_string("E", msgbuf.para[6], MSG);
2959 is_string("F", msgbuf.para[7], MSG);
2960 is_string("G", msgbuf.para[8], MSG);
2961 is_string("H", msgbuf.para[9], MSG);
2962 is_string("I", msgbuf.para[10], MSG);
2963 is_string("J", msgbuf.para[11], MSG);
2964 is_string("K", msgbuf.para[12], MSG);
2965 is_string(MKTEXT(471), msgbuf.para[13], MSG);
2966 is_string("L", msgbuf.para[14], MSG);
2967 }
2968 }
2969}
2970
2971static void no_para_0_spaces(void)
2972{
2973 struct MsgBuf msgbuf;
2974
2975 memset(&msgbuf, 0, sizeof(msgbuf));
2976 strcpy(tmp, "@tag=value");
2977
2978 is_int(1, msgbuf_parse(&msgbuf, tmp), MSG);
2979}
2980
2981static void no_para_1_space(void)
2982{
2983 struct MsgBuf msgbuf;
2984
2985 memset(&msgbuf, 0, sizeof(msgbuf));
2986 strcpy(tmp, "@tag=value ");
2987
2988 is_int(2, msgbuf_parse(&msgbuf, tmp), MSG);
2989}
2990
2991static void no_para_2_spaces(void)
2992{
2993 struct MsgBuf msgbuf;
2994
2995 memset(&msgbuf, 0, sizeof(msgbuf));
2996 strcpy(tmp, "@tag=value ");
2997
2998 is_int(3, msgbuf_parse(&msgbuf, tmp), MSG);
2999}
3000
3001static void no_para_3_spaces(void)
3002{
3003 struct MsgBuf msgbuf;
3004
3005 memset(&msgbuf, 0, sizeof(msgbuf));
3006 strcpy(tmp, "@tag=value ");
3007
3008 is_int(3, msgbuf_parse(&msgbuf, tmp), MSG);
3009}
3010
3011static void origin_with_para1(void)
3012{
3013 struct MsgBuf msgbuf;
3014
3015 memset(&msgbuf, 0, sizeof(msgbuf));
3016 strcpy(tmp, "@tag=value :origin. PRIVMSG");
3017
3018 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3019 if (is_int(1, msgbuf.n_tags, MSG)) {
3020 is_string("tag", msgbuf.tags[0].key, MSG);
3021 is_string("value", msgbuf.tags[0].value, MSG);
3022 }
3023
3024 is_string("origin.", msgbuf.origin, MSG);
3025
3026 is_string("PRIVMSG", msgbuf.cmd, MSG);
3027 if (is_int(1, msgbuf.n_para, MSG)) {
3028 is_string("PRIVMSG", msgbuf.para[0], MSG);
3029 }
3030 }
3031}
3032
3033static void origin_with_para3(void)
3034{
3035 struct MsgBuf msgbuf;
3036
3037 memset(&msgbuf, 0, sizeof(msgbuf));
3038 strcpy(tmp, "@tag=value :origin. PRIVMSG #test :test");
3039
3040 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3041 if (is_int(1, msgbuf.n_tags, MSG)) {
3042 is_string("tag", msgbuf.tags[0].key, MSG);
3043 is_string("value", msgbuf.tags[0].value, MSG);
3044 }
3045
3046 is_string("origin.", msgbuf.origin, MSG);
3047
3048 is_string("PRIVMSG", msgbuf.cmd, MSG);
3049 if (is_int(3, msgbuf.n_para, MSG)) {
3050 is_string("PRIVMSG", msgbuf.para[0], MSG);
3051 is_string("#test", msgbuf.para[1], MSG);
3052 is_string("test", msgbuf.para[2], MSG);
3053 }
3054 }
3055}
3056
3057static void origin_no_para_0_spaces(void)
3058{
3059 struct MsgBuf msgbuf;
3060
3061 memset(&msgbuf, 0, sizeof(msgbuf));
3062 strcpy(tmp, "@tag=value :origin");
3063
3064 is_int(4, msgbuf_parse(&msgbuf, tmp), MSG);
3065}
3066
3067static void origin_no_para_1_space(void)
3068{
3069 struct MsgBuf msgbuf;
3070
3071 memset(&msgbuf, 0, sizeof(msgbuf));
3072 strcpy(tmp, "@tag=value :origin ");
3073
3074 is_int(2, msgbuf_parse(&msgbuf, tmp), MSG);
3075}
3076
3077static void origin_no_para_2_spaces(void)
3078{
3079 struct MsgBuf msgbuf;
3080
3081 memset(&msgbuf, 0, sizeof(msgbuf));
3082 strcpy(tmp, "@tag=value :origin ");
3083
3084 is_int(3, msgbuf_parse(&msgbuf, tmp), MSG);
3085}
3086
3087static void origin_no_para_3_spaces(void)
3088{
3089 struct MsgBuf msgbuf;
3090
3091 memset(&msgbuf, 0, sizeof(msgbuf));
3092 strcpy(tmp, "@tag=value :origin ");
3093
3094 is_int(3, msgbuf_parse(&msgbuf, tmp), MSG);
3095}
3096
3097static void unescape_test(void)
3098{
3099 struct MsgBuf msgbuf;
3100
3101 memset(&msgbuf, 0, sizeof(msgbuf));
3102 strcpy(tmp, "@tag1=:\\:\\s\\\\\\r\\n;tag2=^:^\\:^\\s^\\\\^\\r^\\n^;tag3=\\:;tag4=\\\\;tag5=\\s PRIVMSG #test :test");
3103
3104 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3105 if (is_int(5, msgbuf.n_tags, MSG)) {
3106 is_string("tag1", msgbuf.tags[0].key, MSG);
3107 is_string(":; \\\r\n", msgbuf.tags[0].value, MSG);
3108
3109 is_string("tag2", msgbuf.tags[1].key, MSG);
3110 is_string("^:^;^ ^\\^\r^\n^", msgbuf.tags[1].value, MSG);
3111
3112 is_string("tag3", msgbuf.tags[2].key, MSG);
3113 is_string(";", msgbuf.tags[2].value, MSG);
3114
3115 is_string("tag4", msgbuf.tags[3].key, MSG);
3116 is_string("\\", msgbuf.tags[3].value, MSG);
3117
3118 is_string("tag5", msgbuf.tags[4].key, MSG);
3119 is_string(" ", msgbuf.tags[4].value, MSG);
3120 }
3121
3122 is_string("PRIVMSG", msgbuf.cmd, MSG);
3123 if (is_int(3, msgbuf.n_para, MSG)) {
3124 is_string("PRIVMSG", msgbuf.para[0], MSG);
3125 is_string("#test", msgbuf.para[1], MSG);
3126 is_string("test", msgbuf.para[2], MSG);
3127 }
3128 }
3129}
3130
3131static void unescape_bad_test1(void)
3132{
3133 struct MsgBuf msgbuf;
3134
3135 memset(&msgbuf, 0, sizeof(msgbuf));
3136 strcpy(tmp, "@tag1=\\ PRIVMSG #test :test");
3137
3138 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3139 if (is_int(1, msgbuf.n_tags, MSG)) {
3140 is_string("tag1", msgbuf.tags[0].key, MSG);
3141 is_string("", msgbuf.tags[0].value, MSG);
3142 }
3143
3144 is_string("PRIVMSG", msgbuf.cmd, MSG);
3145 if (is_int(3, msgbuf.n_para, MSG)) {
3146 is_string("PRIVMSG", msgbuf.para[0], MSG);
3147 is_string("#test", msgbuf.para[1], MSG);
3148 is_string("test", msgbuf.para[2], MSG);
3149 }
3150 }
3151}
3152
3153static void unescape_bad_test2(void)
3154{
3155 struct MsgBuf msgbuf;
3156
3157 memset(&msgbuf, 0, sizeof(msgbuf));
3158 strcpy(tmp, "@tag1=\\; PRIVMSG #test :test");
3159
3160 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3161 if (is_int(1, msgbuf.n_tags, MSG)) {
3162 is_string("tag1", msgbuf.tags[0].key, MSG);
3163 is_string("", msgbuf.tags[0].value, MSG);
3164 }
3165
3166 is_string("PRIVMSG", msgbuf.cmd, MSG);
3167 if (is_int(3, msgbuf.n_para, MSG)) {
3168 is_string("PRIVMSG", msgbuf.para[0], MSG);
3169 is_string("#test", msgbuf.para[1], MSG);
3170 is_string("test", msgbuf.para[2], MSG);
3171 }
3172 }
3173}
3174
3175static void unescape_bad_test3(void)
3176{
3177 struct MsgBuf msgbuf;
3178
3179 memset(&msgbuf, 0, sizeof(msgbuf));
3180 strcpy(tmp, "@tag1=\\;tag2=value2 PRIVMSG #test :test");
3181
3182 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3183 if (is_int(2, msgbuf.n_tags, MSG)) {
3184 is_string("tag1", msgbuf.tags[0].key, MSG);
3185 is_string("", msgbuf.tags[0].value, MSG);
3186
3187 is_string("tag2", msgbuf.tags[1].key, MSG);
3188 is_string("value2", msgbuf.tags[1].value, MSG);
3189 }
3190
3191 is_string("PRIVMSG", msgbuf.cmd, MSG);
3192 if (is_int(3, msgbuf.n_para, MSG)) {
3193 is_string("PRIVMSG", msgbuf.para[0], MSG);
3194 is_string("#test", msgbuf.para[1], MSG);
3195 is_string("test", msgbuf.para[2], MSG);
3196 }
3197 }
3198}
3199
3200static void unescape_bad_test4(void)
3201{
3202 struct MsgBuf msgbuf;
3203
3204 memset(&msgbuf, 0, sizeof(msgbuf));
3205 strcpy(tmp, "@tag1\\=value1;ta\\g2=val\\=ue2 PRIVMSG #test :test");
3206
3207 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3208 if (is_int(2, msgbuf.n_tags, MSG)) {
3209 is_string("tag1\\", msgbuf.tags[0].key, MSG);
3210 is_string("value1", msgbuf.tags[0].value, MSG);
3211
3212 is_string("ta\\g2", msgbuf.tags[1].key, MSG);
3213 is_string("val=ue2", msgbuf.tags[1].value, MSG);
3214 }
3215
3216 is_string("PRIVMSG", msgbuf.cmd, MSG);
3217 if (is_int(3, msgbuf.n_para, MSG)) {
3218 is_string("PRIVMSG", msgbuf.para[0], MSG);
3219 is_string("#test", msgbuf.para[1], MSG);
3220 is_string("test", msgbuf.para[2], MSG);
3221 }
3222 }
3223}
3224
3225static void unescape_bad_test5(void)
3226{
3227 struct MsgBuf msgbuf;
3228
3229 memset(&msgbuf, 0, sizeof(msgbuf));
3230 strcpy(tmp, "@tag1=\\v\\a\\l\\u\\e\\1;tag2=\\va\\lu\\e2;tag3=v\\al\\ue\\3 PRIVMSG #test :test");
3231
3232 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3233 if (is_int(3, msgbuf.n_tags, MSG)) {
3234 is_string("tag1", msgbuf.tags[0].key, MSG);
3235 is_string("value1", msgbuf.tags[0].value, MSG);
3236
3237 is_string("tag2", msgbuf.tags[1].key, MSG);
3238 is_string("value2", msgbuf.tags[1].value, MSG);
3239
3240 is_string("tag3", msgbuf.tags[2].key, MSG);
3241 is_string("value3", msgbuf.tags[2].value, MSG);
3242 }
3243
3244 is_string("PRIVMSG", msgbuf.cmd, MSG);
3245 if (is_int(3, msgbuf.n_para, MSG)) {
3246 is_string("PRIVMSG", msgbuf.para[0], MSG);
3247 is_string("#test", msgbuf.para[1], MSG);
3248 is_string("test", msgbuf.para[2], MSG);
3249 }
3250 }
3251}
3252
3253static void unescape_bad_test6(void)
3254{
3255 struct MsgBuf msgbuf;
3256
3257 memset(&msgbuf, 0, sizeof(msgbuf));
3258 strcpy(tmp, "@\\=value1;tag2=value2 PRIVMSG #test :test");
3259
3260 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3261 if (is_int(2, msgbuf.n_tags, MSG)) {
3262 is_string("\\", msgbuf.tags[0].key, MSG);
3263 is_string("value1", msgbuf.tags[0].value, MSG);
3264
3265 is_string("tag2", msgbuf.tags[1].key, MSG);
3266 is_string("value2", msgbuf.tags[1].value, MSG);
3267 }
3268
3269 is_string("PRIVMSG", msgbuf.cmd, MSG);
3270 if (is_int(3, msgbuf.n_para, MSG)) {
3271 is_string("PRIVMSG", msgbuf.para[0], MSG);
3272 is_string("#test", msgbuf.para[1], MSG);
3273 is_string("test", msgbuf.para[2], MSG);
3274 }
3275 }
3276}
3277
3278static void unescape_8bit(void)
3279{
3280 struct MsgBuf msgbuf;
3281
3282 memset(&msgbuf, 0, sizeof(msgbuf));
3283 strcpy(tmp, "@tag=\176\177\178\376\377 PRIVMSG #test :test");
3284
3285 if (is_int(0, msgbuf_parse(&msgbuf, tmp), MSG)) {
3286 if (is_int(1, msgbuf.n_tags, MSG)) {
3287 is_string("tag", msgbuf.tags[0].key, MSG);
3288 is_string("\176\177\178\376\377", msgbuf.tags[0].value, MSG);
3289 }
3290
3291 is_string("PRIVMSG", msgbuf.cmd, MSG);
3292 if (is_int(3, msgbuf.n_para, MSG)) {
3293 is_string("PRIVMSG", msgbuf.para[0], MSG);
3294 is_string("#test", msgbuf.para[1], MSG);
3295 is_string("test", msgbuf.para[2], MSG);
3296 }
3297 }
3298}
3299
4e14f9a4
EK
3300static struct MsgBuf *reconstruct_tail_prep(char *line, size_t n)
3301{
3302 static struct MsgBuf msgbuf;
3303 msgbuf_init(&msgbuf);
3304 msgbuf_parse(&msgbuf, line);
3305 msgbuf_reconstruct_tail(&msgbuf, n);
3306 return &msgbuf;
3307}
3308
3309static void reconstruct_tail(void)
3310{
3311 struct MsgBuf *mb;
3312 mb = reconstruct_tail_prep((char[]){"CMD P1"}, 2);
3313 is_string("CMD", mb->para[0], MSG);
3314 is_string("P1", mb->para[1], MSG);
3315
3316 mb = reconstruct_tail_prep((char[]){"CMD P1 P2"}, 2);
3317 is_string("CMD", mb->para[0], MSG);
3318 is_string("P1", mb->para[1], MSG);
3319 is_string("P2", mb->para[2], MSG);
3320
3321 mb = reconstruct_tail_prep((char[]){" CMD P1 P2 :P3"}, 0);
3322 is_string("CMD P1 P2 :P3", mb->para[0], MSG);
3323
3324 mb = reconstruct_tail_prep((char[]){"CMD P1 P2 :P3"}, 1);
3325 is_string(" P1 P2 :P3", mb->para[1], MSG);
3326
3327 mb = reconstruct_tail_prep((char[]){"CMD P1 P2"}, 1);
3328 is_string("P1 P2", mb->para[1], MSG);
3329
3330 mb = reconstruct_tail_prep((char[]){"CMD P1 P2 "}, 2);
3331 is_string(" P2 ", mb->para[2], MSG);
3332
3333 mb = reconstruct_tail_prep((char[]){"CMD P1 "}, 2);
3334 is_string(" ", mb->para[2], MSG);
3335
3336 mb = reconstruct_tail_prep((char[]){"CMD P1 :"}, 2);
3337 is_string(":", mb->para[2], MSG);
3338
3339 mb = reconstruct_tail_prep((char[]){"CMD P1 :"}, 2);
3340 is_string(" :", mb->para[2], MSG);
3341}
3342
05a16d98
SA
3343int main(int argc, char *argv[])
3344{
3345 memset(&me, 0, sizeof(me));
3346 strcpy(me.name, "me.name.");
3347
3348 plan_lazy();
3349
3350 is_int(512, TAGSLEN, MSG);
3351 is_int(510, DATALEN, MSG);
3352
3353 basic_tags1();
3354 basic_tags2();
3355 basic_tags3();
3356 basic_tags4();
3357 basic_tags5a();
3358 basic_tags5b();
b582b005 3359 basic_tags13();
05a16d98
SA
3360 basic_tags14();
3361 basic_tags15();
3362 basic_tags16();
3363 basic_tags17();
3364
3365 empty_value1();
3366 empty_value2();
3367
3368 malformed1a();
3369 malformed2a();
3370 malformed1b();
3371 malformed2b();
3372 malformed3();
3373 malformed4();
3374 malformed5();
3375 malformed6();
3376 malformed7();
3377
3378 long_tag1();
3379 long_tag2();
3380
3381 long_value1();
3382
3383 too_long_tag1();
3384 too_long_tag2();
3385 too_long_tag3();
3386 too_long_tags15a();
3387 too_long_tags15b();
3388 too_long_tags16a();
3389 too_long_tags16b();
3390 too_long_tags17a();
3391 too_long_tags17b();
3392
3393 too_long_value1();
3394 too_long_value2();
3395 too_long_value3();
3396
3397 basic_para3a();
3398 basic_para3b();
3399 basic_para13();
3400 basic_para14a();
3401 basic_para14b();
3402 basic_para14c();
3403 basic_para15a();
3404 basic_para15b();
3405 basic_para15c();
3406 basic_para15d();
3407 basic_para16a();
3408 basic_para16b();
3409 basic_para16c();
3410 basic_para17a();
3411 basic_para17b();
3412 basic_para17c();
3413 basic_para17d();
3414
3415 long_para1();
3416 long_para2();
3417 long_para3();
3418 long_para4();
3419
3420 too_long_para1();
b582b005 3421 too_long_para2();
05a16d98
SA
3422
3423 long_everything1();
3424 long_everything2();
3425 long_everything3a();
3426 long_everything3b();
3427 long_everything4();
3428
3429 too_long_everything1();
3430 too_long_everything2();
3431 too_long_everything3a();
3432 too_long_everything3b();
3433 too_long_everything4();
3434
3435 no_para_0_spaces();
3436 no_para_1_space();
3437 no_para_2_spaces();
3438 no_para_3_spaces();
3439
3440 origin_with_para1();
3441 origin_with_para3();
3442 origin_no_para_0_spaces();
3443 origin_no_para_1_space();
3444 origin_no_para_2_spaces();
b582b005 3445 origin_no_para_3_spaces();
05a16d98
SA
3446
3447 unescape_test();
3448 unescape_bad_test1();
3449 unescape_bad_test2();
3450 unescape_bad_test3();
3451 unescape_bad_test4();
3452 unescape_bad_test5();
3453 unescape_bad_test6();
3454
3455 unescape_8bit();
3456
4e14f9a4
EK
3457 reconstruct_tail();
3458
05a16d98
SA
3459 return 0;
3460}