| |
1 /* |
| |
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
| |
3 * |
| |
4 * Copyright 2025 Olaf Wintermann. All rights reserved. |
| |
5 * |
| |
6 * Redistribution and use in source and binary forms, with or without |
| |
7 * modification, are permitted provided that the following conditions are met: |
| |
8 * |
| |
9 * 1. Redistributions of source code must retain the above copyright |
| |
10 * notice, this list of conditions and the following disclaimer. |
| |
11 * |
| |
12 * 2. Redistributions in binary form must reproduce the above copyright |
| |
13 * notice, this list of conditions and the following disclaimer in the |
| |
14 * documentation and/or other materials provided with the distribution. |
| |
15 * |
| |
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| |
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| |
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| |
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| |
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| |
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| |
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| |
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| |
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| |
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| |
26 * POSSIBILITY OF SUCH DAMAGE. |
| |
27 */ |
| |
28 |
| |
29 #include "test_resource.h" |
| |
30 |
| |
31 #include "helper.h" |
| |
32 |
| |
33 |
| |
34 CX_TEST(test_resource_iterator_visitor) { |
| |
35 DavContext *ctx = dav_context_new(); |
| |
36 DavSession *sn = test_session(ctx); |
| |
37 CX_TEST_DO { |
| |
38 DavResource *root = dav_resource_new(sn, "/"); |
| |
39 DavResource *c1 = dav_resource_new(sn, "/child1"); |
| |
40 DavResource *c2 = dav_resource_new(sn, "/child2"); |
| |
41 DavResource *c1c1 = dav_resource_new(sn, "/child1/sub1"); |
| |
42 DavResource *c1c2 = dav_resource_new(sn, "/child1/sub2"); |
| |
43 DavResource *c1c2c1 = dav_resource_new(sn, "/child2/sub2/x1"); |
| |
44 DavResource *c1c3 = dav_resource_new(sn, "/child1/sub3"); |
| |
45 DavResource *c3 = dav_resource_new(sn, "/child3"); |
| |
46 |
| |
47 root->children = c1; |
| |
48 c1->next = c2; c2->prev = c1; |
| |
49 c2->next = c3; c3->prev = c2; |
| |
50 |
| |
51 c1->parent = root; |
| |
52 c2->parent = root; |
| |
53 c3->parent = root; |
| |
54 |
| |
55 c1->children = c1c1; |
| |
56 c1c1->next = c1c2; c1c2->prev = c1c1; |
| |
57 c1c2->next = c1c3; c1c3->prev = c1c2; |
| |
58 |
| |
59 c1c1->parent = c1; |
| |
60 c1c2->parent = c1; |
| |
61 c1c3->parent = c1; |
| |
62 |
| |
63 c1c2->children = c1c2c1; c1c2c1->parent = c1c2; |
| |
64 |
| |
65 DavResource *resources[] = {root, c1, c2, c3, c1c1, c1c2, c1c3, c1c2c1 }; |
| |
66 |
| |
67 // Iterator Test |
| |
68 CxTreeIterator i = dav_resource_iterator(root); |
| |
69 int iterated = 0; |
| |
70 cx_foreach(DavResource *, res, i) { |
| |
71 for(int r=0;r<8;r++) { |
| |
72 if(res == resources[r]) { |
| |
73 res->exists = 1; |
| |
74 break; |
| |
75 } |
| |
76 } |
| |
77 iterated++; |
| |
78 } |
| |
79 CX_TEST_ASSERT(iterated == 8); |
| |
80 |
| |
81 for(int ir=0;ir<8;ir++) { |
| |
82 CX_TEST_ASSERT(resources[ir]->exists); |
| |
83 resources[ir]->exists = 0; // reset for next test |
| |
84 } |
| |
85 |
| |
86 // Visitor Test |
| |
87 CxTreeVisitor v = dav_resource_visitor(root); |
| |
88 int visited = 0; |
| |
89 cx_foreach(DavResource *, res, v) { |
| |
90 for(int r=0;r<8;r++) { |
| |
91 if(res == resources[r]) { |
| |
92 res->exists = 1; |
| |
93 break; |
| |
94 } |
| |
95 } |
| |
96 visited++; |
| |
97 } |
| |
98 CX_TEST_ASSERT(visited == 8); |
| |
99 |
| |
100 for(int vr=0;vr<8;vr++) { |
| |
101 CX_TEST_ASSERT(resources[vr]->exists); |
| |
102 resources[vr]->exists = 0; // reset for next test |
| |
103 } |
| |
104 |
| |
105 |
| |
106 // partial test |
| |
107 i = dav_resource_iterator(c1); |
| |
108 iterated = 0; |
| |
109 cx_foreach(DavResource *, res, i) { |
| |
110 iterated++; |
| |
111 } |
| |
112 CX_TEST_ASSERT(iterated == 7); |
| |
113 |
| |
114 v = dav_resource_visitor(c1); |
| |
115 visited = 0; |
| |
116 cx_foreach(DavResource *, res, v) { |
| |
117 visited++; |
| |
118 } |
| |
119 CX_TEST_ASSERT(visited == 7); |
| |
120 } |
| |
121 dav_context_destroy(ctx); |
| |
122 } |
| |
123 |
| |
124 CX_TEST(test_resource_map) { |
| |
125 DavContext *ctx = dav_context_new(); |
| |
126 DavSession *sn = test_session(ctx); |
| |
127 CX_TEST_DO { |
| |
128 DavResource *root = dav_resource_new(sn, "/"); |
| |
129 DavResource *c1 = dav_resource_new(sn, "/child1"); |
| |
130 DavResource *c2 = dav_resource_new(sn, "/child2"); |
| |
131 DavResource *c1c1 = dav_resource_new(sn, "/child1/sub1"); |
| |
132 DavResource *c1c2 = dav_resource_new(sn, "/child1/sub2"); |
| |
133 DavResource *c2c2c1 = dav_resource_new(sn, "/child2/sub2/x1"); |
| |
134 DavResource *c1c3 = dav_resource_new(sn, "/child1/sub3"); |
| |
135 DavResource *c3 = dav_resource_new(sn, "/child3"); |
| |
136 |
| |
137 root->children = c1; |
| |
138 c1->next = c2; c2->prev = c1; |
| |
139 c2->next = c3; c3->prev = c2; |
| |
140 |
| |
141 c1->parent = root; |
| |
142 c2->parent = root; |
| |
143 c3->parent = root; |
| |
144 |
| |
145 c1->children = c1c1; |
| |
146 c1c1->next = c1c2; c1c2->prev = c1c1; |
| |
147 c1c2->next = c1c3; c1c3->prev = c1c2; |
| |
148 |
| |
149 c1c1->parent = c1; |
| |
150 c1c2->parent = c1; |
| |
151 c1c3->parent = c1; |
| |
152 |
| |
153 c1c2->children = c2c2c1; c2c2c1->parent = c1c2; |
| |
154 |
| |
155 CxMap *map = dav_resource_map(root); |
| |
156 CX_TEST_ASSERT(cxMapGet(map, "/") == root); |
| |
157 CX_TEST_ASSERT(cxMapGet(map, "/child1") == c1); |
| |
158 CX_TEST_ASSERT(cxMapGet(map, "/child2") == c2); |
| |
159 CX_TEST_ASSERT(cxMapGet(map, "/child3") == c3); |
| |
160 CX_TEST_ASSERT(cxMapGet(map, "/child1/sub1") == c1c1); |
| |
161 CX_TEST_ASSERT(cxMapGet(map, "/child1/sub2") == c1c2); |
| |
162 CX_TEST_ASSERT(cxMapGet(map, "/child1/sub3") == c1c3); |
| |
163 CX_TEST_ASSERT(cxMapGet(map, "/child2/sub2/x1") == c2c2c1); |
| |
164 } |
| |
165 dav_context_destroy(ctx); |
| |
166 } |