| // | |
| // Copyright 2021 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // JsonSerializer_unittests.cpp: Unit tests for the JSON based serializer | |
| // | |
| #if !defined(ANGLE_HAS_RAPIDJSON) | |
| # error RapidJSON must be available to build this file. | |
| #endif // !defined(ANGLE_HAS_RAPIDJSON) | |
| #include "JsonSerializer.h" | |
| #include <gtest/gtest.h> | |
| class JsonSerializerTest : public ::testing::Test | |
| { | |
| protected: | |
| void SetUp() override; | |
| void check(const std::string &expect); | |
| angle::JsonSerializer js; | |
| }; | |
| // Test writing one integer value | |
| TEST_F(JsonSerializerTest, NamedIntValue1) | |
| { | |
| js.addScalar("test1", 1); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test1": 1 | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing one long value | |
| TEST_F(JsonSerializerTest, NamedLongValue) | |
| { | |
| long v = -12; | |
| js.addScalar("test1", v); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test1": -12 | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing one unsigned long value | |
| TEST_F(JsonSerializerTest, NamedULongValue) | |
| { | |
| unsigned long v = 12; | |
| js.addScalar("test1", v); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test1": 12 | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing another integer value | |
| TEST_F(JsonSerializerTest, NamedIntValue2) | |
| { | |
| js.addScalar("test2", 2); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test2": 2 | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing one string value | |
| TEST_F(JsonSerializerTest, NamedStringValue) | |
| { | |
| js.addCString("test2", "value"); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test2": "value" | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing one byte array | |
| // Since he serialiter is only used for testing we don't store | |
| // the whole byte array, but only it's SHA1 checksum | |
| TEST_F(JsonSerializerTest, ByteArrayValue) | |
| { | |
| const uint8_t value[5] = {10, 0, 0xcc, 0xff, 0xaa}; | |
| js.addBlob("test2", value, 5); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test2-hash": "SHA1:4315724B1AB1EB2C0128E8E9DAD6D76254BA711D", | |
| "test2-raw[0-4]": [ | |
| 10, | |
| 0, | |
| 204, | |
| 255, | |
| 170 | |
| ] | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing one vector of integer values | |
| TEST_F(JsonSerializerTest, IntVectorValue) | |
| { | |
| std::vector<int> v = {0, 1, -1}; | |
| js.addVector("test2", v); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test2": [ | |
| 0, | |
| 1, | |
| -1 | |
| ] | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing one vector of integer values | |
| TEST_F(JsonSerializerTest, IntVectorAsBlobValue) | |
| { | |
| std::vector<int> v = {0, 1, -1}; | |
| js.addVectorAsHash("test2", v); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test2-hash": "SHA1:6216A439C16A113E2F1E53AB63FB88877D3597F5", | |
| "test2-raw[0-11]": [ | |
| 0, | |
| 0, | |
| 0, | |
| 0, | |
| 1, | |
| 0, | |
| 0, | |
| 0, | |
| 255, | |
| 255, | |
| 255, | |
| 255 | |
| ] | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test unsorted input gets sorted | |
| TEST_F(JsonSerializerTest, SortValues1) | |
| { | |
| js.addScalar("b", 1.0); | |
| js.addScalar("a", 2.0); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "a": 2.0, | |
| "b": 1.0 | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing one vector of short integer values | |
| TEST_F(JsonSerializerTest, ShortVectorAsBlobValue) | |
| { | |
| std::vector<short> v = {0, 1, -1}; | |
| js.addVectorAsHash("test2", v); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test2-hash": "SHA1:0BA7C0DE700CE0F8018D084B8CF447B150A9465D", | |
| "test2-raw[0-5]": [ | |
| 0, | |
| 0, | |
| 1, | |
| 0, | |
| 255, | |
| 255 | |
| ] | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test adding the same key twice | |
| TEST_F(JsonSerializerTest, KeyUsedTwice) | |
| { | |
| js.addScalar("a", 1.0); | |
| js.addScalar("a", 1.0); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "a": 1.0, | |
| "a": 1.0 | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // Test writing boolean values | |
| TEST_F(JsonSerializerTest, NamedBoolValues) | |
| { | |
| js.addScalar("test_false", false); | |
| js.addScalar("test_true", true); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "test_false": false, | |
| "test_true": true | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| // test writing two values in a sub-group | |
| TEST_F(JsonSerializerTest, GroupedIntValue) | |
| { | |
| js.startGroup("group"); | |
| js.addScalar("test1", 1); | |
| js.addScalar("test2", 2); | |
| js.endGroup(); | |
| const std::string expect = | |
| R"({ | |
| "context": { | |
| "group": { | |
| "test1": 1, | |
| "test2": 2 | |
| } | |
| } | |
| })"; | |
| check(expect); | |
| } | |
| void JsonSerializerTest::SetUp() | |
| { | |
| js.startGroup("context"); | |
| } | |
| void JsonSerializerTest::check(const std::string &expect) | |
| { | |
| js.endGroup(); | |
| EXPECT_EQ(js.data(), expect); | |
| EXPECT_EQ(js.length(), expect.length()); | |
| std::vector<uint8_t> expectAsUbyte(expect.begin(), expect.end()); | |
| EXPECT_EQ(js.getData(), expectAsUbyte); | |
| } |