Skip to content

Commit

Permalink
added example and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mguludag committed May 1, 2023
1 parent 94d0649 commit 39c966b
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build/*
20 changes: 20 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
cmake_minimum_required(VERSION 3.14)
project(enum_name_example VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

include(FetchContent)

FetchContent_Declare(
DocTest
GIT_REPOSITORY "https://github.com/onqtam/doctest"
GIT_TAG "v2.4.11"
)

FetchContent_MakeAvailable(DocTest)

add_executable(${PROJECT_NAME} example/main.cpp)
target_include_directories(${PROJECT_NAME} AFTER PUBLIC ${CMAKE_SOURCE_DIR}/include)

enable_testing()
add_subdirectory(test)
33 changes: 33 additions & 0 deletions example/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include <iostream>
#include "enum_name.hpp"


enum class rgb_color { red, green, blue, unknown = -1};

// you can specialize enum ranges with specialize struct per enum types (option 1)
namespace mgutility{
template<>
struct enum_range<rgb_color>
{
static constexpr auto min = -1;
static constexpr auto max = 3;
};
}

// you can specialize enum ranges with overload per enum types (option 2)
auto enum_name = [](rgb_color c){ return mgutility::enum_name<-1, 3>(c); };


int main()
{
auto x = rgb_color::blue;
auto y = mgutility::to_enum<rgb_color>("green");

// default signature: enum_name<min_value = -128, max_value = 128, Enum typename>(Enum&&)
// Changing max_value to not too much greater than enum's max value, it will compiles faster
std::cout << mgutility::enum_name(x) << '\n'; // will print "blue" to output

// calling specialized enum ranges function for rgb_color type
// will print "green" to output, if y can't convert to rgb_color prints "unknown"
std::cout << enum_name(y.value_or(rgb_color::unknown)) << '\n';
}
File renamed without changes.
12 changes: 12 additions & 0 deletions scripts/ci_setup_clang.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash

set -ex

VERSION=$1

apt-get update
apt-get install -y libc++-${VERSION}-dev libc++abi-${VERSION}-dev

if [[ "${VERSION}" -ge 12 ]]; then
apt-get install -y --no-install-recommends libunwind-${VERSION}-dev
fi
11 changes: 11 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 3.14)
project(enum_name_test VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

include_directories(AFTER PUBLIC ${CMAKE_SOURCE_DIR}/include)

add_executable(${PROJECT_NAME} enum_name_test.cpp)
target_link_libraries(${PROJECT_NAME} doctest)

add_test(NAME enum_name_test COMMAND enum_name_test)
29 changes: 29 additions & 0 deletions test/enum_name_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest/doctest.h"
#include "enum_name.hpp"

enum class rgb_color { red, green, blue, unknown = -1};

// you can specialize enum ranges with specialize struct per enum types (option 1)
namespace mgutility{
template<>
struct enum_range<rgb_color>
{
static constexpr auto min = -1;
static constexpr auto max = 3;
};
}


TEST_CASE("testing the enum name serialization") {
CHECK(mgutility::enum_name(rgb_color::blue) == "blue");
CHECK(mgutility::enum_name(rgb_color::unknown) == "unknown");
CHECK(mgutility::enum_name<0, 2>(rgb_color::unknown) == "");
}

TEST_CASE("testing the enum name deserialization") {
CHECK(mgutility::to_enum<rgb_color>("blue").value() == rgb_color::blue);
CHECK(mgutility::to_enum<rgb_color>("unknown").value() == rgb_color::unknown);
CHECK(mgutility::to_enum<rgb_color, 0, 2>("unknown").value_or(rgb_color::red) == rgb_color::red);
REQUIRE_THROWS(mgutility::to_enum<rgb_color, 0, 2>("unknown").value());
}

0 comments on commit 39c966b

Please sign in to comment.