8#include <gtest/gtest.h>
10#include "arcane/utils/ValueConvert.h"
11#include "arcane/utils/ArgumentException.h"
12#include "arcane/utils/internal/ValueConvertInternal.h"
14#include "arccore/base/internal/ConvertInternal.h"
30template <
typename T>
void _checkBad(
const String& s)
33 bool is_bad = builtInGetValue(x, s);
34 std::cout <<
"CheckBad S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
38void _checkDouble(
const String& s,
double expected_x)
41 bool is_bad = builtInGetValue(x, s);
42 std::cout <<
"S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
44 ASSERT_EQ(x, expected_x);
47void _checkNaN(
const String& s)
50 bool is_bad = builtInGetValue(x, s);
51 std::cout <<
"S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
61void _checkValidDouble(
double value,
double expected_value)
64 if (std::isnan(expected_value)) {
65 ASSERT_TRUE(std::isnan(value)) <<
"value " << value <<
" is not 'nan'";
68 ASSERT_EQ(value, expected_value);
74 bool is_bad = builtInGetValue(v, s);
75 std::cout <<
"S=" << s <<
" Real2=" << v <<
" is_bad?=" << is_bad <<
"\n";
76 ASSERT_FALSE(is_bad) <<
"Can not convert '" << s <<
"' to Real2";
78 _checkValidDouble(v.
x, expected_v.
x);
79 _checkValidDouble(v.
y, expected_v.
y);
81 ASSERT_EQ(v, expected_v);
87 std::cout <<
"Real3Compare s='" << s <<
"'\n";
89 bool is_bad = builtInGetValue(v, s);
90 std::cout <<
"S=" << s <<
" Real3=" << v <<
" is_bad?=" << is_bad <<
"\n";
91 ASSERT_FALSE(is_bad) <<
"Can not convert '" << s <<
"' to Real3";
93 _checkValidDouble(v.
x, expected_v.
x);
94 _checkValidDouble(v.
y, expected_v.
y);
95 _checkValidDouble(v.
z, expected_v.
z);
97 ASSERT_EQ(v, expected_v);
101void _testDoubleConvert(
bool use_from_chars)
108 bool is_bad = builtInGetValue(x, s);
109 std::cout <<
"S=" << s <<
" X=" << x <<
" is_bad?=" << is_bad <<
"\n";
115 _checkBad<double>(
"");
116 _checkDouble(
"-0x1.81e03f705857bp-16", -2.3e-05);
117 _checkDouble(
"0x1.81e03f705857bp-16", 2.3e-05);
118 _checkDouble(
"+0x1.81e03f705857bp-16", 2.3e-05);
119 _checkDouble(
" +1.23e42", 1.23e42);
120 _checkDouble(
" -1.23e42", -1.23e42);
121 if (!use_from_chars) {
122 _checkDouble(
"+1.23e42", 1.23e42);
125 _checkBad<double>(
"d2");
126 _checkBad<double>(
"2.3w");
129 Real inf_x = std::numeric_limits<Real>::infinity();
130 _checkDouble(
"inf", inf_x);
131 _checkDouble(
" INF", inf_x);
132 _checkDouble(
" infinity", inf_x);
133 _checkDouble(
"INFINITY", inf_x);
136 Real minus_inf_x = -std::numeric_limits<Real>::infinity();
137 _checkDouble(
"-inf", minus_inf_x);
138 _checkDouble(
" -INF", minus_inf_x);
139 _checkDouble(
" -infinity", minus_inf_x);
140 _checkDouble(
"-INFINITY", minus_inf_x);
150 String s3 =
"23123.132e123";
152 Int32 nb_iter = 1000000 * 10;
154 for (Int32 i = 0; i < nb_iter; ++i) {
156 builtInGetValue(v, s3);
159 std::cout <<
"Total=" << total <<
"\n";
163void _testReal2Convert(
bool use_same_that_real)
166 Real v_nan = std::numeric_limits<double>::quiet_NaN();
167 _checkReal2(
"2.3e1 -1.2",
Real2(2.3e1, -1.2));
168 if (use_same_that_real) {
169 _checkReal2(
"-1.3 nan",
Real2(-1.3, v_nan));
170 _checkReal2(
" 2.3 -1.3",
Real2(2.3, -1.3));
172 _checkBad<Real2>(
"2.3 1.2w");
173 _checkBad<Real2>(
"2.3x");
174 _checkBad<Real2>(
" y2.3 1.2");
177void _testReal3Convert(
bool use_same_that_real)
180 Real v_nan = std::numeric_limits<double>::quiet_NaN();
181 Real v_inf = std::numeric_limits<double>::infinity();
182 _checkReal3(
"2.3e1 -1.2 1.5",
Real3(2.3e1, -1.2, 1.5));
183 if (use_same_that_real) {
184 _checkReal3(
"-1.3 nan 4.6",
Real3(-1.3, v_nan, 4.6));
185 _checkReal3(
"1.3 4.2 inf",
Real3(1.3, 4.2, v_inf));
186 _checkReal3(
"-2.1\t -1.5 1.0e5",
Real3(-2.1, -1.5, 1.0e5));
187 _checkReal3(
" -2.1 -1.5 1.0e5",
Real3(-2.1, -1.5, 1.0e5));
190 _checkBad<Real3>(
"2.3 1.2w");
191 _checkBad<Real3>(
"2.3x");
192 _checkBad<Real3>(
"2.3 1.2");
193 _checkBad<Real3>(
"2.3 -1.2ee2 4.5");
194 _checkBad<Real3>(
"z2.3 -1.2e2 -2323.3");
195 _checkBad<Real3>(
"2.3 -1.2e2 -2323.3x");
206TEST(ValueConvert, Basic)
208 std::cout <<
"TEST_ValueConvert Basic\n";
212 _testDoubleConvert(
true);
213 _testReal2Convert(
true);
214 _testReal2Convert(
false);
215 _testReal3Convert(
true);
216 _testReal3Convert(
false);
219 _testDoubleConvert(
false);
220 _testReal2Convert(
true);
221 _testReal2Convert(
false);
222 _testReal3Convert(
true);
223 _testReal3Convert(
false);
227 unsigned long long x1 = 123456789012345;
229 long long x2 = 123456789012345;
231 long long x3 = -123456789012345;
245TEST(ValueConvert, TryParse)
#define ASSERT_FALSE(condition)
Vérifie que condition est faux.
#define ASSERT_TRUE(condition)
Vérifie que condition est vrai.
Exception lorsqu'un argument est invalide.
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 -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
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