blob: 055808ae654a3a37a9f3952f8aa76bb716187bbc [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/databinding/binding.h"
#include "base/functional/callback.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace vr {
namespace {
struct TestModel {
bool value;
};
struct TestView {
bool value;
std::unique_ptr<Binding<bool>> binding;
};
} // namespace
TEST(Binding, BoundBool) {
TestModel a;
a.value = true;
TestView b;
b.value = false;
b.binding =
VR_BIND_FIELD(bool, TestModel, &a, model->value, TestView, &b, value);
EXPECT_NE(a.value, b.value);
b.binding->Update();
EXPECT_EQ(true, a.value);
EXPECT_EQ(true, b.value);
a.value = false;
EXPECT_EQ(true, b.value);
b.binding->Update();
EXPECT_EQ(false, a.value);
EXPECT_EQ(false, b.value);
b.value = true;
// Since this is a one way binding, Update will not detect a change in value
// of b. Since a's value has not changed, a new value should not be pushed
// to b.
b.binding->Update();
EXPECT_EQ(false, a.value);
EXPECT_EQ(true, b.value);
}
TEST(Binding, HistoricBinding) {
TestModel a;
a.value = true;
TestView b;
b.value = false;
b.binding = std::make_unique<Binding<bool>>(
VR_BIND_LAMBDA([](TestModel* m) { return m->value; },
base::Unretained(&a)),
VR_BIND_LAMBDA(
[](TestView* v, const std::optional<bool>& last_value,
const bool& value) {
if (last_value)
v->value = value;
},
base::Unretained(&b)));
EXPECT_NE(a.value, b.value);
b.binding->Update();
EXPECT_EQ(true, a.value);
EXPECT_EQ(false, b.value);
a.value = false;
b.binding->Update();
EXPECT_EQ(false, b.value);
a.value = true;
b.binding->Update();
EXPECT_EQ(true, b.value);
}
} // namespace vr