comparison UnitTestsSources/GenericToolboxTests.cpp @ 1748:b6a6ad64192a

FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
author Benjamin Golinvaux <bgo@osimis.io>
date Mon, 22 Feb 2021 14:55:13 +0100
parents 9ac2a65d4172
children 63e893267c98
comparison
equal deleted inserted replaced
1747:730604db88b8 1748:b6a6ad64192a
4285 EXPECT_EQ(0, red); 4285 EXPECT_EQ(0, red);
4286 EXPECT_EQ(0, green); 4286 EXPECT_EQ(0, green);
4287 EXPECT_EQ(0, blue); 4287 EXPECT_EQ(0, blue);
4288 } 4288 }
4289 4289
4290 4290 TEST(GenericToolbox, FastParseTest_StringToDoubleEx01)
4291 4291 {
4292 4292 using OrthancStone::GenericToolbox::StringToDoubleEx;
4293 4293
4294 4294 const char* s = "0.0/.123/3/12.5//-43.1";
4295 4295
4296 int32_t size;
4297 double r;
4298 const char* p = s;
4299
4300 size = StringToDoubleEx(r, p, '/');
4301 // -->
4302 // r = 0 and size = 3
4303 ASSERT_EQ(3, size);
4304 ASSERT_DOUBLE_EQ(0, r);
4305
4306 p += (size + 1);
4307 size = StringToDoubleEx(r, p, '/');
4308 ASSERT_EQ(4, size);
4309 ASSERT_DOUBLE_EQ(0.123, r);
4310
4311 p += (size + 1);
4312 size = StringToDoubleEx(r, p, '/');
4313 ASSERT_EQ(1, size);
4314 ASSERT_DOUBLE_EQ(3, r);
4315
4316 p += (size + 1);
4317 size = StringToDoubleEx(r, p, '/');
4318 ASSERT_EQ(4, size);
4319 ASSERT_DOUBLE_EQ(12.5, r);
4320
4321 p += (size + 1);
4322 size = StringToDoubleEx(r, p, '/');
4323 ASSERT_EQ(0, size);
4324 ASSERT_DOUBLE_EQ(0, r);
4325
4326 p += (size + 1);
4327 size = StringToDoubleEx(r, p, '/');
4328 ASSERT_EQ(5, size);
4329 ASSERT_DOUBLE_EQ(-43.1, r);
4330
4331 p += size;
4332 ASSERT_EQ(0, *p);
4333 }
4334
4335 TEST(GenericToolbox, FastParseTest_StringToDoubleEx02)
4336 {
4337 using OrthancStone::GenericToolbox::StringToDoubleEx;
4338
4339 const char* s = " \t 0.0/.123/3 \t/12.5e-3//-43.1 \t ";
4340
4341 int32_t size;
4342 double r;
4343 const char* p = s;
4344
4345 while (*p == ' ' || *p == '\t')
4346 ++p;
4347
4348 size = StringToDoubleEx(r, p, '/');
4349 // -->
4350 // r = 0 and size = 3
4351 ASSERT_EQ(3, size);
4352 ASSERT_DOUBLE_EQ(0, r);
4353
4354 p += (size + 1);
4355 size = StringToDoubleEx(r, p, '/');
4356 ASSERT_EQ(4, size);
4357 ASSERT_DOUBLE_EQ(0.123, r);
4358
4359 p += (size + 1);
4360 size = StringToDoubleEx(r, p, '/');
4361 ASSERT_EQ(4, size);
4362 ASSERT_DOUBLE_EQ(3, r);
4363
4364 p += (size + 1);
4365 size = StringToDoubleEx(r, p, '/');
4366 ASSERT_EQ(7, size);
4367 ASSERT_DOUBLE_EQ(12.5e-3, r);
4368
4369 p += (size + 1);
4370 size = StringToDoubleEx(r, p, '/');
4371 ASSERT_EQ(0, size);
4372 ASSERT_DOUBLE_EQ(0, r);
4373
4374 p += (size + 1);
4375 size = StringToDoubleEx(r, p, '/');
4376 ASSERT_EQ(14, size);
4377 ASSERT_DOUBLE_EQ(-43.1, r);
4378
4379 p += size;
4380 ASSERT_EQ(0, *p);
4381 }
4382
4383 TEST(GenericToolbox, FastParseTest_StringToDoubleEx03)
4384 {
4385 using OrthancStone::GenericToolbox::StringToDoubleEx;
4386
4387 const char* s = " \t 0.0/.123/3/12.5e-3//-43.1e-2 \t ";
4388
4389 int32_t size;
4390 double r;
4391 const char* p = s;
4392
4393 while (*p == ' ' || *p == '\t')
4394 ++p;
4395
4396 size = StringToDoubleEx(r, p, '/');
4397 // -->
4398 // r = 0 and size = 3
4399 ASSERT_EQ(3, size);
4400 ASSERT_DOUBLE_EQ(0, r);
4401
4402 p += (size + 1);
4403 size = StringToDoubleEx(r, p, '/');
4404 ASSERT_EQ(4, size);
4405 ASSERT_DOUBLE_EQ(0.123, r);
4406
4407 p += (size + 1);
4408 size = StringToDoubleEx(r, p, '/');
4409 ASSERT_EQ(1, size);
4410 ASSERT_DOUBLE_EQ(3, r);
4411
4412 p += (size + 1);
4413 size = StringToDoubleEx(r, p, '/');
4414 ASSERT_EQ(7, size);
4415 ASSERT_DOUBLE_EQ(12.5e-3, r);
4416
4417 p += (size + 1);
4418 size = StringToDoubleEx(r, p, '/');
4419 ASSERT_EQ(0, size);
4420 ASSERT_DOUBLE_EQ(0, r);
4421
4422 p += (size + 1);
4423 size = StringToDoubleEx(r, p, '/');
4424 ASSERT_EQ(17, size);
4425 ASSERT_DOUBLE_EQ(-43.1e-2, r);
4426
4427 p += size;
4428 ASSERT_EQ(0, *p);
4429 }
4430
4431
4432 TEST(GenericToolbox, FastParseTest_GetCharCount)
4433 {
4434 using OrthancStone::GenericToolbox::GetCharCount;
4435
4436 ASSERT_EQ(0u, GetCharCount("-1e-22", '\\'));
4437 ASSERT_EQ(0u, GetCharCount(" -1e-22", '\\'));
4438 ASSERT_EQ(0u, GetCharCount(" -1e-22 ", '\\'));
4439 ASSERT_EQ(0u, GetCharCount("-1e-22 ", '\\'));
4440
4441 ASSERT_EQ(1u, GetCharCount("-1e-2\\2", '\\'));
4442 ASSERT_EQ(1u, GetCharCount(" -1e-2\\2", '\\'));
4443 ASSERT_EQ(1u, GetCharCount("-1e-2\\2 ", '\\'));
4444 ASSERT_EQ(1u, GetCharCount(" -1e-2\\2 ", '\\'));
4445
4446
4447 ASSERT_EQ(11u, GetCharCount(" -1e-2\\\\3\\12.473\\-2.34e4\\-284\\423.23\\\\0.234423\\.786 \\ 9093\\ ", '\\'));
4448 }
4449
4450
4451 TEST(GenericToolbox, FastParseTest_FastParseVector01)
4452 {
4453 using OrthancStone::GenericToolbox::FastParseVector;
4454
4455 OrthancStone::Vector v;
4456
4457 ASSERT_TRUE(FastParseVector(v, "1.2"));
4458 ASSERT_EQ(1u, v.size());
4459 ASSERT_DOUBLE_EQ(1.2, v[0]);
4460
4461 ASSERT_TRUE(FastParseVector(v, "-1.2e+2"));
4462 ASSERT_EQ(1u, v.size());
4463 ASSERT_DOUBLE_EQ(-120.0, v[0]);
4464
4465 ASSERT_TRUE(FastParseVector(v, "-1e-2\\2"));
4466 ASSERT_EQ(2u, v.size());
4467 ASSERT_DOUBLE_EQ(-0.01, v[0]);
4468 ASSERT_DOUBLE_EQ(2.0, v[1]);
4469
4470 ASSERT_TRUE(FastParseVector(v, "1.3671875\\1.3671875"));
4471 ASSERT_EQ(2u, v.size());
4472 ASSERT_DOUBLE_EQ(1.3671875, v[0]);
4473 ASSERT_DOUBLE_EQ(1.3671875, v[1]);
4474 }
4475
4476 TEST(GenericToolbox, FastParseTest_FastParseVector02)
4477 {
4478 using OrthancStone::GenericToolbox::FastParseVector;
4479
4480 const char* vectorString = " -1e-2\\\\3\\12.473\\-2.34e4\\-284\\423.23\\\\0.234423\\.786 \\9093\\ ";
4481
4482 OrthancStone::Vector v;
4483
4484 ASSERT_TRUE(FastParseVector(v, vectorString));
4485 ASSERT_EQ(12u, v.size());
4486 ASSERT_DOUBLE_EQ(-1e-2 , v[ 0]);
4487 ASSERT_DOUBLE_EQ(0 , v[ 1]);
4488 ASSERT_DOUBLE_EQ(3 , v[ 2]);
4489 ASSERT_DOUBLE_EQ(12.473 , v[ 3]);
4490 ASSERT_DOUBLE_EQ(-2.34e4 , v[ 4]);
4491 ASSERT_DOUBLE_EQ(-284 , v[ 5]);
4492 ASSERT_DOUBLE_EQ(423.23 , v[ 6]);
4493 ASSERT_DOUBLE_EQ(0 , v[ 7]);
4494 ASSERT_DOUBLE_EQ(0.234423 , v[ 8]);
4495 ASSERT_DOUBLE_EQ(.786 , v[ 9]);
4496 ASSERT_DOUBLE_EQ(9093 , v[10]);
4497 ASSERT_DOUBLE_EQ(0 , v[11]);
4498 }