
The methodology used to generate this CL is documented in https://crbug.com/1098010#c34. An earlier version of this CL, https://crrev.com/c/3879904, was reverted due to an issue that was resolved with https://crrev.com/c/3881211. No-Try: true Bug: 1098010 Change-Id: Ibd6ffb97e66835bc299fe7b85876c3e2927b2345 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3883841 Auto-Submit: Avi Drissman <avi@chromium.org> Owners-Override: Avi Drissman <avi@chromium.org> Reviewed-by: Mark Mentovai <mark@chromium.org> Commit-Queue: Mark Mentovai <mark@chromium.org> Cr-Commit-Position: refs/heads/main@{#1044747}
101 lines
3.8 KiB
C++
101 lines
3.8 KiB
C++
// Copyright 2020 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "base/state_transitions.h"
|
|
|
|
#include <ostream>
|
|
#include <string>
|
|
|
|
#include "base/test/gtest_util.h"
|
|
#include "build/build_config.h"
|
|
#include "testing/gmock/include/gmock/gmock.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace base {
|
|
|
|
enum class State { kState1 = 0, kState2, kState3, kState4 };
|
|
|
|
std::ostream& operator<<(std::ostream& o, const State& s) {
|
|
return o << static_cast<int>(s);
|
|
}
|
|
|
|
TEST(StateTransitionsTest, Constructor) {
|
|
// No expectations, just make sure the constructor works.
|
|
const StateTransitions<State> transitions({
|
|
{State::kState1, {State::kState2, State::kState3}},
|
|
{State::kState2, {State::kState3, State::kState4}},
|
|
});
|
|
}
|
|
|
|
TEST(StateTransitionsTest, GetValidTransitions) {
|
|
const StateTransitions<State> transitions({
|
|
{State::kState1, {State::kState2, State::kState3}},
|
|
{State::kState2, {State::kState3, State::kState4}},
|
|
});
|
|
EXPECT_THAT(transitions.GetValidTransitions(State::kState1),
|
|
testing::ElementsAre(State::kState2, State::kState3));
|
|
EXPECT_THAT(transitions.GetValidTransitions(State::kState2),
|
|
testing::ElementsAre(State::kState3, State::kState4));
|
|
EXPECT_THAT(transitions.GetValidTransitions(State::kState3),
|
|
testing::ElementsAre());
|
|
EXPECT_THAT(transitions.GetValidTransitions(State::kState4),
|
|
testing::ElementsAre());
|
|
}
|
|
|
|
TEST(StateTransitionsTest, IsTransitionValid) {
|
|
const StateTransitions<State> transitions({
|
|
{State::kState1, {State::kState2, State::kState3}},
|
|
{State::kState2, {State::kState3, State::kState4}},
|
|
});
|
|
ASSERT_TRUE(transitions.IsTransitionValid(State::kState1, State::kState2));
|
|
ASSERT_TRUE(transitions.IsTransitionValid(State::kState2, State::kState3));
|
|
ASSERT_FALSE(transitions.IsTransitionValid(State::kState1, State::kState4));
|
|
// kState3 was omitted from the definition.
|
|
ASSERT_FALSE(transitions.IsTransitionValid(State::kState3, State::kState4));
|
|
}
|
|
|
|
TEST(StateTransitionsTest, DCHECK_STATE_TRANSITION) {
|
|
const StateTransitions<State> transitions({
|
|
{State::kState1, {State::kState2, State::kState3}},
|
|
{State::kState2, {State::kState3, State::kState4}},
|
|
});
|
|
DCHECK_STATE_TRANSITION(&transitions, State::kState1, State::kState2);
|
|
DCHECK_STATE_TRANSITION(&transitions, State::kState2, State::kState3);
|
|
|
|
#if DCHECK_IS_ON()
|
|
// EXPECT_DEATH is not defined on IOS.
|
|
#if !BUILDFLAG(IS_IOS)
|
|
EXPECT_DEATH(
|
|
DCHECK_STATE_TRANSITION(&transitions, State::kState1, State::kState4),
|
|
"Check failed.*Invalid transition: 0 -> 3");
|
|
// kState3 was omitted from the definition.
|
|
EXPECT_DEATH(
|
|
DCHECK_STATE_TRANSITION(&transitions, State::kState3, State::kState4),
|
|
"Check failed.*Invalid transition: 2 -> 3");
|
|
#endif // !BUILDFLAG(IS_IOS)
|
|
#endif // DCHECK_IS_ON()
|
|
}
|
|
|
|
// Test that everything works OK with some other data type.
|
|
TEST(StateTransitionsTest, NonEnum) {
|
|
const StateTransitions<std::string> transitions({
|
|
{"state1", {"state2", "state3"}},
|
|
{"state2", {"state3", "state4"}},
|
|
});
|
|
ASSERT_TRUE(transitions.IsTransitionValid("state1", "state2"));
|
|
ASSERT_TRUE(transitions.IsTransitionValid("state2", "state3"));
|
|
ASSERT_FALSE(transitions.IsTransitionValid("state1", "state4"));
|
|
// kState3 was omitted from the definition.
|
|
ASSERT_FALSE(transitions.IsTransitionValid("state3", "state4"));
|
|
DCHECK_STATE_TRANSITION(&transitions, "state1", "state2");
|
|
DCHECK_STATE_TRANSITION(&transitions, "state2", "state3");
|
|
|
|
// Try some states that are not in the specification at all.
|
|
ASSERT_FALSE(transitions.IsTransitionValid("foo", "state2"));
|
|
ASSERT_FALSE(transitions.IsTransitionValid("state1", "foo"));
|
|
ASSERT_FALSE(transitions.IsTransitionValid("foo", "bar"));
|
|
}
|
|
|
|
} // namespace base
|