1 #include <rlookup.h>
2 #include <gtest/gtest.h>
3 
4 class RLookupTest : public ::testing::Test {};
5 
TEST_F(RLookupTest,testInit)6 TEST_F(RLookupTest, testInit) {
7   RLookup lk = {0};
8   RLookup_Init(&lk, NULL);
9   RLookup_Cleanup(&lk);
10 }
11 
TEST_F(RLookupTest,testFlags)12 TEST_F(RLookupTest, testFlags) {
13   RLookup lk = {0};
14   RLookup_Init(&lk, NULL);
15   RLookupKey *fook = RLookup_GetKey(&lk, "foo", 0);
16   ASSERT_EQ(NULL, fook);
17   // Try with O_CREAT
18   fook = RLookup_GetKey(&lk, "foo", RLOOKUP_F_OCREAT);
19   ASSERT_TRUE(fook);
20 
21   RLookupKey *tmpk = RLookup_GetKey(&lk, "foo", RLOOKUP_F_OEXCL);
22   ASSERT_EQ(NULL, tmpk);
23 
24   RLookup_Cleanup(&lk);
25 }
26 
TEST_F(RLookupTest,testRow)27 TEST_F(RLookupTest, testRow) {
28   RLookup lk = {0};
29   RLookup_Init(&lk, NULL);
30   RLookupKey *fook = RLookup_GetKey(&lk, "foo", RLOOKUP_F_OCREAT);
31   RLookupKey *bark = RLookup_GetKey(&lk, "bar", RLOOKUP_F_OCREAT);
32   RLookupRow rr = {0};
33   RSValue *vfoo = RS_Int64Val(42);
34   RSValue *vbar = RS_Int64Val(666);
35 
36   ASSERT_EQ(1, vfoo->refcount);
37   RLookup_WriteKey(fook, &rr, vfoo);
38   ASSERT_EQ(2, vfoo->refcount);
39 
40   RSValue *vtmp = RLookup_GetItem(fook, &rr);
41   ASSERT_EQ(vfoo, vtmp);
42   ASSERT_EQ(2, vfoo->refcount);
43   ASSERT_EQ(1, rr.ndyn);
44 
45   // Write a NULL value
46   RLookup_WriteKey(fook, &rr, &RS_StaticNull);
47   ASSERT_EQ(1, vfoo->refcount);
48 
49   // Get the 'bar' key -- should be NULL
50   ASSERT_TRUE(NULL == RLookup_GetItem(bark, &rr));
51 
52   // Clean up the row
53   RLookupRow_Wipe(&rr);
54   vtmp = RLookup_GetItem(fook, &rr);
55   ASSERT_TRUE(NULL == RLookup_GetItem(fook, &rr));
56 
57   RSValue_Decref(vfoo);
58   RSValue_Decref(vbar);
59   RLookupRow_Cleanup(&rr);
60   RLookup_Cleanup(&lk);
61 }