From 67025e787fa572e19e1f9837d910c725ea4ff022 Mon Sep 17 00:00:00 2001 From: martin dobrev Date: Wed, 24 Oct 2018 22:13:48 +0300 Subject: Add test app. --- JSImpl/JS.Common/JS.Common.vcxitems | 34 --- JSImpl/JS.Common/JS.Common.vcxitems.filters | 61 ------ JSImpl/projects/JS.Common/JS.Common.vcxitems | 34 +++ .../projects/JS.Common/JS.Common.vcxitems.filters | 61 ++++++ JSImpl/projects/TestApp/TestApp.vcxproj | 121 ++++++++++ JSImpl/projects/TestApp/TestApp.vcxproj.filters | 6 + JSImpl/solution/JSImpl.sln | 17 +- JSImpl/solution/JSImpl.vcxproj | 2 +- JSImpl/src/Tests/main.cpp | 244 +++++++++++++++++++++ JSImpl/src/main.cpp | 231 ------------------- 10 files changed, 481 insertions(+), 330 deletions(-) delete mode 100644 JSImpl/JS.Common/JS.Common.vcxitems delete mode 100644 JSImpl/JS.Common/JS.Common.vcxitems.filters create mode 100644 JSImpl/projects/JS.Common/JS.Common.vcxitems create mode 100644 JSImpl/projects/JS.Common/JS.Common.vcxitems.filters create mode 100644 JSImpl/projects/TestApp/TestApp.vcxproj create mode 100644 JSImpl/projects/TestApp/TestApp.vcxproj.filters create mode 100644 JSImpl/src/Tests/main.cpp (limited to 'JSImpl') diff --git a/JSImpl/JS.Common/JS.Common.vcxitems b/JSImpl/JS.Common/JS.Common.vcxitems deleted file mode 100644 index 0aa7ad7..0000000 --- a/JSImpl/JS.Common/JS.Common.vcxitems +++ /dev/null @@ -1,34 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - true - {45d41acc-2c3c-43d2-bc10-02aa73ffc7c7} - - - - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/JSImpl/JS.Common/JS.Common.vcxitems.filters b/JSImpl/JS.Common/JS.Common.vcxitems.filters deleted file mode 100644 index 9d4ce31..0000000 --- a/JSImpl/JS.Common/JS.Common.vcxitems.filters +++ /dev/null @@ -1,61 +0,0 @@ - - - - - {456619f8-e093-4a34-aaa1-cc84813b928c} - - - {bc30bfe3-9613-4c4e-9d84-1731eacf1d90} - - - {5834345c-efe8-4e4b-98e5-04f2851f4388} - - - {8c9cc117-30cd-4035-ba75-8dd0e2668e4e} - - - - - Expressions - - - Lexer - - - Parser - - - Visitors - - - Visitors - - - - - Expressions - - - Expressions - - - Expressions - - - Lexer - - - Parser - - - Visitors - - - Visitors - - - Visitors - - - - \ No newline at end of file diff --git a/JSImpl/projects/JS.Common/JS.Common.vcxitems b/JSImpl/projects/JS.Common/JS.Common.vcxitems new file mode 100644 index 0000000..0f2ec7d --- /dev/null +++ b/JSImpl/projects/JS.Common/JS.Common.vcxitems @@ -0,0 +1,34 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {45d41acc-2c3c-43d2-bc10-02aa73ffc7c7} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JSImpl/projects/JS.Common/JS.Common.vcxitems.filters b/JSImpl/projects/JS.Common/JS.Common.vcxitems.filters new file mode 100644 index 0000000..f213e40 --- /dev/null +++ b/JSImpl/projects/JS.Common/JS.Common.vcxitems.filters @@ -0,0 +1,61 @@ + + + + + {456619f8-e093-4a34-aaa1-cc84813b928c} + + + {bc30bfe3-9613-4c4e-9d84-1731eacf1d90} + + + {5834345c-efe8-4e4b-98e5-04f2851f4388} + + + {8c9cc117-30cd-4035-ba75-8dd0e2668e4e} + + + + + Expressions + + + Lexer + + + Parser + + + Visitors + + + Visitors + + + + + Expressions + + + Expressions + + + Expressions + + + Expressions + + + Lexer + + + Parser + + + Visitors + + + Visitors + + + + \ No newline at end of file diff --git a/JSImpl/projects/TestApp/TestApp.vcxproj b/JSImpl/projects/TestApp/TestApp.vcxproj new file mode 100644 index 0000000..e37f61d --- /dev/null +++ b/JSImpl/projects/TestApp/TestApp.vcxproj @@ -0,0 +1,121 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {05DB0989-2720-45CC-8689-2FF047B4FD74} + TestApp + 8.1 + + + + Application + true + v140 + MultiByte + + + Application + false + v140 + true + MultiByte + + + Application + true + v140 + MultiByte + + + Application + false + v140 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + + + + + Level3 + Disabled + true + %(AdditionalIncludeDirectories) + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + $(ProjectDir)../../src/;%(AdditionalIncludeDirectories) + + + true + true + + + + + + + + + \ No newline at end of file diff --git a/JSImpl/projects/TestApp/TestApp.vcxproj.filters b/JSImpl/projects/TestApp/TestApp.vcxproj.filters new file mode 100644 index 0000000..5a05e58 --- /dev/null +++ b/JSImpl/projects/TestApp/TestApp.vcxproj.filters @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JSImpl/solution/JSImpl.sln b/JSImpl/solution/JSImpl.sln index a2f0672..9deeed2 100644 --- a/JSImpl/solution/JSImpl.sln +++ b/JSImpl/solution/JSImpl.sln @@ -5,12 +5,15 @@ VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSImpl", "JSImpl.vcxproj", "{EE0F8C6F-3619-4A46-BC19-FAEAD4167EE4}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JS.Common", "..\JS.Common\JS.Common.vcxitems", "{45D41ACC-2C3C-43D2-BC10-02AA73FFC7C7}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JS.Common", "..\projects\JS.Common\JS.Common.vcxitems", "{45D41ACC-2C3C-43D2-BC10-02AA73FFC7C7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestApp", "..\projects\TestApp\TestApp.vcxproj", "{05DB0989-2720-45CC-8689-2FF047B4FD74}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution - ..\JS.Common\JS.Common.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9 - ..\JS.Common\JS.Common.vcxitems*{ee0f8c6f-3619-4a46-bc19-faead4167ee4}*SharedItemsImports = 4 + ..\projects\JS.Common\JS.Common.vcxitems*{05db0989-2720-45cc-8689-2ff047b4fd74}*SharedItemsImports = 4 + ..\projects\JS.Common\JS.Common.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9 + ..\projects\JS.Common\JS.Common.vcxitems*{ee0f8c6f-3619-4a46-bc19-faead4167ee4}*SharedItemsImports = 4 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -27,6 +30,14 @@ Global {EE0F8C6F-3619-4A46-BC19-FAEAD4167EE4}.Release|x64.Build.0 = Release|x64 {EE0F8C6F-3619-4A46-BC19-FAEAD4167EE4}.Release|x86.ActiveCfg = Release|Win32 {EE0F8C6F-3619-4A46-BC19-FAEAD4167EE4}.Release|x86.Build.0 = Release|Win32 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Debug|x64.ActiveCfg = Debug|x64 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Debug|x64.Build.0 = Debug|x64 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Debug|x86.ActiveCfg = Debug|Win32 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Debug|x86.Build.0 = Debug|Win32 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Release|x64.ActiveCfg = Release|x64 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Release|x64.Build.0 = Release|x64 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Release|x86.ActiveCfg = Release|Win32 + {05DB0989-2720-45CC-8689-2FF047B4FD74}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/JSImpl/solution/JSImpl.vcxproj b/JSImpl/solution/JSImpl.vcxproj index 32d6b96..39beeba 100644 --- a/JSImpl/solution/JSImpl.vcxproj +++ b/JSImpl/solution/JSImpl.vcxproj @@ -54,7 +54,7 @@ - + diff --git a/JSImpl/src/Tests/main.cpp b/JSImpl/src/Tests/main.cpp new file mode 100644 index 0000000..f92144a --- /dev/null +++ b/JSImpl/src/Tests/main.cpp @@ -0,0 +1,244 @@ +#include "Lexer.h" +#include "Parser.h" +#include "ASTPrinter.h" +#include "ASTInterpreter.h" +#include +#define LOG(msg) std::cout << msg << std::endl +#define EXECUTE_TEST(test) std::cout << #test << " "; test(); + +#define CHECK(cond) if (cond) {LOG("PASS");} else {LOG(#cond " FAIL");} + +// Lexer Tests +void TestLess() +{ + IPLVector tokens; + Tokenize("<", tokens); + + CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Less); +} + +void TestNumber() +{ + IPLVector tokens; + Tokenize("213434.24", tokens); + + CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Number && tokens[0].Number == 213434.24); +} + +void TestNumberStartWithNine() +{ + IPLVector tokens; + Tokenize("999", tokens); + CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Number && tokens[0].Number == 999); +} + +void TestNumberStartWithZero() +{ + IPLVector tokens; + Tokenize("0999", tokens); + CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Number && tokens[0].Number == 999); +} + +void TestSpaceNewLineSpace() +{ + IPLVector tokens; + Tokenize(" \n var a = 4; ", tokens); + CHECK(tokens.size() == 6 && tokens[0].Type == TokenType::Var && + tokens[1].Type == TokenType::Identifier && + tokens[2].Type == TokenType::Equal && + tokens[3].Type == TokenType::Number && + tokens[4].Type == TokenType::Semicolon); +} + +void TestString() +{ + IPLVector tokens; + Tokenize("\"alabala\"", tokens); + CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::String && tokens[0].Lexeme == "\"alabala\""); +} + +void TestStringSingleQuotedStrings() +{ + IPLVector tokens; + Tokenize("'alabala'", tokens); + CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::String && tokens[0].Lexeme == "'alabala'"); +} + +void TestKeyWord() +{ + IPLVector tokens; + Tokenize("for", tokens); + CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::For); +} + +void TestVariableDeclaration() +{ + IPLVector tokens; + Tokenize("var pesho = 10", tokens); + + CHECK(tokens.size() == 5 && tokens[0].Type == TokenType::Var + && tokens[1].Type == TokenType::Identifier + && tokens[2].Type == TokenType::Equal + && tokens[3].Type == TokenType::Number + && tokens[4].Type == TokenType::Eof); +} + +void TestStringError() +{ + IPLVector tokens; + const auto& res = Tokenize("\" aaaa", tokens); + CHECK(!res.IsSuccessful && res.Error.Row == 0 && res.Error.Column == 6); +} + +void TestWhiteSpaceTokens() +{ + IPLVector tokens; + const auto& res = Tokenize(" 1\n2 abc\n \n", tokens, { true, false }); + CHECK(res.IsSuccessful + && tokens.size() == 8 + && tokens[0].Type == TokenType::Whitespace + && tokens[0].Lexeme == " " + && tokens[1].Type == TokenType::Number + && tokens[1].Number == 1 + && tokens[2].Type == TokenType::Whitespace + && tokens[2].Lexeme == "\n" + && tokens[3].Type == TokenType::Number + && tokens[3].Number == 2 + && tokens[4].Type == TokenType::Whitespace + && tokens[4].Lexeme == " " + && tokens[5].Type == TokenType::Identifier + && tokens[5].Lexeme == "abc" + && tokens[6].Type == TokenType::Whitespace + && tokens[6].Lexeme == "\n \n" + && tokens[7].Type == TokenType::Eof); +} + +void TestSimpleComment() +{ + IPLVector tokens; + const auto& res = Tokenize("//comment", tokens, { false, true }); + CHECK(res.IsSuccessful + && tokens.size() == 2 + && tokens[0].Type == TokenType::Comment + && tokens[0].Lexeme == "//comment" + && tokens[1].Type == TokenType::Eof); +} + +void TestSimpleMultiLineComment() +{ + IPLVector tokens; + const auto& res = Tokenize("/*comment\ncomment*/", tokens, { false, true }); + CHECK(res.IsSuccessful + && tokens.size() == 2 + && tokens[0].Type == TokenType::Comment + && tokens[0].Lexeme == "/*comment\ncomment*/" + && tokens[1].Type == TokenType::Eof); +} + +void TestConsecutiveMultiLineComment() +{ + IPLVector tokens; + const auto& res = Tokenize("/*comment1\ncomment1*//*comment2\ncomment2*/", tokens, { false, true }); + CHECK(res.IsSuccessful + && tokens.size() == 3 + && tokens[0].Type == TokenType::Comment + && tokens[0].Lexeme == "/*comment1\ncomment1*/" + && tokens[1].Type == TokenType::Comment + && tokens[1].Lexeme == "/*comment2\ncomment2*/" + && tokens[2].Type == TokenType::Eof); +} + +void TestConsecutiveMultiLineCommentWithSpace() +{ + IPLVector tokens; + const auto& res = Tokenize("/*comment1\ncomment1*/\n\n\n/*comment2\ncomment2*/", tokens, { false, true }); + CHECK(res.IsSuccessful + && tokens.size() == 3 + && tokens[0].Type == TokenType::Comment + && tokens[0].Lexeme == "/*comment1\ncomment1*/" + && tokens[1].Type == TokenType::Comment + && tokens[1].Lexeme == "/*comment2\ncomment2*/" + && tokens[2].Type == TokenType::Eof); +} + +void TestConsecutiveMultiLineCommentWithSpaceWithTokens() +{ + IPLVector tokens; + const auto& res = Tokenize("//comment1\n/*comment2\ncomment2*/\n\n\n/*comment3\ncomment3*/", tokens, { true, true }); + CHECK(res.IsSuccessful + && tokens.size() == 6 + && tokens[0].Type == TokenType::Comment + && tokens[0].Lexeme == "//comment1" + && tokens[1].Type == TokenType::Whitespace + && tokens[1].Lexeme == "\n" + && tokens[2].Type == TokenType::Comment + && tokens[2].Lexeme == "/*comment2\ncomment2*/" + && tokens[3].Type == TokenType::Whitespace + && tokens[3].Lexeme == "\n\n\n" + && tokens[4].Type == TokenType::Comment + && tokens[4].Lexeme == "/*comment3\ncomment3*/" + && tokens[5].Type == TokenType::Eof); +} + +void TestCommentError() +{ + IPLVector tokens; + const auto& res = Tokenize(" aa\n /*", tokens); + CHECK(!res.IsSuccessful && res.Error.Row == 1 && res.Error.Column == 3); +} + +// Parser Tests +void TestParseUnaryExpr() +{ + IPLVector tokens; + Tokenize("function pesho() { var a = 0; return a; } var a = \"3\";", tokens); + + // TODO make actual test :D + auto expr = Parse(tokens); + ASTPrinter p(std::cout); + expr->Accept(p); + std::cout << "\n"; +} + +void TestHexNumber() +{ + IPLVector tokens; + const auto& res = Tokenize("0x10", tokens); + + CHECK(res.IsSuccessful && tokens[0].Type == TokenType::Number && tokens[0].Number == 16); +} + +void TestScientificNotationNumber() +{ + IPLVector tokens; + const auto& res = Tokenize("1e2", tokens); + + CHECK(res.IsSuccessful && tokens[0].Type == TokenType::Number && tokens[0].Number == 100); +} + +int main() +{ + EXECUTE_TEST(TestLess); + EXECUTE_TEST(TestNumber); + EXECUTE_TEST(TestNumberStartWithNine); + EXECUTE_TEST(TestNumberStartWithZero); + EXECUTE_TEST(TestString); + EXECUTE_TEST(TestSpaceNewLineSpace); + EXECUTE_TEST(TestStringSingleQuotedStrings); + EXECUTE_TEST(TestKeyWord); + EXECUTE_TEST(TestVariableDeclaration); + EXECUTE_TEST(TestWhiteSpaceTokens); + EXECUTE_TEST(TestSimpleComment); + EXECUTE_TEST(TestSimpleMultiLineComment); + EXECUTE_TEST(TestConsecutiveMultiLineComment); + EXECUTE_TEST(TestConsecutiveMultiLineCommentWithSpace); + EXECUTE_TEST(TestConsecutiveMultiLineCommentWithSpaceWithTokens); + EXECUTE_TEST(TestCommentError); + EXECUTE_TEST(TestHexNumber); + EXECUTE_TEST(TestScientificNotationNumber); + +#if defined(_WIN32) + std::system("pause"); +#endif + return 0; +} diff --git a/JSImpl/src/main.cpp b/JSImpl/src/main.cpp index 3cb3be5..5f2ce2b 100644 --- a/JSImpl/src/main.cpp +++ b/JSImpl/src/main.cpp @@ -3,202 +3,6 @@ #include "ASTPrinter.h" #include "ASTInterpreter.h" #include -#define LOG(msg) std::cout << msg << std::endl -#define EXECUTE_TEST(test) std::cout << #test << " "; test(); - -#define CHECK(cond) if (cond) {LOG("PASS");} else {LOG(#cond " FAIL");} - -// Lexer Tests -void TestLess() -{ - IPLVector tokens; - Tokenize("<", tokens); - - CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Less); -} - -void TestNumber() -{ - IPLVector tokens; - Tokenize("213434.24", tokens); - - CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Number && tokens[0].Number == 213434.24); -} - -void TestNumberStartWithNine() -{ - IPLVector tokens; - Tokenize("999", tokens); - CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Number && tokens[0].Number == 999); -} - -void TestNumberStartWithZero() -{ - IPLVector tokens; - Tokenize("0999", tokens); - CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::Number && tokens[0].Number == 999); -} - -void TestSpaceNewLineSpace() -{ - IPLVector tokens; - Tokenize(" \n var a = 4; ", tokens); - CHECK(tokens.size() == 6 && tokens[0].Type == TokenType::Var && - tokens[1].Type == TokenType::Identifier && - tokens[2].Type == TokenType::Equal && - tokens[3].Type == TokenType::Number && - tokens[4].Type == TokenType::Semicolon); -} - -void TestString() -{ - IPLVector tokens; - Tokenize("\"alabala\"", tokens); - CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::String && tokens[0].Lexeme == "\"alabala\""); -} - -void TestStringSingleQuotedStrings() -{ - IPLVector tokens; - Tokenize("'alabala'", tokens); - CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::String && tokens[0].Lexeme == "'alabala'"); -} - -void TestKeyWord() -{ - IPLVector tokens; - Tokenize("for", tokens); - CHECK(tokens.size() == 2 && tokens[0].Type == TokenType::For); -} - -void TestVariableDeclaration() -{ - IPLVector tokens; - Tokenize("var pesho = 10", tokens); - - CHECK(tokens.size() == 5 && tokens[0].Type == TokenType::Var - && tokens[1].Type == TokenType::Identifier - && tokens[2].Type == TokenType::Equal - && tokens[3].Type == TokenType::Number - && tokens[4].Type == TokenType::Eof); -} - -void TestStringError() -{ - IPLVector tokens; - const auto& res = Tokenize("\" aaaa", tokens); - CHECK(!res.IsSuccessful && res.Error.Row == 0 && res.Error.Column == 6); -} - -void TestWhiteSpaceTokens() -{ - IPLVector tokens; - const auto& res = Tokenize(" 1\n2 abc\n \n", tokens, { true, false }); - CHECK(res.IsSuccessful - && tokens.size() == 8 - && tokens[0].Type == TokenType::Whitespace - && tokens[0].Lexeme == " " - && tokens[1].Type == TokenType::Number - && tokens[1].Number == 1 - && tokens[2].Type == TokenType::Whitespace - && tokens[2].Lexeme == "\n" - && tokens[3].Type == TokenType::Number - && tokens[3].Number == 2 - && tokens[4].Type == TokenType::Whitespace - && tokens[4].Lexeme == " " - && tokens[5].Type == TokenType::Identifier - && tokens[5].Lexeme == "abc" - && tokens[6].Type == TokenType::Whitespace - && tokens[6].Lexeme == "\n \n" - && tokens[7].Type == TokenType::Eof); -} - -void TestSimpleComment() -{ - IPLVector tokens; - const auto& res = Tokenize("//comment", tokens, { false, true }); - CHECK(res.IsSuccessful - && tokens.size() == 2 - && tokens[0].Type == TokenType::Comment - && tokens[0].Lexeme == "//comment" - && tokens[1].Type == TokenType::Eof); -} - -void TestSimpleMultiLineComment() -{ - IPLVector tokens; - const auto& res = Tokenize("/*comment\ncomment*/", tokens, { false, true }); - CHECK(res.IsSuccessful - && tokens.size() == 2 - && tokens[0].Type == TokenType::Comment - && tokens[0].Lexeme == "/*comment\ncomment*/" - && tokens[1].Type == TokenType::Eof); -} - -void TestConsecutiveMultiLineComment() -{ - IPLVector tokens; - const auto& res = Tokenize("/*comment1\ncomment1*//*comment2\ncomment2*/", tokens, { false, true }); - CHECK(res.IsSuccessful - && tokens.size() == 3 - && tokens[0].Type == TokenType::Comment - && tokens[0].Lexeme == "/*comment1\ncomment1*/" - && tokens[1].Type == TokenType::Comment - && tokens[1].Lexeme == "/*comment2\ncomment2*/" - && tokens[2].Type == TokenType::Eof); -} - -void TestConsecutiveMultiLineCommentWithSpace() -{ - IPLVector tokens; - const auto& res = Tokenize("/*comment1\ncomment1*/\n\n\n/*comment2\ncomment2*/", tokens, { false, true }); - CHECK(res.IsSuccessful - && tokens.size() == 3 - && tokens[0].Type == TokenType::Comment - && tokens[0].Lexeme == "/*comment1\ncomment1*/" - && tokens[1].Type == TokenType::Comment - && tokens[1].Lexeme == "/*comment2\ncomment2*/" - && tokens[2].Type == TokenType::Eof); -} - -void TestConsecutiveMultiLineCommentWithSpaceWithTokens() -{ - IPLVector tokens; - const auto& res = Tokenize("//comment1\n/*comment2\ncomment2*/\n\n\n/*comment3\ncomment3*/", tokens, { true, true }); - CHECK(res.IsSuccessful - && tokens.size() == 6 - && tokens[0].Type == TokenType::Comment - && tokens[0].Lexeme == "//comment1" - && tokens[1].Type == TokenType::Whitespace - && tokens[1].Lexeme == "\n" - && tokens[2].Type == TokenType::Comment - && tokens[2].Lexeme == "/*comment2\ncomment2*/" - && tokens[3].Type == TokenType::Whitespace - && tokens[3].Lexeme == "\n\n\n" - && tokens[4].Type == TokenType::Comment - && tokens[4].Lexeme == "/*comment3\ncomment3*/" - && tokens[5].Type == TokenType::Eof); -} - -void TestCommentError() -{ - IPLVector tokens; - const auto& res = Tokenize(" aa\n /*", tokens); - CHECK(!res.IsSuccessful && res.Error.Row == 1 && res.Error.Column == 3); -} - -// Parser Tests -void TestParseUnaryExpr() -{ - IPLVector tokens; - Tokenize("function pesho() { var a = 0; return a; } var a = \"3\";", tokens); - - // TODO make actual test :D - auto expr = Parse(tokens); - ASTPrinter p(std::cout); - expr->Accept(p); - std::cout << "\n"; -} void RunParseCalc() { @@ -221,44 +25,9 @@ void RunParseCalc() std::cout << "S = " << i.ModifyVariable("s") << std::endl; } -void TestHexNumber() -{ - IPLVector tokens; - const auto& res = Tokenize("0x10", tokens); - - CHECK(res.IsSuccessful && tokens[0].Type == TokenType::Number && tokens[0].Number == 16); -} - -void TestScientificNotationNumber() -{ - IPLVector tokens; - const auto& res = Tokenize("1e2", tokens); - - CHECK(res.IsSuccessful && tokens[0].Type == TokenType::Number && tokens[0].Number == 100); -} - int main() { - EXECUTE_TEST(TestLess); - EXECUTE_TEST(TestNumber); - EXECUTE_TEST(TestNumberStartWithNine); - EXECUTE_TEST(TestNumberStartWithZero); - EXECUTE_TEST(TestString); - EXECUTE_TEST(TestSpaceNewLineSpace); - EXECUTE_TEST(TestStringSingleQuotedStrings); - EXECUTE_TEST(TestKeyWord); - EXECUTE_TEST(TestVariableDeclaration); - EXECUTE_TEST(TestWhiteSpaceTokens); - EXECUTE_TEST(TestSimpleComment); - EXECUTE_TEST(TestSimpleMultiLineComment); - EXECUTE_TEST(TestConsecutiveMultiLineComment); - EXECUTE_TEST(TestConsecutiveMultiLineCommentWithSpace); - EXECUTE_TEST(TestConsecutiveMultiLineCommentWithSpaceWithTokens); - EXECUTE_TEST(TestCommentError); - EXECUTE_TEST(TestHexNumber); - EXECUTE_TEST(TestScientificNotationNumber); - //TestParseUnaryExpr(); RunParseCalc(); #if defined(_WIN32) -- cgit v1.3.1-23-gd82d