#pragma once #include #include #include #include #include #include #include /* comparerChecksInside == true means comparer uses UNIT_ASSERT... inside itself * comparerChecksInside == false means comparer returns if its arguments are equal */ template , bool comparerChecksInside = false> void UnitTestCheckWithComparer(const T& lhs, const T& rhs, const TComparer& comparer) { if constexpr (comparerChecksInside) { comparer(lhs, rhs); } else { UNIT_ASSERT(comparer(lhs, rhs)); } } /* comparerChecksInside == true means comparer uses UNIT_ASSERT... inside itself * comparerChecksInside == false means comparer returns true if its arguments are equal */ template , bool comparerChecksInside = false> void TestBinSaverSerializationToBuffer(const T& original, const TComparer& comparer = TComparer()) { TBufferOutput out; { TYaStreamOutput yaOut(out); IBinSaver f(yaOut, false, false); f.Add(0, const_cast(&original)); } TBufferInput in(out.Buffer()); T restored; { TYaStreamInput yaIn(in); IBinSaver f(yaIn, true, false); f.Add(0, &restored); } UnitTestCheckWithComparer(original, restored, comparer); } template , bool comparerChecksInside = false> void TestBinSaverSerializationToVector(const T& original, const TComparer& comparer = TComparer()) { TVector out; SerializeToMem(&out, *const_cast(&original)); T restored; SerializeFromMem(&out, restored); UnitTestCheckWithComparer(original, restored, comparer); TVector> out2D; SerializeToMem(&out2D, *const_cast(&original)); T restored2D; SerializeFromMem(&out2D, restored2D); UnitTestCheckWithComparer(original, restored2D, comparer); } template , bool comparerChecksInside = false> void TestBinSaverSerialization(const T& original, const TComparer& comparer = TComparer()) { TestBinSaverSerializationToBuffer(original, comparer); TestBinSaverSerializationToVector(original, comparer); }