dragonfly/core/compact_object_test.cc
Roman Gershman aa2136a406 Add CompactObject that will represent all the possible dragonfly types
Specifically, it act as union for int,string, set, zset and other types
that exist in Redis API. In order to be more memory friendly, CompactObject
incorporates inline storage that will be used for SSO.
2022-02-24 14:11:43 +02:00

68 lines
1.3 KiB
C++

// Copyright 2021, Roman Gershman. All rights reserved.
// See LICENSE for licensing terms.
//
#include "core/compact_object.h"
#include "base/gtest.h"
extern "C" {
#include "redis/object.h"
}
namespace dfly {
using namespace std;
void PrintTo(const CompactObj& cobj, std::ostream* os) {
if (cobj.ObjType() == OBJ_STRING) {
*os << "'" << cobj.ToString() << "' ";
return;
}
*os << "cobj: [" << cobj.ObjType() << "]";
}
class CompactObjectTest : public ::testing::Test {
protected:
static void SetUpTestCase() {
}
CompactObj cs_;
string tmp_;
};
TEST_F(CompactObjectTest, Basic) {
robj* rv = createRawStringObject("foo", 3);
cs_.ImportRObj(rv);
CompactObj a;
a.SetString("val");
string res;
a.GetString(&res);
EXPECT_EQ("val", res);
CompactObj b("vala");
EXPECT_NE(a, b);
CompactObj c = a.AsRef();
EXPECT_EQ(a, c);
}
TEST_F(CompactObjectTest, Int) {
cs_.SetString("0");
EXPECT_EQ(0, cs_.TryGetInt());
EXPECT_EQ(cs_, "0");
EXPECT_EQ("0", cs_.GetSlice(&tmp_));
EXPECT_EQ(OBJ_STRING, cs_.ObjType());
cs_.SetString("42");
EXPECT_EQ(OBJ_ENCODING_INT, cs_.Encoding());
}
TEST_F(CompactObjectTest, MediumString) {
CompactObj obj;
string tmp(512, 'b');
obj.SetString(tmp);
obj.SetString(tmp);
obj.Reset();
}
} // namespace dfly