2024-12-08 22:19:43 -07:00
|
|
|
#include "../../test.h"
|
|
|
|
|
#include "arc/std/bool.h"
|
|
|
|
|
#include "arc/std/errno.h"
|
|
|
|
|
#include "arc/std/parser/csv.h"
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
void TEST_ParserCSV_CastTypeFn(void **data, ARC_String *string){
|
|
|
|
|
int32_t *int32Data = (int32_t *)malloc(sizeof(int32_t));
|
|
|
|
|
*int32Data = (int32_t)ARC_String_ToInt64_t(string);
|
|
|
|
|
|
|
|
|
|
*data = (void *)int32Data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TEST_ParserCSV_DestroyTypeFn(void *data){
|
|
|
|
|
free((int32_t *)data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ARC_TEST(Parser_ParserCSV_BasicTest){
|
|
|
|
|
ARC_Parser *parser;
|
|
|
|
|
ARC_ParserCSV_CreateAsParser(&parser, ARC_False, TEST_ParserCSV_CastTypeFn, TEST_ParserCSV_DestroyTypeFn);
|
|
|
|
|
|
|
|
|
|
const char *tempCString =
|
2024-12-09 02:33:12 -07:00
|
|
|
"1,1,2,2\n"
|
|
|
|
|
"2,3,4,5\n"
|
|
|
|
|
"4,2,4,1\n"
|
|
|
|
|
"7,7,7,7\n";
|
2024-12-08 22:19:43 -07:00
|
|
|
|
2025-01-06 17:35:13 -07:00
|
|
|
const int32_t correctData[4][4] = {
|
|
|
|
|
{ 1, 1, 2, 2 },
|
|
|
|
|
{ 2, 3, 4, 5 },
|
|
|
|
|
{ 4, 2, 4, 1 },
|
|
|
|
|
{ 7, 7, 7, 7 }
|
|
|
|
|
};
|
|
|
|
|
|
2024-12-08 22:19:43 -07:00
|
|
|
ARC_String *tempString;
|
|
|
|
|
ARC_String_CreateWithStrlen(&tempString, (char *)tempCString);
|
|
|
|
|
|
|
|
|
|
//this destroys string, so no need for cleanup
|
|
|
|
|
ARC_Parser_Parse(parser, &tempString);
|
|
|
|
|
ARC_CHECK(arc_errno == 0);
|
|
|
|
|
|
|
|
|
|
ARC_ParserCSVData *data = (ARC_ParserCSVData *)ARC_Parser_GetData(parser);
|
2024-12-09 02:33:12 -07:00
|
|
|
|
2024-12-08 22:19:43 -07:00
|
|
|
for(uint32_t y = 0; y < data->height; y++){
|
|
|
|
|
for(uint32_t x = 0; x < data->width; x++){
|
2025-01-06 17:35:13 -07:00
|
|
|
ARC_CHECK(correctData[y][x] == *(int32_t *)(data->data[y][x]));
|
2024-12-08 22:19:43 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ARC_Parser_Destroy(parser);
|
|
|
|
|
}
|
2024-12-09 19:39:39 -07:00
|
|
|
|
|
|
|
|
ARC_TEST(Parser_ParserCSV_BasicHeaderTest){
|
|
|
|
|
ARC_Parser *parser;
|
|
|
|
|
ARC_ParserCSV_CreateAsParser(&parser, ARC_True, TEST_ParserCSV_CastTypeFn, TEST_ParserCSV_DestroyTypeFn);
|
|
|
|
|
|
|
|
|
|
const char *tempCString =
|
|
|
|
|
"a,b,c,d\n"
|
|
|
|
|
"4,3,2,1\n"
|
|
|
|
|
"7,3,2,1\n"
|
|
|
|
|
"4,2,4,1\n"
|
|
|
|
|
"7,7,7,7\n";
|
|
|
|
|
|
2025-01-06 17:35:13 -07:00
|
|
|
const char correctHeaders[4] = {
|
|
|
|
|
'a', 'b', 'c', 'd'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const int32_t correctData[4][4] = {
|
|
|
|
|
{ 4, 3, 2, 1 },
|
|
|
|
|
{ 7, 3, 2, 1 },
|
|
|
|
|
{ 4, 2, 4, 1 },
|
|
|
|
|
{ 7, 7, 7, 7 }
|
|
|
|
|
};
|
|
|
|
|
|
2024-12-09 19:39:39 -07:00
|
|
|
ARC_String *tempString;
|
|
|
|
|
ARC_String_CreateWithStrlen(&tempString, (char *)tempCString);
|
|
|
|
|
|
|
|
|
|
//this destroys string, so no need for cleanup
|
|
|
|
|
ARC_Parser_Parse(parser, &tempString);
|
|
|
|
|
ARC_CHECK(arc_errno == 0);
|
|
|
|
|
|
|
|
|
|
ARC_ParserCSVData *data = (ARC_ParserCSVData *)ARC_Parser_GetData(parser);
|
|
|
|
|
|
|
|
|
|
for(uint32_t x = 0; x < data->width; x++){
|
2025-01-06 17:35:13 -07:00
|
|
|
ARC_CHECK(correctHeaders[x] == data->headers[x]->data[0]);
|
2024-12-09 19:39:39 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(uint32_t y = 0; y < data->height; y++){
|
|
|
|
|
for(uint32_t x = 0; x < data->width; x++){
|
2025-01-06 17:35:13 -07:00
|
|
|
ARC_CHECK(correctData[y][x] == *(int32_t *)(data->data[y][x]));
|
2024-12-09 19:39:39 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ARC_Parser_Destroy(parser);
|
|
|
|
|
}
|