This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository protozero.
commit 515c9d9d3b0336edadc214357363a13d83846e38 Author: Bas Couwenberg <[email protected]> Date: Tue Dec 1 09:10:30 2015 +0100 Imported Upstream version 1.2.3 --- .gitattributes | 1 + .gitignore | 1 + CHANGELOG.md | 18 +++- Makefile | 2 +- README.md | 22 +++++ appveyor.yml | 12 +-- build-appveyor.bat | 79 +++++++++++++++++ build-local.bat | 29 +++++++ common.gypi | 52 ++---------- include/protozero/byteswap.hpp | 10 ++- include/protozero/config.hpp | 57 +++++++++++++ include/protozero/pbf_reader.hpp | 34 ++++---- include/protozero/pbf_writer.hpp | 13 +-- include/protozero/version.hpp | 4 +- protozero.gyp | 59 +++++-------- test/include/testcase.hpp | 2 +- test/t/basic/test_cases.cpp | 2 +- test/t/bool/test_cases.cpp | 16 ++-- test/t/bytes/test_cases.cpp | 14 ++-- test/t/complex/test_cases.cpp | 16 ++-- test/t/double/test_cases.cpp | 65 ++++++++------ test/t/endian/test_cases.cpp | 8 +- test/t/enum/test_cases.cpp | 4 +- test/t/fixed32/test_cases.cpp | 112 +++++++++++++------------ test/t/fixed64/test_cases.cpp | 65 ++++++++------ test/t/float/test_cases.cpp | 65 ++++++++------ test/t/int32/test_cases.cpp | 18 ++-- test/t/int64/test_cases.cpp | 16 ++-- test/t/message/test_cases.cpp | 10 +-- test/t/nested/test_cases.cpp | 4 +- test/t/repeated/test_cases.cpp | 10 +-- test/t/repeated_packed_bool/test_cases.cpp | 10 +-- test/t/repeated_packed_double/test_cases.cpp | 81 ++++++++++-------- test/t/repeated_packed_enum/test_cases.cpp | 10 +-- test/t/repeated_packed_fixed32/test_cases.cpp | 79 +++++++++-------- test/t/repeated_packed_fixed64/test_cases.cpp | 79 +++++++++-------- test/t/repeated_packed_float/test_cases.cpp | 81 ++++++++++-------- test/t/repeated_packed_int32/test_cases.cpp | 10 +-- test/t/repeated_packed_int64/test_cases.cpp | 10 +-- test/t/repeated_packed_sfixed32/test_cases.cpp | 10 +-- test/t/repeated_packed_sfixed64/test_cases.cpp | 10 +-- test/t/repeated_packed_sint32/test_cases.cpp | 10 +-- test/t/repeated_packed_sint64/test_cases.cpp | 10 +-- test/t/repeated_packed_uint32/test_cases.cpp | 10 +-- test/t/repeated_packed_uint64/test_cases.cpp | 10 +-- test/t/sfixed32/test_cases.cpp | 10 +-- test/t/sfixed64/test_cases.cpp | 10 +-- test/t/sint32/test_cases.cpp | 14 ++-- test/t/sint64/test_cases.cpp | 14 ++-- test/t/skip/test_cases.cpp | 4 +- test/t/string/test_cases.cpp | 12 +-- test/t/uint32/test_cases.cpp | 10 +-- test/t/uint64/test_cases.cpp | 10 +-- test/t/vector_tile/test_cases.cpp | 8 +- test/tests.cpp | 2 +- tutorial.md | 4 +- 56 files changed, 786 insertions(+), 552 deletions(-) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3503e2c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pbf -text diff --git a/.gitignore b/.gitignore index ccd5ce5..68e1aeb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ deps *.sln *.suo *.vcxproj* +*.7z diff --git a/CHANGELOG.md b/CHANGELOG.md index 07f64bd..60bc829 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,26 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added +- Added `config.hpp` header which now includes all the macro magic to + configure the library for different architectures etc. + ### Changed ### Fixed +## [1.2.3] - 2015-11-30 + +### Added + +- Added `config.hpp` header which now includes all the macro magic to + configure the library for different architectures etc. + +### Fixed + +- Unaligned access to floats/doubles on some ARM architectures. + + ## [1.2.2] - 2015-10-13 ### Fixed @@ -48,7 +63,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Make pbf reader and writer code endianess-aware. -[unreleased]: https://github.com/osmcode/libosmium/compare/v1.2.2...HEAD +[unreleased]: https://github.com/osmcode/libosmium/compare/v1.2.3...HEAD +[1.2.3]: https://github.com/osmcode/libosmium/compare/v1.2.2...v1.2.3 [1.2.2]: https://github.com/osmcode/libosmium/compare/v1.2.1...v1.2.2 [1.2.1]: https://github.com/osmcode/libosmium/compare/v1.2.0...v1.2.1 [1.2.0]: https://github.com/osmcode/libosmium/compare/v1.1.0...v1.2.0 diff --git a/Makefile b/Makefile index 801897c..c760e0a 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ HPP_FILES := include/protozero/byteswap.hpp \ include/protozero/pbf_reader.hpp \ include/protozero/pbf_writer.hpp -CFLAGS_PROTOBUF := $(shell pkg-config protobuf --cflags) +CFLAGS_PROTOBUF := $(subst -I,-isystem ,$(shell pkg-config protobuf --cflags)) LDFLAGS_PROTOBUF := $(shell pkg-config protobuf --libs-only-L) all: ./test/tests test/writer_tests diff --git a/README.md b/README.md index 695442a..09bde83 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,28 @@ Call `make doc` to build the Doxygen documentation. (You'll need https://developers.google.com/protocol-buffers/docs/proto3#maps. +## Memory Alignment Issues and Endianness + +Protobuf-encoded data is not necessarily properly aligned for the machine we +are using. For single values this isn't a problem, because we copy those into +a properly aligned variable and return that one. But for repeated packed values +it can be a problem, because we give users access to them through an iterator. +To get the best performance this iterator is usually just a raw pointer. This +works fine on Intel processors, non-aligned access is just slower than aligned +access. On ARM this is not necessarily the case (depends on machine type and +compile options), so we need to go through a special iterator there +which makes sure to return aligned data on member access. Basically the same +iterator is used on big endian architectures to put the bytes in the correct +order before handing them back to the application. + +Detection of endianess and those architectures which have problems with +non-aligned data is not perfect. If tests fail for you, this might be a problem +in your setup. Please open an issue on Github in this case and tell us about +your system. + +See also the discussion on https://github.com/mapbox/protozero/issues/33 . + + ## Tests Extensive tests are included. Call diff --git a/appveyor.yml b/appveyor.yml index 4e13aa9..80988cd 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -os: Visual Studio 2015 RC +os: Visual Studio 2015 platform: - x64 @@ -9,15 +9,7 @@ configuration: - Release install: - - SET PATH=c:\python27;%PATH% - - SET PATH=C:\Program Files (x86)\MSBuild\14.0\bin\;%PATH% - - git clone --quiet --depth 1 https://chromium.googlesource.com/external/gyp.git deps/gyp - # note windows requires --generator-output to be absolute - - python deps/gyp/gyp_main.py protozero.gyp --depth=. -f msvs -G msvs_version=2015 - - set MSBUILD_PLATFORM=%platform% - - if "%MSBUILD_PLATFORM%" == "x86" set MSBUILD_PLATFORM=Win32 - - msbuild protozero.sln /nologo /p:Configuration=%configuration%;Platform=%MSBUILD_PLATFORM% - - .\%configuration%\tests.exe + - CALL build-appveyor.bat build: off test: off diff --git a/build-appveyor.bat b/build-appveyor.bat new file mode 100644 index 0000000..8cc7430 --- /dev/null +++ b/build-appveyor.bat @@ -0,0 +1,79 @@ +@ECHO OFF +SETLOCAL +SET EL=0 + +ECHO =========== %~f0 =========== + +ECHO platform^: %platform% +ECHO configuration^: %configuration% + +SET MSBUILD_VERBOSITY=normal +IF NOT "%1"=="" SET MSBUILD_VERBOSITY=%1 +ECHO MSBUILD_VERBOSITY^: %MSBUILD_VERBOSITY% + +SET PATH=C:\Program Files\7-Zip;%PATH% +SET PATH=c:\python27;%PATH% +SET PATH="C:\Program Files (x86)\MSBuild\14.0\bin";%PATH% +SET PATH=%~dp0deps\protobuf;%PATH% + +REM add unix style "find" to front of PATH +REM used to glob files in gyp +IF DEFINED APPVEYOR SET PATH=C:\Program Files\Git\usr\bin;%PATH% +IF NOT DEFINED APPVEYOR SET PATH=%GIT_INSTALL_ROOT%\bin;%PATH% +WHERE find + +IF EXIST %configuration% ECHO deleting %configuration% && RD /Q /S %configuration% +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +IF EXIST protozero.sln DEL protozero.sln +IF EXIST protozero.sdf DEL protozero.sdf +DEL *.vcxproj +DEL *.vcxproj.filters + +IF exist deps\gyp (ECHO gyp already cloned) ELSE (git clone --quiet --depth 1 https://chromium.googlesource.com/external/gyp.git deps/gyp) +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +SET protobuf_sdk=protozero-dep-protobuf-2.6.1.7z +IF EXIST %protobuf_sdk% (ECHO protobuf already downloaded) ELSE (ECHO downloading protobuf ... && powershell Invoke-WebRequest https://mapbox.s3.amazonaws.com/windows-builds/windows-build-deps/$env:protobuf_sdk -OutFile $pwd\$env:protobuf_sdk) +IF %ERRORLEVEL% NEQ 0 GOTO ERROR +IF EXIST deps\protobuf (ECHO protobuf already extracted) ELSE (CALL 7z x -y %protobuf_sdk% | %windir%\system32\FIND "ing archive") +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +FOR /F %%x in ('find test/ -name "testcase.proto"') DO "deps\protobuf\%platform%\%configuration%\protoc" --cpp_out=. %%x +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +REM note windows requires --generator-output to be absolute +python deps/gyp/gyp_main.py protozero.gyp --depth=. -f msvs -G msvs_version=2015 +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +SET MSBUILD_PLATFORM=%platform% +IF /I "%MSBUILD_PLATFORM%" == "x86" set MSBUILD_PLATFORM=Win32 + +msbuild protozero.sln ^ +/nologo ^ +/maxcpucount:%NUMBER_OF_PROCESSORS% ^ +/p:BuildInParellel=true ^ +/p:Configuration=%configuration%;Platform=%MSBUILD_PLATFORM% ^ +/verbosity:%MSBUILD_VERBOSITY% ^ +/consoleloggerparameters:Summary +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +ECHO running %configuration%\%platform%\tests.exe ... +%configuration%\%platform%\tests.exe +:: IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +ECHO running %configuration%\%platform%\writer_tests.exe ... +%configuration%\%platform%\writer_tests.exe +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +GOTO DONE + +:ERROR +ECHO ~~~~~~~~~ ERROR %~f0 ~~~~~~~~~~~ +SET EL=%ERRORLEVEL% +ECHO ERRORLEVEL^: %EL% + +:DONE + +ECHO DONE %~f0 %platform% %configuration% +EXIT /B %EL% diff --git a/build-local.bat b/build-local.bat new file mode 100644 index 0000000..62db254 --- /dev/null +++ b/build-local.bat @@ -0,0 +1,29 @@ +@ECHO OFF +SETLOCAL +SET EL=0 + +ECHO =========== %~f0 =========== + +SET VERBOSITY_MSBUILD=diagnostic +IF NOT "%1"=="" SET VERBOSITY_MSBUILD=%1 +SET platform=x64 +SET configuration=Release +CALL build-appveyor.bat %VERBOSITY_MSBUILD% +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +SET platform=x86 +SET configuration=Debug +CALL build-appveyor.bat %VERBOSITY_MSBUILD% +IF %ERRORLEVEL% NEQ 0 GOTO ERROR + +GOTO DONE + +:ERROR +ECHO =========== ERROR %~f0 =========== +ECHO ERRORLEVEL^: %ERRORLEVEL% +SET EL=%ERRORLEVEL% + +:DONE +ECHO =========== DONE %~f0 =========== + +EXIT /b %EL% diff --git a/common.gypi b/common.gypi index aa24ac6..2e329aa 100644 --- a/common.gypi +++ b/common.gypi @@ -3,11 +3,14 @@ ["OS=='win'", { "target_defaults": { "default_configuration": "Release_x64", - #"msbuild_toolset":"CTP_Nov2013", + "msvs_configuration_attributes": { + "OutputDirectory": "$(SolutionDir)$(Configuration)\\$(PlatformTarget)\\", + }, "msvs_settings": { "VCCLCompilerTool": { "ExceptionHandling": 1, # /EHsc - "RuntimeTypeInfo": "true" # /GR + "RuntimeTypeInfo": "true", # /GR + "ObjectFile": "$(SolutionDir)$(Configuration)\\$(PlatformTarget)\\%(RelativeDir)", } }, "configurations": { @@ -16,7 +19,7 @@ "defines": [ "DEBUG","_DEBUG"], "msvs_settings": { "VCCLCompilerTool": { - "RuntimeLibrary": "1", # static debug /MTd + "RuntimeLibrary": "3", #0:static release /MT, 1:static debug /MTd, 2:shared /MD, 3:shared debug /MDd "Optimization": 0, # /Od, no optimization "MinimalRebuild": "false", "OmitFramePointers": "false", @@ -25,24 +28,15 @@ } }, "Debug_x64": { + 'inherit_from': ['Debug_Win32'], "msvs_configuration_platform": "x64", - "defines": [ "DEBUG","_DEBUG"], - "msvs_settings": { - "VCCLCompilerTool": { - "RuntimeLibrary": "1", # static debug /MTd - "Optimization": 0, # /Od, no optimization - "MinimalRebuild": "false", - "OmitFramePointers": "false", - "BasicRuntimeChecks": 3 # /RTC1 - } - } }, "Release_Win32": { "msvs_configuration_platform": "Win32", "defines": [ "NDEBUG"], "msvs_settings": { "VCCLCompilerTool": { - "RuntimeLibrary": 0, # static release + "RuntimeLibrary": "2", #0:static release /MT, 1:static debug /MTd, 2:shared /MD, 3:shared debug /MDd "Optimization": 3, # /Ox, full optimization "FavorSizeOrSpeed": 1, # /Ot, favour speed over size "InlineFunctionExpansion": 2, # /Ob2, inline anything eligible @@ -70,36 +64,8 @@ } }, "Release_x64": { + 'inherit_from': ['Release_Win32'], "msvs_configuration_platform": "x64", - "defines": [ "NDEBUG"], - "msvs_settings": { - "VCCLCompilerTool": { - "RuntimeLibrary": 0, # static release - "Optimization": 3, # /Ox, full optimization - "FavorSizeOrSpeed": 1, # /Ot, favour speed over size - "InlineFunctionExpansion": 2, # /Ob2, inline anything eligible - "WholeProgramOptimization": "true", # /GL, whole program optimization, needed for LTCG - "OmitFramePointers": "true", - "EnableFunctionLevelLinking": "true", - "EnableIntrinsicFunctions": "true", - #"AdditionalOptions": [ - # "/MP", # compile across multiple CPUs - #], - "DebugInformationFormat": "0" - }, - "VCLibrarianTool": { - "AdditionalOptions": [ - "/LTCG" # link time code generation - ], - }, - "VCLinkerTool": { - "LinkTimeCodeGeneration": 1, # link-time code generation - "OptimizeReferences": 2, # /OPT:REF - "EnableCOMDATFolding": 2, # /OPT:ICF - "LinkIncremental": 1, # disable incremental linking - "GenerateDebugInformation": "false" - } - } } } } diff --git a/include/protozero/byteswap.hpp b/include/protozero/byteswap.hpp index 29c312a..a018c1c 100644 --- a/include/protozero/byteswap.hpp +++ b/include/protozero/byteswap.hpp @@ -19,6 +19,8 @@ documentation. #include <cstdint> #include <cassert> +#include <protozero/config.hpp> + namespace protozero { /** @@ -35,9 +37,9 @@ inline void byteswap(const char* /*data*/, char* /*result*/) { */ template <> inline void byteswap<4>(const char* data, char* result) { -# if defined(__GNUC__) || defined(__clang__) +#ifdef PROTOZERO_USE_BUILTIN_BSWAP *reinterpret_cast<uint32_t*>(result) = __builtin_bswap32(*reinterpret_cast<const uint32_t*>(data)); -# else +#else result[3] = data[0]; result[2] = data[1]; result[1] = data[2]; @@ -50,9 +52,9 @@ inline void byteswap<4>(const char* data, char* result) { */ template <> inline void byteswap<8>(const char* data, char* result) { -# if defined(__GNUC__) || defined(__clang__) +#ifdef PROTOZERO_USE_BUILTIN_BSWAP *reinterpret_cast<uint64_t*>(result) = __builtin_bswap64(*reinterpret_cast<const uint64_t*>(data)); -# else +#else result[7] = data[0]; result[6] = data[1]; result[5] = data[2]; diff --git a/include/protozero/config.hpp b/include/protozero/config.hpp new file mode 100644 index 0000000..4086994 --- /dev/null +++ b/include/protozero/config.hpp @@ -0,0 +1,57 @@ +#ifndef PROTOZERO_CONFIG_HPP +#define PROTOZERO_CONFIG_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +#include <cassert> + +/** + * @file config.hpp + * + * @brief Contains macro checks for different configurations. + */ + +#define PROTOZERO_LITTLE_ENDIAN 1234 +#define PROTOZERO_BIG_ENDIAN 4321 + +// Find out which byte order the machine has. +#if defined(__BYTE_ORDER) +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define PROTOZERO_BYTE_ORDER PROTOZERO_LITTLE_ENDIAN +# endif +# if (__BYTE_ORDER == __BIG_ENDIAN) +# define PROTOZERO_BYTE_ORDER PROTOZERO_BIG_ENDIAN +# endif +#else +// This probably isn't a very good default, but might do until we figure +// out something better. +# define PROTOZERO_BYTE_ORDER PROTOZERO_LITTLE_ENDIAN +#endif + +// On some ARM machines and depending on compiler settings access to unaligned +// floating point values will result in a SIGBUS. Do not use the bare pointers +// in this case. +#if PROTOZERO_BYTE_ORDER == PROTOZERO_LITTLE_ENDIAN +# if !defined(__arm__) && !defined(_M_ARM) +# define PROTOZERO_USE_BARE_POINTER_FOR_PACKED_FIXED +# endif +#endif + +// Check whether __builtin_bswap is available +#if defined(__GNUC__) || defined(__clang__) +# define PROTOZERO_USE_BUILTIN_BSWAP +#endif + +// Wrapper for assert() used for testing +#ifndef protozero_assert +# define protozero_assert(x) assert(x) +#endif + +#endif // PROTOZERO_CONFIG_HPP diff --git a/include/protozero/pbf_reader.hpp b/include/protozero/pbf_reader.hpp index ac3220c..aced901 100644 --- a/include/protozero/pbf_reader.hpp +++ b/include/protozero/pbf_reader.hpp @@ -16,7 +16,6 @@ documentation. * @brief Contains the pbf_reader class. */ -#include <cassert> #include <cstddef> #include <cstdint> #include <cstring> @@ -24,19 +23,15 @@ documentation. #include <string> #include <utility> -#include <protozero/pbf_types.hpp> +#include <protozero/config.hpp> #include <protozero/exception.hpp> +#include <protozero/pbf_types.hpp> #include <protozero/varint.hpp> -#if __BYTE_ORDER != __LITTLE_ENDIAN +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN # include <protozero/byteswap.hpp> #endif -/// Wrapper for assert() used for testing -#ifndef protozero_assert -# define protozero_assert(x) assert(x) -#endif - namespace protozero { /** @@ -77,19 +72,27 @@ class pbf_reader { // The tag of the current field. pbf_tag_type m_tag = 0; + // Copy N bytes from src to dest on little endian machines, on big endian + // swap the bytes in the process. + template <int N> + static void copy_or_byteswap(const char* src, void* dest) noexcept { +#if PROTOZERO_BYTE_ORDER == PROTOZERO_LITTLE_ENDIAN + memcpy(dest, src, N); +#else + byteswap<N>(src, reinterpret_cast<char*>(dest)); +#endif + } + template <typename T> inline T get_fixed() { T result; skip_bytes(sizeof(T)); -#if __BYTE_ORDER == __LITTLE_ENDIAN - memcpy(&result, m_data - sizeof(T), sizeof(T)); -#else - byteswap<sizeof(T)>(m_data - sizeof(T), reinterpret_cast<char*>(&result)); -#endif + copy_or_byteswap<sizeof(T)>(m_data - sizeof(T), &result); return result; } -#if __BYTE_ORDER == __LITTLE_ENDIAN +#ifdef PROTOZERO_USE_BARE_POINTER_FOR_PACKED_FIXED + template <typename T> inline std::pair<const T*, const T*> packed_fixed() { protozero_assert(tag() != 0 && "call next() before accessing field value"); @@ -128,7 +131,7 @@ class pbf_reader { T operator*() { T result; - byteswap<sizeof(T)>(m_data, reinterpret_cast<char*>(&result)); + copy_or_byteswap<sizeof(T)>(m_data , &result); return result; } @@ -161,6 +164,7 @@ class pbf_reader { return std::make_pair(const_fixed_iterator<T>(m_data-len, m_data), const_fixed_iterator<T>(m_data, m_data)); } + #endif template <typename T> inline T get_varint(); diff --git a/include/protozero/pbf_writer.hpp b/include/protozero/pbf_writer.hpp index e4e02de..2b78cb8 100644 --- a/include/protozero/pbf_writer.hpp +++ b/include/protozero/pbf_writer.hpp @@ -16,7 +16,6 @@ documentation. * @brief Contains the pbf_writer class. */ -#include <cassert> #include <cstddef> #include <cstdint> #include <cstring> @@ -24,18 +23,14 @@ documentation. #include <limits> #include <string> +#include <protozero/config.hpp> #include <protozero/pbf_types.hpp> #include <protozero/varint.hpp> -#if __BYTE_ORDER != __LITTLE_ENDIAN +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN # include <protozero/byteswap.hpp> #endif -/// Wrapper for assert() used for testing -#ifndef protozero_assert -# define protozero_assert(x) assert(x) -#endif - namespace protozero { /** @@ -71,7 +66,7 @@ class pbf_writer { inline void add_fixed(T value) { protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage"); protozero_assert(m_data); -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if PROTOZERO_BYTE_ORDER == PROTOZERO_LITTLE_ENDIAN m_data->append(reinterpret_cast<const char*>(&value), sizeof(T)); #else auto size = m_data->size(); @@ -380,7 +375,7 @@ public: inline void add_bytes(pbf_tag_type tag, const char* value, size_t size) { protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage"); protozero_assert(m_data); - assert(size <= std::numeric_limits<pbf_length_type>::max()); + protozero_assert(size <= std::numeric_limits<pbf_length_type>::max()); add_length_varint(tag, pbf_length_type(size)); m_data->append(value, size); } diff --git a/include/protozero/version.hpp b/include/protozero/version.hpp index f11d303..4f129ac 100644 --- a/include/protozero/version.hpp +++ b/include/protozero/version.hpp @@ -12,11 +12,11 @@ documentation. #define PROTOZERO_VERSION_MAJOR 1 #define PROTOZERO_VERSION_MINOR 2 -#define PROTOZERO_VERSION_PATCH 2 +#define PROTOZERO_VERSION_PATCH 3 #define PROTOZERO_VERSION_CODE (PROTOZERO_VERSION_MAJOR * 10000 + PROTOZERO_VERSION_MINOR * 100 + PROTOZERO_VERSION_PATCH) -#define PROTOZERO_VERSION_STRING "1.2.2" +#define PROTOZERO_VERSION_STRING "1.2.3" #endif // PROTOZERO_VERSION_HPP diff --git a/protozero.gyp b/protozero.gyp index 2fa8d0a..c2b4f36 100644 --- a/protozero.gyp +++ b/protozero.gyp @@ -7,45 +7,30 @@ "target_name": "tests", "type": "executable", "sources": [ - "test/tests.cpp", - "test/t/basic/test_cases.cpp", - "test/t/bool/test_cases.cpp", - "test/t/bytes/test_cases.cpp", - "test/t/complex/test_cases.cpp", - "test/t/double/test_cases.cpp", - "test/t/enum/test_cases.cpp", - "test/t/fixed32/test_cases.cpp", - "test/t/fixed64/test_cases.cpp", - "test/t/float/test_cases.cpp", - "test/t/int32/test_cases.cpp", - "test/t/int64/test_cases.cpp", - "test/t/message/test_cases.cpp", - "test/t/repeated/test_cases.cpp", - "test/t/repeated_packed_fixed32/test_cases.cpp", - "test/t/repeated_packed_fixed64/test_cases.cpp", - "test/t/repeated_packed_int32/test_cases.cpp", - "test/t/repeated_packed_int64/test_cases.cpp", - "test/t/repeated_packed_sfixed32/test_cases.cpp", - "test/t/repeated_packed_sfixed64/test_cases.cpp", - "test/t/repeated_packed_sint32/test_cases.cpp", - "test/t/repeated_packed_sint64/test_cases.cpp", - "test/t/repeated_packed_uint32/test_cases.cpp", - "test/t/repeated_packed_uint64/test_cases.cpp", - "test/t/sfixed32/test_cases.cpp", - "test/t/sfixed64/test_cases.cpp", - "test/t/sint32/test_cases.cpp", - "test/t/sint64/test_cases.cpp", - "test/t/skip/test_cases.cpp", - "test/t/string/test_cases.cpp", - "test/t/tags/test_cases.cpp", - "test/t/uint32/test_cases.cpp", - "test/t/uint64/test_cases.cpp", - "test/t/vector_tile/test_cases.cpp", - "test/t/zigzag/test_cases.cpp" + "<!@(find ./test/ -name '*.cpp' ! -name 'writer_tests.cpp' ! -name 'writer_test_cases.cpp' ! -name 'testcase.cpp')" ], "include_dirs": [ - "./include/", - "./test/include/" + "./include/", + "./test/include/" + ] + }, + { + "target_name": "writer_tests", + "type": "executable", + "sources": [ + "test/writer_tests.cpp", + "<!@(find ./test/ -name 'writer_test_cases.cpp')", + "<!@(find include/protozero/ -name '*.hpp' ! -name 'config.hpp' ! -name 'pbf_builder.hpp' ! -name 'pbf_message.hpp' ! -name 'version.hpp')", + "<!@(find ./test/ -name '*.pb.cc')", + ], + "include_dirs": [ + ".", + "./include/", + "./test/include/", + "./deps/protobuf/include" + ], + "libraries" : [ + "./deps/protobuf/$(PlatformTarget)/$(Configuration)/libprotobuf-lite.lib" ] } ] diff --git a/test/include/testcase.hpp b/test/include/testcase.hpp index 1005061..8df0584 100644 --- a/test/include/testcase.hpp +++ b/test/include/testcase.hpp @@ -11,7 +11,7 @@ std::string write_to_file(const T& msg, const char* filename) { std::string out; msg.SerializeToString(&out); - std::ofstream d(filename); + std::ofstream d(filename, std::ios_base::out|std::ios_base::binary); assert(d.is_open()); d << out; diff --git a/test/t/basic/test_cases.cpp b/test/t/basic/test_cases.cpp index ac3c7e3..a728810 100644 --- a/test/t/basic/test_cases.cpp +++ b/test/t/basic/test_cases.cpp @@ -12,7 +12,7 @@ TEST_CASE("basic") { } SECTION("empty buffer is okay") { - std::string buffer; + const std::string buffer; protozero::pbf_reader item(buffer); REQUIRE(item.length() == 0); diff --git a/test/t/bool/test_cases.cpp b/test/t/bool/test_cases.cpp index b73a8fd..9a4b0fe 100644 --- a/test/t/bool/test_cases.cpp +++ b/test/t/bool/test_cases.cpp @@ -12,7 +12,7 @@ enum class Test : protozero::pbf_tag_type { TEST_CASE("read bool field using pbf_reader") { SECTION("false") { - std::string buffer = load_data("bool/data-false"); + const std::string buffer = load_data("bool/data-false"); protozero::pbf_reader item(buffer); @@ -22,7 +22,7 @@ TEST_CASE("read bool field using pbf_reader") { } SECTION("true") { - std::string buffer = load_data("bool/data-true"); + const std::string buffer = load_data("bool/data-true"); protozero::pbf_reader item(buffer); @@ -32,7 +32,7 @@ TEST_CASE("read bool field using pbf_reader") { } SECTION("also true") { - std::string buffer = load_data("bool/data-also-true"); + const std::string buffer = load_data("bool/data-also-true"); protozero::pbf_reader item(buffer); @@ -42,7 +42,7 @@ TEST_CASE("read bool field using pbf_reader") { } SECTION("still true") { - std::string buffer = load_data("bool/data-still-true"); + const std::string buffer = load_data("bool/data-still-true"); protozero::pbf_reader item(buffer); @@ -56,7 +56,7 @@ TEST_CASE("read bool field using pbf_reader") { TEST_CASE("read bool field using pbf_message") { SECTION("false") { - std::string buffer = load_data("bool/data-false"); + const std::string buffer = load_data("bool/data-false"); protozero::pbf_message<TestBoolean::Test> item(buffer); @@ -66,7 +66,7 @@ TEST_CASE("read bool field using pbf_message") { } SECTION("true") { - std::string buffer = load_data("bool/data-true"); + const std::string buffer = load_data("bool/data-true"); protozero::pbf_message<TestBoolean::Test> item(buffer); @@ -76,7 +76,7 @@ TEST_CASE("read bool field using pbf_message") { } SECTION("also true") { - std::string buffer = load_data("bool/data-also-true"); + const std::string buffer = load_data("bool/data-also-true"); protozero::pbf_message<TestBoolean::Test> item(buffer); @@ -86,7 +86,7 @@ TEST_CASE("read bool field using pbf_message") { } SECTION("still true") { - std::string buffer = load_data("bool/data-still-true"); + const std::string buffer = load_data("bool/data-still-true"); protozero::pbf_message<TestBoolean::Test> item(buffer); diff --git a/test/t/bytes/test_cases.cpp b/test/t/bytes/test_cases.cpp index 57791f1..b335b26 100644 --- a/test/t/bytes/test_cases.cpp +++ b/test/t/bytes/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read bytes field") { SECTION("empty") { - std::string buffer = load_data("bytes/data-empty"); + const std::string buffer = load_data("bytes/data-empty"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read bytes field") { } SECTION("one") { - std::string buffer = load_data("bytes/data-one"); + const std::string buffer = load_data("bytes/data-one"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read bytes field") { } SECTION("string") { - std::string buffer = load_data("bytes/data-string"); + const std::string buffer = load_data("bytes/data-string"); protozero::pbf_reader item(buffer); @@ -34,12 +34,12 @@ TEST_CASE("read bytes field") { } SECTION("binary") { - std::string buffer = load_data("bytes/data-binary"); + const std::string buffer = load_data("bytes/data-binary"); protozero::pbf_reader item(buffer); REQUIRE(item.next()); - std::string data = item.get_string(); + const std::string data = item.get_string(); REQUIRE(data.size() == 3); REQUIRE(data[0] == char(1)); REQUIRE(data[1] == char(2)); @@ -48,9 +48,9 @@ TEST_CASE("read bytes field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("bytes/data-binary"); + const std::string buffer = load_data("bytes/data-binary"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_string(), protozero::end_of_buffer_exception); diff --git a/test/t/complex/test_cases.cpp b/test/t/complex/test_cases.cpp index ab1b60d..d00a605 100644 --- a/test/t/complex/test_cases.cpp +++ b/test/t/complex/test_cases.cpp @@ -22,7 +22,7 @@ enum class Sub : protozero::pbf_tag_type { TEST_CASE("read complex data using pbf_reader") { SECTION("minimal") { - std::string buffer = load_data("complex/data-minimal"); + const std::string buffer = load_data("complex/data-minimal"); protozero::pbf_reader item(buffer); @@ -48,7 +48,7 @@ TEST_CASE("read complex data using pbf_reader") { } SECTION("some") { - std::string buffer = load_data("complex/data-some"); + const std::string buffer = load_data("complex/data-some"); protozero::pbf_reader item(buffer); @@ -85,7 +85,7 @@ TEST_CASE("read complex data using pbf_reader") { } SECTION("all") { - std::string buffer = load_data("complex/data-all"); + const std::string buffer = load_data("complex/data-all"); protozero::pbf_reader item(buffer); @@ -140,7 +140,7 @@ TEST_CASE("read complex data using pbf_reader") { } SECTION("skip everything") { - std::string buffer = load_data("complex/data-all"); + const std::string buffer = load_data("complex/data-all"); protozero::pbf_reader item(buffer); @@ -168,7 +168,7 @@ TEST_CASE("read complex data using pbf_reader") { TEST_CASE("read complex data using pbf_message") { SECTION("minimal") { - std::string buffer = load_data("complex/data-minimal"); + const std::string buffer = load_data("complex/data-minimal"); protozero::pbf_message<TestComplex::Test> item(buffer); @@ -194,7 +194,7 @@ TEST_CASE("read complex data using pbf_message") { } SECTION("some") { - std::string buffer = load_data("complex/data-some"); + const std::string buffer = load_data("complex/data-some"); protozero::pbf_message<TestComplex::Test> item(buffer); @@ -231,7 +231,7 @@ TEST_CASE("read complex data using pbf_message") { } SECTION("all") { - std::string buffer = load_data("complex/data-all"); + const std::string buffer = load_data("complex/data-all"); protozero::pbf_message<TestComplex::Test> item(buffer); @@ -286,7 +286,7 @@ TEST_CASE("read complex data using pbf_message") { } SECTION("skip everything") { - std::string buffer = load_data("complex/data-all"); + const std::string buffer = load_data("complex/data-all"); protozero::pbf_message<TestComplex::Test> item(buffer); diff --git a/test/t/double/test_cases.cpp b/test/t/double/test_cases.cpp index b9e1eb3..301e34f 100644 --- a/test/t/double/test_cases.cpp +++ b/test/t/double/test_cases.cpp @@ -3,44 +3,55 @@ TEST_CASE("read double field") { - SECTION("zero") { - std::string buffer = load_data("double/data-zero"); + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the double will + // not be aligned properly. So we test that even in that case the double + // will be extracted properly. - protozero::pbf_reader item(buffer); + for (std::string::size_type n = 0; n < 2; ++n) { - REQUIRE(item.next()); - REQUIRE(item.get_double() == Approx(0.0)); - REQUIRE(!item.next()); - } + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - SECTION("positive") { - std::string buffer = load_data("double/data-pos"); + SECTION("zero") { + abuffer.append(load_data("double/data-zero")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - protozero::pbf_reader item(buffer); + REQUIRE(item.next()); + REQUIRE(item.get_double() == Approx(0.0)); + REQUIRE(!item.next()); + } - REQUIRE(item.next()); - REQUIRE(item.get_double() == Approx(4.893)); - REQUIRE(!item.next()); - } + SECTION("positive") { + abuffer.append(load_data("double/data-pos")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("negative") { - std::string buffer = load_data("double/data-neg"); + REQUIRE(item.next()); + REQUIRE(item.get_double() == Approx(4.893)); + REQUIRE(!item.next()); + } - protozero::pbf_reader item(buffer); + SECTION("negative") { + abuffer.append(load_data("double/data-neg")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - REQUIRE(item.get_double() == Approx(-9232.33)); - REQUIRE(!item.next()); - } + REQUIRE(item.next()); + REQUIRE(item.get_double() == Approx(-9232.33)); + REQUIRE(!item.next()); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("double/data-neg"); + SECTION("end_of_buffer") { + abuffer.append(load_data("double/data-neg")); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_double(), protozero::end_of_buffer_exception); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_double(), protozero::end_of_buffer_exception); + } } + } } diff --git a/test/t/endian/test_cases.cpp b/test/t/endian/test_cases.cpp index fc69879..146992d 100644 --- a/test/t/endian/test_cases.cpp +++ b/test/t/endian/test_cases.cpp @@ -1,13 +1,13 @@ #include <cstdint> -#include <protozero/byteswap.hpp> - #include <test.hpp> +#include <protozero/byteswap.hpp> + namespace { - int32_t check_swap_4(int32_t data) { + int32_t check_swap_4(const int32_t data) { int32_t swapped; int32_t back; @@ -17,7 +17,7 @@ namespace { return back; } - int64_t check_swap_8(int64_t data) { + int64_t check_swap_8(const int64_t data) { int64_t swapped; int64_t back; diff --git a/test/t/enum/test_cases.cpp b/test/t/enum/test_cases.cpp index 61aca39..3e92d70 100644 --- a/test/t/enum/test_cases.cpp +++ b/test/t/enum/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read enum field") { SECTION("zero") { - std::string buffer = load_data("enum/data-black"); + const std::string buffer = load_data("enum/data-black"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read enum field") { } SECTION("positive") { - std::string buffer = load_data("enum/data-blue"); + const std::string buffer = load_data("enum/data-blue"); protozero::pbf_reader item(buffer); diff --git a/test/t/fixed32/test_cases.cpp b/test/t/fixed32/test_cases.cpp index 2e56264..5892412 100644 --- a/test/t/fixed32/test_cases.cpp +++ b/test/t/fixed32/test_cases.cpp @@ -3,77 +3,85 @@ TEST_CASE("read fixed32 field") { - SECTION("zero") { - std::string buffer = load_data("fixed32/data-zero"); - - protozero::pbf_reader item(buffer); - - REQUIRE(item.next()); - REQUIRE(item.get_fixed32() == 0UL); - REQUIRE(!item.next()); - } + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the int32 will + // not be aligned properly. So we test that even in that case the int32 + // will be extracted properly. - SECTION("max-uint") { - std::string buffer = load_data("fixed32/data-max-uint"); + for (std::string::size_type n = 0; n < 2; ++n) { - protozero::pbf_reader item(buffer); + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - REQUIRE(item.next()); - REQUIRE(item.get_fixed32() == std::numeric_limits<uint32_t>::max()); - REQUIRE(!item.next()); - } + SECTION("zero") { + abuffer.append(load_data("fixed32/data-zero")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("min-uint") { - std::string buffer = load_data("fixed32/data-min-uint"); + REQUIRE(item.next()); + REQUIRE(item.get_fixed32() == 0UL); + REQUIRE(!item.next()); + } - protozero::pbf_reader item(buffer); + SECTION("max-uint") { + abuffer.append(load_data("fixed32/data-max-uint")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - REQUIRE(item.get_fixed32() == std::numeric_limits<uint32_t>::min()); - REQUIRE(!item.next()); - } + REQUIRE(item.next()); + REQUIRE(item.get_fixed32() == std::numeric_limits<uint32_t>::max()); + REQUIRE(!item.next()); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("fixed32/data-min-uint"); + SECTION("min-uint") { + abuffer.append(load_data("fixed32/data-min-uint")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_fixed32(), protozero::end_of_buffer_exception); + REQUIRE(item.get_fixed32() == std::numeric_limits<uint32_t>::min()); + REQUIRE(!item.next()); } - } - SECTION("check assert on varint/string access") { - std::string buffer = load_data("fixed32/data-zero"); + SECTION("end_of_buffer") { + abuffer.append(load_data("fixed32/data-min-uint")); - protozero::pbf_reader item(buffer); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_fixed32(), protozero::end_of_buffer_exception); + } + } - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_string(), assert_error); - } + SECTION("check assert on varint/string access") { + abuffer.append(load_data("fixed32/data-zero")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("assert detecting tag==0") { - std::string buffer = load_data("fixed32/data-zero"); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_string(), assert_error); + } - protozero::pbf_reader item(buffer); + SECTION("assert detecting tag==0") { + abuffer.append(load_data("fixed32/data-zero")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE_THROWS_AS(item.get_fixed32(), assert_error); - REQUIRE(item.next()); - REQUIRE(item.get_fixed32() == 0UL); - REQUIRE_THROWS(item.get_fixed32()); - REQUIRE(!item.next()); - } + REQUIRE_THROWS_AS(item.get_fixed32(), assert_error); + REQUIRE(item.next()); + REQUIRE(item.get_fixed32() == 0UL); + REQUIRE_THROWS(item.get_fixed32()); + REQUIRE(!item.next()); + } - SECTION("skip") { - std::string buffer = load_data("fixed32/data-zero"); + SECTION("skip") { + abuffer.append(load_data("fixed32/data-zero")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - protozero::pbf_reader item(buffer); + REQUIRE_THROWS_AS(item.skip(), assert_error); + REQUIRE(item.next()); + item.skip(); + REQUIRE_THROWS(item.skip()); + REQUIRE(!item.next()); + } - REQUIRE_THROWS_AS(item.skip(), assert_error); - REQUIRE(item.next()); - item.skip(); - REQUIRE_THROWS(item.skip()); - REQUIRE(!item.next()); } } diff --git a/test/t/fixed64/test_cases.cpp b/test/t/fixed64/test_cases.cpp index 9fbb1ef..8923507 100644 --- a/test/t/fixed64/test_cases.cpp +++ b/test/t/fixed64/test_cases.cpp @@ -3,44 +3,55 @@ TEST_CASE("read fixed64 field") { - SECTION("zero") { - std::string buffer = load_data("fixed64/data-zero"); + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the int64 will + // not be aligned properly. So we test that even in that case the int64 + // will be extracted properly. - protozero::pbf_reader item(buffer); + for (std::string::size_type n = 0; n < 2; ++n) { - REQUIRE(item.next()); - REQUIRE(item.get_fixed64() == 0ULL); - REQUIRE(!item.next()); - } + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - SECTION("max-uint") { - std::string buffer = load_data("fixed64/data-max-uint"); + SECTION("zero") { + abuffer.append(load_data("fixed64/data-zero")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - protozero::pbf_reader item(buffer); + REQUIRE(item.next()); + REQUIRE(item.get_fixed64() == 0ULL); + REQUIRE(!item.next()); + } - REQUIRE(item.next()); - REQUIRE(item.get_fixed64() == std::numeric_limits<uint64_t>::max()); - REQUIRE(!item.next()); - } + SECTION("max-uint") { + abuffer.append(load_data("fixed64/data-max-uint")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("min-uint") { - std::string buffer = load_data("fixed64/data-min-uint"); + REQUIRE(item.next()); + REQUIRE(item.get_fixed64() == std::numeric_limits<uint64_t>::max()); + REQUIRE(!item.next()); + } - protozero::pbf_reader item(buffer); + SECTION("min-uint") { + abuffer.append(load_data("fixed64/data-min-uint")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - REQUIRE(item.get_fixed64() == std::numeric_limits<uint64_t>::min()); - REQUIRE(!item.next()); - } + REQUIRE(item.next()); + REQUIRE(item.get_fixed64() == std::numeric_limits<uint64_t>::min()); + REQUIRE(!item.next()); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("fixed64/data-min-uint"); + SECTION("end_of_buffer") { + abuffer.append(load_data("fixed64/data-min-uint")); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_fixed64(), protozero::end_of_buffer_exception); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_fixed64(), protozero::end_of_buffer_exception); + } } + } } diff --git a/test/t/float/test_cases.cpp b/test/t/float/test_cases.cpp index 48721c1..96fd84c 100644 --- a/test/t/float/test_cases.cpp +++ b/test/t/float/test_cases.cpp @@ -3,44 +3,55 @@ TEST_CASE("read float field") { - SECTION("zero") { - std::string buffer = load_data("float/data-zero"); + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the float will + // not be aligned properly. So we test that even in that case the float + // will be extracted properly. - protozero::pbf_reader item(buffer); + for (std::string::size_type n = 0; n < 2; ++n) { - REQUIRE(item.next()); - REQUIRE(item.get_float() == Approx(0.0f)); - REQUIRE(!item.next()); - } + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - SECTION("positive") { - std::string buffer = load_data("float/data-pos"); + SECTION("zero") { + abuffer.append(load_data("float/data-zero")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - protozero::pbf_reader item(buffer); + REQUIRE(item.next()); + REQUIRE(item.get_float() == Approx(0.0f)); + REQUIRE(!item.next()); + } - REQUIRE(item.next()); - REQUIRE(item.get_float() == Approx(5.34f)); - REQUIRE(!item.next()); - } + SECTION("positive") { + abuffer.append(load_data("float/data-pos")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("negative") { - std::string buffer = load_data("float/data-neg"); + REQUIRE(item.next()); + REQUIRE(item.get_float() == Approx(5.34f)); + REQUIRE(!item.next()); + } - protozero::pbf_reader item(buffer); + SECTION("negative") { + abuffer.append(load_data("float/data-neg")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - REQUIRE(item.get_float() == Approx(-1.71f)); - REQUIRE(!item.next()); - } + REQUIRE(item.next()); + REQUIRE(item.get_float() == Approx(-1.71f)); + REQUIRE(!item.next()); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("float/data-neg"); + SECTION("end_of_buffer") { + abuffer.append(load_data("float/data-neg")); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_float(), protozero::end_of_buffer_exception); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_float(), protozero::end_of_buffer_exception); + } } + } } diff --git a/test/t/int32/test_cases.cpp b/test/t/int32/test_cases.cpp index 7af603d..04a83b3 100644 --- a/test/t/int32/test_cases.cpp +++ b/test/t/int32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read int32 field") { SECTION("zero") { - std::string buffer = load_data("int32/data-zero"); + const std::string buffer = load_data("int32/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read int32 field") { } SECTION("positive") { - std::string buffer = load_data("int32/data-pos"); + const std::string buffer = load_data("int32/data-pos"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read int32 field") { } SECTION("negative") { - std::string buffer = load_data("int32/data-neg"); + const std::string buffer = load_data("int32/data-neg"); protozero::pbf_reader item(buffer); @@ -34,7 +34,7 @@ TEST_CASE("read int32 field") { } SECTION("max") { - std::string buffer = load_data("int32/data-max"); + const std::string buffer = load_data("int32/data-max"); protozero::pbf_reader item(buffer); @@ -44,7 +44,7 @@ TEST_CASE("read int32 field") { } SECTION("min64") { - std::string buffer = load_data("int32/data-min"); + const std::string buffer = load_data("int32/data-min"); protozero::pbf_reader item(buffer); @@ -54,7 +54,7 @@ TEST_CASE("read int32 field") { } SECTION("min") { - std::string buffer = load_data("int32/data-min"); + const std::string buffer = load_data("int32/data-min"); protozero::pbf_reader item(buffer); @@ -64,9 +64,9 @@ TEST_CASE("read int32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("int32/data-min"); + const std::string buffer = load_data("int32/data-min"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_int32(), protozero::end_of_buffer_exception); @@ -74,7 +74,7 @@ TEST_CASE("read int32 field") { } SECTION("check assert on string/fixed int access") { - std::string buffer = load_data("int32/data-zero"); + const std::string buffer = load_data("int32/data-zero"); protozero::pbf_reader item(buffer); diff --git a/test/t/int64/test_cases.cpp b/test/t/int64/test_cases.cpp index cb815ac..0ee4060 100644 --- a/test/t/int64/test_cases.cpp +++ b/test/t/int64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read int64 field") { SECTION("zero") { - std::string buffer = load_data("int64/data-zero"); + const std::string buffer = load_data("int64/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read int64 field") { } SECTION("positive") { - std::string buffer = load_data("int64/data-pos"); + const std::string buffer = load_data("int64/data-pos"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read int64 field") { } SECTION("negative") { - std::string buffer = load_data("int64/data-neg"); + const std::string buffer = load_data("int64/data-neg"); protozero::pbf_reader item(buffer); @@ -34,7 +34,7 @@ TEST_CASE("read int64 field") { } SECTION("max") { - std::string buffer = load_data("int64/data-max"); + const std::string buffer = load_data("int64/data-max"); protozero::pbf_reader item(buffer); @@ -44,7 +44,7 @@ TEST_CASE("read int64 field") { } SECTION("min") { - std::string buffer = load_data("int64/data-min"); + const std::string buffer = load_data("int64/data-min"); protozero::pbf_reader item(buffer); @@ -54,9 +54,9 @@ TEST_CASE("read int64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("int64/data-min"); + const std::string buffer = load_data("int64/data-min"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_int64(), protozero::end_of_buffer_exception); @@ -64,7 +64,7 @@ TEST_CASE("read int64 field") { } SECTION("varint overflow") { - std::string buffer = load_data("int64/data-overflow"); + const std::string buffer = load_data("int64/data-overflow"); protozero::pbf_reader item(buffer); diff --git a/test/t/message/test_cases.cpp b/test/t/message/test_cases.cpp index ef92064..2298806 100644 --- a/test/t/message/test_cases.cpp +++ b/test/t/message/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read message field") { SECTION("string") { - std::string buffer = load_data("message/data-message"); + const std::string buffer = load_data("message/data-message"); protozero::pbf_reader item(buffer); @@ -18,9 +18,9 @@ TEST_CASE("read message field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("message/data-message"); + const std::string buffer = load_data("message/data-message"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_string(), protozero::end_of_buffer_exception); @@ -28,7 +28,7 @@ TEST_CASE("read message field") { } SECTION("optional contents of message - empty") { - std::string buffer = load_data("message/data-opt-empty"); + const std::string buffer = load_data("message/data-opt-empty"); protozero::pbf_reader item(buffer); @@ -36,7 +36,7 @@ TEST_CASE("read message field") { } SECTION("string") { - std::string buffer = load_data("message/data-opt-element"); + const std::string buffer = load_data("message/data-opt-element"); protozero::pbf_reader item(buffer); diff --git a/test/t/nested/test_cases.cpp b/test/t/nested/test_cases.cpp index bf74bc9..bfc4fdd 100644 --- a/test/t/nested/test_cases.cpp +++ b/test/t/nested/test_cases.cpp @@ -80,14 +80,14 @@ inline void check_empty(protozero::pbf_reader message) { TEST_CASE("read nested message fields") { SECTION("string") { - std::string buffer = load_data("nested/data-message"); + const std::string buffer = load_data("nested/data-message"); protozero::pbf_reader message(buffer); check(message); } SECTION("no submessage") { - std::string buffer = load_data("nested/data-no-message"); + const std::string buffer = load_data("nested/data-no-message"); protozero::pbf_reader message(buffer); check_empty(message); diff --git a/test/t/repeated/test_cases.cpp b/test/t/repeated/test_cases.cpp index 9a6148c..5671dbb 100644 --- a/test/t/repeated/test_cases.cpp +++ b/test/t/repeated/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated fields") { SECTION("empty") { - std::string buffer = load_data("repeated/data-empty"); + const std::string buffer = load_data("repeated/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated fields") { } SECTION("one") { - std::string buffer = load_data("repeated/data-one"); + const std::string buffer = load_data("repeated/data-one"); protozero::pbf_reader item(buffer); @@ -22,7 +22,7 @@ TEST_CASE("read repeated fields") { } SECTION("many") { - std::string buffer = load_data("repeated/data-many"); + const std::string buffer = load_data("repeated/data-many"); protozero::pbf_reader item(buffer); @@ -45,9 +45,9 @@ TEST_CASE("read repeated fields") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated/data-one"); + const std::string buffer = load_data("repeated/data-one"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_int32(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_bool/test_cases.cpp b/test/t/repeated_packed_bool/test_cases.cpp index 7d3424e..574d538 100644 --- a/test/t/repeated_packed_bool/test_cases.cpp +++ b/test/t/repeated_packed_bool/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed bool field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_bool/data-empty"); + const std::string buffer = load_data("repeated_packed_bool/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed bool field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_bool/data-one"); + const std::string buffer = load_data("repeated_packed_bool/data-one"); protozero::pbf_reader item(buffer); @@ -26,7 +26,7 @@ TEST_CASE("read repeated packed bool field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_bool/data-many"); + const std::string buffer = load_data("repeated_packed_bool/data-many"); protozero::pbf_reader item(buffer); @@ -44,9 +44,9 @@ TEST_CASE("read repeated packed bool field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_bool/data-many"); + const std::string buffer = load_data("repeated_packed_bool/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_bool(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_double/test_cases.cpp b/test/t/repeated_packed_double/test_cases.cpp index 7fc7c52..059d4b8 100644 --- a/test/t/repeated_packed_double/test_cases.cpp +++ b/test/t/repeated_packed_double/test_cases.cpp @@ -3,53 +3,64 @@ TEST_CASE("read repeated packed double field") { - SECTION("empty") { - std::string buffer = load_data("repeated_packed_double/data-empty"); - - protozero::pbf_reader item(buffer); + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the doubles will + // not be aligned properly. So we test that even in that case the doubles + // will be extracted properly. - REQUIRE(!item.next()); - } + for (std::string::size_type n = 0; n < 2; ++n) { - SECTION("one") { - std::string buffer = load_data("repeated_packed_double/data-one"); + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - protozero::pbf_reader item(buffer); + SECTION("empty") { + abuffer.append(load_data("repeated_packed_double/data-empty")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - auto it_pair = item.get_packed_double(); - REQUIRE(!item.next()); + REQUIRE(!item.next()); + } - REQUIRE(*it_pair.first == 17.34); - REQUIRE(++it_pair.first == it_pair.second); - } + SECTION("one") { + abuffer.append(load_data("repeated_packed_double/data-one")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("many") { - std::string buffer = load_data("repeated_packed_double/data-many"); + REQUIRE(item.next()); + auto it_pair = item.get_packed_double(); + REQUIRE(!item.next()); - protozero::pbf_reader item(buffer); + REQUIRE(*it_pair.first == 17.34); + REQUIRE(++it_pair.first == it_pair.second); + } - REQUIRE(item.next()); - auto it_pair = item.get_packed_double(); - REQUIRE(!item.next()); + SECTION("many") { + abuffer.append(load_data("repeated_packed_double/data-many")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - auto it = it_pair.first; - REQUIRE(*it++ == 17.34); - REQUIRE(*it++ == 0.0); - REQUIRE(*it++ == 1.0); - REQUIRE(*it++ == std::numeric_limits<double>::min()); - REQUIRE(*it++ == std::numeric_limits<double>::max()); - REQUIRE(it == it_pair.second); - } + REQUIRE(item.next()); + auto it_pair = item.get_packed_double(); + REQUIRE(!item.next()); + + auto it = it_pair.first; + REQUIRE(*it++ == 17.34); + REQUIRE(*it++ == 0.0); + REQUIRE(*it++ == 1.0); + REQUIRE(*it++ == std::numeric_limits<double>::min()); + REQUIRE(*it++ == std::numeric_limits<double>::max()); + REQUIRE(it == it_pair.second); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_double/data-many"); + SECTION("end_of_buffer") { + abuffer.append(load_data("repeated_packed_double/data-many")); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_packed_double(), protozero::end_of_buffer_exception); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_packed_double(), protozero::end_of_buffer_exception); + } } + } } diff --git a/test/t/repeated_packed_enum/test_cases.cpp b/test/t/repeated_packed_enum/test_cases.cpp index f475a94..be1473a 100644 --- a/test/t/repeated_packed_enum/test_cases.cpp +++ b/test/t/repeated_packed_enum/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed enum field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_enum/data-empty"); + const std::string buffer = load_data("repeated_packed_enum/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed enum field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_enum/data-one"); + const std::string buffer = load_data("repeated_packed_enum/data-one"); protozero::pbf_reader item(buffer); @@ -26,7 +26,7 @@ TEST_CASE("read repeated packed enum field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_enum/data-many"); + const std::string buffer = load_data("repeated_packed_enum/data-many"); protozero::pbf_reader item(buffer); @@ -43,9 +43,9 @@ TEST_CASE("read repeated packed enum field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_enum/data-many"); + const std::string buffer = load_data("repeated_packed_enum/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_enum(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_fixed32/test_cases.cpp b/test/t/repeated_packed_fixed32/test_cases.cpp index 266f310..4a02eec 100644 --- a/test/t/repeated_packed_fixed32/test_cases.cpp +++ b/test/t/repeated_packed_fixed32/test_cases.cpp @@ -3,52 +3,63 @@ TEST_CASE("read repeated packed fixed32 field") { - SECTION("empty") { - std::string buffer = load_data("repeated_packed_fixed32/data-empty"); - - protozero::pbf_reader item(buffer); + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the int32s will + // not be aligned properly. So we test that even in that case the int32s + // will be extracted properly. - REQUIRE(!item.next()); - } + for (std::string::size_type n = 0; n < 2; ++n) { - SECTION("one") { - std::string buffer = load_data("repeated_packed_fixed32/data-one"); + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - protozero::pbf_reader item(buffer); + SECTION("empty") { + abuffer.append(load_data("repeated_packed_fixed32/data-empty")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - auto it_pair = item.get_packed_fixed32(); - REQUIRE(!item.next()); + REQUIRE(!item.next()); + } - REQUIRE(*it_pair.first == 17UL); - REQUIRE(++it_pair.first == it_pair.second); - } + SECTION("one") { + abuffer.append(load_data("repeated_packed_fixed32/data-one")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("many") { - std::string buffer = load_data("repeated_packed_fixed32/data-many"); + REQUIRE(item.next()); + auto it_pair = item.get_packed_fixed32(); + REQUIRE(!item.next()); - protozero::pbf_reader item(buffer); + REQUIRE(*it_pair.first == 17UL); + REQUIRE(++it_pair.first == it_pair.second); + } - REQUIRE(item.next()); - auto it_pair = item.get_packed_fixed32(); - REQUIRE(!item.next()); + SECTION("many") { + abuffer.append(load_data("repeated_packed_fixed32/data-many")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - auto it = it_pair.first; - REQUIRE(*it++ == 17UL); - REQUIRE(*it++ == 0UL); - REQUIRE(*it++ == 1UL); - REQUIRE(*it++ == std::numeric_limits<uint32_t>::max()); - REQUIRE(it == it_pair.second); - } + REQUIRE(item.next()); + auto it_pair = item.get_packed_fixed32(); + REQUIRE(!item.next()); + + auto it = it_pair.first; + REQUIRE(*it++ == 17UL); + REQUIRE(*it++ == 0UL); + REQUIRE(*it++ == 1UL); + REQUIRE(*it++ == std::numeric_limits<uint32_t>::max()); + REQUIRE(it == it_pair.second); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_fixed32/data-many"); + SECTION("end_of_buffer") { + abuffer.append(load_data("repeated_packed_fixed32/data-many")); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_packed_fixed32(), protozero::end_of_buffer_exception); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_packed_fixed32(), protozero::end_of_buffer_exception); + } } + } } diff --git a/test/t/repeated_packed_fixed64/test_cases.cpp b/test/t/repeated_packed_fixed64/test_cases.cpp index 5bb59d5..97c14ad 100644 --- a/test/t/repeated_packed_fixed64/test_cases.cpp +++ b/test/t/repeated_packed_fixed64/test_cases.cpp @@ -3,52 +3,63 @@ TEST_CASE("read repeated packed fixed64 field") { - SECTION("empty") { - std::string buffer = load_data("repeated_packed_fixed64/data-empty"); - - protozero::pbf_reader item(buffer); + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the int64s will + // not be aligned properly. So we test that even in that case the int64s + // will be extracted properly. - REQUIRE(!item.next()); - } + for (std::string::size_type n = 0; n < 2; ++n) { - SECTION("one") { - std::string buffer = load_data("repeated_packed_fixed64/data-one"); + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - protozero::pbf_reader item(buffer); + SECTION("empty") { + abuffer.append(load_data("repeated_packed_fixed64/data-empty")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - auto it_pair = item.get_packed_fixed64(); - REQUIRE(!item.next()); + REQUIRE(!item.next()); + } - REQUIRE(*it_pair.first == 17ULL); - REQUIRE(++it_pair.first == it_pair.second); - } + SECTION("one") { + abuffer.append(load_data("repeated_packed_fixed64/data-one")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("many") { - std::string buffer = load_data("repeated_packed_fixed64/data-many"); + REQUIRE(item.next()); + auto it_pair = item.get_packed_fixed64(); + REQUIRE(!item.next()); - protozero::pbf_reader item(buffer); + REQUIRE(*it_pair.first == 17ULL); + REQUIRE(++it_pair.first == it_pair.second); + } - REQUIRE(item.next()); - auto it_pair = item.get_packed_fixed64(); - REQUIRE(!item.next()); + SECTION("many") { + abuffer.append(load_data("repeated_packed_fixed64/data-many")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - auto it = it_pair.first; - REQUIRE(*it++ == 17ULL); - REQUIRE(*it++ == 0ULL); - REQUIRE(*it++ == 1ULL); - REQUIRE(*it++ == std::numeric_limits<uint64_t>::max()); - REQUIRE(it == it_pair.second); - } + REQUIRE(item.next()); + auto it_pair = item.get_packed_fixed64(); + REQUIRE(!item.next()); + + auto it = it_pair.first; + REQUIRE(*it++ == 17ULL); + REQUIRE(*it++ == 0ULL); + REQUIRE(*it++ == 1ULL); + REQUIRE(*it++ == std::numeric_limits<uint64_t>::max()); + REQUIRE(it == it_pair.second); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_fixed64/data-many"); + SECTION("end_of_buffer") { + abuffer.append(load_data("repeated_packed_fixed64/data-many")); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_packed_fixed64(), protozero::end_of_buffer_exception); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_packed_fixed64(), protozero::end_of_buffer_exception); + } } + } } diff --git a/test/t/repeated_packed_float/test_cases.cpp b/test/t/repeated_packed_float/test_cases.cpp index ddbc5fa..9ae03eb 100644 --- a/test/t/repeated_packed_float/test_cases.cpp +++ b/test/t/repeated_packed_float/test_cases.cpp @@ -3,53 +3,64 @@ TEST_CASE("read repeated packed float field") { - SECTION("empty") { - std::string buffer = load_data("repeated_packed_float/data-empty"); - - protozero::pbf_reader item(buffer); + // Run these tests twice, the second time we basically move the data + // one byte down in the buffer. It doesn't matter how the data or buffer + // is aligned before that, in at least one of these cases the floats will + // not be aligned properly. So we test that even in that case the floats + // will be extracted properly. - REQUIRE(!item.next()); - } + for (std::string::size_type n = 0; n < 2; ++n) { - SECTION("one") { - std::string buffer = load_data("repeated_packed_float/data-one"); + std::string abuffer; + abuffer.reserve(1000); + abuffer.append(n, '\0'); - protozero::pbf_reader item(buffer); + SECTION("empty") { + abuffer.append(load_data("repeated_packed_float/data-empty")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - REQUIRE(item.next()); - auto it_pair = item.get_packed_float(); - REQUIRE(!item.next()); + REQUIRE(!item.next()); + } - REQUIRE(*it_pair.first == 17.34f); - REQUIRE(++it_pair.first == it_pair.second); - } + SECTION("one") { + abuffer.append(load_data("repeated_packed_float/data-one")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - SECTION("many") { - std::string buffer = load_data("repeated_packed_float/data-many"); + REQUIRE(item.next()); + auto it_pair = item.get_packed_float(); + REQUIRE(!item.next()); - protozero::pbf_reader item(buffer); + REQUIRE(*it_pair.first == 17.34f); + REQUIRE(++it_pair.first == it_pair.second); + } - REQUIRE(item.next()); - auto it_pair = item.get_packed_float(); - REQUIRE(!item.next()); + SECTION("many") { + abuffer.append(load_data("repeated_packed_float/data-many")); + protozero::pbf_reader item(abuffer.data() + n, abuffer.size() - n); - auto it = it_pair.first; - REQUIRE(*it++ == 17.34f); - REQUIRE(*it++ == 0.0f); - REQUIRE(*it++ == 1.0f); - REQUIRE(*it++ == std::numeric_limits<float>::min()); - REQUIRE(*it++ == std::numeric_limits<float>::max()); - REQUIRE(it == it_pair.second); - } + REQUIRE(item.next()); + auto it_pair = item.get_packed_float(); + REQUIRE(!item.next()); + + auto it = it_pair.first; + REQUIRE(*it++ == 17.34f); + REQUIRE(*it++ == 0.0f); + REQUIRE(*it++ == 1.0f); + REQUIRE(*it++ == std::numeric_limits<float>::min()); + REQUIRE(*it++ == std::numeric_limits<float>::max()); + REQUIRE(it == it_pair.second); + } - SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_float/data-many"); + SECTION("end_of_buffer") { + abuffer.append(load_data("repeated_packed_float/data-many")); - for (size_t i=1; i < buffer.size(); ++i) { - protozero::pbf_reader item(buffer.data(), i); - REQUIRE(item.next()); - REQUIRE_THROWS_AS(item.get_packed_float(), protozero::end_of_buffer_exception); + for (std::string::size_type i = 1; i < abuffer.size() - n; ++i) { + protozero::pbf_reader item(abuffer.data() + n, i); + REQUIRE(item.next()); + REQUIRE_THROWS_AS(item.get_packed_float(), protozero::end_of_buffer_exception); + } } + } } diff --git a/test/t/repeated_packed_int32/test_cases.cpp b/test/t/repeated_packed_int32/test_cases.cpp index dc369a2..e27cee9 100644 --- a/test/t/repeated_packed_int32/test_cases.cpp +++ b/test/t/repeated_packed_int32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed int32 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_int32/data-empty"); + const std::string buffer = load_data("repeated_packed_int32/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed int32 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_int32/data-one"); + const std::string buffer = load_data("repeated_packed_int32/data-one"); protozero::pbf_reader item(buffer); @@ -26,7 +26,7 @@ TEST_CASE("read repeated packed int32 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_int32/data-many"); + const std::string buffer = load_data("repeated_packed_int32/data-many"); protozero::pbf_reader item(buffer); @@ -46,9 +46,9 @@ TEST_CASE("read repeated packed int32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_int32/data-many"); + const std::string buffer = load_data("repeated_packed_int32/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_int32(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_int64/test_cases.cpp b/test/t/repeated_packed_int64/test_cases.cpp index 98dfb6a..9afda2a 100644 --- a/test/t/repeated_packed_int64/test_cases.cpp +++ b/test/t/repeated_packed_int64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed int64 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_int64/data-empty"); + const std::string buffer = load_data("repeated_packed_int64/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed int64 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_int64/data-one"); + const std::string buffer = load_data("repeated_packed_int64/data-one"); protozero::pbf_reader item(buffer); @@ -25,7 +25,7 @@ TEST_CASE("read repeated packed int64 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_int64/data-many"); + const std::string buffer = load_data("repeated_packed_int64/data-many"); protozero::pbf_reader item(buffer); @@ -44,9 +44,9 @@ TEST_CASE("read repeated packed int64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_int64/data-many"); + const std::string buffer = load_data("repeated_packed_int64/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_int64(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_sfixed32/test_cases.cpp b/test/t/repeated_packed_sfixed32/test_cases.cpp index 2ccf3cb..34ace54 100644 --- a/test/t/repeated_packed_sfixed32/test_cases.cpp +++ b/test/t/repeated_packed_sfixed32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed sfixed32 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_sfixed32/data-empty"); + const std::string buffer = load_data("repeated_packed_sfixed32/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed sfixed32 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_sfixed32/data-one"); + const std::string buffer = load_data("repeated_packed_sfixed32/data-one"); protozero::pbf_reader item(buffer); @@ -25,7 +25,7 @@ TEST_CASE("read repeated packed sfixed32 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_sfixed32/data-many"); + const std::string buffer = load_data("repeated_packed_sfixed32/data-many"); protozero::pbf_reader item(buffer); @@ -44,9 +44,9 @@ TEST_CASE("read repeated packed sfixed32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_sfixed32/data-many"); + const std::string buffer = load_data("repeated_packed_sfixed32/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_sfixed32(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_sfixed64/test_cases.cpp b/test/t/repeated_packed_sfixed64/test_cases.cpp index 08361b2..ecce063 100644 --- a/test/t/repeated_packed_sfixed64/test_cases.cpp +++ b/test/t/repeated_packed_sfixed64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed sfixed64 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_sfixed64/data-empty"); + const std::string buffer = load_data("repeated_packed_sfixed64/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed sfixed64 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_sfixed64/data-one"); + const std::string buffer = load_data("repeated_packed_sfixed64/data-one"); protozero::pbf_reader item(buffer); @@ -25,7 +25,7 @@ TEST_CASE("read repeated packed sfixed64 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_sfixed64/data-many"); + const std::string buffer = load_data("repeated_packed_sfixed64/data-many"); protozero::pbf_reader item(buffer); @@ -44,9 +44,9 @@ TEST_CASE("read repeated packed sfixed64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_sfixed64/data-many"); + const std::string buffer = load_data("repeated_packed_sfixed64/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_sfixed64(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_sint32/test_cases.cpp b/test/t/repeated_packed_sint32/test_cases.cpp index 23bbc41..c2e6c7f 100644 --- a/test/t/repeated_packed_sint32/test_cases.cpp +++ b/test/t/repeated_packed_sint32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed sint32 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_sint32/data-empty"); + const std::string buffer = load_data("repeated_packed_sint32/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed sint32 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_sint32/data-one"); + const std::string buffer = load_data("repeated_packed_sint32/data-one"); protozero::pbf_reader item(buffer); @@ -25,7 +25,7 @@ TEST_CASE("read repeated packed sint32 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_sint32/data-many"); + const std::string buffer = load_data("repeated_packed_sint32/data-many"); protozero::pbf_reader item(buffer); @@ -44,9 +44,9 @@ TEST_CASE("read repeated packed sint32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_sint32/data-many"); + const std::string buffer = load_data("repeated_packed_sint32/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_sint32(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_sint64/test_cases.cpp b/test/t/repeated_packed_sint64/test_cases.cpp index 558f68d..7fa24a0 100644 --- a/test/t/repeated_packed_sint64/test_cases.cpp +++ b/test/t/repeated_packed_sint64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed sint64 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_sint64/data-empty"); + const std::string buffer = load_data("repeated_packed_sint64/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed sint64 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_sint64/data-one"); + const std::string buffer = load_data("repeated_packed_sint64/data-one"); protozero::pbf_reader item(buffer); @@ -25,7 +25,7 @@ TEST_CASE("read repeated packed sint64 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_sint64/data-many"); + const std::string buffer = load_data("repeated_packed_sint64/data-many"); protozero::pbf_reader item(buffer); @@ -44,9 +44,9 @@ TEST_CASE("read repeated packed sint64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_sint64/data-many"); + const std::string buffer = load_data("repeated_packed_sint64/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_sint64(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_uint32/test_cases.cpp b/test/t/repeated_packed_uint32/test_cases.cpp index a842402..dc70ebe 100644 --- a/test/t/repeated_packed_uint32/test_cases.cpp +++ b/test/t/repeated_packed_uint32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed uint32 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_uint32/data-empty"); + const std::string buffer = load_data("repeated_packed_uint32/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed uint32 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_uint32/data-one"); + const std::string buffer = load_data("repeated_packed_uint32/data-one"); protozero::pbf_reader item(buffer); @@ -25,7 +25,7 @@ TEST_CASE("read repeated packed uint32 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_uint32/data-many"); + const std::string buffer = load_data("repeated_packed_uint32/data-many"); protozero::pbf_reader item(buffer); @@ -42,9 +42,9 @@ TEST_CASE("read repeated packed uint32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_uint32/data-many"); + const std::string buffer = load_data("repeated_packed_uint32/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_uint32(), protozero::end_of_buffer_exception); diff --git a/test/t/repeated_packed_uint64/test_cases.cpp b/test/t/repeated_packed_uint64/test_cases.cpp index 2fdf1c4..6880106 100644 --- a/test/t/repeated_packed_uint64/test_cases.cpp +++ b/test/t/repeated_packed_uint64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read repeated packed uint64 field") { SECTION("empty") { - std::string buffer = load_data("repeated_packed_uint64/data-empty"); + const std::string buffer = load_data("repeated_packed_uint64/data-empty"); protozero::pbf_reader item(buffer); @@ -12,7 +12,7 @@ TEST_CASE("read repeated packed uint64 field") { } SECTION("one") { - std::string buffer = load_data("repeated_packed_uint64/data-one"); + const std::string buffer = load_data("repeated_packed_uint64/data-one"); protozero::pbf_reader item(buffer); @@ -25,7 +25,7 @@ TEST_CASE("read repeated packed uint64 field") { } SECTION("many") { - std::string buffer = load_data("repeated_packed_uint64/data-many"); + const std::string buffer = load_data("repeated_packed_uint64/data-many"); protozero::pbf_reader item(buffer); @@ -42,9 +42,9 @@ TEST_CASE("read repeated packed uint64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("repeated_packed_uint64/data-many"); + const std::string buffer = load_data("repeated_packed_uint64/data-many"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_packed_uint64(), protozero::end_of_buffer_exception); diff --git a/test/t/sfixed32/test_cases.cpp b/test/t/sfixed32/test_cases.cpp index 70e251c..e2471f6 100644 --- a/test/t/sfixed32/test_cases.cpp +++ b/test/t/sfixed32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read sfixed32 field") { SECTION("zero") { - std::string buffer = load_data("sfixed32/data-zero"); + const std::string buffer = load_data("sfixed32/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read sfixed32 field") { } SECTION("max-int") { - std::string buffer = load_data("sfixed32/data-max-int"); + const std::string buffer = load_data("sfixed32/data-max-int"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read sfixed32 field") { } SECTION("min-int") { - std::string buffer = load_data("sfixed32/data-min-int"); + const std::string buffer = load_data("sfixed32/data-min-int"); protozero::pbf_reader item(buffer); @@ -34,9 +34,9 @@ TEST_CASE("read sfixed32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("sfixed32/data-min-int"); + const std::string buffer = load_data("sfixed32/data-min-int"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_sfixed32(), protozero::end_of_buffer_exception); diff --git a/test/t/sfixed64/test_cases.cpp b/test/t/sfixed64/test_cases.cpp index ae8ca60..cecf273 100644 --- a/test/t/sfixed64/test_cases.cpp +++ b/test/t/sfixed64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read sfixed64 field") { SECTION("zero") { - std::string buffer = load_data("sfixed64/data-zero"); + const std::string buffer = load_data("sfixed64/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read sfixed64 field") { } SECTION("max-int") { - std::string buffer = load_data("sfixed64/data-max-int"); + const std::string buffer = load_data("sfixed64/data-max-int"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read sfixed64 field") { } SECTION("min-int") { - std::string buffer = load_data("sfixed64/data-min-int"); + const std::string buffer = load_data("sfixed64/data-min-int"); protozero::pbf_reader item(buffer); @@ -34,9 +34,9 @@ TEST_CASE("read sfixed64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("sfixed64/data-min-int"); + const std::string buffer = load_data("sfixed64/data-min-int"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_sfixed64(), protozero::end_of_buffer_exception); diff --git a/test/t/sint32/test_cases.cpp b/test/t/sint32/test_cases.cpp index b75e1dc..68bd9ef 100644 --- a/test/t/sint32/test_cases.cpp +++ b/test/t/sint32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read sint32 field") { SECTION("zero") { - std::string buffer = load_data("sint32/data-zero"); + const std::string buffer = load_data("sint32/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read sint32 field") { } SECTION("positive") { - std::string buffer = load_data("sint32/data-pos"); + const std::string buffer = load_data("sint32/data-pos"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read sint32 field") { } SECTION("negative") { - std::string buffer = load_data("sint32/data-neg"); + const std::string buffer = load_data("sint32/data-neg"); protozero::pbf_reader item(buffer); @@ -34,7 +34,7 @@ TEST_CASE("read sint32 field") { } SECTION("max") { - std::string buffer = load_data("sint32/data-max"); + const std::string buffer = load_data("sint32/data-max"); protozero::pbf_reader item(buffer); @@ -44,7 +44,7 @@ TEST_CASE("read sint32 field") { } SECTION("min") { - std::string buffer = load_data("sint32/data-min"); + const std::string buffer = load_data("sint32/data-min"); protozero::pbf_reader item(buffer); @@ -54,9 +54,9 @@ TEST_CASE("read sint32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("sint32/data-min"); + const std::string buffer = load_data("sint32/data-min"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_sint32(), protozero::end_of_buffer_exception); diff --git a/test/t/sint64/test_cases.cpp b/test/t/sint64/test_cases.cpp index 8f6eaf4..2dec5b1 100644 --- a/test/t/sint64/test_cases.cpp +++ b/test/t/sint64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read sint64 field") { SECTION("zero") { - std::string buffer = load_data("sint64/data-zero"); + const std::string buffer = load_data("sint64/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read sint64 field") { } SECTION("positive") { - std::string buffer = load_data("sint64/data-pos"); + const std::string buffer = load_data("sint64/data-pos"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read sint64 field") { } SECTION("negative") { - std::string buffer = load_data("sint64/data-neg"); + const std::string buffer = load_data("sint64/data-neg"); protozero::pbf_reader item(buffer); @@ -34,7 +34,7 @@ TEST_CASE("read sint64 field") { } SECTION("max") { - std::string buffer = load_data("sint64/data-max"); + const std::string buffer = load_data("sint64/data-max"); protozero::pbf_reader item(buffer); @@ -44,7 +44,7 @@ TEST_CASE("read sint64 field") { } SECTION("min") { - std::string buffer = load_data("sint64/data-min"); + const std::string buffer = load_data("sint64/data-min"); protozero::pbf_reader item(buffer); @@ -54,9 +54,9 @@ TEST_CASE("read sint64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("sint64/data-min"); + const std::string buffer = load_data("sint64/data-min"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_sint64(), protozero::end_of_buffer_exception); diff --git a/test/t/skip/test_cases.cpp b/test/t/skip/test_cases.cpp index 14bd10f..fb4ee34 100644 --- a/test/t/skip/test_cases.cpp +++ b/test/t/skip/test_cases.cpp @@ -12,7 +12,7 @@ TEST_CASE("skip") { // find . -name data\*pbf -not -empty | sed -e 's/^.\/\(.*\).pbf/"\1",/' // and then remove everything manually that contains more than one // field. - std::vector<std::string> filenames = { + const std::vector<std::string> filenames = { "bool/data-also-true", "bool/data-false", "bool/data-still-true", @@ -99,7 +99,7 @@ TEST_CASE("skip") { }; for (const auto& filename : filenames) { - std::string buffer = load_data(filename); + const std::string buffer = load_data(filename); protozero::pbf_reader item(buffer); diff --git a/test/t/string/test_cases.cpp b/test/t/string/test_cases.cpp index 5d840ff..4609581 100644 --- a/test/t/string/test_cases.cpp +++ b/test/t/string/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read string field") { SECTION("empty") { - std::string buffer = load_data("string/data-empty"); + const std::string buffer = load_data("string/data-empty"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read string field") { } SECTION("one") { - std::string buffer = load_data("string/data-one"); + const std::string buffer = load_data("string/data-one"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read string field") { } SECTION("string") { - std::string buffer = load_data("string/data-string"); + const std::string buffer = load_data("string/data-string"); protozero::pbf_reader item(buffer); @@ -34,9 +34,9 @@ TEST_CASE("read string field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("string/data-string"); + const std::string buffer = load_data("string/data-string"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_string(), protozero::end_of_buffer_exception); @@ -44,7 +44,7 @@ TEST_CASE("read string field") { } SECTION("check assert on fixed int access") { - std::string buffer = load_data("string/data-string"); + const std::string buffer = load_data("string/data-string"); protozero::pbf_reader item(buffer); diff --git a/test/t/uint32/test_cases.cpp b/test/t/uint32/test_cases.cpp index deb0a5b..dcd525f 100644 --- a/test/t/uint32/test_cases.cpp +++ b/test/t/uint32/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read uint32 field") { SECTION("zero") { - std::string buffer = load_data("uint32/data-zero"); + const std::string buffer = load_data("uint32/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read uint32 field") { } SECTION("positive") { - std::string buffer = load_data("uint32/data-pos"); + const std::string buffer = load_data("uint32/data-pos"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read uint32 field") { } SECTION("max") { - std::string buffer = load_data("uint32/data-max"); + const std::string buffer = load_data("uint32/data-max"); protozero::pbf_reader item(buffer); @@ -34,9 +34,9 @@ TEST_CASE("read uint32 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("uint32/data-max"); + const std::string buffer = load_data("uint32/data-max"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_uint32(), protozero::end_of_buffer_exception); diff --git a/test/t/uint64/test_cases.cpp b/test/t/uint64/test_cases.cpp index 4d7c6f2..95a9168 100644 --- a/test/t/uint64/test_cases.cpp +++ b/test/t/uint64/test_cases.cpp @@ -4,7 +4,7 @@ TEST_CASE("read uint64 field") { SECTION("zero") { - std::string buffer = load_data("uint64/data-zero"); + const std::string buffer = load_data("uint64/data-zero"); protozero::pbf_reader item(buffer); @@ -14,7 +14,7 @@ TEST_CASE("read uint64 field") { } SECTION("positive") { - std::string buffer = load_data("uint64/data-pos"); + const std::string buffer = load_data("uint64/data-pos"); protozero::pbf_reader item(buffer); @@ -24,7 +24,7 @@ TEST_CASE("read uint64 field") { } SECTION("max") { - std::string buffer = load_data("uint64/data-max"); + const std::string buffer = load_data("uint64/data-max"); protozero::pbf_reader item(buffer); @@ -34,9 +34,9 @@ TEST_CASE("read uint64 field") { } SECTION("end_of_buffer") { - std::string buffer = load_data("uint64/data-max"); + const std::string buffer = load_data("uint64/data-max"); - for (size_t i=1; i < buffer.size(); ++i) { + for (std::string::size_type i = 1; i < buffer.size(); ++i) { protozero::pbf_reader item(buffer.data(), i); REQUIRE(item.next()); REQUIRE_THROWS_AS(item.get_uint64(), protozero::end_of_buffer_exception); diff --git a/test/t/vector_tile/test_cases.cpp b/test/t/vector_tile/test_cases.cpp index 6c18c2e..314aeb7 100644 --- a/test/t/vector_tile/test_cases.cpp +++ b/test/t/vector_tile/test_cases.cpp @@ -7,7 +7,7 @@ // Input data.vector is encoded according to // https://github.com/mapbox/mapnik-vector-tile/blob/master/proto/vector_tile.proto -static std::vector<std::string> expected_layer_names = { +static const std::vector<std::string> expected_layer_names = { "landuse", "waterway", "water", "aeroway", "barrier_line", "building", "landuse_overlay", "tunnel", "road", "bridge", "admin", "country_label_line", "country_label", "marine_label", "state_label", @@ -29,7 +29,7 @@ std::string get_name(protozero::pbf_reader layer) { // copy! TEST_CASE("reading vector tiles") { SECTION("iterate over message using next()") { - std::string buffer = load_data("vector_tile/data.vector"); + const std::string buffer = load_data("vector_tile/data.vector"); protozero::pbf_reader item(buffer); @@ -55,7 +55,7 @@ TEST_CASE("reading vector tiles") { } SECTION("iterate over message using next(type)") { - std::string buffer = load_data("vector_tile/data.vector"); + const std::string buffer = load_data("vector_tile/data.vector"); protozero::pbf_reader item(buffer); @@ -71,7 +71,7 @@ TEST_CASE("reading vector tiles") { } SECTION("iterate over features in road layer") { - std::string buffer = load_data("vector_tile/data.vector"); + const std::string buffer = load_data("vector_tile/data.vector"); protozero::pbf_reader item(buffer); diff --git a/test/tests.cpp b/test/tests.cpp index 378e07b..cec22a4 100644 --- a/test/tests.cpp +++ b/test/tests.cpp @@ -11,7 +11,7 @@ std::string load_data(const std::string& filename) { fullname += filename; fullname += ".pbf"; - std::ifstream stream(fullname.c_str(), std::ios_base::in|std::ios_base::binary); + std::ifstream stream(fullname, std::ios_base::in|std::ios_base::binary); if (!stream.is_open()) { throw std::runtime_error("could not open: '" + filename + "'"); diff --git a/tutorial.md b/tutorial.md index e5de974..d5273ee 100644 --- a/tutorial.md +++ b/tutorial.md @@ -27,8 +27,8 @@ Keep the `protozero` directory and include the files in the form #include <protozero/FILENAME.hpp> -You always need `byteswap.hpp`, `pbf_types.hpp`, `varint.hpp`, and -`exception.hpp`. For reading you need `pbf_reader.hpp` and probably +You always need `byteswap.hpp`, `config.hpp`, `pbf_types.hpp`, `varint.hpp`, +and `exception.hpp`. For reading you need `pbf_reader.hpp` and probably `pbf_message.hpp`, for writing you need `pbf_writer.hpp` and probably `pbf_builder.hpp`. You only need `version.hpp` if you want access to the macros defining the library version. -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/protozero.git _______________________________________________ Pkg-grass-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

