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