diff --git a/src/backends/lua/CMakeLists.txt b/src/backends/lua/CMakeLists.txt --- a/src/backends/lua/CMakeLists.txt +++ b/src/backends/lua/CMakeLists.txt @@ -19,4 +19,15 @@ target_link_libraries(cantor_luabackend ${LUAJIT_LIBRARY}) +if(BUILD_TESTING) + add_executable( testlua testlua.cpp) + add_test(testlua testlua) + ecm_mark_as_test(testlua) + target_link_libraries( testlua + Qt5::Test + cantorlibs + cantortest + ) +endif(BUILD_TESTING) + install(FILES cantor_lua.knsrc DESTINATION ${KDE_INSTALL_CONFDIR} ) diff --git a/src/backends/lua/testlua.h b/src/backends/lua/testlua.h new file mode 100644 --- /dev/null +++ b/src/backends/lua/testlua.h @@ -0,0 +1,52 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + + --- + Copyright (C) 2018 Nikita Sirgienko + */ + +#ifndef _TESTLUA_H +#define _TESTLUA_H + +#include "backendtest.h" + +/** This class test some of the basic functions of the Lua backend + The different tests represent some general expressions for preventing possible future regression +**/ +class TestLua : public BackendTest +{ + Q_OBJECT + +private Q_SLOTS: + //tests evaluating a simple command + void testSimpleCommand(); + //tests a command, containing more than 1 line + void testMultilineCommand(); + //tests simple variable difinition + void testVariableDifinition(); + //tests a syntax error (not closing bracket) + void testInvalidSyntax(); + //tests if-else condition + void testIfElseCondition(); + //tests 'for' loop + void testForLoop(); + +private: + QString backendName() Q_DECL_OVERRIDE; +}; + +#endif /* _TESTLUA_H */ + diff --git a/src/backends/lua/testlua.cpp b/src/backends/lua/testlua.cpp new file mode 100644 --- /dev/null +++ b/src/backends/lua/testlua.cpp @@ -0,0 +1,113 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + + --- + Copyright (C) 2018 Nikita Sirgienko + */ + +#include "testlua.h" + +#include "session.h" +#include "backend.h" +#include "expression.h" +#include "result.h" +#include "imageresult.h" +#include "epsresult.h" + +#include "luaexpression.h" + +#include + +QString TestLua::backendName() +{ + return QLatin1String("lua"); +} + +void TestLua::testSimpleCommand() +{ + Cantor::Expression* e=evalExp( QLatin1String("print(2+2)\n") ); + + QVERIFY( e!=nullptr ); + QVERIFY( e->result()!=nullptr ); + + QCOMPARE( cleanOutput( e->result()->toHtml() ), QLatin1String("4") ); +} + +void TestLua::testMultilineCommand() +{ + Cantor::Expression* e=evalExp( QLatin1String("print(4+4); print(2-1)") ); + + QVERIFY( e!=nullptr ); + QVERIFY( e->result()!=nullptr ); + + QCOMPARE( cleanOutput(e->result()->toHtml()), QLatin1String("8\n1") ); +} + +void TestLua::testVariableDifinition() +{ + Cantor::Expression* e=evalExp( QLatin1String("num = 42; print(num)") ); + + QVERIFY( e!=nullptr ); + QVERIFY( e->result()!=nullptr ); + + QCOMPARE( cleanOutput(e->result()->toHtml()), QLatin1String("42") ); +} + +void TestLua::testInvalidSyntax() +{ + Cantor::Expression* e=evalExp( QLatin1String("2+2*+.") ); + + QVERIFY( e!=nullptr ); + QCOMPARE( e->status(), Cantor::Expression::Error ); +} + +void TestLua::testIfElseCondition() +{ + QSKIP("Skip, until problem with multiline input for lua backends not will be solved"); + QLatin1String cmd( + "if 12 > 50 then" + " print('true')" + "else" + " print('false')" + "end"); + + Cantor::Expression* e=evalExp(cmd); + + QVERIFY( e!=nullptr ); + QVERIFY( e->result()!=nullptr ); + + QCOMPARE( cleanOutput(e->result()->toHtml()), QLatin1String("false") ); +} + +void TestLua::testForLoop() +{ + QSKIP("Skip, until problem with multiline input for lua backends not will be solved"); + QLatin1String cmd( + "karlSum = 0""\n" + "for i = 1, 100 do""\n" + " karlSum = karlSum + i""\n" + "end""\n" + "print(karlSum)"); + + Cantor::Expression* e=evalExp(cmd); + + QVERIFY( e!=nullptr ); + QVERIFY( e->result()!=nullptr ); + + QCOMPARE( cleanOutput(e->result()->toHtml()), QLatin1String("5050") ); +} + +QTEST_MAIN( TestLua )