123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- //===- MsgPackTypesTest.cpp -------------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/BinaryFormat/MsgPackTypes.h"
- #include "gtest/gtest.h"
- using namespace llvm;
- using namespace msgpack;
- TEST(MsgPackTypes, TestReadInt) {
- Reader MPReader(StringRef("\xd0\x00", 2));
- auto OptNodeOrErr = Node::read(MPReader);
- ASSERT_TRUE(static_cast<bool>(OptNodeOrErr));
- ASSERT_TRUE(*OptNodeOrErr);
- auto *S = dyn_cast<ScalarNode>((*OptNodeOrErr)->get());
- ASSERT_TRUE(S);
- ASSERT_EQ(S->getScalarKind(), ScalarNode::SK_Int);
- ASSERT_EQ(S->getInt(), 0);
- }
- TEST(MsgPackTypes, TestReadArray) {
- Reader MPReader(StringRef("\x92\xd0\x01\xc0"));
- auto OptNodeOrErr = Node::read(MPReader);
- ASSERT_TRUE(static_cast<bool>(OptNodeOrErr));
- ASSERT_TRUE(*OptNodeOrErr);
- auto *A = dyn_cast<ArrayNode>((*OptNodeOrErr)->get());
- ASSERT_TRUE(A);
- ASSERT_EQ(A->size(), 2u);
- auto *SI = dyn_cast<ScalarNode>((*A)[0].get());
- ASSERT_TRUE(SI);
- ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_Int);
- ASSERT_EQ(SI->getInt(), 1);
- auto *SN = dyn_cast<ScalarNode>((*A)[1].get());
- ASSERT_TRUE(SN);
- ASSERT_EQ(SN->getScalarKind(), ScalarNode::SK_Nil);
- }
- TEST(MsgPackTypes, TestReadMap) {
- Reader MPReader(StringRef("\x82\xa3"
- "foo"
- "\xd0\x01\xa3"
- "bar"
- "\xd0\x02"));
- auto OptNodeOrErr = Node::read(MPReader);
- ASSERT_TRUE(static_cast<bool>(OptNodeOrErr));
- ASSERT_TRUE(*OptNodeOrErr);
- auto *A = dyn_cast<MapNode>((*OptNodeOrErr)->get());
- ASSERT_TRUE(A);
- ASSERT_EQ(A->size(), 2u);
- auto *FooS = dyn_cast<ScalarNode>((*A)["foo"].get());
- ASSERT_TRUE(FooS);
- ASSERT_EQ(FooS->getScalarKind(), ScalarNode::SK_Int);
- ASSERT_EQ(FooS->getInt(), 1);
- auto *BarS = dyn_cast<ScalarNode>((*A)["bar"].get());
- ASSERT_TRUE(BarS);
- ASSERT_EQ(BarS->getScalarKind(), ScalarNode::SK_Int);
- ASSERT_EQ(BarS->getInt(), 2);
- }
- TEST(MsgPackTypes, TestWriteInt) {
- std::string Buffer;
- raw_string_ostream OStream(Buffer);
- Writer MPWriter(OStream);
- ScalarNode I(int64_t(1));
- I.write(MPWriter);
- ASSERT_EQ(OStream.str(), "\x01");
- }
- TEST(MsgPackTypes, TestWriteArray) {
- std::string Buffer;
- raw_string_ostream OStream(Buffer);
- Writer MPWriter(OStream);
- ArrayNode A;
- A.push_back(std::make_shared<ScalarNode>(int64_t(1)));
- A.push_back(std::make_shared<ScalarNode>());
- A.write(MPWriter);
- ASSERT_EQ(OStream.str(), "\x92\x01\xc0");
- }
- TEST(MsgPackTypes, TestWriteMap) {
- std::string Buffer;
- raw_string_ostream OStream(Buffer);
- Writer MPWriter(OStream);
- MapNode M;
- M["foo"] = std::make_shared<ScalarNode>(int64_t(1));
- M["bar"] = std::make_shared<ScalarNode>(int64_t(2));
- M.write(MPWriter);
- ASSERT_EQ(OStream.str(), "\x82\xa3"
- "foo"
- "\x01\xa3"
- "bar"
- "\x02");
- }
- TEST(MsgPackTypes, TestOutputYAMLArray) {
- std::string Buffer;
- raw_string_ostream OStream(Buffer);
- yaml::Output yout(OStream);
- ArrayNode A;
- A.push_back(std::make_shared<ScalarNode>(int64_t(1)));
- A.push_back(std::make_shared<ScalarNode>(int64_t(2)));
- yout << A;
- ASSERT_EQ(OStream.str(), "---\n- !int 1\n- !int 2\n...\n");
- }
- TEST(MsgPackTypes, TestInputYAMLArray) {
- NodePtr RootNode;
- yaml::Input yin("---\n- !int 1\n- !str 2\n...\n");
- yin >> RootNode;
- auto *A = dyn_cast<ArrayNode>(RootNode.get());
- ASSERT_TRUE(A);
- ASSERT_EQ(A->size(), 2u);
- auto *SI = dyn_cast<ScalarNode>((*A)[0].get());
- ASSERT_TRUE(SI);
- ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt);
- ASSERT_EQ(SI->getUInt(), 1u);
- auto *SS = dyn_cast<ScalarNode>((*A)[1].get());
- ASSERT_TRUE(SS);
- ASSERT_EQ(SS->getScalarKind(), ScalarNode::SK_String);
- ASSERT_EQ(SS->getString(), "2");
- }
- TEST(MsgPackTypes, TestOutputYAMLMap) {
- std::string Buffer;
- raw_string_ostream OStream(Buffer);
- yaml::Output yout(OStream);
- MapNode M;
- M["foo"] = std::make_shared<ScalarNode>(int64_t(1));
- M["bar"] = std::make_shared<ScalarNode>(uint64_t(2));
- auto N = std::make_shared<MapNode>();
- (*N)["baz"] = std::make_shared<ScalarNode>(true);
- M["qux"] = std::move(N);
- yout << M;
- ASSERT_EQ(OStream.str(), "---\nfoo: !int 1\nbar: "
- "!int 2\nqux: \n baz: "
- "!bool true\n...\n");
- }
- TEST(MsgPackTypes, TestInputYAMLMap) {
- NodePtr RootNode;
- yaml::Input yin("---\nfoo: !int 1\nbaz: !str 2\n...\n");
- yin >> RootNode;
- auto *M = dyn_cast<MapNode>(RootNode.get());
- ASSERT_TRUE(M);
- ASSERT_EQ(M->size(), 2u);
- auto *SI = dyn_cast<ScalarNode>((*M)["foo"].get());
- ASSERT_TRUE(SI);
- ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt);
- ASSERT_EQ(SI->getUInt(), 1u);
- auto *SS = dyn_cast<ScalarNode>((*M)["baz"].get());
- ASSERT_TRUE(SS);
- ASSERT_EQ(SS->getScalarKind(), ScalarNode::SK_String);
- ASSERT_EQ(SS->getString(), "2");
- }
- // Test that the document is parsed into a tree of shared_ptr where each node
- // can have multiple owners.
- TEST(MsgPackTypes, TestInputShared) {
- yaml::Input yin("---\nfoo:\n bar: !int 1\n...\n");
- NodePtr InnerMap;
- NodePtr IntNode;
- {
- {
- {
- NodePtr RootNode;
- yin >> RootNode;
- auto *M = dyn_cast<MapNode>(RootNode.get());
- ASSERT_TRUE(M);
- ASSERT_EQ(M->size(), 1u);
- InnerMap = (*M)["foo"];
- }
- auto *N = dyn_cast<MapNode>(InnerMap.get());
- ASSERT_TRUE(N);
- ASSERT_EQ(N->size(), 1u);
- IntNode = (*N)["bar"];
- }
- auto *S = dyn_cast<ScalarNode>(IntNode.get());
- ASSERT_TRUE(S);
- ASSERT_EQ(S->getScalarKind(), ScalarNode::SK_UInt);
- ASSERT_EQ(S->getUInt(), 1u);
- }
- }
|