return_types_table_t.cc
Go to the documentation of this file.
1 // ======================================================================
2 //
3 // test types return type for tables
4 
5 /* The purpose of this test is to verify that types 14-21 below return
6  the correct types.
7 
8  In what follows, ’T’ represents a type supported by an Atom<>
9  and ’S’ represents an explicitly constructed struct that may
10  contain Atom<>, Sequence<>, Tuple<>, or Table<> objects.
11 
12  [ 1] Atom<T>;
13  [ 2] Sequence<T>
14  [ 3] Sequence<T,SZ>
15  [ 4] Tuple<T...>
16  [ 5] Tuple< Sequence<T>, U...>
17  [ 6] Tuple< Sequence<T,SZ>, U...>
18  [ 7] Tuple< Tuple<T...>,U...>
19  [ 8] Sequence< Tuple<T...> >
20  [ 9] Sequence< Tuple<T...>, SZ >
21  [10] Sequence< Sequence<T> >
22  [11] Sequence< Sequence<T,SZ> >
23  [12] Sequence< Sequence<T>, SZ >
24  [13] Sequence< Sequence<T,SZ>, SZ >
25 
26  14-21 cannot support default arguments (since Table<> cannot have a default)
27 
28  [14] Table<S>
29  [15] Sequence< Table<S> >
30  [16] Sequence< Table<S>, SZ >
31  [17] Tuple< Table<S>, U... >
32  [18] Tuple< Sequence< Table<S> >, U... >
33  [19] Tuple< Sequence< Table<S>, SZ>, U... >
34  [20] Sequence< Tuple< Table<S>, U... > >
35  [21] Sequence< Tuple< Table<S>, U... >, SZ>
36 
37  */
38 
39 // ======================================================================
40 
41 #define BOOST_TEST_MODULE (return types with tables)
42 
43 #include "boost/test/unit_test.hpp"
44 
45 #include "fhiclcpp/types/Atom.h"
47 #include "fhiclcpp/types/Table.h"
48 #include "fhiclcpp/types/Tuple.h"
49 
50 #include <string>
51 #include <vector>
52 
53 using namespace fhicl;
54 using namespace fhicl::detail;
55 using namespace std;
56 
57 namespace {
58 
59  template <typename R, typename T>
60  void
61  require_type_as(T& t [[maybe_unused]])
62  {
63  auto rt = t();
64  BOOST_TEST((std::is_same<R, decltype(rt)>::value));
65  }
66 
67  struct S {
68  Atom<int> test{Name("atom")};
69  Sequence<int, 2> seq{Name("sequence")};
70  Tuple<int, double, bool> tuple{Name("tuple")};
71  };
72 }
73 
74 BOOST_AUTO_TEST_SUITE(types_return_types_tables)
75 
76 // [14] Table<S>
78 {
79  Table<S> test{Name("table")};
80  require_type_as<S>(test);
81 }
82 
83 // [15] Sequence< Table<S> >
84 BOOST_AUTO_TEST_CASE(table_in_seq_t)
85 {
86  Sequence<Table<S>> test{Name("seqtable")};
87  require_type_as<std::vector<S>>(test);
88 }
89 
90 // [16] Sequence< Table<S>,2 >
91 BOOST_AUTO_TEST_CASE(table_in_seq_2_t)
92 {
93  Sequence<Table<S>, 2> test{Name("seqtable")};
94  require_type_as<std::array<S, 2>>(test);
95 }
96 
97 // [17] Tuple< Table<S>, U... >
98 BOOST_AUTO_TEST_CASE(table_in_tuple_t)
99 {
100  Tuple<Table<S>, int, double> test{Name("tuptable")};
101  require_type_as<std::tuple<S, int, double>>(test);
102 }
103 
104 // [18] Tuple< Sequence< Table<S> >, U... >
105 BOOST_AUTO_TEST_CASE(seqtable_in_tuple_t)
106 {
107  Tuple<Sequence<Table<S>>, int, double> test{Name("seqtuptable")};
108  require_type_as<std::tuple<std::vector<S>, int, double>>(test);
109 }
110 
111 // [19] Tuple< Sequence< Table<S>, SZ >, U... >
112 BOOST_AUTO_TEST_CASE(seqtable_2_in_tuple_t)
113 {
114  Tuple<Sequence<Table<S>, 2>, int, double> test{Name("seqtuptable")};
115  require_type_as<std::tuple<std::array<S, 2>, int, double>>(test);
116 }
117 
118 // [20] Sequence< Tuple< Table<S>, U... > >
119 BOOST_AUTO_TEST_CASE(tuptable_in_seq_t)
120 {
121  Sequence<Tuple<Table<S>, int, double>> test{Name("tupseqtable")};
122  require_type_as<std::vector<std::tuple<S, int, double>>>(test);
123 }
124 
125 // [21] Sequence< Tuple< Table<S>, U... >, SZ >
126 BOOST_AUTO_TEST_CASE(tuptable_in_seq_2_t)
127 {
128  Sequence<Tuple<Table<S>, int, double>, 2> test{Name("tupseqtable")};
129  require_type_as<std::array<std::tuple<S, int, double>, 2>>(test);
130 }
131 
132 BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(table_t)
ChannelGroupService::Name Name
STL namespace.