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