1 /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3  *     Copyright 2012 Couchbase, Inc.
4  *
5  *   Licensed under the Apache License, Version 2.0 (the "License");
6  *   you may not use this file except in compliance with the License.
7  *   You may obtain a copy of the License at
8  *
9  *       http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *   Unless required by applicable law or agreed to in writing, software
12  *   distributed under the License is distributed on an "AS IS" BASIS,
13  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *   See the License for the specific language governing permissions and
15  *   limitations under the License.
16  */
17 #include "config.h"
18 #include <gtest/gtest.h>
19 #include <libcouchbase/couchbase.h>
20 #include "list.h"
21 
22 
23 class CCBC_103 : public ::testing::Test
24 {
25 };
26 
27 typedef struct {
28     lcb_list_t list;
29 } event_t;
30 
31 typedef struct {
32     event_t events;
33 } io_cookie;
34 
35 TEST_F(CCBC_103, lists)
36 {
37     io_cookie instance;
38     event_t e1, e2, e3, e4;
39 
40     lcb_list_init(&instance.events.list);
41     lcb_list_append(&instance.events.list, &e1.list);
42     ASSERT_EQ(&e1.list, instance.events.list.prev);
43 
44     lcb_list_append(&instance.events.list, &e2.list);
45     ASSERT_EQ(&e2.list, instance.events.list.prev);
46 
47     lcb_list_append(&instance.events.list, &e3.list);
regtest_func_1null48     ASSERT_EQ(&e3.list, instance.events.list.prev);
49 
50     lcb_list_append(&instance.events.list, &e4.list);
51     ASSERT_EQ(&e4.list, instance.events.list.prev);
52 
53     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e1.list));
54     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e2.list));
55     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e3.list));
56     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e4.list));
57 
58     // Try to unlink the one in the middle
59     lcb_list_delete(&e2.list);
60     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e1.list));
61     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e2.list));
62     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e3.list));
63     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e4.list));
64 
65     // Try to unlink the last one
66     lcb_list_delete(&e1.list);
67     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e1.list));
68     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e2.list));
69     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e3.list));
70     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e4.list));
71 
72     // try to unlink the current head
73     lcb_list_delete(&e4.list);
74     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e1.list));
75     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e2.list));
76     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e3.list));
77     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e4.list));
78 
79     // try to unlink the last one
80     lcb_list_delete(&e3.list);
81     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e1.list));
82     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e2.list));
83     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e3.list));
84     ASSERT_EQ(0, lcb_list_contains(&instance.events.list, &e4.list));
85 
86     // And we should be able to add all back
87     lcb_list_append(&instance.events.list, &e1.list);
88     lcb_list_append(&instance.events.list, &e2.list);
89     lcb_list_append(&instance.events.list, &e3.list);
90     lcb_list_append(&instance.events.list, &e4.list);
91     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e1.list));
92     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e2.list));
93     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e3.list));
94     ASSERT_EQ(1, lcb_list_contains(&instance.events.list, &e4.list));
95 }
96