aboutsummaryrefslogtreecommitdiffstats
path: root/util/generic/typelist_ut.cpp
blob: 955ebb1f1bf592aad49d1647f9dd496cafc22d64 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <library/cpp/testing/unittest/registar.h>
#include <util/system/type_name.h>

#include "typelist.h"
#include "vector.h"

class TTypeListTest: public TTestBase {
    UNIT_TEST_SUITE(TTypeListTest);
    UNIT_TEST(TestSimple);
    UNIT_TEST(TestHave);
    UNIT_TEST(TestGet);
    UNIT_TEST(TestFloatList);
    UNIT_TEST(TestSelectBy);
    UNIT_TEST_SUITE_END();

public:
    void TestGet() {
        using TListType = TTypeList<int, char, float>;

        UNIT_ASSERT_TYPES_EQUAL(TListType::TGet<0>, int);
        UNIT_ASSERT_TYPES_EQUAL(TListType::TGet<1>, char);
        UNIT_ASSERT_TYPES_EQUAL(TListType::TGet<2>, float);
    }

    void TestSimple() {
        using TListType = TTypeList<int, char, float>;
        UNIT_ASSERT_EQUAL(TListType::Length, 3);
        UNIT_ASSERT_TYPES_EQUAL(TListType::THead, int);
    }

    struct TA {};
    struct TB {};
    struct TC {};
    void TestHave() {
        using TListType = TTypeList<TA, TB*, const TC&>;
        UNIT_ASSERT(TListType::THave<TA>::value);
        UNIT_ASSERT(TListType::THave<TB*>::value);
        UNIT_ASSERT(!TListType::THave<TB>::value);
        UNIT_ASSERT(TListType::THave<const TC&>::value);
        UNIT_ASSERT(!TListType::THave<TC&>::value);
    }

    template <class T>
    class TT {};

    template <class T>
    struct TIs1ArgTemplate: std::false_type {};

    template <class T, template <class> class TT>
    struct TIs1ArgTemplate<TT<T>>: std::true_type {};

    template <class T>
    struct TIsNArgTemplate: std::false_type {};

    template <template <class...> class TT, class... R>
    struct TIsNArgTemplate<TT<R...>>: std::true_type {};

    template <class>
    struct TAnyType: std::true_type {};

    template <class T>
    struct TMyVector {};

    template <class T1, class T2>
    struct TMyMap {};

    void TestSelectBy() {
        using TListType = TTypeList<TA, TB, TMyMap<TA*, TB>, TMyVector<TA>, TC>;

        UNIT_ASSERT_TYPES_EQUAL(TListType::TSelectBy<TAnyType>::type, TA);
        UNIT_ASSERT_TYPES_EQUAL(TListType::TSelectBy<TIs1ArgTemplate>::type, TMyVector<TA>);
        using TMyMapPTATB = TMyMap<TA*, TB>;
        UNIT_ASSERT_TYPES_EQUAL(TListType::TSelectBy<TIsNArgTemplate>::type, TMyMapPTATB);
    }

    void TestFloatList() {
        UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<ui32>, float);
        UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<i32>, float);
        UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<ui64>, double);
        UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<i64>, double);
    }
};

UNIT_TEST_SUITE_REGISTRATION(TTypeListTest);