//===- 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(OptNodeOrErr)); ASSERT_TRUE(*OptNodeOrErr); auto *S = dyn_cast((*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(OptNodeOrErr)); ASSERT_TRUE(*OptNodeOrErr); auto *A = dyn_cast((*OptNodeOrErr)->get()); ASSERT_TRUE(A); ASSERT_EQ(A->size(), 2u); auto *SI = dyn_cast((*A)[0].get()); ASSERT_TRUE(SI); ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_Int); ASSERT_EQ(SI->getInt(), 1); auto *SN = dyn_cast((*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(OptNodeOrErr)); ASSERT_TRUE(*OptNodeOrErr); auto *A = dyn_cast((*OptNodeOrErr)->get()); ASSERT_TRUE(A); ASSERT_EQ(A->size(), 2u); auto *FooS = dyn_cast((*A)["foo"].get()); ASSERT_TRUE(FooS); ASSERT_EQ(FooS->getScalarKind(), ScalarNode::SK_Int); ASSERT_EQ(FooS->getInt(), 1); auto *BarS = dyn_cast((*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(int64_t(1))); A.push_back(std::make_shared()); 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(int64_t(1)); M["bar"] = std::make_shared(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(int64_t(1))); A.push_back(std::make_shared(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(RootNode.get()); ASSERT_TRUE(A); ASSERT_EQ(A->size(), 2u); auto *SI = dyn_cast((*A)[0].get()); ASSERT_TRUE(SI); ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt); ASSERT_EQ(SI->getUInt(), 1u); auto *SS = dyn_cast((*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(int64_t(1)); M["bar"] = std::make_shared(uint64_t(2)); auto N = std::make_shared(); (*N)["baz"] = std::make_shared(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(RootNode.get()); ASSERT_TRUE(M); ASSERT_EQ(M->size(), 2u); auto *SI = dyn_cast((*M)["foo"].get()); ASSERT_TRUE(SI); ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt); ASSERT_EQ(SI->getUInt(), 1u); auto *SS = dyn_cast((*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(RootNode.get()); ASSERT_TRUE(M); ASSERT_EQ(M->size(), 1u); InnerMap = (*M)["foo"]; } auto *N = dyn_cast(InnerMap.get()); ASSERT_TRUE(N); ASSERT_EQ(N->size(), 1u); IntNode = (*N)["bar"]; } auto *S = dyn_cast(IntNode.get()); ASSERT_TRUE(S); ASSERT_EQ(S->getScalarKind(), ScalarNode::SK_UInt); ASSERT_EQ(S->getUInt(), 1u); } }