#include "../test.h" #include "arc/std/errno.h" #include "arc/std/parser.h" //TODO: fix lambda #define LAMBDA 20 #define CHAR ARC_LEXER_TOKEN_ALPHALOWERCHAR #define NUM ARC_LEXER_TOKEN_NUMBER #define CHAR_OR_NUM 23 #define VARIABLE_NAME 24 #define VARIABLE 25 void TEST_Parser_InitLexerRulesFn(ARC_Lexer *lexer){ ARC_Lexer_InitBasicTokenRules(lexer); } ARC_TEST(Parser_Init){ ARC_Parser *parser; uint32_t *charOrNumTokens[] = { (uint32_t[]){ 1, CHAR }, (uint32_t[]){ 1, NUM } }; uint32_t *variableNameTags[] = { (uint32_t[]){ 2, CHAR_OR_NUM, VARIABLE_NAME }, (uint32_t[]){ 1, LAMBDA } }; uint32_t *variableTokensOrTags[] = { (uint32_t[]){ 2, CHAR, VARIABLE_NAME } }; ARC_ParserLanguageTag testTags[3] = { { VARIABLE, //tagId variableTokensOrTags, //tokensOrTags 1 //tokenOrTagsSize }, { VARIABLE_NAME, //tagId variableNameTags, //tokensOrTags 2 //tokenOrTagsSize }, { CHAR_OR_NUM, //tagId charOrNumTokens, //tokensOrTags 2 //tokenOrTagsSize } }; ARC_Array languageArray = { 3, //size testTags //data }; ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn); ARC_Parser_Destroy(parser); ARC_CHECK(1 == 1); } ARC_TEST(Parser_Basic_Parse){ ARC_Parser *parser; uint32_t *charOrNumTokens[] = { (uint32_t[]){ 1, CHAR }, (uint32_t[]){ 1, NUM } }; uint32_t *variableNameTags[] = { (uint32_t[]){ 2, CHAR_OR_NUM, VARIABLE_NAME }, (uint32_t[]){ 1, LAMBDA } }; uint32_t *variableTokensOrTags[] = { (uint32_t[]){ 2, CHAR, VARIABLE_NAME } }; ARC_ParserLanguageTag testTags[3] = { { VARIABLE, //tagId variableTokensOrTags, //tokensOrTags 1 //tokenOrTagsSize }, { VARIABLE_NAME, //tagId variableNameTags, //tokensOrTags 2 //tokenOrTagsSize }, { CHAR_OR_NUM, //tagId charOrNumTokens, //tokensOrTags 2 //tokenOrTagsSize } }; ARC_Array languageArray = { 3, //size testTags //data }; ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn); 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); } ARC_TEST(Parser_Basic_ParseError){ ARC_Parser *parser; uint32_t *charOrNumTokens[] = { (uint32_t[]){ 1, CHAR }, (uint32_t[]){ 1, NUM } }; uint32_t *variableNameTags[] = { (uint32_t[]){ 2, CHAR_OR_NUM, VARIABLE_NAME }, (uint32_t[]){ 1, LAMBDA } }; uint32_t *variableTokensOrTags[] = { (uint32_t[]){ 2, CHAR, VARIABLE_NAME } }; ARC_ParserLanguageTag testTags[3] = { { VARIABLE, //tagId variableTokensOrTags, //tokensOrTags 1 //tokenOrTagsSize }, { VARIABLE_NAME, //tagId variableNameTags, //tokensOrTags 2 //tokenOrTagsSize }, { CHAR_OR_NUM, //tagId charOrNumTokens, //tokensOrTags 2 //tokenOrTagsSize } }; ARC_Array languageArray = { 3, //size testTags //data }; ARC_Parser_Create(&parser, &languageArray, TEST_Parser_InitLexerRulesFn); 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 == ARC_ERRNO_DATA); //check again with moved character arc_errno = 0; ARC_String_CreateWithStrlen(&tempString, "my!Var1"); //this destroys string, so no need for cleanup ARC_Parser_Parse(parser, &tempString); ARC_CHECK(arc_errno == ARC_ERRNO_DATA); //check again with moved character arc_errno = 0; ARC_String_CreateWithStrlen(&tempString, "myVar1!"); //this destroys string, so no need for cleanup ARC_Parser_Parse(parser, &tempString); ARC_CHECK(arc_errno == ARC_ERRNO_DATA); }