blob: 13b07f0cd016d320bf11816b8a8cd092d54155ed [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "util/raw_ref.h"
#include <memory>
#include <type_traits>
#include <utility>
#include "gtest/gtest.h"
namespace openscreen {
namespace {
TEST(RawRefTest, SizeIsSameAsRawPointer) {
#if !defined(BUILD_WITH_CHROMIUM)
// In standalone builds, raw_ref must be zero-overhead.
EXPECT_EQ(sizeof(raw_ref<int>), sizeof(int*));
#endif
}
TEST(RawRefTest, ConstructFromReference) {
int val = 42;
raw_ref<int> r(val);
EXPECT_EQ(&r.get(), &val);
EXPECT_EQ(*r, 42);
}
TEST(RawRefTest, CopyAndMove) {
int val = 42;
raw_ref<int> r1(val);
// Copy
raw_ref<int> r2 = r1;
EXPECT_EQ(&r2.get(), &val);
EXPECT_EQ(&r1.get(), &val);
// Move
raw_ref<int> r3 = std::move(r2);
EXPECT_EQ(&r3.get(), &val);
}
TEST(RawRefTest, Assignment) {
int val1 = 42;
int val2 = 84;
raw_ref<int> r1(val1);
raw_ref<int> r2(val2);
r1 = r2;
EXPECT_EQ(&r1.get(), &val2);
r1 = std::move(r2);
EXPECT_EQ(&r1.get(), &val2);
}
TEST(RawRefTest, DereferenceAndMemberAccess) {
struct Foo {
int x = 42;
};
Foo foo;
raw_ref<Foo> r(foo);
EXPECT_EQ(r->x, 42);
EXPECT_EQ((*r).x, 42);
EXPECT_EQ(r.get().x, 42);
}
TEST(RawRefTest, Comparison) {
int val1 = 42;
int val2 = 84;
raw_ref<int> r1(val1);
raw_ref<int> r1_copy(val1);
raw_ref<int> r2(val2);
EXPECT_TRUE(r1 == r1);
EXPECT_TRUE(r1 == r1_copy);
EXPECT_FALSE(r1 == r2);
EXPECT_TRUE(r1 != r2);
}
struct Base {
virtual ~Base() = default;
int base_val = 1;
};
struct Derived : public Base {
int derived_val = 2;
};
TEST(RawRefTest, Upcasting) {
Derived derived;
raw_ref<Derived> r_derived(derived);
// Copy construct Derived -> Base
raw_ref<Base> r_base(r_derived);
EXPECT_EQ(&r_base.get(), &derived);
EXPECT_EQ(r_base->base_val, 1);
// Move construct Derived -> Base
raw_ref<Derived> r_derived_move(derived);
raw_ref<Base> r_base_move(std::move(r_derived_move));
EXPECT_EQ(&r_base_move.get(), &derived);
// Assignment Derived -> Base
Derived derived2;
raw_ref<Derived> r_derived2(derived2);
r_base = r_derived2;
EXPECT_EQ(&r_base.get(), &derived2);
// Move assignment Derived -> Base
Derived derived3;
raw_ref<Derived> r_derived3(derived3);
r_base = std::move(r_derived3);
EXPECT_EQ(&r_base.get(), &derived3);
}
} // namespace
} // namespace openscreen