diff options
author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/stream/zerocopy_output_ut.cpp |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/stream/zerocopy_output_ut.cpp')
-rw-r--r-- | util/stream/zerocopy_output_ut.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/util/stream/zerocopy_output_ut.cpp b/util/stream/zerocopy_output_ut.cpp new file mode 100644 index 00000000000..e81f7fb056c --- /dev/null +++ b/util/stream/zerocopy_output_ut.cpp @@ -0,0 +1,48 @@ +#include "zerocopy_output.h" + +#include <library/cpp/testing/unittest/registar.h> + +#include <util/generic/string.h> + +// This version of string output stream is written here only +// for testing IZeroCopyOutput implementation of DoWrite. +class TSimpleStringOutput: public IZeroCopyOutput { +public: + TSimpleStringOutput(TString& s) noexcept + : S_(s) + { + } + +private: + size_t DoNext(void** ptr) override { + if (S_.size() == S_.capacity()) { + S_.reserve(FastClp2(S_.capacity() + 1)); + } + size_t previousSize = S_.size(); + S_.resize(S_.capacity()); + *ptr = S_.begin() + previousSize; + return S_.size() - previousSize; + } + + void DoUndo(size_t len) override { + Y_ENSURE(len <= S_.size()); + S_.resize(S_.size() - len); + } + + TString& S_; +}; + +Y_UNIT_TEST_SUITE(TestZerocopyOutput) { + Y_UNIT_TEST(Write) { + TString str; + TSimpleStringOutput output(str); + TString result; + + for (size_t i = 0; i < 1000; ++i) { + result.push_back('a' + (i % 20)); + } + + output.Write(result.begin(), result.size()); + UNIT_ASSERT_STRINGS_EQUAL(str, result); + } +} |