MsgPackTypesTest.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. //===- MsgPackTypesTest.cpp -------------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/BinaryFormat/MsgPackTypes.h"
  9. #include "gtest/gtest.h"
  10. using namespace llvm;
  11. using namespace msgpack;
  12. TEST(MsgPackTypes, TestReadInt) {
  13. Reader MPReader(StringRef("\xd0\x00", 2));
  14. auto OptNodeOrErr = Node::read(MPReader);
  15. ASSERT_TRUE(static_cast<bool>(OptNodeOrErr));
  16. ASSERT_TRUE(*OptNodeOrErr);
  17. auto *S = dyn_cast<ScalarNode>((*OptNodeOrErr)->get());
  18. ASSERT_TRUE(S);
  19. ASSERT_EQ(S->getScalarKind(), ScalarNode::SK_Int);
  20. ASSERT_EQ(S->getInt(), 0);
  21. }
  22. TEST(MsgPackTypes, TestReadArray) {
  23. Reader MPReader(StringRef("\x92\xd0\x01\xc0"));
  24. auto OptNodeOrErr = Node::read(MPReader);
  25. ASSERT_TRUE(static_cast<bool>(OptNodeOrErr));
  26. ASSERT_TRUE(*OptNodeOrErr);
  27. auto *A = dyn_cast<ArrayNode>((*OptNodeOrErr)->get());
  28. ASSERT_TRUE(A);
  29. ASSERT_EQ(A->size(), 2u);
  30. auto *SI = dyn_cast<ScalarNode>((*A)[0].get());
  31. ASSERT_TRUE(SI);
  32. ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_Int);
  33. ASSERT_EQ(SI->getInt(), 1);
  34. auto *SN = dyn_cast<ScalarNode>((*A)[1].get());
  35. ASSERT_TRUE(SN);
  36. ASSERT_EQ(SN->getScalarKind(), ScalarNode::SK_Nil);
  37. }
  38. TEST(MsgPackTypes, TestReadMap) {
  39. Reader MPReader(StringRef("\x82\xa3"
  40. "foo"
  41. "\xd0\x01\xa3"
  42. "bar"
  43. "\xd0\x02"));
  44. auto OptNodeOrErr = Node::read(MPReader);
  45. ASSERT_TRUE(static_cast<bool>(OptNodeOrErr));
  46. ASSERT_TRUE(*OptNodeOrErr);
  47. auto *A = dyn_cast<MapNode>((*OptNodeOrErr)->get());
  48. ASSERT_TRUE(A);
  49. ASSERT_EQ(A->size(), 2u);
  50. auto *FooS = dyn_cast<ScalarNode>((*A)["foo"].get());
  51. ASSERT_TRUE(FooS);
  52. ASSERT_EQ(FooS->getScalarKind(), ScalarNode::SK_Int);
  53. ASSERT_EQ(FooS->getInt(), 1);
  54. auto *BarS = dyn_cast<ScalarNode>((*A)["bar"].get());
  55. ASSERT_TRUE(BarS);
  56. ASSERT_EQ(BarS->getScalarKind(), ScalarNode::SK_Int);
  57. ASSERT_EQ(BarS->getInt(), 2);
  58. }
  59. TEST(MsgPackTypes, TestWriteInt) {
  60. std::string Buffer;
  61. raw_string_ostream OStream(Buffer);
  62. Writer MPWriter(OStream);
  63. ScalarNode I(int64_t(1));
  64. I.write(MPWriter);
  65. ASSERT_EQ(OStream.str(), "\x01");
  66. }
  67. TEST(MsgPackTypes, TestWriteArray) {
  68. std::string Buffer;
  69. raw_string_ostream OStream(Buffer);
  70. Writer MPWriter(OStream);
  71. ArrayNode A;
  72. A.push_back(std::make_shared<ScalarNode>(int64_t(1)));
  73. A.push_back(std::make_shared<ScalarNode>());
  74. A.write(MPWriter);
  75. ASSERT_EQ(OStream.str(), "\x92\x01\xc0");
  76. }
  77. TEST(MsgPackTypes, TestWriteMap) {
  78. std::string Buffer;
  79. raw_string_ostream OStream(Buffer);
  80. Writer MPWriter(OStream);
  81. MapNode M;
  82. M["foo"] = std::make_shared<ScalarNode>(int64_t(1));
  83. M["bar"] = std::make_shared<ScalarNode>(int64_t(2));
  84. M.write(MPWriter);
  85. ASSERT_EQ(OStream.str(), "\x82\xa3"
  86. "foo"
  87. "\x01\xa3"
  88. "bar"
  89. "\x02");
  90. }
  91. TEST(MsgPackTypes, TestOutputYAMLArray) {
  92. std::string Buffer;
  93. raw_string_ostream OStream(Buffer);
  94. yaml::Output yout(OStream);
  95. ArrayNode A;
  96. A.push_back(std::make_shared<ScalarNode>(int64_t(1)));
  97. A.push_back(std::make_shared<ScalarNode>(int64_t(2)));
  98. yout << A;
  99. ASSERT_EQ(OStream.str(), "---\n- !int 1\n- !int 2\n...\n");
  100. }
  101. TEST(MsgPackTypes, TestInputYAMLArray) {
  102. NodePtr RootNode;
  103. yaml::Input yin("---\n- !int 1\n- !str 2\n...\n");
  104. yin >> RootNode;
  105. auto *A = dyn_cast<ArrayNode>(RootNode.get());
  106. ASSERT_TRUE(A);
  107. ASSERT_EQ(A->size(), 2u);
  108. auto *SI = dyn_cast<ScalarNode>((*A)[0].get());
  109. ASSERT_TRUE(SI);
  110. ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt);
  111. ASSERT_EQ(SI->getUInt(), 1u);
  112. auto *SS = dyn_cast<ScalarNode>((*A)[1].get());
  113. ASSERT_TRUE(SS);
  114. ASSERT_EQ(SS->getScalarKind(), ScalarNode::SK_String);
  115. ASSERT_EQ(SS->getString(), "2");
  116. }
  117. TEST(MsgPackTypes, TestOutputYAMLMap) {
  118. std::string Buffer;
  119. raw_string_ostream OStream(Buffer);
  120. yaml::Output yout(OStream);
  121. MapNode M;
  122. M["foo"] = std::make_shared<ScalarNode>(int64_t(1));
  123. M["bar"] = std::make_shared<ScalarNode>(uint64_t(2));
  124. auto N = std::make_shared<MapNode>();
  125. (*N)["baz"] = std::make_shared<ScalarNode>(true);
  126. M["qux"] = std::move(N);
  127. yout << M;
  128. ASSERT_EQ(OStream.str(), "---\nfoo: !int 1\nbar: "
  129. "!int 2\nqux: \n baz: "
  130. "!bool true\n...\n");
  131. }
  132. TEST(MsgPackTypes, TestInputYAMLMap) {
  133. NodePtr RootNode;
  134. yaml::Input yin("---\nfoo: !int 1\nbaz: !str 2\n...\n");
  135. yin >> RootNode;
  136. auto *M = dyn_cast<MapNode>(RootNode.get());
  137. ASSERT_TRUE(M);
  138. ASSERT_EQ(M->size(), 2u);
  139. auto *SI = dyn_cast<ScalarNode>((*M)["foo"].get());
  140. ASSERT_TRUE(SI);
  141. ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt);
  142. ASSERT_EQ(SI->getUInt(), 1u);
  143. auto *SS = dyn_cast<ScalarNode>((*M)["baz"].get());
  144. ASSERT_TRUE(SS);
  145. ASSERT_EQ(SS->getScalarKind(), ScalarNode::SK_String);
  146. ASSERT_EQ(SS->getString(), "2");
  147. }
  148. // Test that the document is parsed into a tree of shared_ptr where each node
  149. // can have multiple owners.
  150. TEST(MsgPackTypes, TestInputShared) {
  151. yaml::Input yin("---\nfoo:\n bar: !int 1\n...\n");
  152. NodePtr InnerMap;
  153. NodePtr IntNode;
  154. {
  155. {
  156. {
  157. NodePtr RootNode;
  158. yin >> RootNode;
  159. auto *M = dyn_cast<MapNode>(RootNode.get());
  160. ASSERT_TRUE(M);
  161. ASSERT_EQ(M->size(), 1u);
  162. InnerMap = (*M)["foo"];
  163. }
  164. auto *N = dyn_cast<MapNode>(InnerMap.get());
  165. ASSERT_TRUE(N);
  166. ASSERT_EQ(N->size(), 1u);
  167. IntNode = (*N)["bar"];
  168. }
  169. auto *S = dyn_cast<ScalarNode>(IntNode.get());
  170. ASSERT_TRUE(S);
  171. ASSERT_EQ(S->getScalarKind(), ScalarNode::SK_UInt);
  172. ASSERT_EQ(S->getUInt(), 1u);
  173. }
  174. }