From eba89bec41aea81d965506876a7f3a60b58391ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20H=C3=A4rer?= Date: Sun, 23 Apr 2023 01:45:11 +0200 Subject: [PATCH 1/2] CVariant: Fix inverted logic when converting strings to bool Bug was introduced in 728b396dad. --- xbmc/utils/Variant.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/xbmc/utils/Variant.cpp b/xbmc/utils/Variant.cpp index 4ef0a2d399c70..45ab7e19d7836 100644 --- a/xbmc/utils/Variant.cpp +++ b/xbmc/utils/Variant.cpp @@ -419,11 +419,12 @@ float CVariant::asFloat(float fallback) const bool CVariant::asBoolean(bool fallback) const { return std::visit( - overloaded{[](bool b) { return b; }, [](int64_t i) { return i != 0; }, - [](uint64_t u) { return u != 0; }, [](double d) { return d != 0; }, - [](const std::string& s) { return s.empty() || s == "0" || s == "false"; }, - [](const std::wstring& ws) { return ws.empty() || ws == L"0" || ws == L"false"; }, - [=](const auto&) { return fallback; }}, + overloaded{ + [](bool b) { return b; }, [](int64_t i) { return i != 0; }, + [](uint64_t u) { return u != 0; }, [](double d) { return d != 0; }, + [](const std::string& s) { return !(s.empty() || s == "0" || s == "false"); }, + [](const std::wstring& ws) { return !(ws.empty() || ws == L"0" || ws == L"false"); }, + [=](const auto&) { return fallback; }}, m_data); } From 4b9d40d7e23a87855cda517a91e0dd7888ee42f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20H=C3=A4rer?= Date: Sun, 23 Apr 2023 01:46:47 +0200 Subject: [PATCH 2/2] TestVariant: Add tests for CVariant::asBoolean() --- xbmc/utils/test/TestVariant.cpp | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/xbmc/utils/test/TestVariant.cpp b/xbmc/utils/test/TestVariant.cpp index c130c79e92462..c38370480cc92 100644 --- a/xbmc/utils/test/TestVariant.cpp +++ b/xbmc/utils/test/TestVariant.cpp @@ -359,3 +359,40 @@ TEST(TestVariant, isMember) EXPECT_TRUE(a.isMember("key1")); EXPECT_FALSE(a.isMember("key2")); } + +TEST(TestVariant, asBoolean) +{ + EXPECT_TRUE(CVariant("true").asBoolean()); + EXPECT_FALSE(CVariant("false").asBoolean()); + EXPECT_TRUE(CVariant("1").asBoolean()); + EXPECT_FALSE(CVariant("0").asBoolean()); + EXPECT_FALSE(CVariant("").asBoolean()); + + EXPECT_TRUE(CVariant(L"true").asBoolean()); + EXPECT_FALSE(CVariant(L"false").asBoolean()); + EXPECT_TRUE(CVariant(L"1").asBoolean()); + EXPECT_FALSE(CVariant(L"0").asBoolean()); + EXPECT_FALSE(CVariant(L"").asBoolean()); + + EXPECT_TRUE(CVariant(uint64_t{1}).asBoolean()); + EXPECT_TRUE(CVariant(uint64_t{999999999}).asBoolean()); + EXPECT_FALSE(CVariant(uint64_t{0}).asBoolean()); + + EXPECT_TRUE(CVariant(int64_t{1}).asBoolean()); + EXPECT_TRUE(CVariant(int64_t{999999999}).asBoolean()); + EXPECT_TRUE(CVariant(int64_t{-999999999}).asBoolean()); + EXPECT_FALSE(CVariant(int64_t{0}).asBoolean()); + + EXPECT_TRUE(CVariant(double{1}).asBoolean()); + EXPECT_TRUE(CVariant(double{999999999}).asBoolean()); + EXPECT_TRUE(CVariant(double{-999999999}).asBoolean()); + EXPECT_FALSE(CVariant(double{0}).asBoolean()); + + EXPECT_TRUE(CVariant(true).asBoolean()); + EXPECT_FALSE(CVariant(false).asBoolean()); + + EXPECT_FALSE(CVariant(CVariant::VariantTypeNull).asBoolean()); + EXPECT_FALSE(CVariant(CVariant::VariantTypeConstNull).asBoolean()); + EXPECT_FALSE(CVariant(CVariant::VariantTypeArray).asBoolean()); + EXPECT_FALSE(CVariant(CVariant::VariantTypeObject).asBoolean()); +}