Files
ortools-clone/ortools/math_opt/cpp/enums_test.cc
Mizux Seiha 4f381f6d07 backport from main:
* bump abseil to 20250814
* bump protobuf to v32.0
* cmake: add ccache auto support
* backport flatzinc, math_opt and sat update
2025-09-16 16:25:04 +02:00

133 lines
4.3 KiB
C++

// Copyright 2010-2025 Google LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "ortools/math_opt/cpp/enums.h"
#include <optional>
#include <sstream>
#include <string>
#include <type_traits>
#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include "gtest/gtest.h"
#include "ortools/base/gmock.h"
#include "ortools/base/logging.h"
#include "ortools/math_opt/cpp/enums_test.pb.h"
#include "ortools/math_opt/cpp/enums_testing.h"
#include "ortools/math_opt/testing/stream.h"
namespace operations_research::math_opt {
namespace {
enum class TestEnum {
kFirstValue = TEST_ENUM_FIRST_VALUE,
kSecondValue = TEST_ENUM_SECOND_VALUE
};
} // namespace
// Template specialization must be in the same namespace. It can't be in the
// anonymous namespace.
MATH_OPT_DEFINE_ENUM(TestEnum, TEST_ENUM_UNSPECIFIED);
std::optional<absl::string_view> Enum<TestEnum>::ToOptString(TestEnum value) {
switch (value) {
case TestEnum::kFirstValue:
return "first_value";
case TestEnum::kSecondValue:
return "second_value";
}
return std::nullopt;
}
absl::Span<const TestEnum> Enum<TestEnum>::AllValues() {
static constexpr TestEnum kTestEnumValues[] = {TestEnum::kFirstValue,
TestEnum::kSecondValue};
return absl::MakeConstSpan(kTestEnumValues);
}
namespace {
using ::testing::ElementsAre;
using ::testing::Optional;
TEST(EnumsTest, EnumToProtoWithOptional) {
std::optional<TestEnum> opt_value = TestEnum::kFirstValue;
EXPECT_EQ(EnumToProto(opt_value), TEST_ENUM_FIRST_VALUE);
EXPECT_EQ(EnumToProto<TestEnum>(std::nullopt), TEST_ENUM_UNSPECIFIED);
}
TEST(EnumsTest, EnumToProtoWithValue) {
EXPECT_EQ(EnumToProto(TestEnum::kFirstValue), TEST_ENUM_FIRST_VALUE);
EXPECT_EQ(EnumToProto(TestEnum::kSecondValue), TEST_ENUM_SECOND_VALUE);
}
TEST(EnumsTest, FromProto) {
EXPECT_THAT(EnumFromProto(TEST_ENUM_FIRST_VALUE),
Optional(TestEnum::kFirstValue));
EXPECT_THAT(EnumFromProto(TEST_ENUM_SECOND_VALUE),
Optional(TestEnum::kSecondValue));
EXPECT_EQ(EnumFromProto(TEST_ENUM_UNSPECIFIED), std::nullopt);
}
TEST(EnumsTest, EnumToOptString) {
EXPECT_THAT(EnumToOptString(TestEnum::kFirstValue),
Optional(absl::string_view("first_value")));
EXPECT_THAT(EnumToOptString(TestEnum::kSecondValue),
Optional(absl::string_view("second_value")));
EXPECT_EQ(EnumToOptString(static_cast<TestEnum>(-15)), std::nullopt);
}
TEST(EnumsTest, EnumToString) {
EXPECT_THAT(EnumToString(TestEnum::kFirstValue), "first_value");
EXPECT_THAT(EnumToString(TestEnum::kSecondValue), "second_value");
}
TEST(EnumsDeathTest, EnumToString) {
EXPECT_DEATH_IF_SUPPORTED(EnumToString(static_cast<TestEnum>(-15)),
"invalid value: -15");
}
TEST(EnumsTest, EnumFromString) {
EXPECT_THAT(EnumFromString<TestEnum>("first_value"),
Optional(TestEnum::kFirstValue));
EXPECT_THAT(EnumFromString<TestEnum>("second_value"),
Optional(TestEnum::kSecondValue));
EXPECT_EQ(EnumFromString<TestEnum>("unknown"), std::nullopt);
}
TEST(EnumsTest, AllValues) {
EXPECT_THAT(Enum<TestEnum>::AllValues(),
ElementsAre(TestEnum::kFirstValue, TestEnum::kSecondValue));
}
TEST(EnumsTest, Stream) {
EXPECT_EQ(StreamToString(TestEnum::kFirstValue), "first_value");
EXPECT_EQ(StreamToString(static_cast<TestEnum>(-15)), "<invalid enum (-15)>");
}
TEST(EnumsTest, OptStream) {
EXPECT_EQ(StreamToString(std::make_optional(TestEnum::kFirstValue)),
"first_value");
EXPECT_EQ(StreamToString(std::make_optional(static_cast<TestEnum>(-15))),
"<invalid enum (-15)>");
EXPECT_EQ(StreamToString(std::optional<TestEnum>()), "<unspecified>");
}
INSTANTIATE_TYPED_TEST_SUITE_P(TestEnum, EnumTest, TestEnum);
} // namespace
} // namespace operations_research::math_opt