* Clean up logic for converting tree_method to updater sequence * Use C++11 enum class for extra safety Compiler will give warnings if switch statements don't handle all possible values of C++11 enum class. Also allow enum class to be used as DMLC parameter. * Fix compiler error + lint * Address reviewer comment * Better docstring for DECLARE_FIELD_ENUM_CLASS * Fix lint * Add C++ test to see if tree_method is recognized * Fix clang-tidy error * Add test_learner.h to R package * Update comments * Fix lint error
56 lines
1.3 KiB
C++
56 lines
1.3 KiB
C++
#include "../../../src/common/enum_class_param.h"
|
|
#include <dmlc/parameter.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
enum class Foo : int {
|
|
kBar = 0, kFrog = 1, kCat = 2, kDog = 3
|
|
};
|
|
|
|
DECLARE_FIELD_ENUM_CLASS(Foo);
|
|
|
|
struct MyParam : dmlc::Parameter<MyParam> {
|
|
Foo foo;
|
|
int bar;
|
|
DMLC_DECLARE_PARAMETER(MyParam) {
|
|
DMLC_DECLARE_FIELD(foo)
|
|
.set_default(Foo::kBar)
|
|
.add_enum("bar", Foo::kBar)
|
|
.add_enum("frog", Foo::kFrog)
|
|
.add_enum("cat", Foo::kCat)
|
|
.add_enum("dog", Foo::kDog);
|
|
DMLC_DECLARE_FIELD(bar)
|
|
.set_default(-1);
|
|
}
|
|
};
|
|
|
|
DMLC_REGISTER_PARAMETER(MyParam);
|
|
|
|
TEST(EnumClassParam, Basic) {
|
|
MyParam param;
|
|
std::map<std::string, std::string> kwargs{
|
|
{"foo", "frog"}, {"bar", "10"}
|
|
};
|
|
// try initializing
|
|
param.Init(kwargs);
|
|
ASSERT_EQ(param.foo, Foo::kFrog);
|
|
ASSERT_EQ(param.bar, 10);
|
|
|
|
// try all possible enum values
|
|
kwargs["foo"] = "bar";
|
|
param.Init(kwargs);
|
|
ASSERT_EQ(param.foo, Foo::kBar);
|
|
kwargs["foo"] = "frog";
|
|
param.Init(kwargs);
|
|
ASSERT_EQ(param.foo, Foo::kFrog);
|
|
kwargs["foo"] = "cat";
|
|
param.Init(kwargs);
|
|
ASSERT_EQ(param.foo, Foo::kCat);
|
|
kwargs["foo"] = "dog";
|
|
param.Init(kwargs);
|
|
ASSERT_EQ(param.foo, Foo::kDog);
|
|
|
|
// try setting non-existent enum value
|
|
kwargs["foo"] = "human";
|
|
ASSERT_THROW(param.Init(kwargs), dmlc::ParamError);
|
|
}
|