Yaml.cpp (6220B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "TestCommon.h" 5 #include <AppInstallerErrors.h> 6 #include <winget/Yaml.h> 7 8 using namespace TestCommon; 9 using namespace AppInstaller::Utility; 10 using namespace AppInstaller::YAML; 11 12 13 TEST_CASE("YamlParserTypes", "[YAML]") 14 { 15 auto document = AppInstaller::YAML::Load(TestDataFile("Node-Types.yaml")); 16 17 auto intUnquoted = document["IntegerUnquoted"]; 18 CHECK(intUnquoted.GetTagType() == Node::TagType::Int); 19 20 auto intSingleQuoted = document["IntegerSingleQuoted"]; 21 CHECK(intSingleQuoted.GetTagType() == Node::TagType::Str); 22 23 auto intDoubleQuoted = document["IntegerDoubleQuoted"]; 24 CHECK(intDoubleQuoted.GetTagType() == Node::TagType::Str); 25 26 auto boolTrue = document["BooleanTrue"]; 27 CHECK(boolTrue.GetTagType() == Node::TagType::Bool); 28 29 auto strTrue = document["StringTrue"]; 30 CHECK(strTrue.GetTagType() == Node::TagType::Str); 31 32 auto boolFalse = document["BooleanFalse"]; 33 CHECK(boolFalse.GetTagType() == Node::TagType::Bool); 34 35 auto strFalse = document["StringFalse"]; 36 CHECK(strFalse.GetTagType() == Node::TagType::Str); 37 38 auto localTag = document["LocalTag"]; 39 CHECK(localTag.GetTagType() == Node::TagType::Unknown); 40 } 41 42 TEST_CASE("YamlMergeMappingNode", "[YAML]") 43 { 44 auto document = Load(TestDataFile("Node-Mapping.yaml")); 45 46 auto mergeNode = document["MergeNode"]; 47 auto mergeNode2 = document["MergeNode2"]; 48 49 REQUIRE(3 == mergeNode.size()); 50 REQUIRE(2 == mergeNode2.size()); 51 52 mergeNode.MergeMappingNode(mergeNode2); 53 54 REQUIRE(5 == mergeNode.size()); 55 } 56 57 TEST_CASE("YamlMergeMappingNode_CaseInsensitive", "[YAML]") 58 { 59 auto document = Load(TestDataFile("Node-Mapping.yaml")); 60 61 auto mergeNode = document["MergeNode"]; 62 auto mergeNode2 = document["MergeNode2"]; 63 64 REQUIRE(3 == mergeNode.size()); 65 REQUIRE(2 == mergeNode2.size()); 66 67 mergeNode.MergeMappingNode(mergeNode2, true); 68 69 REQUIRE(4 == mergeNode.size()); 70 } 71 72 TEST_CASE("YamlMergeSequenceNode", "[YAML]") 73 { 74 auto document = Load(TestDataFile("Node-Merge.yaml")); 75 auto document2 = Load(TestDataFile("Node-Merge2.yaml")); 76 77 REQUIRE(3 == document["StrawHats"].size()); 78 REQUIRE(2 == document2["StrawHats"].size()); 79 80 // Internally will call MergeMappingNode. 81 document["StrawHats"].MergeSequenceNode(document2["StrawHats"], "Bounty"); 82 REQUIRE(5 == document["StrawHats"].size()); 83 } 84 85 TEST_CASE("YamlMergeSequenceNode_CaseInsensitive", "[YAML]") 86 { 87 auto document = Load(TestDataFile("Node-Merge.yaml")); 88 auto document2 = Load(TestDataFile("Node-Merge2.yaml")); 89 90 REQUIRE(3 == document["StrawHats"].size()); 91 REQUIRE(2 == document2["StrawHats"].size()); 92 93 // Internally will call MergeMappingNode. 94 document["StrawHats"].MergeSequenceNode(document2["StrawHats"], "Name", true); 95 REQUIRE(4 == document["StrawHats"].size()); 96 97 auto luffy = std::find_if( 98 document["StrawHats"].Sequence().begin(), 99 document["StrawHats"].Sequence().end(), 100 [](auto const& n) { return n["Name"].as<std::string>() == "Monkey D Luffy"; }); 101 REQUIRE(luffy != document["StrawHats"].Sequence().end()); 102 103 // From original node 104 REQUIRE((*luffy)["Bounty"].as<std::string>() == "3,000,000,000"); 105 106 // From merged node 107 REQUIRE((*luffy)["Fruit"].as<std::string>() == "Gomu Gomu no Mi"); 108 } 109 110 TEST_CASE("YamlMergeNode_MergeSequenceNoKey", "[YAML]") 111 { 112 auto document = Load(TestDataFile("Node-Merge.yaml")); 113 auto document2 = Load(TestDataFile("Node-Merge2.yaml")); 114 115 REQUIRE_THROWS_HR(document["StrawHats"].MergeSequenceNode(document2["StrawHats"], "Power"), APPINSTALLER_CLI_ERROR_YAML_INVALID_DATA); 116 } 117 118 TEST_CASE("YamlMappingNode", "[YAML]") 119 { 120 auto document = Load(TestDataFile("Node-Mapping.yaml")); 121 122 auto node = document["key"]; 123 REQUIRE(node.as<std::string>() == "value"); 124 125 auto node2 = document.GetChildNode("KEY"); 126 REQUIRE(node2.as<std::string>() == "value"); 127 128 auto node3 = document.GetChildNode("key"); 129 REQUIRE(node3.as<std::string>() == "value"); 130 131 auto node4 = document.GetChildNode("kEy"); 132 REQUIRE(node4.as<std::string>() == "value"); 133 134 auto node5 = document.GetChildNode("fake"); 135 REQUIRE(node5.IsNull()); 136 137 auto node6 = document["repeatedkey"]; 138 REQUIRE(node6.as<std::string>() == "repeated value"); 139 REQUIRE_THROWS_HR(document.GetChildNode("repeatedkey"), APPINSTALLER_CLI_ERROR_YAML_DUPLICATE_MAPPING_KEY); 140 141 REQUIRE_THROWS_HR(document.GetChildNode("RepeatedKey"), APPINSTALLER_CLI_ERROR_YAML_DUPLICATE_MAPPING_KEY); 142 REQUIRE_THROWS_HR(document["RepeatedKey"], APPINSTALLER_CLI_ERROR_YAML_DUPLICATE_MAPPING_KEY); 143 } 144 145 TEST_CASE("YamlMappingNode_const", "[YAML]") 146 { 147 const auto document = Load(TestDataFile("Node-Mapping.yaml")); 148 149 auto node = document["key"]; 150 REQUIRE(node.as<std::string>() == "value"); 151 152 auto node2 = document.GetChildNode("KEY"); 153 REQUIRE(node2.as<std::string>() == "value"); 154 155 auto node3 = document.GetChildNode("key"); 156 REQUIRE(node3.as<std::string>() == "value"); 157 158 auto node4 = document.GetChildNode("kEy"); 159 REQUIRE(node4.as<std::string>() == "value"); 160 161 auto node5 = document.GetChildNode("fake"); 162 REQUIRE(node5.IsNull()); 163 164 auto node6 = document["repeatedkey"]; 165 REQUIRE(node6.as<std::string>() == "repeated value"); 166 REQUIRE_THROWS_HR(document.GetChildNode("repeatedkey"), APPINSTALLER_CLI_ERROR_YAML_DUPLICATE_MAPPING_KEY); 167 168 REQUIRE_THROWS_HR(document.GetChildNode("RepeatedKey"), APPINSTALLER_CLI_ERROR_YAML_DUPLICATE_MAPPING_KEY); 169 REQUIRE_THROWS_HR(document["RepeatedKey"], APPINSTALLER_CLI_ERROR_YAML_DUPLICATE_MAPPING_KEY); 170 } 171 172 TEST_CASE("YamlContainsEscapeControlCode", "[YAML]") 173 { 174 REQUIRE_THROWS_HR(Load(TestDataFile("ContainsEscapeControlCode.yaml")), APPINSTALLER_CLI_ERROR_LIBYAML_ERROR); 175 } 176 177 TEST_CASE("YamlContainsTooManyNestedLayers", "[YAML]") 178 { 179 REQUIRE_THROWS_HR(Load(TestDataFile("ContainsTooManyNestedLayers.yaml")), APPINSTALLER_CLI_ERROR_YAML_DOC_BUILD_FAILED); 180 }