#include "../test.h" #include "arc/std/bool.h" #include "arc/std/errno.h" #include "arc/std/parser.h" #include "arc/std/lexer.h" #include #include //TODO: add more tests const char *languageCString = " -> ALPHA_UPPER_CHAR | ALPHA_LOWER_CHAR | UNDERSCORE \n" " -> | LAMBDA\n" " -> ALPHA_UPPER_CHAR | ALPHA_LOWER_CHAR | UNDERSCORE | NUMBER\n"; #define ARC_TEST_TAG_UNDERSCORE 1 #define ARC_TEST_TAG_NUMBER 2 #define ARC_TEST_TAG_ALPHA_UPPER_CHAR 3 #define ARC_TEST_TAG_ALPHA_LOWER_CHAR 4 #define ARC_TEST_TAG_VARIABLE 5 #define ARC_TEST_TAG_VARIABLE_NAME 6 #define ARC_TEST_TAG_VARIABLE_CHAR 7 void ARC_TEST_InitLexerRulesFn(ARC_Lexer *lexer){ ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharRule(ARC_TEST_TAG_UNDERSCORE, '_' )); ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharOrBetween(ARC_TEST_TAG_NUMBER , '0', '9')); ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharOrBetween(ARC_TEST_TAG_ALPHA_LOWER_CHAR, 'a', 'z')); ARC_Lexer_RegisterTokenRule(lexer, ARC_LexerTokenRule_CreateAndReturnMatchCharOrBetween(ARC_TEST_TAG_ALPHA_UPPER_CHAR, 'A', 'Z')); } uint32_t ARC_TEST_GetStringIdFn(ARC_String *string){ if(ARC_String_EqualsCStringWithStrlen(string, "LAMBDA")){ return ARC_PARSER_TAG_LAMBDA; } if(ARC_String_EqualsCStringWithStrlen(string, "UNDERSCORE")){ return ARC_TEST_TAG_UNDERSCORE; } if(ARC_String_EqualsCStringWithStrlen(string, "NUMBER")){ return ARC_TEST_TAG_NUMBER; } if(ARC_String_EqualsCStringWithStrlen(string, "ALPHA_UPPER_CHAR")){ return ARC_TEST_TAG_ALPHA_UPPER_CHAR; } if(ARC_String_EqualsCStringWithStrlen(string, "ALPHA_LOWER_CHAR")){ return ARC_TEST_TAG_ALPHA_LOWER_CHAR; } if(ARC_String_EqualsCStringWithStrlen(string, "")){ return ARC_TEST_TAG_VARIABLE; } if(ARC_String_EqualsCStringWithStrlen(string, "")){ return ARC_TEST_TAG_VARIABLE_NAME; } if(ARC_String_EqualsCStringWithStrlen(string, "")){ return ARC_TEST_TAG_VARIABLE_CHAR; } return ~(uint32_t)0; } void ARC_TESTData_CreateFn(void **data, ARC_ParserTagToken *parsedData, void *userData){ } void ARC_TESTData_DestroyFn(void *data, ARC_Bool clear, void *userData){ } ARC_TEST(Parser_Init){ ARC_String *languageString; ARC_String_CreateWithStrlen(&languageString, (char *)languageCString); ARC_Parser *parser; ARC_ParserData_CreateFn createCharFn = ARC_TESTData_CreateFn; ARC_ParserData_DestroyFn destroyCharFn = ARC_TESTData_DestroyFn; ARC_Parser_CreateFromString(&parser, languageString, ARC_TEST_InitLexerRulesFn, ARC_TEST_GetStringIdFn, &createCharFn, &destroyCharFn, NULL); ARC_String_Destroy(languageString); ARC_Parser_Destroy(parser); ARC_CHECK(arc_errno == 0); } ARC_TEST(Parser_Basic_Parse){ ARC_String *languageString; ARC_String_CreateWithStrlen(&languageString, (char *)languageCString); ARC_Parser *parser; ARC_ParserData_CreateFn createCharFn = ARC_TESTData_CreateFn; ARC_ParserData_DestroyFn destroyCharFn = ARC_TESTData_DestroyFn; ARC_Parser_CreateFromString(&parser, languageString, ARC_TEST_InitLexerRulesFn, ARC_TEST_GetStringIdFn, &createCharFn, &destroyCharFn, NULL); ARC_String_Destroy(languageString); /* ~ first test ~ */ ARC_String *tempString; ARC_String_CreateWithStrlen(&tempString, "myvar1"); //this destroys string, so no need for cleanup ARC_Parser_Parse(parser, &tempString); ARC_CHECK(arc_errno == 0); /* ~ second test ~ */ ARC_String_CreateWithStrlen(&tempString, "z1xwvq"); //this destroys string, so no need for cleanup ARC_Parser_Parse(parser, &tempString); ARC_CHECK(arc_errno == 0); /* ~ third test ~ */ ARC_String_CreateWithStrlen(&tempString, "z1234"); //this destroys string, so no need for cleanup ARC_Parser_Parse(parser, &tempString); ARC_CHECK(arc_errno == 0); /* ~ fourth test ~ */ ARC_String_CreateWithStrlen(&tempString, "aaaaa"); //this destroys string, so no need for cleanup ARC_Parser_Parse(parser, &tempString); ARC_CHECK(arc_errno == 0); /* ~ cleanup ~ */ ARC_Parser_Destroy(parser); }