1
1
#include < catch2/catch.hpp>
2
2
#define PROGRAMOPTIONS_EXCEPTIONS
3
3
#include < ProgramOptions.hxx>
4
- #include < string>
5
4
#include < limits>
5
+ #include < string>
6
6
#include < cmath>
7
7
8
8
TEST_CASE (" str2flt" , " [ProgramOptions]" ) {
9
+ const double inf = std::numeric_limits<double >::infinity ();
10
+
11
+ CHECK (po::str2flt<double >(" " ).error == po::error_code::conversion_error);
12
+
9
13
CHECK (po::str2flt<double >(" +0" ).good ());
10
14
CHECK (po::str2flt<double >(" +0" ) == 0.0 );
11
15
CHECK (po::str2flt<double >(" -0" ).good ());
@@ -14,50 +18,57 @@ TEST_CASE("str2flt", "[ProgramOptions]") {
14
18
CHECK (po::str2flt<double >(" -42.36" ) == Approx (-42.36 ));
15
19
CHECK (po::str2flt<double >(" .53" ) == Approx (0.53 ));
16
20
CHECK (po::str2flt<double >(" 21." ) == Approx (21.0 ));
21
+ CHECK (po::str2flt<double >(" -.07" ) == Approx (-0.07 ));
22
+ CHECK (po::str2flt<double >(" -07." ) == Approx (-7.0 ));
17
23
18
24
CHECK (po::str2flt<double >(" 123.456e-12" ) == Approx (123.456e-12 ));
19
25
CHECK (po::str2flt<double >(" -42.36E8" ) == Approx (-42.36e+8 ));
20
26
CHECK (po::str2flt<double >(" .53e0" ) == Approx (0.53 ));
21
27
CHECK (po::str2flt<double >(" 21.e+3" ) == Approx (21.0e+3 ));
22
- CHECK (std::isinf (po::str2flt<double >(" 15.3e+806" ).get ()));
28
+
29
+ CHECK (po::str2flt<double >(" 15.3e+806" ).error == po::error_code::out_of_range);
30
+ CHECK (po::str2flt<double >(" 1e9999999999999999999999999999" ).error == po::error_code::out_of_range);
31
+ std::string big (500 , ' 9' );
32
+ CHECK (po::str2flt<double >(big.begin (), big.end ()).error == po::error_code::out_of_range);
23
33
CHECK (po::str2flt<double >(" 15.3e-806" ) == Approx (0.0 ));
34
+ CHECK (po::str2flt<double >(" 1e-9999999999999999999999999999" ) == Approx (0.0 ));
35
+
36
+ CHECK (po::str2flt<double >(" ." ).error == po::error_code::conversion_error);
37
+ CHECK (po::str2flt<double >(" -." ).error == po::error_code::conversion_error);
38
+ CHECK (po::str2flt<double >(" ++0" ).error == po::error_code::conversion_error);
39
+ CHECK (po::str2flt<double >(" +-0" ).error == po::error_code::conversion_error);
40
+ CHECK (po::str2flt<double >(" -+0" ).error == po::error_code::conversion_error);
41
+ CHECK (po::str2flt<double >(" --0" ).error == po::error_code::conversion_error);
42
+ CHECK (po::str2flt<double >(" 4.a" ).error == po::error_code::conversion_error);
43
+ CHECK (po::str2flt<double >(" 2.5 a" ).error == po::error_code::conversion_error);
44
+ CHECK (po::str2flt<double >(" e3" ).error == po::error_code::conversion_error);
45
+ CHECK (po::str2flt<double >(" 1e" ).error == po::error_code::conversion_error);
46
+ CHECK (po::str2flt<double >(" 1e+" ).error == po::error_code::conversion_error);
47
+ CHECK (po::str2flt<double >(" 1e+2.0" ).error == po::error_code::conversion_error);
24
48
25
- CHECK (!po::str2flt<double >(" ." ).good ());
26
- CHECK (!po::str2flt<double >(" -." ).good ());
27
- CHECK (!po::str2flt<double >(" ++0" ).good ());
28
- CHECK (!po::str2flt<double >(" +-0" ).good ());
29
- CHECK (!po::str2flt<double >(" -+0" ).good ());
30
- CHECK (!po::str2flt<double >(" --0" ).good ());
31
- CHECK (!po::str2flt<double >(" 4.a" ).good ());
32
- CHECK (!po::str2flt<double >(" 2.5 a" ).good ());
33
- CHECK (!po::str2flt<double >(" e3" ).good ());
34
- CHECK (!po::str2flt<double >(" 1e" ).good ());
35
- CHECK (!po::str2flt<double >(" 1e+" ).good ());
36
- CHECK (!po::str2flt<double >(" 1e+2.0" ).good ());
37
-
38
- CHECK (!po::str2flt<double >(" n" ).good ());
39
- CHECK (!po::str2flt<double >(" na" ).good ());
49
+ CHECK (po::str2flt<double >(" n" ).error == po::error_code::conversion_error);
50
+ CHECK (po::str2flt<double >(" na" ).error == po::error_code::conversion_error);
40
51
CHECK (po::str2flt<double >(" nan" ).good ());
41
- CHECK (! po::str2flt<double >(" nann" ).good () );
42
- CHECK (! po::str2flt<double >(" nanE0" ).good () );
52
+ CHECK (po::str2flt<double >(" nann" ).error == po::error_code::conversion_error );
53
+ CHECK (po::str2flt<double >(" nanE0" ).error == po::error_code::conversion_error );
43
54
CHECK (std::isnan (po::str2flt<double >(" nan" ).get ()));
44
55
CHECK (std::isnan (po::str2flt<double >(" +nan" ).get ()));
45
56
CHECK (std::isnan (po::str2flt<double >(" -nan" ).get ()));
46
57
47
- CHECK (! po::str2flt<double >(" i" ).good () );
48
- CHECK (! po::str2flt<double >(" in" ).good () );
58
+ CHECK (po::str2flt<double >(" i" ).error == po::error_code::conversion_error );
59
+ CHECK (po::str2flt<double >(" in" ).error == po::error_code::conversion_error );
49
60
CHECK (po::str2flt<double >(" inf" ).good ());
50
- CHECK (! po::str2flt<double >(" infi" ).good () );
51
- CHECK (! po::str2flt<double >(" infin" ).good () );
52
- CHECK (! po::str2flt<double >(" infini" ).good () );
53
- CHECK (! po::str2flt<double >(" infinit" ).good () );
61
+ CHECK (po::str2flt<double >(" infi" ).error == po::error_code::conversion_error );
62
+ CHECK (po::str2flt<double >(" infin" ).error == po::error_code::conversion_error );
63
+ CHECK (po::str2flt<double >(" infini" ).error == po::error_code::conversion_error );
64
+ CHECK (po::str2flt<double >(" infinit" ).error == po::error_code::conversion_error );
54
65
CHECK (po::str2flt<double >(" infinity" ).good ());
55
- CHECK (! po::str2flt<double >(" infinityy" ).good () );
56
- CHECK (! po::str2flt<double >(" infinityE0" ).good () );
57
- CHECK (std::isinf ( po::str2flt<double >(" inf" ). get ()) );
58
- CHECK (std::isinf ( po::str2flt<double >(" +inf" ). get ()) );
59
- CHECK (std::isinf ( po::str2flt<double >(" -inf" ). get ()) );
60
- CHECK (std::isinf ( po::str2flt<double >(" infinity" ). get ()) );
61
- CHECK (std::isinf ( po::str2flt<double >(" +infinity" ). get ()) );
62
- CHECK (std::isinf ( po::str2flt<double >(" -infinity" ). get ()) );
66
+ CHECK (po::str2flt<double >(" infinityy" ).error == po::error_code::conversion_error );
67
+ CHECK (po::str2flt<double >(" infinityE0" ).error == po::error_code::conversion_error );
68
+ CHECK (po::str2flt<double >(" inf" ) == inf );
69
+ CHECK (po::str2flt<double >(" +inf" ) == inf );
70
+ CHECK (po::str2flt<double >(" -inf" ) == -inf );
71
+ CHECK (po::str2flt<double >(" infinity" ) == inf );
72
+ CHECK (po::str2flt<double >(" +infinity" ) == inf );
73
+ CHECK (po::str2flt<double >(" -infinity" ) == -inf );
63
74
}
0 commit comments