/* * Copyright 2025 Axel Waggershauser */ // SPDX-License-Identifier: Apache-2.0 #include "JSON.h" #include "gtest/gtest.h" using namespace ZXing; TEST(JSONTest, Prop) { EXPECT_EQ(JsonProp("key", "val"), R"("key":"val",)"); EXPECT_EQ(JsonProp("key", true), R"("key":true,)"); EXPECT_EQ(JsonProp("key", 1), R"("key":1,)"); EXPECT_EQ(JsonProp("key", R"(C:\)"), R"("key":"C:\\",)"); #ifndef _MSVC_LANG EXPECT_EQ(JsonProp("key", R"("quotes")"), R"("key":"\"quotes\"",)"); #endif } TEST(JSONTest, GetStr) { EXPECT_EQ(JsonFind("", "key"), ""); EXPECT_EQ(JsonFind("key", "key"), ""); EXPECT_EQ(JsonFind("keys:abc", "key"), ""); EXPECT_EQ(JsonFind("key:", "key"), ""); EXPECT_EQ(JsonFind("key:abc", "key"), "abc"); EXPECT_EQ(JsonFind("key:abc,", "key"), "abc"); EXPECT_EQ(JsonFind("key:abc,key2", "key"), "abc"); EXPECT_EQ(JsonFind("key:abc", "KEY"), "abc"); EXPECT_EQ(JsonFind("\"key\": \"abc\"", "KEY"), "abc"); EXPECT_EQ(JsonFind("{\"key\": true}", "key"), "true"); // JSON EXPECT_EQ(JsonFind("{'key': True}", "key"), "True"); // Python EXPECT_EQ(JsonFind("key=val", "key"), "val"); // user input EXPECT_EQ(JsonFind("Key:val", "key"), "val"); // ignore case EXPECT_EQ(JsonFind("k_ey:val", "key"), "val"); // ignore underscore } TEST(JSONTest, GetBool) { EXPECT_TRUE(JsonGet("key", "key")); EXPECT_TRUE(JsonGet("key:true", "key")); EXPECT_TRUE(JsonGet("key:1", "key")); EXPECT_TRUE(JsonGet("key,other", "key")); EXPECT_TRUE(JsonGet("key", "KEY")); EXPECT_TRUE(JsonGet("key1", "key1")); EXPECT_FALSE(JsonGet("", "")); EXPECT_FALSE(JsonGet("", "key")); EXPECT_FALSE(JsonGet("key:", "key")); EXPECT_FALSE(JsonGet("key:false", "key")); EXPECT_FALSE(JsonGet("key:0", "key")); EXPECT_FALSE(JsonGet("keys", "key")); EXPECT_FALSE(JsonGet("thekey", "key")); EXPECT_TRUE(JsonGet("key , other", "key").value()); EXPECT_TRUE(JsonGet("\"key\": \"true\"", "key").value()); EXPECT_TRUE(JsonGet("{\"key\": true}", "key")); // JSON EXPECT_TRUE(JsonGet("{'key': True'}", "key")); // Python } TEST(JSONTest, GetInt) { EXPECT_FALSE(JsonGet("key:", "key")); EXPECT_THROW(JsonGet("key:false", "key"), std::invalid_argument); EXPECT_EQ(JsonGet("key:1", "key").value(), 1); EXPECT_EQ(JsonGet("{\"key\": 2}", "key").value(), 2); // JSON EXPECT_EQ(JsonGet("{'key': 1}", "key").value(), 1); // Python } TEST(JSONTest, GetString) { EXPECT_FALSE(JsonGet("key:", "key")); EXPECT_EQ(JsonGet("key:abc", "key").value(), "abc"); EXPECT_EQ(JsonGet("{\"key\":\"abc\\n\"}", "key").value(), "abc\n"); // JSON EXPECT_EQ(JsonGet("{'key': 'abc'}", "key").value(), "abc"); // Python } TEST(JSONTest, Escaping) { EXPECT_EQ("\\u0001", JsonEscapeStr("\x01")); EXPECT_EQ("\x80", JsonEscapeStr("\x80")); for (int c = 0; c <= 0xFF; ++c) { auto str = std::string(1, static_cast(c)); EXPECT_EQ(str, JsonUnEscapeStr(JsonEscapeStr(str))); } }