From f95955990dbcc0187962c4b0d38979e778dc49b5 Mon Sep 17 00:00:00 2001 From: arhag Date: Thu, 29 Aug 2019 13:05:44 -0400 Subject: [PATCH 1/3] fix CHECK_ASSERT and CHECK_PRINT macros; fix bug in symbol::print; correct symbol_tests unit test --- libraries/eosiolib/core/eosio/symbol.hpp | 2 +- libraries/native/native/eosio/tester.hpp | 6 +++--- tests/unit/string_tests.cpp | 14 ++++++++------ tests/unit/symbol_tests.cpp | 10 ++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/libraries/eosiolib/core/eosio/symbol.hpp b/libraries/eosiolib/core/eosio/symbol.hpp index 6e1c180bd0..b9cb7704ae 100644 --- a/libraries/eosiolib/core/eosio/symbol.hpp +++ b/libraries/eosiolib/core/eosio/symbol.hpp @@ -302,7 +302,7 @@ namespace eosio { char buffer[7]; auto end = code().write_as_string( buffer, buffer + sizeof(buffer) ); if( buffer < end ) - ::eosio::print( buffer, (end-buffer) ); + printl( buffer, (end-buffer) ); } /** diff --git a/libraries/native/native/eosio/tester.hpp b/libraries/native/native/eosio/tester.hpp index 93a5e9e432..e824ef4a83 100644 --- a/libraries/native/native/eosio/tester.hpp +++ b/libraries/native/native/eosio/tester.hpp @@ -66,7 +66,7 @@ inline bool expect_print(bool check, const std::string& li, Pred&& pred, F&& fun if (!check) eosio::check(passed, std::string("error : wrong print message {"+li+"}").c_str()); if (!passed) - eosio::print("error : wrong print message9 {"+li+"}\n"); + eosio::print("error : wrong print message {"+li+"}\n"); silence_output(disable_out); return passed; } @@ -81,13 +81,13 @@ inline bool expect_print(bool check, const std::string& li, const char (&expecte } #define CHECK_ASSERT(...) \ - ___has_failed &= expect_assert(true, std::string(__FILE__)+":"+__func__+":"+(std::to_string(__LINE__)), __VA_ARGS__); + ___has_failed |= !expect_assert(true, std::string(__FILE__)+":"+__func__+":"+(std::to_string(__LINE__)), __VA_ARGS__); #define REQUIRE_ASSERT(...) \ expect_assert(false, std::string(__FILE__)+":"+__func__+":"+(std::to_string(__LINE__)), __VA_ARGS__); #define CHECK_PRINT(...) \ - ___has_failed &= expect_print(true, std::string(__FILE__)+":"+__func__+":"+(std::to_string(__LINE__)), __VA_ARGS__); + ___has_failed |= !expect_print(true, std::string(__FILE__)+":"+__func__+":"+(std::to_string(__LINE__)), __VA_ARGS__); #define REQUIRE_PRINT(...) \ expect_print(false, std::string(__FILE__)+":"+__func__+":"+(std::to_string(__LINE__)), __VA_ARGS__); diff --git a/tests/unit/string_tests.cpp b/tests/unit/string_tests.cpp index be72c44971..9bba025e24 100644 --- a/tests/unit/string_tests.cpp +++ b/tests/unit/string_tests.cpp @@ -15,8 +15,6 @@ using eosio::string; // Definitions found in `eosio.cdt/libraries/eosiolib/core/eosio/string.hpp` EOSIO_TEST_BEGIN(string_test) - silence_output(false); - //// template //// string(const char (&str)[N]) { @@ -1025,7 +1023,7 @@ EOSIO_TEST_BEGIN(string_test) CHECK_EQUAL( eostr.size(), 6 ) CHECK_EQUAL( eostr.capacity(), 12 ) CHECK_EQUAL( strcmp(eostr.c_str(), "0hello") , 0 ) - + eostr.insert(0, "h", 1); CHECK_EQUAL( eostr.size(), 7 ) CHECK_EQUAL( eostr.capacity(), 12 ) @@ -1494,11 +1492,15 @@ EOSIO_TEST_BEGIN(string_test) ds >> str; CHECK_EQUAL( cstr, str ) } - -silence_output(false); EOSIO_TEST_END -int main() { +int main(int argc, char* argv[]) { + bool verbose = false; + if( argc >= 2 && std::strcmp( argv[1], "-v" ) == 0 ) { + verbose = true; + } + silence_output(!verbose); + EOSIO_TEST(string_test) return has_failed(); } diff --git a/tests/unit/symbol_tests.cpp b/tests/unit/symbol_tests.cpp index 1b564da0f7..a5a363a243 100644 --- a/tests/unit/symbol_tests.cpp +++ b/tests/unit/symbol_tests.cpp @@ -192,12 +192,10 @@ EOSIO_TEST_BEGIN(symbol_type_test) // --------------------- // void print(bool)const - // Note: - // This function prints the length of the symbol at the very end - CHECK_PRINT( "0,A1", [&](){symbol{"A", 0}.print(true);} ); - CHECK_PRINT( "0,Z1", [&](){symbol{"Z", 0}.print(true);} ); - CHECK_PRINT( "255,AAAAAAA7", [&](){symbol{"AAAAAAA", 255}.print(true);} ); - CHECK_PRINT( "255,ZZZZZZZ7", [&](){symbol{"ZZZZZZZ", 255}.print(true);} ); + CHECK_PRINT( "0,A", [&](){symbol{"A", 0}.print(true);} ); + CHECK_PRINT( "0,Z", [&](){symbol{"Z", 0}.print(true);} ); + CHECK_PRINT( "255,AAAAAAA", [&](){symbol{"AAAAAAA", 255}.print(true);} ); + CHECK_PRINT( "255,ZZZZZZZ", [&](){symbol{"ZZZZZZZ", 255}.print(true);} ); // -------------------------------------------------------------- // friend constexpr bool operator==(const symbol&, const symbol&) From 2094ca6929aa8156e8a3d2dd974b96d6f161c0e4 Mon Sep 17 00:00:00 2001 From: johndebord Date: Fri, 6 Sep 2019 17:16:41 -0400 Subject: [PATCH 2/3] Fix bugs brought to light in `string.hpp` after `tester.hpp` changes --- libraries/eosiolib/core/eosio/string.hpp | 9 ++++++--- tests/unit/string_tests.cpp | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/libraries/eosiolib/core/eosio/string.hpp b/libraries/eosiolib/core/eosio/string.hpp index 85acda315a..d19a105559 100644 --- a/libraries/eosiolib/core/eosio/string.hpp +++ b/libraries/eosiolib/core/eosio/string.hpp @@ -22,10 +22,12 @@ namespace eosio { template constexpr string(const char (&str)[N]) : _size{N-1}, _capacity{_size}, _begin{str} - { } + { + } constexpr string() : _size{0}, _capacity{0}, _begin{""} - { } + { + } constexpr string(const char* str, const size_t n) : _size{n}, _capacity{_size*2} { char* begin{new char[_capacity]}; @@ -255,7 +257,7 @@ namespace eosio { void pop_back() { if (_size == 0) return; - --_size; + resize(--_size); } string substr(size_t pos = 0, size_t len = npos) const { @@ -319,6 +321,7 @@ namespace eosio { if (is_literal()) clone(_size, _capacity, std::get(_begin)); memmove(std::get(_begin).get()+pos+len, std::get(_begin).get(), len); + resize(_size); return *this; } diff --git a/tests/unit/string_tests.cpp b/tests/unit/string_tests.cpp index 9bba025e24..0863ae09be 100644 --- a/tests/unit/string_tests.cpp +++ b/tests/unit/string_tests.cpp @@ -354,7 +354,8 @@ EOSIO_TEST_BEGIN(string_test) CHECK_EQUAL( eostr.at(0), 'a' ) CHECK_EQUAL( eostr.at(5), 'f' ) - CHECK_ASSERT( "eostring::string::at", []() {eostr.at(6);} ) + CHECK_ASSERT( "eosio::string::at", []() {eostr.at(6);} ) + } //// const char& at(const size_t n) const @@ -363,7 +364,7 @@ EOSIO_TEST_BEGIN(string_test) CHECK_EQUAL( eostr.at(0), 'a' ) CHECK_EQUAL( eostr.at(5), 'f' ) - CHECK_ASSERT( "eostring::string::at const", []() {eostr.at(6);} ) + CHECK_ASSERT( "eosio::string::at const", []() {eostr.at(6);} ) } { @@ -794,7 +795,7 @@ EOSIO_TEST_BEGIN(string_test) { static const string eostr{"abcdef"}; static char str[7]{}; - CHECK_ASSERT( "eostring::string::copy", []() {eostr.copy(str, 1, eostr.size()+1);} ) + CHECK_ASSERT( "eosio::string::copy", []() {eostr.copy(str, 1, eostr.size()+1);} ) } //// string& insert(const size_t pos, const char* str) @@ -861,8 +862,8 @@ EOSIO_TEST_BEGIN(string_test) { static string eostr{"abcdefg"}; static const char* null_man{nullptr}; - CHECK_ASSERT( "eostring::string::insert", []() {eostr.insert(0, null_man, 1);} ) - CHECK_ASSERT( "eostring::string::insert", []() {eostr.insert(-1, "ooo", 1);} ) + CHECK_ASSERT( "eosio::string::insert", []() {eostr.insert(0, null_man, 1);} ) + CHECK_ASSERT( "eosio::string::insert", []() {eostr.insert(-1, "ooo", 1);} ) } //// string& insert(const size_t pos, const string& str) @@ -932,7 +933,7 @@ EOSIO_TEST_BEGIN(string_test) { static string eostr{"abcdefg"}; static const string str{"ooo"}; - CHECK_ASSERT( "eostring::string::insert", []() {eostr.insert(-1, str);} ) + CHECK_ASSERT( "eosio::string::insert", []() {eostr.insert(-1, str);} ) } { @@ -1014,7 +1015,7 @@ EOSIO_TEST_BEGIN(string_test) { static string eostr{"abcdefg"}; static string str{"ooo"}; - CHECK_ASSERT( "eostring::string::insert", []() {eostr.insert(-1, str);} ) + CHECK_ASSERT( "eosio::string::insert", []() {eostr.insert(-1, str);} ) } { // Bucky's test for bug he caught; PR #459. @@ -1117,7 +1118,7 @@ EOSIO_TEST_BEGIN(string_test) { static string eostr{"abcdefg"}; - CHECK_ASSERT( "eostring::string::erase", []() {eostr.erase(-1, 1);} ) + CHECK_ASSERT( "eosio::string::erase", []() {eostr.erase(-1, 1);} ) } { @@ -1230,7 +1231,7 @@ EOSIO_TEST_BEGIN(string_test) { static string eostr{"abcdefg"}; - CHECK_ASSERT( "eostring::string::erase", []() {eostr.erase(-1, 1);} ) + CHECK_ASSERT( "eosio::string::erase", []() {eostr.erase(-1, 1);} ) } //// string& append(const char* str) @@ -1255,7 +1256,7 @@ EOSIO_TEST_BEGIN(string_test) { static string eostr{"abcdefg"}; static const char* null_man{nullptr}; - CHECK_ASSERT( "eostring::string::append", []() {eostr.append(null_man);} ) + CHECK_ASSERT( "eosio::string::append", []() {eostr.append(null_man);} ) } //// string& append(const string& str) From fd37f01642c2c9301374b2f7dfe416a511f8417a Mon Sep 17 00:00:00 2001 From: johndebord Date: Fri, 6 Sep 2019 17:21:44 -0400 Subject: [PATCH 3/3] Stylistic changes --- libraries/eosiolib/core/eosio/string.hpp | 35 +++++++++++++++++++----- tests/unit/string_tests.cpp | 3 +- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/libraries/eosiolib/core/eosio/string.hpp b/libraries/eosiolib/core/eosio/string.hpp index d19a105559..cbb5c8e5c2 100644 --- a/libraries/eosiolib/core/eosio/string.hpp +++ b/libraries/eosiolib/core/eosio/string.hpp @@ -21,27 +21,42 @@ namespace eosio { static constexpr size_t npos = -1; template - constexpr string(const char (&str)[N]) : _size{N-1}, _capacity{_size}, _begin{str} + constexpr string(const char (&str)[N]) + : _size{N-1} + , _capacity{_size} + , _begin{str} { } - constexpr string() : _size{0}, _capacity{0}, _begin{""} + constexpr string() + : _size{0} + , _capacity{0} + , _begin{""} { } - constexpr string(const char* str, const size_t n) : _size{n}, _capacity{_size*2} { + constexpr string(const char* str, const size_t n) + : _size{n} + , _capacity{_size*2} + { char* begin{new char[_capacity]}; memcpy(begin, str, _size); _begin = begin; } - constexpr string(const size_t n, const char c) : _size{n}, _capacity{_size*2} { + constexpr string(const size_t n, const char c) + : _size{n} + , _capacity{_size*2} + { char* begin{new char[_capacity]}; memset(begin, c, _size); _begin = begin; } - constexpr string(const string& str, const size_t pos, const size_t n) : _size{n}, _capacity{_size*2} { + constexpr string(const string& str, const size_t pos, const size_t n) + : _size{n} + , _capacity{_size*2} + { if (n == string::npos || str._size < pos+n) { _size = str._size; _capacity = _size*2; @@ -50,14 +65,20 @@ namespace eosio { clone(_size, _capacity, str.data()+pos); } - constexpr string(const string& str) : _size{str._size}, _capacity{str._capacity} { + constexpr string(const string& str) + : _size{str._size} + , _capacity{str._capacity} + { if (str.is_literal()) _begin = std::get(str._begin); else clone(str._size, str._capacity, str.data()); } - constexpr string(string&& str) : _size{str._size}, _capacity{str._capacity} { + constexpr string(string&& str) + : _size{str._size} + , _capacity{str._capacity} + { if (str.is_literal()) _begin = std::get(str._begin); else diff --git a/tests/unit/string_tests.cpp b/tests/unit/string_tests.cpp index 0863ae09be..9bcda8a272 100644 --- a/tests/unit/string_tests.cpp +++ b/tests/unit/string_tests.cpp @@ -354,8 +354,7 @@ EOSIO_TEST_BEGIN(string_test) CHECK_EQUAL( eostr.at(0), 'a' ) CHECK_EQUAL( eostr.at(5), 'f' ) - CHECK_ASSERT( "eosio::string::at", []() {eostr.at(6);} ) - + CHECK_ASSERT( "eosio::string::at", []() {eostr.at(6);} ) } //// const char& at(const size_t n) const