winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }