8#include <gtest/gtest.h>
10#include "arcane/utils/ValueConvert.h"
11#include "arcane/utils/internal/ValueConvertInternal.h"
13#include "arccore/base/internal/ConvertInternal.h"
29template <
typename T>
void _checkBad(
const String& s)
32 bool is_bad = builtInGetValue(x, s);
33 std::cout <<
"CheckBad S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
37void _checkDouble(
const String& s,
double expected_x)
40 bool is_bad = builtInGetValue(x, s);
41 std::cout <<
"S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
43 ASSERT_EQ(x, expected_x);
46void _checkNaN(
const String& s)
49 bool is_bad = builtInGetValue(x, s);
50 std::cout <<
"S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
60void _checkValidDouble(
double value,
double expected_value)
63 if (std::isnan(expected_value)) {
64 ASSERT_TRUE(std::isnan(value)) <<
"value " << value <<
" is not 'nan'";
67 ASSERT_EQ(value, expected_value);
73 bool is_bad = builtInGetValue(v, s);
74 std::cout <<
"S=" << s <<
" Real2=" << v <<
" is_bad?=" << is_bad <<
"\n";
75 ASSERT_FALSE(is_bad) <<
"Can not convert '" << s <<
"' to Real2";
77 _checkValidDouble(v.
x, expected_v.
x);
78 _checkValidDouble(v.
y, expected_v.
y);
80 ASSERT_EQ(v, expected_v);
86 std::cout <<
"Real3Compare s='" << s <<
"'\n";
88 bool is_bad = builtInGetValue(v, s);
89 std::cout <<
"S=" << s <<
" Real3=" << v <<
" is_bad?=" << is_bad <<
"\n";
90 ASSERT_FALSE(is_bad) <<
"Can not convert '" << s <<
"' to Real3";
92 _checkValidDouble(v.
x, expected_v.
x);
93 _checkValidDouble(v.
y, expected_v.
y);
94 _checkValidDouble(v.
z, expected_v.
z);
96 ASSERT_EQ(v, expected_v);
100void _testDoubleConvert(
bool use_from_chars)
107 bool is_bad = builtInGetValue(x, s);
108 std::cout <<
"S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
114 _checkBad<double>(
"");
115 _checkDouble(
"-0x1.81e03f705857bp-16", -2.3e-05);
116 _checkDouble(
"0x1.81e03f705857bp-16", 2.3e-05);
117 _checkDouble(
"+0x1.81e03f705857bp-16", 2.3e-05);
118 _checkDouble(
" +1.23e42", 1.23e42);
119 _checkDouble(
" -1.23e42", -1.23e42);
120 if (!use_from_chars) {
121 _checkDouble(
"+1.23e42", 1.23e42);
124 _checkBad<double>(
"d2");
125 _checkBad<double>(
"2.3w");
128 Real inf_x = std::numeric_limits<Real>::infinity();
129 _checkDouble(
"inf", inf_x);
130 _checkDouble(
" INF", inf_x);
131 _checkDouble(
" infinity", inf_x);
132 _checkDouble(
"INFINITY", inf_x);
135 Real minus_inf_x = -std::numeric_limits<Real>::infinity();
136 _checkDouble(
"-inf", minus_inf_x);
137 _checkDouble(
" -INF", minus_inf_x);
138 _checkDouble(
" -infinity", minus_inf_x);
139 _checkDouble(
"-INFINITY", minus_inf_x);
149 String s3 =
"23123.132e123";
151 Int32 nb_iter = 1000000 * 10;
153 for (Int32 i = 0; i < nb_iter; ++i) {
155 builtInGetValue(v, s3);
158 std::cout <<
"Total=" << total <<
"\n";
162void _testReal2Convert(
bool use_same_that_real)
165 Real v_nan = std::numeric_limits<double>::quiet_NaN();
166 _checkReal2(
"2.3e1 -1.2",
Real2(2.3e1, -1.2));
167 if (use_same_that_real) {
168 _checkReal2(
"-1.3 nan",
Real2(-1.3, v_nan));
169 _checkReal2(
" 2.3 -1.3",
Real2(2.3, -1.3));
171 _checkBad<Real2>(
"2.3 1.2w");
172 _checkBad<Real2>(
"2.3x");
173 _checkBad<Real2>(
" y2.3 1.2");
176void _testReal3Convert(
bool use_same_that_real)
179 Real v_nan = std::numeric_limits<double>::quiet_NaN();
180 Real v_inf = std::numeric_limits<double>::infinity();
181 _checkReal3(
"2.3e1 -1.2 1.5",
Real3(2.3e1, -1.2, 1.5));
182 if (use_same_that_real) {
183 _checkReal3(
"-1.3 nan 4.6",
Real3(-1.3, v_nan, 4.6));
184 _checkReal3(
"1.3 4.2 inf",
Real3(1.3, 4.2, v_inf));
185 _checkReal3(
"-2.1\t -1.5 1.0e5",
Real3(-2.1, -1.5, 1.0e5));
186 _checkReal3(
" -2.1 -1.5 1.0e5",
Real3(-2.1, -1.5, 1.0e5));
189 _checkBad<Real3>(
"2.3 1.2w");
190 _checkBad<Real3>(
"2.3x");
191 _checkBad<Real3>(
"2.3 1.2");
192 _checkBad<Real3>(
"2.3 -1.2ee2 4.5");
193 _checkBad<Real3>(
"z2.3 -1.2e2 -2323.3");
194 _checkBad<Real3>(
"2.3 -1.2e2 -2323.3x");
205TEST(ValueConvert, Basic)
207 std::cout <<
"TEST_ValueConvert Basic\n";
211 _testDoubleConvert(
true);
212 _testReal2Convert(
true);
213 _testReal2Convert(
false);
214 _testReal3Convert(
true);
215 _testReal3Convert(
false);
218 _testDoubleConvert(
false);
219 _testReal2Convert(
true);
220 _testReal2Convert(
false);
221 _testReal3Convert(
true);
222 _testReal3Convert(
false);
225TEST(ValueConvert, TryParse)
#define ASSERT_FALSE(condition)
Vérifie que condition est faux.
#define ASSERT_TRUE(condition)
Vérifie que condition est vrai.
static void setUseFromChars(bool v)
Indique si on utilise 'std::from_chars' pour convertir les chaînes de caractères en un type numérique...
static void setUseSameConvertForAllReal(bool v)
static void setVerbosity(Int32 v)
Positionne le niveau de verbosité pour les fonctions de conversion.
Classe template pour convertir un type.
Classe gérant un vecteur de réel de dimension 2.
Classe gérant un vecteur de réel de dimension 3.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Real y
deuxième composante du couple
Real x
première composante du couple
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet