blob: faf551ae7084f2bd4e93292709c4a77398187597 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/graphics/display/drivers/intel-i915/scoped-value-change.h"
#include <gtest/gtest.h>
namespace i915 {
namespace {
TEST(ScopedValueChange, ConstructorChangesVariable) {
int variable = 100;
ScopedValueChange value_change(variable, 200);
EXPECT_EQ(200, variable);
}
TEST(ScopedValueChange, DestructorRestoresVariable) {
int variable = 100;
{ ScopedValueChange value_change(variable, 200); }
EXPECT_EQ(100, variable);
}
TEST(ScopedValueChange, MoveConstructorPopulatesDestination) {
int variable = 100;
{
ScopedValueChange move_source_change(variable, 200);
{ ScopedValueChange move_destination_change(std::move(move_source_change)); }
EXPECT_EQ(100, variable)
<< "`move_destination_change` destruction did not restore the variable";
}
}
TEST(ScopedValueChange, MoveConstructorDoesNotModifyVariable) {
int variable = 100;
{
ScopedValueChange move_source_change(variable, 200);
{
variable = 300;
ScopedValueChange move_destination_change(std::move(move_source_change));
EXPECT_EQ(300, variable) << "Move constructor changed the variable";
}
}
}
TEST(ScopedValueChange, MoveConstructorInvalidatesMoveSource) {
int variable = 100;
{
ScopedValueChange move_source_change(variable, 200);
{ ScopedValueChange move_destination_change(std::move(move_source_change)); }
EXPECT_EQ(100, variable)
<< "`move_destination_change` destruction did not restore the variable";
variable = 300;
}
EXPECT_EQ(300, variable) << "`move_source_change` destruction restored the variable";
}
TEST(ScopedValueChange, MoveAssignmentPopulatesDestination) {
int variable1 = 101;
int variable2 = 102;
{
ScopedValueChange move_source_change(variable1, 201);
{
ScopedValueChange move_destination_change(variable2, 202);
move_destination_change = std::move(move_source_change);
}
EXPECT_EQ(101, variable1)
<< "`move_destination_change` destruction did not restore the variable";
}
}
TEST(ScopedValueChange, MoveAssignmentDoesNotModifyVariables) {
int variable1 = 101;
int variable2 = 102;
{
ScopedValueChange move_source_change(variable1, 201);
{
ScopedValueChange move_destination_change(variable2, 202);
variable1 = 103;
variable2 = 203;
move_destination_change = std::move(move_source_change);
EXPECT_EQ(103, variable1) << "Move assignment changed the variable of the moved-from Change";
EXPECT_EQ(203, variable2) << "Move assignment changed the variable of the moved-to Change";
}
}
}
TEST(ScopedValueChange, MoveAssignmentDoesNotDropDestinationState) {
int variable1 = 101;
int variable2 = 102;
{
ScopedValueChange move_source_change(variable1, 201);
{
ScopedValueChange move_destination_change(variable2, 202);
move_destination_change = std::move(move_source_change);
}
}
EXPECT_EQ(102, variable2) << "Move assignment dropped the moved-to state";
}
TEST(ScopedValueChange, MultipleChangesForSameVariable) {
int variable = 100;
ScopedValueChange change(variable, 200);
EXPECT_DEATH({ ScopedValueChange change2(variable, 300); },
"Multiple ScopedValueChange instances created");
}
TEST(ScopedValueChange, ResetRestoresOriginalValue) {
int variable = 100;
ScopedValueChange change(variable, 200);
change.reset();
EXPECT_EQ(100, variable) << "reset() did not restore the variable";
}
TEST(ScopedValueChange, ResetInvalidatesChange) {
int variable = 100;
{
ScopedValueChange change(variable, 200);
change.reset();
variable = 300;
}
EXPECT_EQ(300, variable) << "Reset `change` destruction restored the variable";
}
TEST(ScopedValueChange, MoveAssignmentPopulatesResetDestination) {
int variable1 = 101;
int variable2 = 102;
{
ScopedValueChange move_source_change(variable1, 201);
{
ScopedValueChange move_destination_change(variable2, 202);
move_destination_change.reset();
variable2 = 203;
move_destination_change = std::move(move_source_change);
}
EXPECT_EQ(101, variable1)
<< "`move_destination_change` destruction did not restore the variable";
}
}
TEST(ScopedValueChange, MoveAssignmentToResetDestinationDoesNotModifyVariables) {
int variable1 = 101;
int variable2 = 102;
{
ScopedValueChange move_source_change(variable1, 201);
{
ScopedValueChange move_destination_change(variable2, 202);
move_destination_change.reset();
variable1 = 103;
variable2 = 203;
move_destination_change = std::move(move_source_change);
EXPECT_EQ(103, variable1) << "Move assignment changed the variable of the moved-from Change";
EXPECT_EQ(203, variable2) << "Move assignment changed the variable of the moved-to Change";
}
}
}
TEST(ScopedValueChange, MoveAssignmentDoesRestoreResetDestination) {
int variable1 = 101;
int variable2 = 102;
{
ScopedValueChange move_source_change(variable1, 201);
{
ScopedValueChange move_destination_change(variable2, 202);
move_destination_change.reset();
variable2 = 203;
move_destination_change = std::move(move_source_change);
}
}
EXPECT_EQ(203, variable2) << "Move assignment revived reset destination state";
}
} // namespace
} // namespace i915