blob: 84ca48a105c861b093f5ddf1d4a61f0c5f50a599 [file] [log] [blame]
//===- 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);
}
}