213 lines
6.1 KiB
C++
213 lines
6.1 KiB
C++
/*
|
|
* TestParser.cpp
|
|
*
|
|
* Created on: Dec 22, 2012
|
|
* Author: att
|
|
*/
|
|
|
|
#include "TestParser.h"
|
|
|
|
TestParser::TestParser() {
|
|
|
|
|
|
}
|
|
|
|
TestParser::~TestParser() {
|
|
|
|
}
|
|
|
|
std::string TestParser::test_parsing_and_evaluating_logical_expressions()
|
|
{
|
|
std::string test_report = "";
|
|
std::vector<InputOutputPair> logical_inputs = prepare_logical_input();
|
|
Lexer lexer;
|
|
ContextManager context;
|
|
Parser parser(&context);
|
|
for(auto logical_case : logical_inputs)
|
|
{
|
|
auto tokens = lexer.parse_line(logical_case.first);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
SenchaObject value = parser.program->evaluate_last();
|
|
parser.erase_all();
|
|
muu_assert("Logical value isn't correct", value.truthy == logical_case.second);
|
|
}
|
|
return test_report;
|
|
}
|
|
|
|
std::string TestParser::test_changing_letters_in_string()
|
|
{
|
|
std::string test_report = "";
|
|
std::string preparations = "text = \"AlfaBetaGamma\";";
|
|
std::string changes = "text[0] = \"a\";";
|
|
changes += "text[4] = \"b\";";
|
|
changes += "text[8] = \"g\";";
|
|
changes += "text;";
|
|
|
|
ContextManager context_manager;
|
|
Parser parser(&context_manager);
|
|
Lexer lexer;
|
|
auto tokens = lexer.parse_line(preparations + changes);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
SenchaObject value = parser.program->execute();
|
|
//std::cout << value.repr() << std::endl;
|
|
muu_assert("Changed text isn't alfabetagamma", value.text == "alfabetagamma");
|
|
|
|
return test_report;
|
|
}
|
|
|
|
|
|
|
|
std::string TestParser::test_adding_new_function()
|
|
{
|
|
std::string test_report = "";
|
|
std::string function_declaration = "def print_hello(how_many_times) {";
|
|
function_declaration += " repeat(how_many_times) { print(\"Hello\");}";
|
|
|
|
ContextManager context_manager;
|
|
Parser parser(&context_manager);
|
|
Lexer lexer;
|
|
auto tokens = lexer.parse_line(function_declaration);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
|
|
muu_assert("Function couldn't be added", context_manager.get_top()->contains_function("print_hello"));
|
|
|
|
return test_report;
|
|
}
|
|
|
|
std::string TestParser::test_writing_and_accessing_array_elements()
|
|
{
|
|
std::string test_report = "";
|
|
std::string table_definition = "array data[4];";
|
|
table_definition += "data[0] = 3; data[1] = -88; data[2] = true; data[3] = 1.222;";
|
|
|
|
std::string data_access = "data[0];";
|
|
ContextManager context;
|
|
Parser parser(&context);
|
|
Lexer lexer;
|
|
auto tokens = lexer.parse_line(table_definition + data_access);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
SenchaObject value = parser.program->execute();
|
|
|
|
muu_assert("data[0] != 3", (value == SenchaObject(3)).truthy );
|
|
data_access = "data[1];";
|
|
tokens = lexer.parse_line(data_access);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
value = parser.program->execute();
|
|
muu_assert("data[1] != -88", (value == SenchaObject(-88)).truthy );
|
|
|
|
data_access = "data[2];";
|
|
tokens = lexer.parse_line(data_access);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
value = parser.program->execute();
|
|
muu_assert("data[2] != true", (value == SenchaObject(true)).truthy );
|
|
|
|
data_access = "data[3];";
|
|
tokens = lexer.parse_line(data_access);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
value = parser.program->execute();
|
|
muu_assert("data[3] != 1.222", (value == SenchaObject(1.222)).truthy );
|
|
|
|
|
|
return test_report;
|
|
}
|
|
|
|
std::string TestParser::test_calling_funtion()
|
|
{
|
|
std::string test_report = "";
|
|
Lexer lexer;
|
|
ContextManager context;
|
|
Parser parser(&context);
|
|
std::string call_max = " max(77, 12);";
|
|
std::string declarations = prepare_some_function_declarations();
|
|
auto tokens = lexer.parse_line( declarations + call_max);
|
|
parser.add_tokens(tokens);
|
|
parser.interpret();
|
|
auto value1 = parser.program->execute();
|
|
std::string call_multiply = " multiply_string(\"banana\", 3);";
|
|
muu_assert("function max doesn't work", value1.integer == 77);
|
|
|
|
parser.erase_all();
|
|
parser.add_tokens(lexer.parse_line(declarations + call_multiply));
|
|
parser.interpret();
|
|
auto value2 = parser.program->execute();
|
|
muu_assert("function multiply_string doesn't work", value2.text == "bananabananabanana");
|
|
return test_report;
|
|
}
|
|
|
|
std::string TestParser::prepare_some_function_declarations()
|
|
{
|
|
|
|
std::string how_long_declaration = "def how_long(some_text) {";
|
|
how_long_declaration += " return len(some_text);}";
|
|
|
|
|
|
std::string max_declaration = "def max(a, b) { ";
|
|
max_declaration += "if(a > b) { return a; }";
|
|
max_declaration += "else { return b;} }";
|
|
|
|
std::string min_declaration = "def min(a, b) { ";
|
|
min_declaration += "if(a < b) return a;";
|
|
min_declaration += "else return b; }";
|
|
|
|
std::string multiply_string_declaration = "def multiply_string(text, i) {";
|
|
multiply_string_declaration += "result = \"\"; ";
|
|
multiply_string_declaration += "repeat(i) { result = result + text; }";
|
|
multiply_string_declaration += " return result;} ";
|
|
|
|
|
|
return max_declaration + min_declaration + multiply_string_declaration;
|
|
}
|
|
|
|
|
|
std::vector<TestParser::InputOutputPair> TestParser::prepare_logical_input()
|
|
{
|
|
std::vector<InputOutputPair> logical_inputs;
|
|
logical_inputs.push_back(InputOutputPair("false and false", false));
|
|
logical_inputs.push_back(InputOutputPair("false and true", false));
|
|
logical_inputs.push_back(InputOutputPair("true and false", false));
|
|
logical_inputs.push_back(InputOutputPair("true and true", true));
|
|
logical_inputs.push_back(InputOutputPair("false or false", false));
|
|
logical_inputs.push_back(InputOutputPair("false or true", true));
|
|
logical_inputs.push_back(InputOutputPair("true or false", true));
|
|
logical_inputs.push_back(InputOutputPair("true or true", true));
|
|
logical_inputs.push_back(InputOutputPair("(true or false) and (true or false)", true));
|
|
logical_inputs.push_back(InputOutputPair("7 + 2 > 55 or 6-5 == 1", true));
|
|
|
|
return logical_inputs;
|
|
}
|
|
|
|
|
|
std::string TestParser::all_tests()
|
|
{
|
|
std::string test_report = "";
|
|
|
|
mu_run_test(test_parsing_and_evaluating_logical_expressions);
|
|
mu_run_test(test_calling_funtion);
|
|
mu_run_test(test_changing_letters_in_string);
|
|
//mu_run_test(test_adding_new_function);
|
|
mu_run_test(test_writing_and_accessing_array_elements);
|
|
|
|
return test_report;
|
|
}
|
|
|
|
/*TODO
|
|
* write test of evaluating logical expression
|
|
* possible input:
|
|
*
|
|
* some variable == "g" and other != "a"
|
|
*
|
|
* some easy expression like:
|
|
* if("aaa" != "bbb" and 2 < 5) {
|
|
>> print(1);
|
|
>> } else {
|
|
>> print(0);
|
|
>> }
|
|
*/
|