OTest2
A C++ testing framework
printtraits.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2019 Ondrej Starek
3  *
4  * This file is part of OTest2.
5  *
6  * OTest2 is free software: you can redistribute it and/or modify it under
7  * the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License,
9  * or (at your option) any later version.
10  *
11  * OTest2 is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14  * License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with OTest2. If not, see <http://www.gnu.org/licenses/>.
18  */
19 #ifndef OTest2__INCLUDE_OTEST2_PRINTTRAITS_H_
20 #define OTest2__INCLUDE_OTEST2_PRINTTRAITS_H_
21 
22 #include <iosfwd>
23 #include <string>
24 
25 #include <otest2/comparisons.h>
26 #include <otest2/comparisonslexi.h>
27 #include <otest2/typetraits.h>
28 
29 namespace OTest2 {
30 
37 template<typename Type_>
38 struct PrintTrait {
39  static std::ostream& print(
40  std::ostream& os_,
41  typename TypeTrait<Type_>::BestArg value_) {
42  return os_ << value_;
43  }
44 };
45 
46 /* -- specializations for string types */
47 template<>
48 struct PrintTrait<std::string> {
49  static std::ostream& print(
50  std::ostream& os_,
51  const std::string& value_) {
52  return os_ << '"' << value_ << '"';
53  }
54 };
55 template<>
56 struct PrintTrait<const char*> {
57  static std::ostream& print(
58  std::ostream& os_,
59  const char* value_) {
60  if(value_ == nullptr)
61  return os_ << "NULL";
62  else
63  return os_ << '"' << value_ << '"';
64  }
65 };
66 
67 /* -- specializations for comparison functors */
68 template<typename A_, typename B_>
69 struct PrintTrait<Equal<A_, B_> > {
70  static std::ostream& print(
71  std::ostream& os_,
72  const Equal<A_, B_>& value_) {
73  return os_ << "==";
74  }
75 };
76 template<typename A_, typename B_, typename P_>
77 struct PrintTrait<EqualFP<A_, B_, P_> > {
78  static std::ostream& print(
79  std::ostream& os_,
80  const EqualFP<A_, B_, P_>& value_) {
81  return os_ << "==";
82  }
83 };
84 template<typename A_, typename B_>
85 struct PrintTrait<NotEqual<A_, B_> > {
86  static std::ostream& print(
87  std::ostream& os_,
88  const NotEqual<A_, B_>& value_) {
89  return os_ << "!=";
90  }
91 };
92 template<typename A_, typename B_, typename P_>
93 struct PrintTrait<NotEqualFP<A_, B_, P_> > {
94  static std::ostream& print(
95  std::ostream& os_,
96  const NotEqualFP<A_, B_, P_>& value_) {
97  return os_ << "!=";
98  }
99 };
100 template<typename A_, typename B_>
101 struct PrintTrait<Less<A_, B_> > {
102  static std::ostream& print(
103  std::ostream& os_,
104  const Less<A_, B_>& value_) {
105  return os_ << "<";
106  }
107 };
108 template<typename A_, typename B_>
109 struct PrintTrait<LessOrEqual<A_, B_> > {
110  static std::ostream& print(
111  std::ostream& os_,
112  const LessOrEqual<A_, B_>& value_) {
113  return os_ << "<=";
114  }
115 };
116 template<typename A_, typename B_>
117 struct PrintTrait<Greater<A_, B_> > {
118  static std::ostream& print(
119  std::ostream& os_,
120  const Greater<A_, B_>& value_) {
121  return os_ << ">";
122  }
123 };
124 template<typename A_, typename B_>
125 struct PrintTrait<GreaterOrEqual<A_, B_> > {
126  static std::ostream& print(
127  std::ostream& os_,
128  const GreaterOrEqual<A_, B_>& value_) {
129  return os_ << ">=";
130  }
131 };
132 
133 /* -- lexicographical comparators */
134 template<typename A_, typename B_>
135 struct PrintTrait<LexiLess<A_, B_> > {
136  static std::ostream& print(
137  std::ostream& os_,
138  const LexiLess<A_, B_>& value_) {
139  return os_ << "<";
140  }
141 };
142 template<typename A_, typename B_>
143 struct PrintTrait<LexiLessOrEqual<A_, B_> > {
144  static std::ostream& print(
145  std::ostream& os_,
146  const LexiLessOrEqual<A_, B_>& value_) {
147  return os_ << "<=";
148  }
149 };
150 template<typename A_, typename B_>
151 struct PrintTrait<LexiGreater<A_, B_> > {
152  static std::ostream& print(
153  std::ostream& os_,
154  const LexiGreater<A_, B_>& value_) {
155  return os_ << ">";
156  }
157 };
158 template<typename A_, typename B_>
159 struct PrintTrait<LexiGreaterOrEqual<A_, B_> > {
160  static std::ostream& print(
161  std::ostream& os_,
162  const LexiGreaterOrEqual<A_, B_>& value_) {
163  return os_ << ">=";
164  }
165 };
166 
167 } /* -- namespace OTest2 */
168 
169 #endif /* OTest2__INCLUDE_OTEST2_PRINTTRAITS_H_ */
OTest2::GreaterOrEqual
Definition: comparisons.h:140
OTest2::TypeTrait::BestArg
Private::SelectArgType< Type_, std::is_scalar< Type_ >::value >::Value BestArg
Definition: typetraits.h:49
OTest2::PrintTrait< LexiGreater< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const LexiGreater< A_, B_ > &value_)
Definition: printtraits.h:152
OTest2::NotEqualFP
Definition: comparisons.h:76
comparisonslexi.h
OTest2::PrintTrait< Greater< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const Greater< A_, B_ > &value_)
Definition: printtraits.h:118
OTest2::EqualFP
Definition: comparisons.h:48
typetraits.h
OTest2::PrintTrait< const char * >::print
static std::ostream & print(std::ostream &os_, const char *value_)
Definition: printtraits.h:57
OTest2::LexiLess
the '<' operator for lexicographical assertions
Definition: comparisonslexi.h:32
OTest2::Less
Definition: comparisons.h:86
OTest2::PrintTrait< GreaterOrEqual< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const GreaterOrEqual< A_, B_ > &value_)
Definition: printtraits.h:126
OTest2::NotEqual
Definition: comparisons.h:58
OTest2::LexiGreaterOrEqual
the '>=' operator for lexicographical assertions
Definition: comparisonslexi.h:113
OTest2::PrintTrait< NotEqualFP< A_, B_, P_ > >::print
static std::ostream & print(std::ostream &os_, const NotEqualFP< A_, B_, P_ > &value_)
Definition: printtraits.h:94
OTest2::PrintTrait< Equal< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const Equal< A_, B_ > &value_)
Definition: printtraits.h:70
OTest2::PrintTrait< LexiLess< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const LexiLess< A_, B_ > &value_)
Definition: printtraits.h:136
OTest2::LexiLessOrEqual
the '<=' operator for lexicographical assertions
Definition: comparisonslexi.h:59
OTest2::PrintTrait::print
static std::ostream & print(std::ostream &os_, typename TypeTrait< Type_ >::BestArg value_)
Definition: printtraits.h:39
OTest2::LexiGreater
the '>' operator for lexicographical assertions
Definition: comparisonslexi.h:86
OTest2::Equal
Definition: comparisons.h:30
OTest2
Definition: assertbean.h:25
comparisons.h
OTest2::PrintTrait< EqualFP< A_, B_, P_ > >::print
static std::ostream & print(std::ostream &os_, const EqualFP< A_, B_, P_ > &value_)
Definition: printtraits.h:78
OTest2::PrintTrait< LexiLessOrEqual< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const LexiLessOrEqual< A_, B_ > &value_)
Definition: printtraits.h:144
OTest2::PrintTrait< Less< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const Less< A_, B_ > &value_)
Definition: printtraits.h:102
OTest2::PrintTrait
Generic type trait.
Definition: printtraits.h:38
OTest2::Greater
Definition: comparisons.h:122
OTest2::LessOrEqual
Definition: comparisons.h:104
OTest2::PrintTrait< LexiGreaterOrEqual< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const LexiGreaterOrEqual< A_, B_ > &value_)
Definition: printtraits.h:160
OTest2::PrintTrait< LessOrEqual< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const LessOrEqual< A_, B_ > &value_)
Definition: printtraits.h:110
OTest2::PrintTrait< NotEqual< A_, B_ > >::print
static std::ostream & print(std::ostream &os_, const NotEqual< A_, B_ > &value_)
Definition: printtraits.h:86
OTest2::PrintTrait< std::string >::print
static std::ostream & print(std::ostream &os_, const std::string &value_)
Definition: printtraits.h:49