MsgPackTypesTest.cpp 5.8 KB

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