SettingsRegistryBuilderTests.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/JSON/rapidjson.h>
  9. #include <AzCore/Settings/SettingsRegistryImpl.h>
  10. #include <native/InternalBuilders/SettingsRegistryBuilder.h>
  11. #include <native/tests/AssetProcessorTest.h>
  12. namespace AssetProcessor
  13. {
  14. class SettingsRegistryBuilderTest
  15. : public AssetProcessorTest
  16. {
  17. };
  18. // These tests are done relative to "TestValues" because the Settings Registry adds runtime information for
  19. // anything that is merged in.
  20. TEST_F(SettingsRegistryBuilderTest, SettingsExporter_ExportRegistryToJson_ProducesIdenticalJsonToRegularWriter)
  21. {
  22. static constexpr char json[] =
  23. R"( {
  24. "TestValues":
  25. {
  26. "BoolTrue": true,
  27. "BoolFalse": false,
  28. "Integer": 42,
  29. "Double": 42.0,
  30. "String": "hello",
  31. "Array": [ null, true, false, 42, 42.0, "hello", { "Field": 42 }, [ 42, 42.0 ] ]
  32. }
  33. })";
  34. rapidjson::Document document;
  35. document.Parse(json);
  36. ASSERT_FALSE(document.HasParseError());
  37. rapidjson::StringBuffer jsonOutputBuffer;
  38. rapidjson::Writer<rapidjson::StringBuffer> writer(jsonOutputBuffer);
  39. document.FindMember("TestValues")->value.Accept(writer);
  40. AZ::SettingsRegistryImpl registry;
  41. ASSERT_TRUE(registry.MergeSettings(json, AZ::SettingsRegistryInterface::Format::JsonMergePatch));
  42. AZStd::string registryOutputBuffer;
  43. AZStd::vector<AZStd::string> excludes;
  44. AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings;
  45. dumperSettings.m_includeFilter = [&excludes](AZStd::string_view jsonKeyPath)
  46. {
  47. auto ExcludeField = [&jsonKeyPath](AZStd::string_view excludePath)
  48. {
  49. return AZ::SettingsRegistryMergeUtils::IsPathDescendantOrEqual(excludePath, jsonKeyPath);
  50. };
  51. // Include a path only if it is not equal or a suffix of any paths of the exclude vector
  52. return AZStd::ranges::find_if(excludes, ExcludeField) == AZStd::ranges::end(excludes);
  53. };
  54. AZ::IO::ByteContainerStream byteStream(&registryOutputBuffer);
  55. ASSERT_TRUE(AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(registry, "/TestValues", byteStream, dumperSettings));
  56. EXPECT_EQ(jsonOutputBuffer.GetLength(), registryOutputBuffer.size());
  57. EXPECT_STREQ(jsonOutputBuffer.GetString(), registryOutputBuffer.c_str());
  58. }
  59. TEST_F(SettingsRegistryBuilderTest, SettingsExporter_FilterOutSection_FieldNotInOutput)
  60. {
  61. static constexpr char json[] =
  62. R"( {
  63. "TestValues":
  64. {
  65. "A":
  66. {
  67. "B":
  68. {
  69. "X": 42
  70. },
  71. "C": true
  72. }
  73. }
  74. })";
  75. AZ::SettingsRegistryImpl registry;
  76. ASSERT_TRUE(registry.MergeSettings(json, AZ::SettingsRegistryInterface::Format::JsonMergePatch));
  77. AZStd::string registryOutputBuffer;
  78. AZStd::vector<AZStd::string> excludes;
  79. excludes.push_back("/TestValues/A/B");
  80. AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings;
  81. dumperSettings.m_includeFilter = [&excludes](AZStd::string_view jsonKeyPath)
  82. {
  83. auto ExcludeField = [&jsonKeyPath](AZStd::string_view excludePath)
  84. {
  85. return AZ::SettingsRegistryMergeUtils::IsPathDescendantOrEqual(excludePath, jsonKeyPath);
  86. };
  87. // Include a path only if it is not equal or a suffix of any paths of the exclude vector
  88. return AZStd::ranges::find_if(excludes, ExcludeField) == AZStd::ranges::end(excludes);
  89. };
  90. AZ::IO::ByteContainerStream byteStream(&registryOutputBuffer);
  91. ASSERT_TRUE(AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(registry, "/TestValues", byteStream, dumperSettings));
  92. rapidjson::Document document;
  93. document.Parse(registryOutputBuffer.c_str(), registryOutputBuffer.size());
  94. ASSERT_FALSE(document.HasParseError());
  95. auto it = document.FindMember("A");
  96. ASSERT_NE(document.MemberEnd(), it);
  97. EXPECT_EQ(it->value.MemberEnd(), it->value.FindMember("B"));
  98. EXPECT_NE(it->value.MemberEnd(), it->value.FindMember("C"));
  99. }
  100. TEST_F(SettingsRegistryBuilderTest, SettingsExporter_ExportRegistryWithNull_NullIsSerialized)
  101. {
  102. static constexpr char json[] =
  103. R"( [
  104. { "op": "add", "path": "/TestValues", "value": { "Null": null } }
  105. ])";
  106. AZ::SettingsRegistryImpl registry;
  107. ASSERT_TRUE(registry.MergeSettings(json, AZ::SettingsRegistryInterface::Format::JsonPatch));
  108. AZStd::string registryOutputBuffer;
  109. AZStd::vector<AZStd::string> excludes;
  110. AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings;
  111. dumperSettings.m_includeFilter = [&excludes](AZStd::string_view jsonKeyPath)
  112. {
  113. auto ExcludeField = [&jsonKeyPath](AZStd::string_view excludePath)
  114. {
  115. return AZ::SettingsRegistryMergeUtils::IsPathDescendantOrEqual(excludePath, jsonKeyPath);
  116. };
  117. // Include a path only if it is not equal or a suffix of any paths of the exclude vector
  118. return AZStd::ranges::find_if(excludes, ExcludeField) == AZStd::ranges::end(excludes);
  119. };
  120. AZ::IO::ByteContainerStream byteStream(&registryOutputBuffer);
  121. ASSERT_TRUE(AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(registry, "/TestValues", byteStream, dumperSettings));
  122. rapidjson::Document document;
  123. document.Parse(registryOutputBuffer.c_str(), registryOutputBuffer.size());
  124. ASSERT_FALSE(document.HasParseError());
  125. auto it = document.FindMember("Null");
  126. ASSERT_NE(document.MemberEnd(), it);
  127. EXPECT_TRUE(it->value.IsNull());
  128. }
  129. TEST_F(SettingsRegistryBuilderTest, SettingsExporter_ExportCanBeReused_SecondExportWorksCorrectly)
  130. {
  131. static constexpr char jsonFirst[] =
  132. R"( {
  133. "TestValues": { "FirstPass" : 1 }
  134. })";
  135. static constexpr char jsonSecond[] =
  136. R"( {
  137. "TestValues": { "SecondPass" : 1 }
  138. })";
  139. AZ::SettingsRegistryImpl registryFirst;
  140. ASSERT_TRUE(registryFirst.MergeSettings(jsonFirst, AZ::SettingsRegistryInterface::Format::JsonMergePatch));
  141. AZ::SettingsRegistryImpl registrySecond;
  142. ASSERT_TRUE(registrySecond.MergeSettings(jsonSecond, AZ::SettingsRegistryInterface::Format::JsonMergePatch));
  143. AZStd::string registryOutputBuffer;
  144. AZStd::vector<AZStd::string> excludes;
  145. AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings;
  146. dumperSettings.m_includeFilter = [&excludes](AZStd::string_view jsonKeyPath)
  147. {
  148. auto ExcludeField = [&jsonKeyPath](AZStd::string_view excludePath)
  149. {
  150. return AZ::SettingsRegistryMergeUtils::IsPathDescendantOrEqual(excludePath, jsonKeyPath);
  151. };
  152. // Include a path only if it is not equal or a suffix of any paths of the exclude vector
  153. return AZStd::ranges::find_if(excludes, ExcludeField) == AZStd::ranges::end(excludes);
  154. };
  155. AZ::IO::ByteContainerStream byteStream(&registryOutputBuffer);
  156. ASSERT_TRUE(AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(registryFirst, "/TestValues", byteStream, dumperSettings));
  157. registryOutputBuffer.clear();
  158. byteStream.Seek(0, AZ::IO::GenericStream::SeekMode::ST_SEEK_BEGIN);
  159. ASSERT_TRUE(AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(registrySecond, "/TestValues", byteStream, dumperSettings));
  160. rapidjson::Document document;
  161. document.Parse(jsonSecond);
  162. ASSERT_FALSE(document.HasParseError());
  163. rapidjson::StringBuffer jsonOutputBuffer;
  164. rapidjson::Writer<rapidjson::StringBuffer> writer(jsonOutputBuffer);
  165. document.FindMember("TestValues")->value.Accept(writer);
  166. EXPECT_EQ(jsonOutputBuffer.GetLength(), registryOutputBuffer.size());
  167. EXPECT_STREQ(jsonOutputBuffer.GetString(), registryOutputBuffer.c_str());
  168. }
  169. } // namespace AssetProcessor