From a4a959b1b1ac7221e568010a47648f41b2624d9d Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Thu, 5 Feb 2015 15:45:13 +0100 Subject: [PATCH 1/8] separated libnatspec --- CMakeLists.txt | 1 + libjsqrc/js.qrc | 1 - libnatspec/CMakeLists.txt | 33 ++++++ libnatspec/NatspecExpressionEvaluator.cpp | 58 ++++++++++ libnatspec/NatspecExpressionEvaluator.h | 35 ++++++ {libjsqrc => libnatspec}/natspec.js | 69 ++++++------ libnatspec/natspec.qrc | 5 + test/CMakeLists.txt | 1 + test/natspec.cpp | 124 ++++++++++++++++++++++ 9 files changed, 296 insertions(+), 31 deletions(-) create mode 100644 libnatspec/CMakeLists.txt create mode 100644 libnatspec/NatspecExpressionEvaluator.cpp create mode 100644 libnatspec/NatspecExpressionEvaluator.h rename {libjsqrc => libnatspec}/natspec.js (65%) create mode 100644 libnatspec/natspec.qrc create mode 100644 test/natspec.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bab77585..0a034b4f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,6 +164,7 @@ endif () if (NOT HEADLESS) + add_subdirectory(libnatspec) add_subdirectory(libjsqrc) add_subdirectory(libqwebthree) add_subdirectory(alethzero) diff --git a/libjsqrc/js.qrc b/libjsqrc/js.qrc index 50b5e098c..b23aa144d 100644 --- a/libjsqrc/js.qrc +++ b/libjsqrc/js.qrc @@ -3,6 +3,5 @@ bignumber.min.js setup.js ethereumjs/dist/ethereum.js - natspec.js diff --git a/libnatspec/CMakeLists.txt b/libnatspec/CMakeLists.txt new file mode 100644 index 000000000..e813d0221 --- /dev/null +++ b/libnatspec/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_policy(SET CMP0015 NEW) +# let cmake autolink dependencies on windows +cmake_policy(SET CMP0020 NEW) +# this policy was introduced in cmake 3.0 +# remove if, once 3.0 will be used on unix +if (${CMAKE_MAJOR_VERSION} GREATER 2) + cmake_policy(SET CMP0043 OLD) +endif() +set(CMAKE_AUTOMOC OFF) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +aux_source_directory(. SRC_LIST) + +include_directories(..) + +set(EXECUTABLE natspec) + +file(GLOB HEADERS "*.h") + +qt5_add_resources(NATSPECQRC natspec.qrc) + +if (ETH_STATIC) + add_library(${EXECUTABLE} STATIC ${RESOURCE_ADDED} ${SRC_LIST} ${HEADERS} ${NATSPECQRC}) +else() + add_library(${EXECUTABLE} SHARED ${RESOURCE_ADDED} ${SRC_LIST} ${HEADERS} ${NATSPECQRC}) +endif() + +target_link_libraries(${EXECUTABLE} Qt5::Core) +target_link_libraries(${EXECUTABLE} Qt5::Qml) +target_link_libraries(${EXECUTABLE} devcore) + +install( TARGETS ${EXECUTABLE} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) +install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) diff --git a/libnatspec/NatspecExpressionEvaluator.cpp b/libnatspec/NatspecExpressionEvaluator.cpp new file mode 100644 index 000000000..a5b3b9a34 --- /dev/null +++ b/libnatspec/NatspecExpressionEvaluator.cpp @@ -0,0 +1,58 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . + */ +/** @file NatspecExpressionEvaluator.cpp + * @author Marek Kotewicz + * @date 2015 + */ + +#include +#include +#include "NatspecExpressionEvaluator.h" + +using namespace std; +using namespace dev; + +static QString contentsOfQResource(string const& res) +{ + QFile file(QString::fromStdString(res)); + if (!file.open(QFile::ReadOnly)) + BOOST_THROW_EXCEPTION(FileError()); + QTextStream in(&file); + return in.readAll(); +} + +NatspecExpressionEvaluator::NatspecExpressionEvaluator(QString const& _abi, QString const& _method, QString const& _params) +{ + Q_INIT_RESOURCE(natspec); + QJSValue result = m_engine.evaluate(contentsOfQResource(":/natspec/natspec.js")); + if (result.isError()) + BOOST_THROW_EXCEPTION(FileError()); + + m_engine.evaluate("globals.abi = " + _abi); + m_engine.evaluate("globals.method = " + _method); + m_engine.evaluate("globals.params = " + _params); +} + +QString NatspecExpressionEvaluator::evalExpression(QString const& _expression) +{ + QJSValue result = m_engine.evaluate("evaluateExpression(\"" + _expression + "\")"); + if (result.isError()) + { + cerr << "Could not evaluate expression: " << _expression.toStdString() << ". result: " << result.toString().toStdString() << endl; + } + return result.toString(); +} diff --git a/libnatspec/NatspecExpressionEvaluator.h b/libnatspec/NatspecExpressionEvaluator.h new file mode 100644 index 000000000..91b0b9bf0 --- /dev/null +++ b/libnatspec/NatspecExpressionEvaluator.h @@ -0,0 +1,35 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . + */ +/** @file NatspecExpressionEvaluator.h + * @author Marek Kotewicz + * @date 2015 + */ + +#include +#include +#include + +class NatspecExpressionEvaluator +{ +public: + NatspecExpressionEvaluator(QString const& _abi = "[]", QString const& _method = "", QString const& _params = "[]"); + + QString evalExpression(QString const& _expression); + +private: + QJSEngine m_engine; +}; diff --git a/libjsqrc/natspec.js b/libnatspec/natspec.js similarity index 65% rename from libjsqrc/natspec.js rename to libnatspec/natspec.js index c8cf07496..ed30b5378 100644 --- a/libjsqrc/natspec.js +++ b/libnatspec/natspec.js @@ -2,13 +2,19 @@ /** * This plugin exposes 'evaluateExpression' method which should be used * to evaluate natspec description - * It should be reloaded each time we want to evaluate set of expressions - * Just because of security reasons - * TODO: make use of sync api (once it's finished) and remove unnecessary - * code from 'getContractMethods' - * TODO: unify method signature creation with abi.js (and make a separate method from it) */ +/// Object which should be used by NatspecExpressionEvaluator +/// abi - abi of the contract that will be used +/// method - name of the method that is called +/// params - input params of the method that will be called +var globals = { + abi: [], + method: "", + params: [] +}; + +/// Helper method /// Should be called to copy values from object to global context var copyToContext = function (obj, context) { var keys = Object.keys(obj); @@ -17,32 +23,38 @@ var copyToContext = function (obj, context) { }); } +/// Helper method +/// Should be called to get method with given name from the abi +/// @param contract's abi +/// @param name of the method that we are looking for +var getMethodWithName = function(abi, name) { + for (var i = 0; i < abi.length; i++) { + if (abi[i].name === name) { + return abi[i]; + } + } + //console.warn('could not find method with name: ' + name); + return undefined; +}; + /// Function called to get all contract's storage values /// @returns hashmap with contract properties which are used +/// TODO: check if this function will be used var getContractProperties = function (address, abi) { return {}; }; /// Function called to get all contract's methods /// @returns hashmap with used contract's methods +/// TODO: check if this function will be used var getContractMethods = function (address, abi) { - return web3.eth.contract(address, abi); -}; - -var getMethodWithName = function(abi, name) { - for (var i = 0; i < abi.length; i++) { - if (abi[i].name === name) { - return abi[i]; - } - } - console.warn('could not find method with name: ' + name); - return undefined; + //return web3.eth.contract(address, abi); // commented out web3 usage + return {}; }; /// Function called to get all contract method input variables /// @returns hashmap with all contract's method input variables -var getContractInputParams = function (abi, methodName, params) { - var method = getMethodWithName(abi, methodName); +var getMethodInputParams = function (method, params) { return method.inputs.reduce(function (acc, current, index) { acc[current.name] = params[index]; return acc; @@ -55,18 +67,15 @@ var getContractInputParams = function (abi, methodName, params) { var evaluateExpression = function (expression) { var self = this; - var abi = web3._currentContractAbi; - var address = web3._currentContractAddress; - var methodName = web3._currentContractMethodName; - var params = web3._currentContractMethodParams; - - var storage = getContractProperties(address, abi); - var methods = getContractMethods(address, abi); - var inputParams = getContractInputParams(abi, methodName, params); - - copyToContext(storage, self); - copyToContext(methods, self); - copyToContext(inputParams, self); + + //var storage = getContractProperties(address, abi); + //var methods = getContractMethods(address, abi); + + var method = getMethodWithName(globals.abi, globals.method); + if (method) { + var input = getMethodInputParams(method, globals.params); + copyToContext(input, self); + } // TODO: test if it is safe var evaluatedExpression = ""; diff --git a/libnatspec/natspec.qrc b/libnatspec/natspec.qrc new file mode 100644 index 000000000..db125974c --- /dev/null +++ b/libnatspec/natspec.qrc @@ -0,0 +1,5 @@ + + + natspec.js + + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 764bf928e..36876eea6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -22,6 +22,7 @@ target_link_libraries(testeth ethcore) target_link_libraries(testeth secp256k1) target_link_libraries(testeth solidity) target_link_libraries(testeth webthree) +target_link_libraries(testeth natspec) if (JSONRPC) target_link_libraries(testeth web3jsonrpc) diff --git a/test/natspec.cpp b/test/natspec.cpp new file mode 100644 index 000000000..9ce8e39c6 --- /dev/null +++ b/test/natspec.cpp @@ -0,0 +1,124 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . + */ +/** @file natspec.cpp + * @author Marek Kotewicz + * @date 2015 + */ + +#include +#include +#include + +using namespace std; + +BOOST_AUTO_TEST_SUITE(natspec) + +BOOST_AUTO_TEST_CASE(natspec_eval_function_exists) +{ + cnote << "testing existance of evaluateExpression function"; + + // given + NatspecExpressionEvaluator e; + + // when + string result = e.evalExpression("`typeof evaluateExpression`").toStdString(); + + // then + BOOST_CHECK_EQUAL(result, "function"); +} + +BOOST_AUTO_TEST_CASE(natspec_js_eval) +{ + cnote << "testing natspec basic eval"; + + // given + NatspecExpressionEvaluator e; + + // when + string result = e.evalExpression("`1 + 2`").toStdString(); + + // then + BOOST_CHECK_EQUAL(result, "3"); +} + +BOOST_AUTO_TEST_CASE(natspec_create_custom_function) +{ + cnote << "testing creation and usage of custom js function"; + + // given + NatspecExpressionEvaluator e; + + + // when + auto x = e.evalExpression("`test = function (x) { return x + 'ok'; }`"); // ommit var, make it global + string result = e.evalExpression("`test(5)`").toStdString(); + string result2 = e.evalExpression("`typeof test`").toStdString(); + + // then + BOOST_CHECK_EQUAL(result, "5ok"); + BOOST_CHECK_EQUAL(result2, "function"); +} + +BOOST_AUTO_TEST_CASE(natspec_js_eval_separated_expressions) +{ + cnote << "testing natspec evaluation of separated expresioons"; + + // given + NatspecExpressionEvaluator e; + + // when + string result = e.evalExpression("`x = 1` + `y = 2` will be equal `x + y`").toStdString(); + + // then + BOOST_CHECK_EQUAL(result, "1 + 2 will be equal 3"); +} + +BOOST_AUTO_TEST_CASE(natspec_js_eval_input_params) +{ + cnote << "testing natspec evaluation of input params"; + + // given + char const* abi = R"([ + { + "name": "f", + "constant": false, + "type": "function", + "inputs": [ + { + "name": "a", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "d", + "type": "uint256" + } + ] + } + ])"; + + NatspecExpressionEvaluator e(abi, "'f'", "[4]"); + + // when + string result = e.evalExpression("Will multiply `a` by 7 and return `a * 7`.").toStdString(); + + // then + BOOST_CHECK_EQUAL(result, "Will multiply 4 by 7 and return 28."); +} + +BOOST_AUTO_TEST_SUITE_END() From 2c93677d81664af1682168c21bd32144e0337f3d Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Thu, 5 Feb 2015 16:30:59 +0100 Subject: [PATCH 2/8] removed QNatspec... --- alethzero/CMakeLists.txt | 1 + alethzero/OurWebThreeStubServer.cpp | 30 ++--------------------------- alethzero/OurWebThreeStubServer.h | 16 --------------- 3 files changed, 3 insertions(+), 44 deletions(-) diff --git a/alethzero/CMakeLists.txt b/alethzero/CMakeLists.txt index 219a8cb99..9302743c7 100644 --- a/alethzero/CMakeLists.txt +++ b/alethzero/CMakeLists.txt @@ -47,6 +47,7 @@ target_link_libraries(${EXECUTABLE} evmcore) target_link_libraries(${EXECUTABLE} devcore) target_link_libraries(${EXECUTABLE} web3jsonrpc) target_link_libraries(${EXECUTABLE} jsqrc) +target_link_libraries(${EXECUTABLE} natspec) # eth_install_executable is defined in cmake/EthExecutableHelper.cmake eth_install_executable(${EXECUTABLE}) diff --git a/alethzero/OurWebThreeStubServer.cpp b/alethzero/OurWebThreeStubServer.cpp index 37d37bce1..02d7236df 100644 --- a/alethzero/OurWebThreeStubServer.cpp +++ b/alethzero/OurWebThreeStubServer.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "MainWin.h" @@ -84,36 +85,9 @@ bool OurWebThreeStubServer::authenticate(TransactionSkeleton const& _t) return showAuthenticationPopup("Unverified Pending Transaction", "An undocumented transaction is about to be executed."); - QNatspecExpressionEvaluator evaluator(this, m_main); + NatspecExpressionEvaluator evaluator; userNotice = evaluator.evalExpression(QString::fromStdString(userNotice)).toStdString(); // otherwise it's a transaction to a contract for which we have the natspec return showAuthenticationPopup("Pending Transaction", userNotice); } - -QNatspecExpressionEvaluator::QNatspecExpressionEvaluator(OurWebThreeStubServer* _server, Main* _main) -: m_server(_server), m_main(_main) -{} - -QNatspecExpressionEvaluator::~QNatspecExpressionEvaluator() -{} - -QString QNatspecExpressionEvaluator::evalExpression(QString const& _expression) const -{ - // load natspec.js only when we need it for natspec evaluation - m_main->evalRaw(contentsOfQResource(":/js/natspec.js")); - QVariant result = m_main->evalRaw("evaluateExpression('" + _expression + "')"); - if (result.type() == QVariant::Invalid) - { - cerr << "Could not evaluate natspec expression: \"" << _expression.toStdString() << "\"" << endl; - // return the expression unevaluated - return _expression; - } - return result.toString(); -} - - - - - - diff --git a/alethzero/OurWebThreeStubServer.h b/alethzero/OurWebThreeStubServer.h index 16981f9e1..303b73111 100644 --- a/alethzero/OurWebThreeStubServer.h +++ b/alethzero/OurWebThreeStubServer.h @@ -47,19 +47,3 @@ private: dev::WebThreeDirect* m_web3; Main* m_main; }; - - -class QNatspecExpressionEvaluator: public QObject -{ - Q_OBJECT - -public: - QNatspecExpressionEvaluator(OurWebThreeStubServer* _server, Main* _main); - virtual ~QNatspecExpressionEvaluator(); - - QString evalExpression(QString const& _expression) const; - -private: - OurWebThreeStubServer* m_server; - Main* m_main; -}; From 3fd2bf6b96ce20efbdbcdbf606519ff19a3b924d Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Thu, 5 Feb 2015 18:45:37 +0100 Subject: [PATCH 3/8] fixed natspec evaluator result on error --- libnatspec/NatspecExpressionEvaluator.cpp | 3 +- test/natspec.cpp | 51 ++++++++++++++--------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/libnatspec/NatspecExpressionEvaluator.cpp b/libnatspec/NatspecExpressionEvaluator.cpp index a5b3b9a34..e4536bffd 100644 --- a/libnatspec/NatspecExpressionEvaluator.cpp +++ b/libnatspec/NatspecExpressionEvaluator.cpp @@ -52,7 +52,8 @@ QString NatspecExpressionEvaluator::evalExpression(QString const& _expression) QJSValue result = m_engine.evaluate("evaluateExpression(\"" + _expression + "\")"); if (result.isError()) { - cerr << "Could not evaluate expression: " << _expression.toStdString() << ". result: " << result.toString().toStdString() << endl; + cerr << "Could not evaluate expression: \"" << _expression.toStdString() << "\"" << endl; + return _expression; } return result.toString(); } diff --git a/test/natspec.cpp b/test/natspec.cpp index 9ce8e39c6..73e70fc59 100644 --- a/test/natspec.cpp +++ b/test/natspec.cpp @@ -1,16 +1,16 @@ /* This file is part of cpp-ethereum. - + cpp-ethereum 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 3 of the License, or (at your option) any later version. - + cpp-ethereum 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 cpp-ethereum. If not, see . */ @@ -30,13 +30,13 @@ BOOST_AUTO_TEST_SUITE(natspec) BOOST_AUTO_TEST_CASE(natspec_eval_function_exists) { cnote << "testing existance of evaluateExpression function"; - + // given NatspecExpressionEvaluator e; - + // when string result = e.evalExpression("`typeof evaluateExpression`").toStdString(); - + // then BOOST_CHECK_EQUAL(result, "function"); } @@ -44,13 +44,13 @@ BOOST_AUTO_TEST_CASE(natspec_eval_function_exists) BOOST_AUTO_TEST_CASE(natspec_js_eval) { cnote << "testing natspec basic eval"; - + // given NatspecExpressionEvaluator e; - + // when string result = e.evalExpression("`1 + 2`").toStdString(); - + // then BOOST_CHECK_EQUAL(result, "3"); } @@ -58,16 +58,15 @@ BOOST_AUTO_TEST_CASE(natspec_js_eval) BOOST_AUTO_TEST_CASE(natspec_create_custom_function) { cnote << "testing creation and usage of custom js function"; - + // given NatspecExpressionEvaluator e; - - + // when auto x = e.evalExpression("`test = function (x) { return x + 'ok'; }`"); // ommit var, make it global string result = e.evalExpression("`test(5)`").toStdString(); string result2 = e.evalExpression("`typeof test`").toStdString(); - + // then BOOST_CHECK_EQUAL(result, "5ok"); BOOST_CHECK_EQUAL(result2, "function"); @@ -76,13 +75,13 @@ BOOST_AUTO_TEST_CASE(natspec_create_custom_function) BOOST_AUTO_TEST_CASE(natspec_js_eval_separated_expressions) { cnote << "testing natspec evaluation of separated expresioons"; - + // given NatspecExpressionEvaluator e; - + // when string result = e.evalExpression("`x = 1` + `y = 2` will be equal `x + y`").toStdString(); - + // then BOOST_CHECK_EQUAL(result, "1 + 2 will be equal 3"); } @@ -90,7 +89,7 @@ BOOST_AUTO_TEST_CASE(natspec_js_eval_separated_expressions) BOOST_AUTO_TEST_CASE(natspec_js_eval_input_params) { cnote << "testing natspec evaluation of input params"; - + // given char const* abi = R"([ { @@ -111,9 +110,9 @@ BOOST_AUTO_TEST_CASE(natspec_js_eval_input_params) ] } ])"; - + NatspecExpressionEvaluator e(abi, "'f'", "[4]"); - + // when string result = e.evalExpression("Will multiply `a` by 7 and return `a * 7`.").toStdString(); @@ -121,4 +120,18 @@ BOOST_AUTO_TEST_CASE(natspec_js_eval_input_params) BOOST_CHECK_EQUAL(result, "Will multiply 4 by 7 and return 28."); } +BOOST_AUTO_TEST_CASE(natspec_js_eval_error) +{ + cnote << "testing natspec evaluation of incorrect input"; + + // given + NatspecExpressionEvaluator e; + + // when + string result = e.evalExpression("`test(`").toStdString(); + + // then + BOOST_CHECK_EQUAL(result, "`test(`"); +} + BOOST_AUTO_TEST_SUITE_END() From 72465a81aea2466fd4a7be184308a138381d80d3 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Fri, 6 Feb 2015 13:32:29 +0100 Subject: [PATCH 4/8] fixed cmake rpath policy --- libnatspec/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libnatspec/CMakeLists.txt b/libnatspec/CMakeLists.txt index e813d0221..b5bd7903e 100644 --- a/libnatspec/CMakeLists.txt +++ b/libnatspec/CMakeLists.txt @@ -4,6 +4,8 @@ cmake_policy(SET CMP0020 NEW) # this policy was introduced in cmake 3.0 # remove if, once 3.0 will be used on unix if (${CMAKE_MAJOR_VERSION} GREATER 2) + # old policy do not use MACOSX_RPATH + cmake_policy(SET CMP0042 OLD) cmake_policy(SET CMP0043 OLD) endif() set(CMAKE_AUTOMOC OFF) From d23068984e17eaa6a4d596ea97bf1fea544c1a7e Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Fri, 6 Feb 2015 13:33:36 +0100 Subject: [PATCH 5/8] fixed underscore --- libnatspec/NatspecExpressionEvaluator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libnatspec/NatspecExpressionEvaluator.cpp b/libnatspec/NatspecExpressionEvaluator.cpp index e4536bffd..fd8369145 100644 --- a/libnatspec/NatspecExpressionEvaluator.cpp +++ b/libnatspec/NatspecExpressionEvaluator.cpp @@ -26,9 +26,9 @@ using namespace std; using namespace dev; -static QString contentsOfQResource(string const& res) +static QString contentsOfQResource(string const& _res) { - QFile file(QString::fromStdString(res)); + QFile file(QString::fromStdString(_res)); if (!file.open(QFile::ReadOnly)) BOOST_THROW_EXCEPTION(FileError()); QTextStream in(&file); From eca3a8df17742a725c8da0e05a2250b5a3210ad6 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Fri, 6 Feb 2015 13:38:28 +0100 Subject: [PATCH 6/8] removed output messages in tests && spaces --- test/natspec.cpp | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/test/natspec.cpp b/test/natspec.cpp index 73e70fc59..827f96625 100644 --- a/test/natspec.cpp +++ b/test/natspec.cpp @@ -29,44 +29,32 @@ BOOST_AUTO_TEST_SUITE(natspec) BOOST_AUTO_TEST_CASE(natspec_eval_function_exists) { - cnote << "testing existance of evaluateExpression function"; - // given NatspecExpressionEvaluator e; - // when string result = e.evalExpression("`typeof evaluateExpression`").toStdString(); - // then BOOST_CHECK_EQUAL(result, "function"); } BOOST_AUTO_TEST_CASE(natspec_js_eval) { - cnote << "testing natspec basic eval"; - // given NatspecExpressionEvaluator e; - // when string result = e.evalExpression("`1 + 2`").toStdString(); - // then BOOST_CHECK_EQUAL(result, "3"); } BOOST_AUTO_TEST_CASE(natspec_create_custom_function) { - cnote << "testing creation and usage of custom js function"; - // given NatspecExpressionEvaluator e; - // when auto x = e.evalExpression("`test = function (x) { return x + 'ok'; }`"); // ommit var, make it global string result = e.evalExpression("`test(5)`").toStdString(); string result2 = e.evalExpression("`typeof test`").toStdString(); - // then BOOST_CHECK_EQUAL(result, "5ok"); BOOST_CHECK_EQUAL(result2, "function"); @@ -74,22 +62,16 @@ BOOST_AUTO_TEST_CASE(natspec_create_custom_function) BOOST_AUTO_TEST_CASE(natspec_js_eval_separated_expressions) { - cnote << "testing natspec evaluation of separated expresioons"; - // given NatspecExpressionEvaluator e; - // when string result = e.evalExpression("`x = 1` + `y = 2` will be equal `x + y`").toStdString(); - // then BOOST_CHECK_EQUAL(result, "1 + 2 will be equal 3"); } BOOST_AUTO_TEST_CASE(natspec_js_eval_input_params) { - cnote << "testing natspec evaluation of input params"; - // given char const* abi = R"([ { @@ -110,26 +92,19 @@ BOOST_AUTO_TEST_CASE(natspec_js_eval_input_params) ] } ])"; - NatspecExpressionEvaluator e(abi, "'f'", "[4]"); - // when string result = e.evalExpression("Will multiply `a` by 7 and return `a * 7`.").toStdString(); - // then BOOST_CHECK_EQUAL(result, "Will multiply 4 by 7 and return 28."); } BOOST_AUTO_TEST_CASE(natspec_js_eval_error) { - cnote << "testing natspec evaluation of incorrect input"; - // given NatspecExpressionEvaluator e; - // when string result = e.evalExpression("`test(`").toStdString(); - // then BOOST_CHECK_EQUAL(result, "`test(`"); } From 9af20d0a5617cb517ef1af509d643d5b313e40ce Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Fri, 6 Feb 2015 14:32:32 +0100 Subject: [PATCH 7/8] NatspecExpressionEvaluator docs --- libnatspec/NatspecExpressionEvaluator.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libnatspec/NatspecExpressionEvaluator.h b/libnatspec/NatspecExpressionEvaluator.h index 91b0b9bf0..d49ab92ea 100644 --- a/libnatspec/NatspecExpressionEvaluator.h +++ b/libnatspec/NatspecExpressionEvaluator.h @@ -23,11 +23,25 @@ #include #include +/** + * Should be used to evaluate natspec expression. + * see test/natspec.cpp for natspec expression examples + */ class NatspecExpressionEvaluator { public: + /// Construct natspec expression evaluator + /// @params abi - contract's abi in json format, passed as string + /// @params method - name of the contract's method for which we evaluate the natspec. + /// If we want to use raw string, it should be passed with quotation marks eg. "\"helloWorld\"" + /// If we pass string "helloWorld", the value of the object with name "helloWorld" will be used + /// @params params - array of method input params, passed as string, objects in array should be + /// javascript valid objects NatspecExpressionEvaluator(QString const& _abi = "[]", QString const& _method = "", QString const& _params = "[]"); + /// Should be called to evaluate natspec expression + /// @params expression - natspec expression + /// @returns evaluated natspec expression if it was valid, otherwise original expression QString evalExpression(QString const& _expression); private: From 45796237ab0f43e6ca347a13c8302900884c8bf7 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Fri, 6 Feb 2015 17:12:25 +0100 Subject: [PATCH 8/8] @see --- libnatspec/NatspecExpressionEvaluator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libnatspec/NatspecExpressionEvaluator.h b/libnatspec/NatspecExpressionEvaluator.h index d49ab92ea..fc122084e 100644 --- a/libnatspec/NatspecExpressionEvaluator.h +++ b/libnatspec/NatspecExpressionEvaluator.h @@ -25,7 +25,7 @@ /** * Should be used to evaluate natspec expression. - * see test/natspec.cpp for natspec expression examples + * @see test/natspec.cpp for natspec expression examples */ class NatspecExpressionEvaluator {