diff --git a/src/backends/julia/CMakeLists.txt b/src/backends/julia/CMakeLists.txt index 8739ac84..c7d4dc25 100644 --- a/src/backends/julia/CMakeLists.txt +++ b/src/backends/julia/CMakeLists.txt @@ -1,16 +1,17 @@ add_subdirectory(juliaserver) +add_subdirectory(tests) set(JuliaBackend_SRCS juliabackend.cpp juliasession.cpp juliaexpression.cpp ) kconfig_add_kcfg_files(JuliaBackend_SRCS settings.kcfgc) ki18n_wrap_ui(JuliaBackend_SRCS settings.ui) add_backend(juliabackend ${JuliaBackend_SRCS}) target_link_libraries(cantor_juliabackend Qt5::DBus) install(FILES juliabackend.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR}) diff --git a/src/backends/julia/tests/CMakeLists.txt b/src/backends/julia/tests/CMakeLists.txt new file mode 100644 index 00000000..d26b7ec2 --- /dev/null +++ b/src/backends/julia/tests/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(testjulia testjulia.cpp) +target_link_libraries(testjulia ${QT_QTTEST_LIBRARY} cantorlibs cantortest) + +add_test(NAME testjulia COMMAND testjulia) diff --git a/src/backends/julia/tests/testjulia.cpp b/src/backends/julia/tests/testjulia.cpp new file mode 100644 index 00000000..9032b8d8 --- /dev/null +++ b/src/backends/julia/tests/testjulia.cpp @@ -0,0 +1,122 @@ +/* + * 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) 2016 Ivan Lakhtanov + */ +#include "testjulia.h" + +#include "session.h" +#include "backend.h" +#include "expression.h" +#include "result.h" +#include "textresult.h" + +QString TestJulia::backendName() +{ + return QLatin1String("julia"); +} + +void TestJulia::testOneLine() +{ + Cantor::Expression *e = evalExp(QLatin1String("2 + 3")); + QVERIFY(e != nullptr); + QCOMPARE(e->status(), Cantor::Expression::Done); + QVERIFY(e->result()->type() == Cantor::TextResult::Type); + QCOMPARE(e->result()->data().toString(), QLatin1String("5")); + QVERIFY(e->errorMessage().isEmpty()); +} + +void TestJulia::testOneLineWithPrint() +{ + Cantor::Expression *e = evalExp(QLatin1String("print(2 + 3)")); + QVERIFY(e != nullptr); + QCOMPARE(e->status(), Cantor::Expression::Done); + QVERIFY(e->result()->type() == Cantor::TextResult::Type); + QCOMPARE(e->result()->data().toString(), QLatin1String("5")); + QVERIFY(e->errorMessage().isEmpty()); +} + +void TestJulia::testException() +{ + Cantor::Expression *e = evalExp(QLatin1String("sqrt(-1)")); + QVERIFY(e != nullptr); + QCOMPARE(e->status(), Cantor::Expression::Error); + QVERIFY(e->result()->type() == Cantor::TextResult::Type); + QVERIFY( + not e->errorMessage().isEmpty() + and e->errorMessage().contains(QLatin1String( + "sqrt will only return a complex result if called with a " + "complex argument. Try sqrt(complex(x))." + )) + ); +} + +void TestJulia::testSyntaxError() +{ + Cantor::Expression *e = evalExp(QLatin1String("for i = 1:10\nprint(i)")); + QVERIFY(e != nullptr); + QCOMPARE(e->status(), Cantor::Expression::Error); + QVERIFY(e->result()->type() == Cantor::TextResult::Type); + QVERIFY( + not e->errorMessage().isEmpty() + and e->errorMessage().contains(QLatin1String( + "syntax: incomplete: \"for\" at none:1 requires end" + )) + ); +} + +void TestJulia::testMultilineCode() +{ + Cantor::Expression *e = evalExp(QLatin1String( + "q = 0; # comment\n" + "# sdfsdf\n" + "for i = 1:10\n" + " q += i\n" + "end\n" + "print(q)" + )); + QVERIFY(e != nullptr); + QCOMPARE(e->status(), Cantor::Expression::Done); + QVERIFY(e->result()->type() == Cantor::TextResult::Type); + QCOMPARE(e->result()->data().toString(), QLatin1String("55")); + QVERIFY(e->errorMessage().isEmpty()); +} + +void TestJulia::testPartialResultOnException() +{ + Cantor::Expression *e = evalExp(QLatin1String( + "for i = 1:5\n" + " print(i)\n" + "end\n" + "sqrt(-1)\n" + )); + QVERIFY(e != nullptr); + QCOMPARE(e->status(), Cantor::Expression::Error); + QVERIFY(e->result()->type() == Cantor::TextResult::Type); + QCOMPARE(e->result()->data().toString(), QLatin1String("12345")); + QVERIFY( + not e->errorMessage().isEmpty() + and e->errorMessage().contains(QLatin1String( + "sqrt will only return a complex result if called with a " + "complex argument. Try sqrt(complex(x))." + )) + ); +} + +QTEST_MAIN(TestJulia) + +#include "testjulia.moc" diff --git a/src/backends/julia/tests/testjulia.h b/src/backends/julia/tests/testjulia.h new file mode 100644 index 00000000..7ed4a879 --- /dev/null +++ b/src/backends/julia/tests/testjulia.h @@ -0,0 +1,37 @@ +/* + * 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) 2016 Ivan Lakhtanov + */ +#pragma once + +#include + +class TestJulia: public BackendTest +{ + Q_OBJECT +private Q_SLOTS: + void testOneLine(); + void testOneLineWithPrint(); + void testException(); + void testMultilineCode(); + void testSyntaxError(); + void testPartialResultOnException(); + +private: + virtual QString backendName(); +};