1#include "shared.rsh"
2#include "rs_graphics.rsh"
3
4rs_element simpleElem;
5rs_element complexElem;
6typedef struct ComplexStruct {
7    float subElem0;
8    float subElem1;
9    int subElem2;
10    float arrayElem0[2];
11    int arrayElem1[5];
12    char subElem3;
13    float subElem4;
14    float2 subElem5;
15    float3 subElem6;
16    float4 subElem_7;
17} ComplexStruct_t;
18
19ComplexStruct_t *complexStruct;
20
21static const char *subElemNames[] = {
22    "subElem0",
23    "subElem1",
24    "subElem2",
25    "arrayElem0",
26    "arrayElem1",
27    "subElem3",
28    "subElem4",
29    "subElem5",
30    "subElem6",
31    "subElem_7",
32};
33
34static uint32_t subElemNamesSizes[] = {
35    8,
36    8,
37    8,
38    10,
39    10,
40    8,
41    8,
42    8,
43    8,
44    9,
45};
46
47static uint32_t subElemArraySizes[] = {
48    1,
49    1,
50    1,
51    2,
52    5,
53    1,
54    1,
55    1,
56    1,
57    1,
58};
59
60static bool equals(const char *name0, const char * name1, uint32_t len) {
61    for (uint32_t i = 0; i < len; i ++) {
62        if (name0[i] != name1[i]) {
63            return false;
64        }
65    }
66    return true;
67}
68
69static bool test_element_getters() {
70    bool failed = false;
71
72    uint32_t subElemOffsets[10];
73    uint32_t index = 0;
74    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem0   - (uint32_t)complexStruct;
75    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem1   - (uint32_t)complexStruct;
76    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem2   - (uint32_t)complexStruct;
77    subElemOffsets[index++] = (uint32_t)&complexStruct->arrayElem0 - (uint32_t)complexStruct;
78    subElemOffsets[index++] = (uint32_t)&complexStruct->arrayElem1 - (uint32_t)complexStruct;
79    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem3   - (uint32_t)complexStruct;
80    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem4   - (uint32_t)complexStruct;
81    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem5   - (uint32_t)complexStruct;
82    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem6   - (uint32_t)complexStruct;
83    subElemOffsets[index++] = (uint32_t)&complexStruct->subElem_7  - (uint32_t)complexStruct;
84
85    uint32_t subElemCount = rsElementGetSubElementCount(simpleElem);
86    _RS_ASSERT(subElemCount == 0);
87    _RS_ASSERT(rsElementGetDataType(simpleElem) == RS_TYPE_FLOAT_32);
88    _RS_ASSERT(rsElementGetVectorSize(simpleElem) == 3);
89
90    subElemCount = rsElementGetSubElementCount(complexElem);
91    _RS_ASSERT(subElemCount == 10);
92    _RS_ASSERT(rsElementGetDataType(complexElem) == RS_TYPE_NONE);
93    _RS_ASSERT(rsElementGetVectorSize(complexElem) == 1);
94    _RS_ASSERT(rsElementGetBytesSize(complexElem) == sizeof(*complexStruct));
95
96    char buffer[64];
97    for (uint32_t i = 0; i < subElemCount; i ++) {
98        rs_element subElem = rsElementGetSubElement(complexElem, i);
99        _RS_ASSERT(rsIsObject(subElem));
100
101        _RS_ASSERT(rsElementGetSubElementNameLength(complexElem, i) == subElemNamesSizes[i] + 1);
102
103        uint32_t written = rsElementGetSubElementName(complexElem, i, buffer, 64);
104        _RS_ASSERT(written == subElemNamesSizes[i]);
105        _RS_ASSERT(equals(buffer, subElemNames[i], written));
106
107        _RS_ASSERT(rsElementGetSubElementArraySize(complexElem, i) == subElemArraySizes[i]);
108        _RS_ASSERT(rsElementGetSubElementOffsetBytes(complexElem, i) == subElemOffsets[i]);
109    }
110
111    // Tests error checking
112    rs_element subElem = rsElementGetSubElement(complexElem, subElemCount);
113    _RS_ASSERT(!rsIsObject(subElem));
114
115    _RS_ASSERT(rsElementGetSubElementNameLength(complexElem, subElemCount) == 0);
116
117    _RS_ASSERT(rsElementGetSubElementName(complexElem, subElemCount, buffer, 64) == 0);
118    _RS_ASSERT(rsElementGetSubElementName(complexElem, 0, NULL, 64) == 0);
119    _RS_ASSERT(rsElementGetSubElementName(complexElem, 0, buffer, 0) == 0);
120    uint32_t written = rsElementGetSubElementName(complexElem, 0, buffer, 5);
121    _RS_ASSERT(written == 4);
122    _RS_ASSERT(buffer[4] == '\0');
123
124    _RS_ASSERT(rsElementGetSubElementArraySize(complexElem, subElemCount) == 0);
125    _RS_ASSERT(rsElementGetSubElementOffsetBytes(complexElem, subElemCount) == 0);
126
127    if (failed) {
128        rsDebug("test_element_getters FAILED", 0);
129    }
130    else {
131        rsDebug("test_element_getters PASSED", 0);
132    }
133
134    return failed;
135}
136
137void element_test() {
138    bool failed = false;
139    failed |= test_element_getters();
140
141    if (failed) {
142        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
143    }
144    else {
145        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
146    }
147}
148