#include "../test.h" #include "arc/std/errno.h" #include "arc/std/config.h" #include "arc/std/parser.h" #include "arc/std/parser/helpers.h" #include static const char *testType = "int32"; void TEST_configType_CopyInt32Fn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){ //go into the tag ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0); if(childTagToken->id != ARC_CONFIG_NUMBER_SIGN){ arc_errno = ARC_ERRNO_DATA; ARC_DEBUG_LOG_ERROR("TEST_configType_CopyInt32Fn(type, parsedData, config), parsed data was not a "); *type = NULL; return; } //check if the first tag is a minus sign and create a string starting with that if it is childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(childTagToken->tagTokens, 0); ARC_String *int32String; ARC_String_Create(&int32String, NULL, 0); if(childTagToken->id == ARC_CONFIG_MINUS){ ARC_String_AppendCStringWithStrlen(&int32String, "-"); } ARC_ParserData_HelperRecurseStringAdd(&int32String, parsedData); //set the max character size 2,147,483,647 (10 characters) or -2,147,483,648 (11 characters) uint32_t maxInt32Size = 10; if(int32String->data[0] == '-'){ maxInt32Size++; } //if the string is bigger than the possible size return NULL and error if(int32String->length > maxInt32Size){ arc_errno = ARC_ERRNO_DATA; ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("TEST_configType_CopyInt32Fn(type, parsedData, config), size \"%s\" was bigger or smaller than the max 2,147,483,647 or min -2,147,483,648", int32String->data); *type = NULL; ARC_String_Destroy(int32String); return; } if(int32String->length == maxInt32Size){ char maxint32CStr[10] = "2147483647"; //offset starting index and last number if there is a negative uint8_t stringIndex = 0; if(int32String->data[0] == '-'){ stringIndex++; maxint32CStr[9]++; } for(uint8_t index = 0; index < 10; index++, stringIndex++){ if(int32String->data[stringIndex] > maxint32CStr[index]){ arc_errno = ARC_ERRNO_DATA; ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("TEST_configType_CopyInt32Fn(type, parsedData, config), size \"%s\" was bigger or smaller than the max 2,147,483,647 or min -2,147,483,648", int32String->data); *type = NULL; ARC_String_Destroy(int32String); return; } } } //copy the int32_t *type = malloc(sizeof(int32_t)); *(int32_t *)(*type) = (int32_t)ARC_String_ToInt64_t(int32String); //cleanup ARC_String_Destroy(int32String); } void TEST_configType_DestroyInt32Fn(void *type){ free((int32_t *)type); } ARC_TEST(config_BasicTest){ ARC_Config *config; ARC_Config_Create(&config); ARC_CHECK(arc_errno == 0); ARC_ConfigType int32Type = { TEST_configType_CopyInt32Fn, TEST_configType_DestroyInt32Fn, NULL }; ARC_Config_RegisterTypeWithCStr(config, testType, int32Type); char *tempCString = "tests/res/std/config/first.chemical"; ARC_String *tempString; ARC_String_CreateWithStrlen(&tempString, tempCString); ARC_Config_LoadFromFile(config, tempString); int32_t testVal = *(int32_t *)ARC_Config_GetWithCStr(config, "test::test"); ARC_CHECK(testVal == 5); testVal = *(int32_t *)ARC_Config_GetWithCStr(config, "test::test1"); ARC_CHECK(testVal == -7); ARC_Config_UnloadFromFile(config, tempString); void *nullVal = ARC_Config_GetWithCStr(config, "test::test"); ARC_CHECK(nullVal == NULL); //cleanup ARC_String_Destroy(tempString); ARC_Config_Destroy(config); }