| 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 } |
|