Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TestValueConvert.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7
8#include <gtest/gtest.h>
9
10#include "arcane/utils/ValueConvert.h"
11#include "arcane/utils/ArgumentException.h"
12#include "arcane/utils/internal/ValueConvertInternal.h"
13
14#include "arccore/base/internal/ConvertInternal.h"
15
16/*---------------------------------------------------------------------------*/
17/*---------------------------------------------------------------------------*/
18
19using namespace Arcane;
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30template <typename T> void _checkBad(const String& s)
31{
32 T x = {};
33 bool is_bad = builtInGetValue(x, s);
34 std::cout << "CheckBad S=" << s << " X=" << x << " is_bad?=" << is_bad << "\n";
35 ASSERT_TRUE(is_bad);
36}
37
38void _checkDouble(const String& s, double expected_x)
39{
40 Real x = 0;
41 bool is_bad = builtInGetValue(x, s);
42 std::cout << "S=" << s << " X=" << x << " is_bad?=" << is_bad << "\n";
43 ASSERT_FALSE(is_bad);
44 ASSERT_EQ(x, expected_x);
45}
46
47void _checkNaN(const String& s)
48{
49 Real x = 0;
50 bool is_bad = builtInGetValue(x, s);
51 std::cout << "S=" << s << " X=" << x << " is_bad?=" << is_bad << "\n";
52 ASSERT_FALSE(is_bad);
53 ASSERT_TRUE(std::isnan(x));
54}
55
61void _checkValidDouble(double value, double expected_value)
62{
63 // Pour NaN, on ne peut pas faire la comparaison.
64 if (std::isnan(expected_value)) {
65 ASSERT_TRUE(std::isnan(value)) << "value " << value << " is not 'nan'";
66 return;
67 }
68 ASSERT_EQ(value, expected_value);
69}
70
71void _checkReal2(const String& s, Real2 expected_v)
72{
73 Real2 v = {};
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";
77 bool do_test = false;
78 _checkValidDouble(v.x, expected_v.x);
79 _checkValidDouble(v.y, expected_v.y);
80 if (do_test) {
81 ASSERT_EQ(v, expected_v);
82 }
83}
84
85void _checkReal3(const String& s, Real3 expected_v)
86{
87 std::cout << "Real3Compare s='" << s << "'\n";
88 Real3 v = {};
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";
92 bool do_test = false;
93 _checkValidDouble(v.x, expected_v.x);
94 _checkValidDouble(v.y, expected_v.y);
95 _checkValidDouble(v.z, expected_v.z);
96 if (do_test) {
97 ASSERT_EQ(v, expected_v);
98 }
99}
100
101void _testDoubleConvert(bool use_from_chars)
102{
103
104 {
105 // TODO: tester les autres conversions
106 String s = "25e3";
107 Int32 x = 0;
108 bool is_bad = builtInGetValue(x, s);
109 std::cout << "S=" << s << " X=" << x << " is_bad?=" << is_bad << "\n";
110 ASSERT_TRUE(is_bad);
111 }
112 // Avec la version 'from_chars', convertir une chaîne vide est une erreur
113 // mais pas avec la version historique.
114 if (use_from_chars)
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);
123 }
124
125 _checkBad<double>("d2");
126 _checkBad<double>("2.3w");
127
128 {
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);
134 }
135 {
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);
141 }
142
143 {
144 _checkNaN("nan");
145 _checkNaN(" NAN");
146 _checkNaN("NaN");
147 _checkNaN(" nAN");
148 }
149 {
150 String s3 = "23123.132e123";
151 Real total = 0.0;
152 Int32 nb_iter = 1000000 * 10;
153 nb_iter = 1;
154 for (Int32 i = 0; i < nb_iter; ++i) {
155 Real v = {};
156 builtInGetValue(v, s3);
157 total += v;
158 }
159 std::cout << "Total=" << total << "\n";
160 }
161}
162
163void _testReal2Convert(bool use_same_that_real)
164{
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));
171 }
172 _checkBad<Real2>("2.3 1.2w");
173 _checkBad<Real2>("2.3x");
174 _checkBad<Real2>(" y2.3 1.2");
175}
176
177void _testReal3Convert(bool use_same_that_real)
178{
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));
188 //_checkReal3("-2.1 -1.5 +1.0e5", Real3(-2.1, -1.5, 1.0e5));
189 }
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");
196}
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
200
201} // namespace
202
203/*---------------------------------------------------------------------------*/
204/*---------------------------------------------------------------------------*/
205
206TEST(ValueConvert, Basic)
207{
208 std::cout << "TEST_ValueConvert Basic\n";
210
212 _testDoubleConvert(true);
213 _testReal2Convert(true);
214 _testReal2Convert(false);
215 _testReal3Convert(true);
216 _testReal3Convert(false);
217
219 _testDoubleConvert(false);
220 _testReal2Convert(true);
221 _testReal2Convert(false);
222 _testReal3Convert(true);
223 _testReal3Convert(false);
224
225 EXPECT_THROW(arcaneCheckArraySize(-5),ArgumentException);
226 {
227 unsigned long long x1 = 123456789012345;
228 EXPECT_THROW(arcaneCheckArraySize(x1), ArgumentException);
229 long long x2 = 123456789012345;
230 EXPECT_THROW(arcaneCheckArraySize(x2), ArgumentException);
231 long long x3 = -123456789012345;
232 EXPECT_THROW(arcaneCheckArraySize(x3), ArgumentException);
233 long x4 = -1234567;
234 EXPECT_THROW(arcaneCheckArraySize(x4), ArgumentException);
235
236 long x5 = 1234567;
237 ASSERT_EQ(arcaneCheckArraySize(x5), x5);
238 ASSERT_EQ(arcaneCheckArraySize(static_cast<unsigned long long>(x5)), x5);
239 ASSERT_EQ(arcaneCheckArraySize(static_cast<long long>(x5)), x5);
240 ASSERT_EQ(arcaneCheckArraySize(static_cast<unsigned long>(x5)), x5);
241 ASSERT_EQ(arcaneCheckArraySize(static_cast<unsigned int>(x5)), x5);
242 }
243}
244
245TEST(ValueConvert, TryParse)
246{
247 {
248 String s2;
250 ASSERT_FALSE(v.has_value());
251 }
252
253 {
254 String s2;
256 ASSERT_TRUE(v.has_value());
257 ASSERT_EQ(v, 4);
258 }
259
260 {
261 String s2("2.3");
263 ASSERT_EQ(v, 2.3);
264 }
265
266 {
267 String s2("2.3w");
269 ASSERT_FALSE(v.has_value());
270 }
271}
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
#define ASSERT_FALSE(condition)
Vérifie que condition est faux.
Definition Assertion.h:137
#define ASSERT_TRUE(condition)
Vérifie que condition est vrai.
Definition Assertion.h:125
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.
Definition Real2.h:121
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
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
Definition Real2.h:35
Real x
première composante du couple
Definition Real2.h:34
Real y
deuxième composante du triplet
Definition Real3.h:36
Real z
troisième composante du triplet
Definition Real3.h:37
Real x
première composante du triplet
Definition Real3.h:35