/
Mr.Stalin
/
FOnline-Engine
Обзор
Документация
Войти
/
Mr.Stalin
/
FOnline-Engine
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Source/Tests/Test_HashedString.cpp
212 строк
7 KB
cvet
Non const locals (#190)
24 июл 2026, 10:46
Не верифицирован
24 июл 2026, 10:46
4883d25
Код
Авторство
О чём код?
// __________ ___ ______ _ // / ____/ __ \____ / (_)___ ___ / ____/___ ____ _(_)___ ___ // / /_ / / / / __ \/ / / __ \/ _ \ / __/ / __ \/ __ `/ / __ \/ _ ` // / __/ / /_/ / / / / / / / / / __/ / /___/ / / / /_/ / / / / / __/ // /_/ \____/_/ /_/_/_/_/ /_/\___/ /_____/_/ /_/\__, /_/_/ /_/\___/ // /____/ // FOnline Engine // https://fonline.ru // https://github.com/cvet/fonline // // MIT License // // Copyright (c) 2006 - 2026, Anton Tsvetinskiy aka cvet <cvet@tut.by> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // #include "catch_amalgamated.hpp" #include "Common.h" FO_BEGIN_NAMESPACE TEST_CASE("HashedString") { SECTION("EmptyHash") { hstring empty {}; CHECK_FALSE(static_cast<bool>(empty)); CHECK(empty.as_hash() == 0); CHECK(empty.as_str().empty()); } SECTION("StorageRoundtrip") { HashStorage storage {}; hstring hs = storage.ToHashedString("EssentialsTest"); CHECK(static_cast<bool>(hs)); CHECK(hs.as_hash() != 0); CHECK(hs.as_uint64() == hs.as_hash()); CHECK(hs.as_hash() == HashStorage::DefaultHash(make_const_span(hs.as_str()))); CHECK(hs.as_str() == "EssentialsTest"); hstring resolved = storage.ResolveHash(hs.as_hash()); CHECK(resolved == hs); CHECK(resolved.as_str() == "EssentialsTest"); } SECTION("IdempotentInsertion") { HashStorage storage {}; hstring hs1 = storage.ToHashedString("same_value"); hstring hs2 = storage.ToHashedString("same_value"); CHECK(hs1 == hs2); CHECK(hs1.as_hash() == hs2.as_hash()); CHECK(hs1.as_str() == hs2.as_str()); } SECTION("ResolveHashNoThrow") { HashStorage storage {}; bool failed = false; auto unresolved_hash = hashing_ex::hash("missing", 7); hstring unresolved = storage.ResolveHash(unresolved_hash, &failed); CHECK(failed); CHECK_FALSE(static_cast<bool>(unresolved)); } SECTION("ResolveHashNoThrowPreservesFailureOnSuccess") { HashStorage storage {}; hstring hs = storage.ToHashedString("known_value"); bool failed = true; hstring resolved = storage.ResolveHash(hs.as_hash(), &failed); CHECK(failed); CHECK(resolved == hs); CHECK(resolved.as_str() == "known_value"); } SECTION("ResolveHashThrows") { HashStorage storage {}; hstring hs = storage.ToHashedString("known"); CHECK_NOTHROW(storage.ResolveHash(hs.as_hash())); CHECK_THROWS_AS(storage.ResolveHash(hashing_ex::hash("unknown", 7)), HashResolveException); } SECTION("ResolveHashFailureHandler") { HashStorage storage {}; hstring::hash_t reported_hash = 0; int32_t reports = 0; storage.SetResolveHashFailureHandler([&reported_hash, &reports](hstring::hash_t hash) { reported_hash = hash; reports++; }); auto no_throw_unresolved_hash = hashing_ex::hash("unknown", 7); bool failed = false; CHECK_FALSE(static_cast<bool>(storage.ResolveHash(no_throw_unresolved_hash, &failed))); CHECK(failed); CHECK(reported_hash == no_throw_unresolved_hash); CHECK(reports == 1); hstring hs = storage.ToHashedString("known"); CHECK_NOTHROW(storage.ResolveHash(hs.as_hash())); CHECK(reports == 1); auto throwing_unresolved_hash = hashing_ex::hash("unknown_throwing", 16); CHECK_THROWS_AS(storage.ResolveHash(throwing_unresolved_hash), HashResolveException); CHECK(reported_hash == throwing_unresolved_hash); CHECK(reports == 2); storage.SetResolveHashFailureHandler({}); CHECK_THROWS_AS(storage.ResolveHash(hashing_ex::hash("missing", 7)), HashResolveException); CHECK(reports == 2); } SECTION("ResolveHashNoThrowNullFailed") { HashStorage storage {}; hstring unresolved = storage.ResolveHash(hashing_ex::hash("missing", 7), nullptr); CHECK_FALSE(static_cast<bool>(unresolved)); } SECTION("ResolveHashNoThrowZeroHashPreservesFailure") { HashStorage storage {}; bool failed = true; hstring resolved = storage.ResolveHash(0, &failed); CHECK(failed); CHECK_FALSE(static_cast<bool>(resolved)); } SECTION("ResolveHashNoThrowStickyFailureFlow") { HashStorage storage {}; hstring hs = storage.ToHashedString("known_flow"); bool failed = false; CHECK_FALSE(static_cast<bool>(storage.ResolveHash(hashing_ex::hash("missing", 7), &failed))); CHECK(failed); hstring resolved = storage.ResolveHash(hs.as_hash(), &failed); CHECK(failed); CHECK(resolved == hs); hstring zero_resolved = storage.ResolveHash(0, &failed); CHECK(failed); CHECK_FALSE(static_cast<bool>(zero_resolved)); } SECTION("EmptyStringToHashedString") { HashStorage storage {}; hstring hs = storage.ToHashedString(""); CHECK_FALSE(static_cast<bool>(hs)); CHECK(hs.as_hash() == 0); CHECK(hs.as_str().empty()); } SECTION("CheckHashedStringChecksWithoutInserting") { HashStorage storage {}; storage.ToHashedString("registered_value"); CHECK(storage.CheckHashedString("registered_value")); // An unregistered string is reported missing and must NOT be inserted CHECK_FALSE(storage.CheckHashedString("never_registered_value")); bool still_failed = false; (void)storage.ResolveHash(hashing_ex::hash("never_registered_value", 22), &still_failed); CHECK(still_failed); // Empty string is the zero hash, never a registered entry CHECK_FALSE(storage.CheckHashedString("")); } } FO_END_NAMESPACE