MsgPackDocumentTest.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //===- MsgPackDocumentTest.cpp --------------------------------------------===//
  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/MsgPackDocument.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. using namespace msgpack;
  13. TEST(MsgPackDocument, TestReadInt) {
  14. Document Doc;
  15. bool Ok = Doc.readFromBlob(StringRef("\xd0\x00", 2), /*Multi=*/false);
  16. ASSERT_TRUE(Ok);
  17. ASSERT_EQ(Doc.getRoot().getKind(), Type::Int);
  18. ASSERT_EQ(Doc.getRoot().getInt(), 0);
  19. }
  20. TEST(MsgPackDocument, TestReadArray) {
  21. Document Doc;
  22. bool Ok = Doc.readFromBlob(StringRef("\x92\xd0\x01\xc0"), /*Multi=*/false);
  23. ASSERT_TRUE(Ok);
  24. ASSERT_EQ(Doc.getRoot().getKind(), Type::Array);
  25. auto A = Doc.getRoot().getArray();
  26. ASSERT_EQ(A.size(), 2u);
  27. auto SI = A[0];
  28. ASSERT_EQ(SI.getKind(), Type::Int);
  29. ASSERT_EQ(SI.getInt(), 1);
  30. auto SN = A[1];
  31. ASSERT_EQ(SN.getKind(), Type::Nil);
  32. }
  33. TEST(MsgPackDocument, TestReadMap) {
  34. Document Doc;
  35. bool Ok = Doc.readFromBlob(StringRef("\x82\xa3"
  36. "foo"
  37. "\xd0\x01\xa3"
  38. "bar"
  39. "\xd0\x02"),
  40. /*Multi=*/false);
  41. ASSERT_TRUE(Ok);
  42. ASSERT_EQ(Doc.getRoot().getKind(), Type::Map);
  43. auto M = Doc.getRoot().getMap();
  44. ASSERT_EQ(M.size(), 2u);
  45. auto FooS = M["foo"];
  46. ASSERT_EQ(FooS.getKind(), Type::Int);
  47. ASSERT_EQ(FooS.getInt(), 1);
  48. auto BarS = M["bar"];
  49. ASSERT_EQ(BarS.getKind(), Type::Int);
  50. ASSERT_EQ(BarS.getInt(), 2);
  51. }
  52. TEST(MsgPackDocument, TestWriteInt) {
  53. Document Doc;
  54. Doc.getRoot() = Doc.getNode(int64_t(1));
  55. std::string Buffer;
  56. Doc.writeToBlob(Buffer);
  57. ASSERT_EQ(Buffer, "\x01");
  58. }
  59. TEST(MsgPackDocument, TestWriteArray) {
  60. Document Doc;
  61. auto A = Doc.getRoot().getArray(/*Convert=*/true);
  62. A.push_back(Doc.getNode(int64_t(1)));
  63. A.push_back(Doc.getNode());
  64. std::string Buffer;
  65. Doc.writeToBlob(Buffer);
  66. ASSERT_EQ(Buffer, "\x92\x01\xc0");
  67. }
  68. TEST(MsgPackDocument, TestWriteMap) {
  69. Document Doc;
  70. auto M = Doc.getRoot().getMap(/*Convert=*/true);
  71. M["foo"] = Doc.getNode(int64_t(1));
  72. M["bar"] = Doc.getNode(int64_t(2));
  73. std::string Buffer;
  74. Doc.writeToBlob(Buffer);
  75. ASSERT_EQ(Buffer, "\x82\xa3"
  76. "bar"
  77. "\x02\xa3"
  78. "foo"
  79. "\x01");
  80. }
  81. TEST(MsgPackDocument, TestOutputYAMLArray) {
  82. Document Doc;
  83. auto A = Doc.getRoot().getArray(/*Convert=*/true);
  84. A.push_back(Doc.getNode(int64_t(1)));
  85. A.push_back(Doc.getNode(int64_t(2)));
  86. std::string Buffer;
  87. raw_string_ostream OStream(Buffer);
  88. Doc.toYAML(OStream);
  89. ASSERT_EQ(OStream.str(), "---\n- 1\n- 2\n...\n");
  90. }
  91. TEST(MsgPackDocument, TestInputYAMLArray) {
  92. Document Doc;
  93. bool Ok = Doc.fromYAML("---\n- !int 0x1\n- !str 2\n...\n");
  94. ASSERT_TRUE(Ok);
  95. ASSERT_EQ(Doc.getRoot().getKind(), Type::Array);
  96. auto A = Doc.getRoot().getArray();
  97. ASSERT_EQ(A.size(), 2u);
  98. auto SI = A[0];
  99. ASSERT_EQ(SI.getKind(), Type::UInt);
  100. ASSERT_EQ(SI.getUInt(), 1u);
  101. auto SS = A[1];
  102. ASSERT_EQ(SS.getKind(), Type::String);
  103. ASSERT_EQ(SS.getString(), "2");
  104. }
  105. TEST(MsgPackDocument, TestOutputYAMLMap) {
  106. Document Doc;
  107. auto M = Doc.getRoot().getMap(/*Convert=*/true);
  108. M["foo"] = Doc.getNode(int64_t(1));
  109. M["bar"] = Doc.getNode(uint64_t(2));
  110. auto N = Doc.getMapNode();
  111. M["qux"] = N;
  112. N["baz"] = Doc.getNode(true);
  113. std::string Buffer;
  114. raw_string_ostream OStream(Buffer);
  115. Doc.toYAML(OStream);
  116. ASSERT_EQ(OStream.str(), "---\n"
  117. "bar: 2\n"
  118. "foo: 1\n"
  119. "qux:\n"
  120. " baz: true\n"
  121. "...\n");
  122. }
  123. TEST(MsgPackDocument, TestOutputYAMLMapHex) {
  124. Document Doc;
  125. Doc.setHexMode();
  126. auto M = Doc.getRoot().getMap(/*Convert=*/true);
  127. M["foo"] = Doc.getNode(int64_t(1));
  128. M["bar"] = Doc.getNode(uint64_t(2));
  129. auto N = Doc.getMapNode();
  130. M["qux"] = N;
  131. N["baz"] = Doc.getNode(true);
  132. std::string Buffer;
  133. raw_string_ostream OStream(Buffer);
  134. Doc.toYAML(OStream);
  135. ASSERT_EQ(OStream.str(), "---\n"
  136. "bar: 0x2\n"
  137. "foo: 1\n"
  138. "qux:\n"
  139. " baz: true\n"
  140. "...\n");
  141. }
  142. TEST(MsgPackDocument, TestInputYAMLMap) {
  143. Document Doc;
  144. bool Ok = Doc.fromYAML("---\nfoo: !int 0x1\nbaz: !str 2\n...\n");
  145. ASSERT_TRUE(Ok);
  146. ASSERT_EQ(Doc.getRoot().getKind(), Type::Map);
  147. auto M = Doc.getRoot().getMap();
  148. ASSERT_EQ(M.size(), 2u);
  149. auto SI = M["foo"];
  150. ASSERT_EQ(SI.getKind(), Type::UInt);
  151. ASSERT_EQ(SI.getUInt(), 1u);
  152. auto SS = M["baz"];
  153. ASSERT_EQ(SS.getKind(), Type::String);
  154. ASSERT_EQ(SS.getString(), "2");
  155. }