about summary refs log tree commit diff stats
path: root/arc/mu.arc
Commit message (Collapse)AuthorAgeFilesLines
* 1310Kartik K. Agaram2015-05-081-11/+11
|
* 1276 - make C++ version the defaultKartik K. Agaram2015-05-051-0/+3259
I've tried to update the Readme, but there are at least a couple of issues.
-tty/commit/tests/unittests/test_roster_list.c?id=a4cadf78faabc157e5db00e42302d495bba432c0'>a4cadf78 ^
0b3a9f57 ^
a4cadf78 ^

0b3a9f57 ^
6e46e8fe ^
c23506f4 ^
90b9b48a ^
78bd151c ^
a2726b6a ^

78bd151c ^
055a5f71 ^
a2726b6a ^
0b3a9f57 ^
700f97d7 ^

055a5f71 ^
78bd151c ^

a2726b6a ^

78bd151c ^
055a5f71 ^
db973457 ^
a2726b6a ^
0b3a9f57 ^
700f97d7 ^

055a5f71 ^
78bd151c ^

a2726b6a ^

78bd151c ^
055a5f71 ^
db973457 ^
a2726b6a ^
a336148c ^
78bd151c ^
0b3a9f57 ^
700f97d7 ^

055a5f71 ^
78bd151c ^

a2726b6a ^

78bd151c ^
055a5f71 ^
db973457 ^

a2726b6a ^
78bd151c ^
0b3a9f57 ^
700f97d7 ^

055a5f71 ^
78bd151c ^

a2726b6a ^

78bd151c ^
055a5f71 ^
db973457 ^

a2726b6a ^
6bad38c2 ^
768b2aa4 ^

6bad38c2 ^
0b3a9f57 ^

700f97d7 ^

055a5f71 ^
78bd151c ^

a2726b6a ^

7a9d127a ^
055a5f71 ^
db973457 ^


a2726b6a ^
6bad38c2 ^
0b3a9f57 ^
700f97d7 ^

055a5f71 ^
7a9d127a ^

a2726b6a ^

7a9d127a ^
055a5f71 ^
db973457 ^


a2726b6a ^
a336148c ^


6bad38c2 ^
0b3a9f57 ^


700f97d7 ^

055a5f71 ^
7a9d127a ^

a2726b6a ^

7a9d127a ^
055a5f71 ^
db973457 ^



a2726b6a ^
768b2aa4 ^


6bad38c2 ^
0b3a9f57 ^



700f97d7 ^

055a5f71 ^
7a9d127a ^

a2726b6a ^

7a9d127a ^
055a5f71 ^
db973457 ^



a2726b6a ^
768b2aa4 ^


6bad38c2 ^
0b3a9f57 ^



700f97d7 ^

055a5f71 ^
7a9d127a ^

a2726b6a ^

7a9d127a ^
055a5f71 ^
db973457 ^



a2726b6a ^
768b2aa4 ^


6bad38c2 ^
0b3a9f57 ^



700f97d7 ^

055a5f71 ^
cfc23078 ^
7a9d127a ^
a2726b6a ^

f23f768d ^
055a5f71 ^
db973457 ^


f23f768d ^
a2726b6a ^
dab37236 ^
a2726b6a ^
0b3a9f57 ^
dab37236 ^

055a5f71 ^
f23f768d ^

a2726b6a ^

f23f768d ^
055a5f71 ^
db973457 ^


f23f768d ^
a2726b6a ^
0b3a9f57 ^
dab37236 ^
055a5f71 ^
f23f768d ^

a2726b6a ^

f23f768d ^
055a5f71 ^
db973457 ^


f23f768d ^
a2726b6a ^
0b3a9f57 ^
dab37236 ^
055a5f71 ^
f23f768d ^

a2726b6a ^

f23f768d ^
055a5f71 ^
db973457 ^


f23f768d ^
a2726b6a ^
0b3a9f57 ^
055a5f71 ^
f23f768d ^

a2726b6a ^

f928fb36 ^
055a5f71 ^
a2726b6a ^
0b3a9f57 ^
055a5f71 ^
f928fb36 ^

a2726b6a ^

f7584469 ^
055a5f71 ^
db973457 ^


f7584469 ^
a2726b6a ^

0b3a9f57 ^
dab37236 ^

055a5f71 ^
f7584469 ^

a2726b6a ^

9a3a0840 ^
055a5f71 ^
db973457 ^









05f2d293 ^
a2726b6a ^




0b3a9f57 ^
dab37236 ^




055a5f71 ^
9a3a0840 ^

a2726b6a ^

f7584469 ^
055a5f71 ^
db973457 ^


f7584469 ^
a2726b6a ^
05f2d293 ^
a2726b6a ^
0b3a9f57 ^
dab37236 ^

055a5f71 ^
c4a1d69a ^

a2726b6a ^

c4a1d69a ^
055a5f71 ^
c4a1d69a ^

a2726b6a ^
e3f2ca7d ^
c4a1d69a ^
e3f2ca7d ^
055a5f71 ^
c4a1d69a ^

a2726b6a ^

c4a1d69a ^
055a5f71 ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^


a2726b6a ^
e3f2ca7d ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^


e3f2ca7d ^
055a5f71 ^
c4a1d69a ^

a2726b6a ^

c4a1d69a ^
055a5f71 ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^



a2726b6a ^
e3f2ca7d ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^

e3f2ca7d ^
c4a1d69a ^


e3f2ca7d ^
055a5f71 ^
c4a1d69a ^

a2726b6a ^

c4a1d69a ^
055a5f71 ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^




a2726b6a ^
e3f2ca7d ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^

e3f2ca7d ^
c4a1d69a ^

e3f2ca7d ^
c4a1d69a ^


e3f2ca7d ^
055a5f71 ^
c4a1d69a ^

a2726b6a ^

c4a1d69a ^
055a5f71 ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^




a2726b6a ^
c4a1d69a ^






a2726b6a ^
e3f2ca7d ^
c4a1d69a ^
a2726b6a ^
c4a1d69a ^

e3f2ca7d ^
c4a1d69a ^

e3f2ca7d ^
c4a1d69a ^

e3f2ca7d ^
c4a1d69a ^

e3f2ca7d ^
c4a1d69a ^


e3f2ca7d ^
055a5f71 ^
78bd151c ^
c60060fe ^
a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^




a2726b6a ^
c60060fe ^



a2726b6a ^
e3f2ca7d ^
c60060fe ^
a2726b6a ^
c60060fe ^

e3f2ca7d ^
c60060fe ^


e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^




a2726b6a ^
c60060fe ^


a2726b6a ^
e3f2ca7d ^
c60060fe ^
a2726b6a ^
c60060fe ^


e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^






a2726b6a ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^




a2726b6a ^
c60060fe ^



a2726b6a ^
e3f2ca7d ^
c60060fe ^
a2726b6a ^
c60060fe ^
e3f2ca7d ^
c60060fe ^

e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^






a2726b6a ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^




a2726b6a ^
c60060fe ^



a2726b6a ^
e3f2ca7d ^
c60060fe ^
a2726b6a ^
c60060fe ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
c60060fe ^

e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^




a2726b6a ^
c60060fe ^




a2726b6a ^
e3f2ca7d ^
c60060fe ^
a2726b6a ^
c60060fe ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
c60060fe ^

e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^




a2726b6a ^
c60060fe ^




a2726b6a ^
e3f2ca7d ^
c60060fe ^
a2726b6a ^
c60060fe ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
c60060fe ^

e3f2ca7d ^
055a5f71 ^
c60060fe ^

a2726b6a ^

c60060fe ^
055a5f71 ^
c60060fe ^
a2726b6a ^
c60060fe ^




a2726b6a ^
c60060fe ^






a2726b6a ^
e3f2ca7d ^
c60060fe ^
a2726b6a ^
c60060fe ^
e3f2ca7d ^
c60060fe ^
e3f2ca7d ^
c60060fe ^

e3f2ca7d ^
055a5f71 ^
c60060fe ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
                 
                   
                   
                   

                   
                   
 
                         
                             
 

                                        
 
                    
                                                        
                      

                       
                     

 

                                  
 
                    
                                                 
                                                        
                                              

                       
                     

 

                                   
 
                    
                                                 
                                                        
                                
 
                                                           

                       
                     

 

                                   
 
                    

                                                 
                                                        
 
                                              

                       
                     

 

                                               
 
                    

                                                 
                                                        
 

                                                 
 

                                                            

                       
                     

 

                                     
 
                    


                                                 
                                                        
 
                                              

                       
                     

 

                                          
 
                    


                                                 
                                                        


                                                              
 


                                                           

                       
                     

 

                                              
 
                    



                                                 
                                                        


                                                              
 



                                                           

                       
                     

 

                                           
 
                    



                                                 
                                                        


                                                              
 



                                                           

                       
                     

 

                                        
 
                    



                                                 
                                                        


                                                              
 



                                                           

                       
                     
 
 

                               
 
                    


                                                 
 
                               
 
                                                                    
                                       

                 
                     

 

                                
 
                    


                                                 
 
                                                                   
                                        
                 
                     

 

                               
 
                    


                                                 
 
                                                                  
                                         
                 
                     

 

                               
 
                    


                                                 
 
                                                                    
                        
                     

 

                                        
 
                    
                                                                     
                        
                     

 

                                                      
 
                    


                                                 
 

                                                                      
                                          

                  
                     

 

                                         
 
                    









                                                
 




                                                                      
                                         




                  
                     

 

                                                               
 
                    


                                                 
 
                                                                    
                                   
                                                                      
                                          

                  
                     

 

                                       
 
                    

                                                             
                                            
                                                   
 
                                       
                     

 

                                    
 
                    
 
                          


                                                               
                                            
                                                   
 
                                                                                      


                                                
                                       
                     

 

                                         
 
                    
 
                          



                                                               
                                            
                                                   
 
                                                                                      

                                                
                                                                            


                                             
                                       
                     

 

                                           
 
                    
 
                          




                                                               
                                            
                                                   
 
                                                                                      

                                                
                                                                            

                                             
                                                                             


                                              
                                       
                     

 

                                                             
 
                    
 
                           




                                                                
                           






                                                                   
                                            
                                                   
 
                                                                                      

                                                
                                                                            

                                             
                                                                             

                                              
                                                                              

                                               
                                                                              


                                               
                                       
                     
 
 

                                                               
 
                    
 
                           




                                                                
                           



                                                                   
                                            
                                                   
 
                                                                                      

                                                
                                                                             


                                              
                                       
                     

 

                                                               
 
                    
 
                           




                                                                
                           


                                                                   
                                            
                                                   
 
                                                                                    


                                              
                                       
                     

 

                                                                 
 
                    
 
                           






                                                                
                                            
                                                   
 
                                       
                     

 

                                                          
 
                    
 
                           




                                                                
                           



                                                                   
                                            
                                                   
 
                                                                                         
                               
                                                                                  

                               
                                       
                     

 

                                       
 
                    
 
                           






                                                                
                                            
                                                   
 
                                       
                     

 

                                                
 
                    
 
                           




                                                                
                           



                                                             
                                            
                                                   
 
                                                                                      
                               
                                                                            
                               
                                                                             
                               
                                                                                  
                               
                                                                                  

                               
                                       
                     

 

                                           
 
                    
 
                           




                                                                
                           




                                                             
                                            
                                                   
 
                                                                                      
                               
                                                                            
                               
                                                                             

                               
                                       
                     

 

                                                  
 
                    
 
                           




                                                                
                           




                                                             
                                            
                                                   
 
                                                                                      
                               
                                                                            
                               
                                                                             
                               
                                                                                 

                               
                                       
                     

 

                                                    
 
                    
 
                           




                                                                
                           






                                                             
                                            
                                                   
 
                                                                                      
                               
                                                                            
                               
                                                                             

                               
                                       
                     
 
#include <glib.h>
#include <stdarg.h>
#include <string.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
#include <stdlib.h>

#include "xmpp/contact.h"
#include "xmpp/roster_list.h"

void
empty_list_when_none_added(void** state)
{
    roster_create();
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);
    assert_null(list);

    g_slist_free(list);
    roster_destroy();
}

void
contains_one_element(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);
    assert_int_equal(1, g_slist_length(list));

    g_slist_free(list);
    roster_destroy();
}

void
first_element_correct(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);
    PContact james = list->data;

    assert_string_equal("James", p_contact_barejid(james));

    g_slist_free(list);
    roster_destroy();
}

void
contains_two_elements(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);

    assert_int_equal(2, g_slist_length(list));

    g_slist_free(list);
    roster_destroy();
}

void
first_and_second_elements_correct(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);

    PContact first = list->data;
    PContact second = (g_slist_next(list))->data;

    assert_string_equal("Dave", p_contact_barejid(first));
    assert_string_equal("James", p_contact_barejid(second));

    g_slist_free(list);
    roster_destroy();
}

void
contains_three_elements(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);

    assert_int_equal(3, g_slist_length(list));

    g_slist_free(list);
    roster_destroy();
}

void
first_three_elements_correct(void** state)
{
    roster_create();
    roster_add("Bob", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("James", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);
    PContact bob = list->data;
    PContact dave = (g_slist_next(list))->data;
    PContact james = (g_slist_next(g_slist_next(list)))->data;

    assert_string_equal("James", p_contact_barejid(james));
    assert_string_equal("Dave", p_contact_barejid(dave));
    assert_string_equal("Bob", p_contact_barejid(bob));

    g_slist_free(list);
    roster_destroy();
}

void
add_twice_at_beginning_adds_once(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);
    PContact first = list->data;
    PContact second = (g_slist_next(list))->data;
    PContact third = (g_slist_next(g_slist_next(list)))->data;

    assert_int_equal(3, g_slist_length(list));
    assert_string_equal("Bob", p_contact_barejid(first));
    assert_string_equal("Dave", p_contact_barejid(second));
    assert_string_equal("James", p_contact_barejid(third));

    g_slist_free(list);
    roster_destroy();
}

void
add_twice_in_middle_adds_once(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);
    PContact first = list->data;
    PContact second = (g_slist_next(list))->data;
    PContact third = (g_slist_next(g_slist_next(list)))->data;

    assert_int_equal(3, g_slist_length(list));
    assert_string_equal("Bob", p_contact_barejid(first));
    assert_string_equal("Dave", p_contact_barejid(second));
    assert_string_equal("James", p_contact_barejid(third));

    g_slist_free(list);
    roster_destroy();
}

void
add_twice_at_end_adds_once(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);
    roster_add("James", NULL, NULL, NULL, FALSE);
    GSList* list = roster_get_contacts(ROSTER_ORD_NAME);
    PContact first = list->data;
    PContact second = (g_slist_next(list))->data;
    PContact third = (g_slist_next(g_slist_next(list)))->data;

    assert_int_equal(3, g_slist_length(list));
    assert_string_equal("Bob", p_contact_barejid(first));
    assert_string_equal("Dave", p_contact_barejid(second));
    assert_string_equal("James", p_contact_barejid(third));

    g_slist_free(list);
    roster_destroy();
}

void
find_first_exists(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);

    char* search = strdup("B");

    char* result = roster_contact_autocomplete(search, FALSE, NULL);
    assert_string_equal("Bob", result);
    free(result);
    free(search);
    roster_destroy();
}

void
find_second_exists(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);

    char* result = roster_contact_autocomplete("Dav", FALSE, NULL);
    assert_string_equal("Dave", result);
    free(result);
    roster_destroy();
}

void
find_third_exists(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);

    char* result = roster_contact_autocomplete("Ja", FALSE, NULL);
    assert_string_equal("James", result);
    free(result);
    roster_destroy();
}

void
find_returns_null(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);

    char* result = roster_contact_autocomplete("Mike", FALSE, NULL);
    assert_null(result);
    roster_destroy();
}

void
find_on_empty_returns_null(void** state)
{
    roster_create();
    char* result = roster_contact_autocomplete("James", FALSE, NULL);
    assert_null(result);
    roster_destroy();
}

void
find_twice_returns_second_when_two_match(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Jamie", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);

    char* result1 = roster_contact_autocomplete("Jam", FALSE, NULL);
    char* result2 = roster_contact_autocomplete(result1, FALSE, NULL);
    assert_string_equal("Jamie", result2);
    free(result1);
    free(result2);
    roster_destroy();
}

void
find_five_times_finds_fifth(void** state)
{
    roster_create();
    roster_add("Jama", NULL, NULL, NULL, FALSE);
    roster_add("Jamb", NULL, NULL, NULL, FALSE);
    roster_add("Mike", NULL, NULL, NULL, FALSE);
    roster_add("Dave", NULL, NULL, NULL, FALSE);
    roster_add("Jamm", NULL, NULL, NULL, FALSE);
    roster_add("Jamn", NULL, NULL, NULL, FALSE);
    roster_add("Matt", NULL, NULL, NULL, FALSE);
    roster_add("Jamo", NULL, NULL, NULL, FALSE);
    roster_add("Jamy", NULL, NULL, NULL, FALSE);
    roster_add("Jamz", NULL, NULL, NULL, FALSE);

    char* result1 = roster_contact_autocomplete("Jam", FALSE, NULL);
    char* result2 = roster_contact_autocomplete(result1, FALSE, NULL);
    char* result3 = roster_contact_autocomplete(result2, FALSE, NULL);
    char* result4 = roster_contact_autocomplete(result3, FALSE, NULL);
    char* result5 = roster_contact_autocomplete(result4, FALSE, NULL);
    assert_string_equal("Jamo", result5);
    free(result1);
    free(result2);
    free(result3);
    free(result4);
    free(result5);
    roster_destroy();
}

void
find_twice_returns_first_when_two_match_and_reset(void** state)
{
    roster_create();
    roster_add("James", NULL, NULL, NULL, FALSE);
    roster_add("Jamie", NULL, NULL, NULL, FALSE);
    roster_add("Bob", NULL, NULL, NULL, FALSE);

    char* result1 = roster_contact_autocomplete("Jam", FALSE, NULL);
    roster_reset_search_attempts();
    char* result2 = roster_contact_autocomplete(result1, FALSE, NULL);
    assert_string_equal("James", result2);
    free(result1);
    free(result2);
    roster_destroy();
}

void
add_contact_with_no_group(void** state)
{
    roster_create();
    roster_add("person@server.org", NULL, NULL, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 0);

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_group(void** state)
{
    roster_create();

    GSList* groups = NULL;
    groups = g_slist_append(groups, strdup("friends"));
    roster_add("person@server.org", NULL, groups, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 1);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "friends");

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_two_groups(void** state)
{
    roster_create();

    GSList* groups = NULL;
    groups = g_slist_append(groups, strdup("friends"));
    groups = g_slist_append(groups, strdup("work"));
    roster_add("person@server.org", NULL, groups, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 2);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "friends");
    found = g_list_find_custom(groups_res, "work", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "work");

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_three_groups(void** state)
{
    roster_create();

    GSList* groups = NULL;
    groups = g_slist_append(groups, strdup("friends"));
    groups = g_slist_append(groups, strdup("work"));
    groups = g_slist_append(groups, strdup("stuff"));
    roster_add("person@server.org", NULL, groups, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 3);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "friends");
    found = g_list_find_custom(groups_res, "work", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "work");
    found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "stuff");

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_three_groups_update_adding_two(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("friends"));
    groups2 = g_slist_append(groups2, strdup("work"));
    groups2 = g_slist_append(groups2, strdup("stuff"));
    groups2 = g_slist_append(groups2, strdup("things"));
    groups2 = g_slist_append(groups2, strdup("people"));
    roster_update("person@server.org", NULL, groups2, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 5);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "friends");
    found = g_list_find_custom(groups_res, "work", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "work");
    found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "stuff");
    found = g_list_find_custom(groups_res, "things", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "things");
    found = g_list_find_custom(groups_res, "people", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "people");

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_three_groups_update_removing_one(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("friends"));
    groups2 = g_slist_append(groups2, strdup("stuff"));
    roster_update("person@server.org", NULL, groups2, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 2);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "friends");
    found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "stuff");

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_three_groups_update_removing_two(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("stuff"));
    roster_update("person@server.org", NULL, groups2, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 1);

    GList* found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    assert_string_equal(found->data, "stuff");

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_three_groups_update_removing_three(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    roster_update("person@server.org", NULL, NULL, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 0);

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contact_with_three_groups_update_two_new(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("newfriends"));
    groups2 = g_slist_append(groups2, strdup("somepeople"));
    roster_update("person@server.org", NULL, groups2, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 2);

    GList* found = g_list_find_custom(groups_res, "newfriends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "somepeople", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_remove_contact_groups(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    roster_remove("person@server.org", "person@server.org");

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 0);

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contacts_with_different_groups(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("newfriends"));
    groups2 = g_slist_append(groups2, strdup("somepeople"));
    roster_add("bob@server.org", NULL, groups2, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 5);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "work", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "newfriends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "somepeople", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contacts_with_same_groups(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("friends"));
    groups2 = g_slist_append(groups2, strdup("work"));
    groups2 = g_slist_append(groups2, strdup("stuff"));
    roster_add("bob@server.org", NULL, groups2, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 3);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "work", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
add_contacts_with_overlapping_groups(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("friends"));
    groups2 = g_slist_append(groups2, strdup("work"));
    groups2 = g_slist_append(groups2, strdup("different"));
    roster_add("bob@server.org", NULL, groups2, NULL, FALSE);

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 4);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "work", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "different", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);

    g_list_free_full(groups_res, free);
    roster_destroy();
}

void
remove_contact_with_remaining_in_group(void** state)
{
    roster_create();

    GSList* groups1 = NULL;
    groups1 = g_slist_append(groups1, strdup("friends"));
    groups1 = g_slist_append(groups1, strdup("work"));
    groups1 = g_slist_append(groups1, strdup("stuff"));
    roster_add("person@server.org", NULL, groups1, NULL, FALSE);

    GSList* groups2 = NULL;
    groups2 = g_slist_append(groups2, strdup("friends"));
    groups2 = g_slist_append(groups2, strdup("work"));
    groups2 = g_slist_append(groups2, strdup("different"));
    roster_add("bob@server.org", NULL, groups2, NULL, FALSE);

    roster_remove("bob@server.org", "bob@server.org");

    GList* groups_res = roster_get_groups();
    assert_int_equal(g_list_length(groups_res), 3);

    GList* found = g_list_find_custom(groups_res, "friends", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "work", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);
    found = g_list_find_custom(groups_res, "stuff", (GCompareFunc)g_strcmp0);
    assert_true(found != NULL);

    g_list_free_full(groups_res, free);
    roster_destroy();
}