diff options
author | chriseth <c@ethdev.com> | 2015-04-21 18:04:12 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2015-04-21 18:04:12 +0800 |
commit | ddbaa99056b10052f0539a0afdffab53cc941dab (patch) | |
tree | 24888094abc1918b779043512893d82b3251ed43 /libevmcore | |
parent | 8caf1f723ffe9c8592e995f6e82571fbe2185fd0 (diff) | |
parent | e375612a7ecbab9ad33a6a40df1c722a82e07630 (diff) | |
download | dexon-solidity-ddbaa99056b10052f0539a0afdffab53cc941dab.tar dexon-solidity-ddbaa99056b10052f0539a0afdffab53cc941dab.tar.gz dexon-solidity-ddbaa99056b10052f0539a0afdffab53cc941dab.tar.bz2 dexon-solidity-ddbaa99056b10052f0539a0afdffab53cc941dab.tar.lz dexon-solidity-ddbaa99056b10052f0539a0afdffab53cc941dab.tar.xz dexon-solidity-ddbaa99056b10052f0539a0afdffab53cc941dab.tar.zst dexon-solidity-ddbaa99056b10052f0539a0afdffab53cc941dab.zip |
Merge remote-tracking branch 'ethereum/develop' into sol_overloadingFunctions
Diffstat (limited to 'libevmcore')
-rw-r--r-- | libevmcore/Assembly.cpp | 124 | ||||
-rw-r--r-- | libevmcore/CMakeLists.txt | 5 |
2 files changed, 129 insertions, 0 deletions
diff --git a/libevmcore/Assembly.cpp b/libevmcore/Assembly.cpp new file mode 100644 index 00000000..fab260a9 --- /dev/null +++ b/libevmcore/Assembly.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 <http://www.gnu.org/licenses/>. +*/ +/** + * @author Lefteris Karapetsas <lefteris@ethdev.com> + * @date 2015 + * Unit tests for Assembly Items from evmcore/Assembly.h + */ + +#if ETH_SOLIDITY + +#include <string> +#include <iostream> +#include <boost/test/unit_test.hpp> +#include <libdevcore/Log.h> +#include <libevmcore/SourceLocation.h> +#include <libsolidity/Scanner.h> +#include <libsolidity/Parser.h> +#include <libsolidity/NameAndTypeResolver.h> +#include <libsolidity/Compiler.h> +#include <libsolidity/AST.h> +#include <libevmcore/Assembly.h> + +using namespace std; +using namespace dev::eth; + +namespace dev +{ +namespace solidity +{ +namespace test +{ + +namespace +{ + +eth::AssemblyItems compileContract(const string& _sourceCode) +{ + Parser parser; + ASTPointer<SourceUnit> sourceUnit; + BOOST_REQUIRE_NO_THROW(sourceUnit = parser.parse(make_shared<Scanner>(CharStream(_sourceCode)))); + NameAndTypeResolver resolver({}); + resolver.registerDeclarations(*sourceUnit); + for (ASTPointer<ASTNode> const& node: sourceUnit->getNodes()) + if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) + { + BOOST_REQUIRE_NO_THROW(resolver.resolveNamesAndTypes(*contract)); + } + for (ASTPointer<ASTNode> const& node: sourceUnit->getNodes()) + if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) + { + BOOST_REQUIRE_NO_THROW(resolver.checkTypeRequirements(*contract)); + } + for (ASTPointer<ASTNode> const& node: sourceUnit->getNodes()) + if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) + { + Compiler compiler; + compiler.compileContract(*contract, map<ContractDefinition const*, bytes const*>{}); + + return compiler.getRuntimeAssemblyItems(); + } + BOOST_FAIL("No contract found in source."); + return AssemblyItems(); +} + +void checkAssemblyLocations(AssemblyItems const& _items, vector<SourceLocation> const& _locations) +{ + BOOST_CHECK_EQUAL(_items.size(), _locations.size()); + for (size_t i = 0; i < min(_items.size(), _locations.size()); ++i) + { + BOOST_CHECK_MESSAGE( + _items[i].getLocation() == _locations[i], + "Location mismatch for assembly item " + to_string(i) + ". Found: " + + to_string(_items[i].getLocation().start) + "-" + + to_string(_items[i].getLocation().end) + ", expected: " + + to_string(_locations[i].start) + "-" + + to_string(_locations[i].end)); + } +} + +} // end anonymous namespace + +BOOST_AUTO_TEST_SUITE(Assembly) + +BOOST_AUTO_TEST_CASE(location_test) +{ + char const* sourceCode = R"( + contract test { + function f() returns (uint256 a) { + return 16; + } + } + )"; + shared_ptr<string const> n = make_shared<string>("source"); + AssemblyItems items = compileContract(sourceCode); + vector<SourceLocation> locations = + vector<SourceLocation>(11, SourceLocation(2, 75, n)) + + vector<SourceLocation>(12, SourceLocation(20, 72, n)) + + vector<SourceLocation>{SourceLocation(42, 51, n), SourceLocation(65, 67, n)} + + vector<SourceLocation>(4, SourceLocation(58, 67, n)) + + vector<SourceLocation>(3, SourceLocation(20, 72, n)); + checkAssemblyLocations(items, locations); +} + +BOOST_AUTO_TEST_SUITE_END() + +} +} +} // end namespaces + +#endif diff --git a/libevmcore/CMakeLists.txt b/libevmcore/CMakeLists.txt new file mode 100644 index 00000000..3ceda13b --- /dev/null +++ b/libevmcore/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_policy(SET CMP0015 NEW) + +aux_source_directory(. SRCS) + +add_sources(${SRCS}) |