diff options
author | Christian <c@ethdev.com> | 2014-12-11 23:37:17 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2014-12-11 23:37:17 +0800 |
commit | 568babfb5fc90ba897015c777b403c64d400b126 (patch) | |
tree | 734132d85b8833119b818e1f76cc39a7bb8e6943 /solidityEndToEndTest.cpp | |
parent | 1d17d349797b9267f6d541c812b8eed3a6954977 (diff) | |
download | dexon-solidity-568babfb5fc90ba897015c777b403c64d400b126.tar.gz dexon-solidity-568babfb5fc90ba897015c777b403c64d400b126.tar.zst dexon-solidity-568babfb5fc90ba897015c777b403c64d400b126.zip |
Some (few) tests for the optimizer.
Diffstat (limited to 'solidityEndToEndTest.cpp')
-rw-r--r-- | solidityEndToEndTest.cpp | 121 |
1 files changed, 1 insertions, 120 deletions
diff --git a/solidityEndToEndTest.cpp b/solidityEndToEndTest.cpp index 3c2bb081..3c77492a 100644 --- a/solidityEndToEndTest.cpp +++ b/solidityEndToEndTest.cpp @@ -24,137 +24,18 @@ #include <string> #include <tuple> #include <boost/test/unit_test.hpp> -#include <libethereum/State.h> -#include <libethereum/Executive.h> -#include <libsolidity/CompilerStack.h> #include <libdevcrypto/SHA3.h> +#include <test/solidityExecutionFramework.h> using namespace std; namespace dev { -/// Provides additional overloads for toBigEndian to encode arguments and return values. -inline bytes toBigEndian(byte _value) { return bytes({_value}); } -inline bytes toBigEndian(bool _value) { return bytes({byte(_value)}); } - namespace solidity { namespace test { -class ExecutionFramework -{ -public: - ExecutionFramework() { g_logVerbosity = 0; } - - bytes const& compileAndRun(string const& _sourceCode, u256 const& _value = 0, string const& _contractName = "") - { - dev::solidity::CompilerStack compiler; - compiler.compile(_sourceCode); - bytes code = compiler.getBytecode(_contractName); - sendMessage(code, true, _value); - BOOST_REQUIRE(!m_output.empty()); - return m_output; - } - - bytes const& callContractFunction(byte _index, bytes const& _data = bytes(), u256 const& _value = 0) - { - sendMessage(bytes(1, _index) + _data, false, _value); - return m_output; - } - - template <class... Args> - bytes const& callContractFunction(byte _index, Args const&... _arguments) - { - return callContractFunction(_index, argsToBigEndian(_arguments...)); - } - - template <class CppFunction, class... Args> - void testSolidityAgainstCpp(byte _index, CppFunction const& _cppFunction, Args const&... _arguments) - { - bytes solidityResult = callContractFunction(_index, _arguments...); - bytes cppResult = callCppAndEncodeResult(_cppFunction, _arguments...); - BOOST_CHECK_MESSAGE(solidityResult == cppResult, "Computed values do not match." - "\nSolidity: " + toHex(solidityResult) + "\nC++: " + toHex(cppResult)); - } - - template <class CppFunction, class... Args> - void testSolidityAgainstCppOnRange(byte _index, CppFunction const& _cppFunction, - u256 const& _rangeStart, u256 const& _rangeEnd) - { - for (u256 argument = _rangeStart; argument < _rangeEnd; ++argument) - { - bytes solidityResult = callContractFunction(_index, argument); - bytes cppResult = callCppAndEncodeResult(_cppFunction, argument); - BOOST_CHECK_MESSAGE(solidityResult == cppResult, "Computed values do not match." - "\nSolidity: " + toHex(solidityResult) + "\nC++: " + toHex(cppResult) + - "\nArgument: " + toHex(toBigEndian(argument))); - } - } - -private: - template <class FirstArg, class... Args> - bytes argsToBigEndian(FirstArg const& _firstArg, Args const&... _followingArgs) const - { - return toBigEndian(_firstArg) + argsToBigEndian(_followingArgs...); - } - - bytes argsToBigEndian() const { return bytes(); } - - template <class CppFunction, class... Args> - auto callCppAndEncodeResult(CppFunction const& _cppFunction, Args const&... _arguments) - -> typename enable_if<is_void<decltype(_cppFunction(_arguments...))>::value, bytes>::type - { - _cppFunction(_arguments...); - return bytes(); - } - template <class CppFunction, class... Args> - auto callCppAndEncodeResult(CppFunction const& _cppFunction, Args const&... _arguments) - -> typename enable_if<!is_void<decltype(_cppFunction(_arguments...))>::value, bytes>::type - { - return toBigEndian(_cppFunction(_arguments...)); - } - - void sendMessage(bytes const& _data, bool _isCreation, u256 const& _value = 0) - { - m_state.addBalance(m_sender, _value); // just in case - eth::Executive executive(m_state); - eth::Transaction t = _isCreation ? eth::Transaction(_value, m_gasPrice, m_gas, _data, 0, KeyPair::create().sec()) - : eth::Transaction(_value, m_gasPrice, m_gas, m_contractAddress, _data, 0, KeyPair::create().sec()); - bytes transactionRLP = t.rlp(); - try - { - // this will throw since the transaction is invalid, but it should nevertheless store the transaction - executive.setup(&transactionRLP); - } - catch (...) {} - if (_isCreation) - { - BOOST_REQUIRE(!executive.create(m_sender, _value, m_gasPrice, m_gas, &_data, m_sender)); - m_contractAddress = executive.newAddress(); - BOOST_REQUIRE(m_contractAddress); - BOOST_REQUIRE(m_state.addressHasCode(m_contractAddress)); - } - else - { - BOOST_REQUIRE(m_state.addressHasCode(m_contractAddress)); - BOOST_REQUIRE(!executive.call(m_contractAddress, m_sender, _value, m_gasPrice, &_data, m_gas, m_sender)); - } - BOOST_REQUIRE(executive.go()); - m_state.noteSending(m_sender); - executive.finalize(); - m_output = executive.out().toVector(); - } - -protected: - Address m_sender; - Address m_contractAddress; - eth::State m_state; - u256 const m_gasPrice = 100 * eth::szabo; - u256 const m_gas = 1000000; - bytes m_output; -}; - BOOST_FIXTURE_TEST_SUITE(SolidityCompilerEndToEndTest, ExecutionFramework) BOOST_AUTO_TEST_CASE(smoke_test) |