@@ -8476,6 +8476,158 @@ TEST(io, projstringformatter_merge_consecutive_helmert_3_param_noop) {
8476
8476
8477
8477
// ---------------------------------------------------------------------------
8478
8478
8479
+ TEST(io, projstringformatter_merge_inverted_helmert_with_opposite_conventions) {
8480
+ {
8481
+ auto fmt = PROJStringFormatter::create();
8482
+ fmt->addStep("helmert");
8483
+ fmt->addParam("x", 10);
8484
+ fmt->addParam("y", 20);
8485
+ fmt->addParam("z", 30);
8486
+ fmt->addParam("rx", 1);
8487
+ fmt->addParam("ry", 2);
8488
+ fmt->addParam("rz", 3);
8489
+ fmt->addParam("s", 4);
8490
+ fmt->addParam("convention", "position_vector");
8491
+ fmt->addStep("helmert");
8492
+ fmt->setCurrentStepInverted(true);
8493
+ fmt->addParam("x", 10);
8494
+ fmt->addParam("y", 20);
8495
+ fmt->addParam("z", 30);
8496
+ fmt->addParam("rx", -1);
8497
+ fmt->addParam("ry", -2);
8498
+ fmt->addParam("rz", -3);
8499
+ fmt->addParam("s", 4);
8500
+ fmt->addParam("convention", "coordinate_frame");
8501
+ EXPECT_EQ(fmt->toString(), "+proj=noop");
8502
+ }
8503
+
8504
+ {
8505
+ auto fmt = PROJStringFormatter::create();
8506
+ fmt->addStep("helmert");
8507
+ fmt->setCurrentStepInverted(true);
8508
+ fmt->addParam("x", 10);
8509
+ fmt->addParam("y", 20);
8510
+ fmt->addParam("z", 30);
8511
+ fmt->addParam("rx", 1);
8512
+ fmt->addParam("ry", 2);
8513
+ fmt->addParam("rz", 3);
8514
+ fmt->addParam("s", 4);
8515
+ fmt->addParam("convention", "coordinate_frame");
8516
+ fmt->addStep("helmert");
8517
+ fmt->addParam("x", 10);
8518
+ fmt->addParam("y", 20);
8519
+ fmt->addParam("z", 30);
8520
+ fmt->addParam("rx", -1);
8521
+ fmt->addParam("ry", -2);
8522
+ fmt->addParam("rz", -3);
8523
+ fmt->addParam("s", 4);
8524
+ fmt->addParam("convention", "position_vector");
8525
+ EXPECT_EQ(fmt->toString(), "+proj=noop");
8526
+ }
8527
+
8528
+ // Cannot be optimized
8529
+ {
8530
+ auto fmt = PROJStringFormatter::create();
8531
+ fmt->addStep("helmert");
8532
+ fmt->addParam("x", 10);
8533
+ fmt->addParam("y", 20);
8534
+ fmt->addParam("z", 30);
8535
+ fmt->addParam("rx", 1);
8536
+ fmt->addParam("ry", 2);
8537
+ fmt->addParam("rz", 3);
8538
+ fmt->addParam("s", 4);
8539
+ fmt->addParam("convention", "position_vector");
8540
+ fmt->addStep("helmert");
8541
+ // fmt->setCurrentStepInverted(true); <== CAUSE
8542
+ fmt->addParam("x", 10);
8543
+ fmt->addParam("y", 20);
8544
+ fmt->addParam("z", 30);
8545
+ fmt->addParam("rx", -1);
8546
+ fmt->addParam("ry", -2);
8547
+ fmt->addParam("rz", -3);
8548
+ fmt->addParam("s", 4);
8549
+ fmt->addParam("convention", "coordinate_frame");
8550
+ EXPECT_TRUE(fmt->toString() != "+proj=noop");
8551
+ }
8552
+
8553
+ // Cannot be optimized
8554
+ {
8555
+ auto fmt = PROJStringFormatter::create();
8556
+ fmt->addStep("helmert");
8557
+ fmt->addParam("x", 10);
8558
+ fmt->addParam("y", 20);
8559
+ fmt->addParam("z", 30);
8560
+ fmt->addParam("rx", 1);
8561
+ fmt->addParam("ry", 2);
8562
+ fmt->addParam("rz", 3);
8563
+ fmt->addParam("s", 4);
8564
+ fmt->addParam("convention", "position_vector");
8565
+ fmt->addStep("helmert");
8566
+ fmt->setCurrentStepInverted(true);
8567
+ fmt->addParam("x", 10);
8568
+ fmt->addParam("y", 20);
8569
+ fmt->addParam("z", 30);
8570
+ fmt->addParam("rx", -1);
8571
+ fmt->addParam("ry", -2);
8572
+ fmt->addParam("rz", -3);
8573
+ fmt->addParam("s", 4);
8574
+ fmt->addParam("convention", "position_vector"); // <== CAUSE
8575
+ EXPECT_TRUE(fmt->toString() != "+proj=noop");
8576
+ }
8577
+
8578
+ // Cannot be optimized
8579
+ {
8580
+ auto fmt = PROJStringFormatter::create();
8581
+ fmt->addStep("helmert");
8582
+ fmt->addParam("x", 10);
8583
+ fmt->addParam("y", 20);
8584
+ fmt->addParam("z", 30);
8585
+ fmt->addParam("rx", 1);
8586
+ fmt->addParam("ry", 2);
8587
+ fmt->addParam("rz", 3);
8588
+ fmt->addParam("s", 4);
8589
+ fmt->addParam("convention", "position_vector");
8590
+ fmt->addStep("helmert");
8591
+ fmt->setCurrentStepInverted(true);
8592
+ fmt->addParam("x", -10); // <== CAUSE
8593
+ fmt->addParam("y", 20);
8594
+ fmt->addParam("z", 30);
8595
+ fmt->addParam("rx", -1);
8596
+ fmt->addParam("ry", -2);
8597
+ fmt->addParam("rz", -3);
8598
+ fmt->addParam("s", 4);
8599
+ fmt->addParam("convention", "coordinate_frame");
8600
+ EXPECT_TRUE(fmt->toString() != "+proj=noop");
8601
+ }
8602
+
8603
+ // Cannot be optimized
8604
+ {
8605
+ auto fmt = PROJStringFormatter::create();
8606
+ fmt->addStep("helmert");
8607
+ fmt->addParam("x", 10);
8608
+ fmt->addParam("y", 20);
8609
+ fmt->addParam("z", 30);
8610
+ fmt->addParam("rx", 1);
8611
+ fmt->addParam("ry", 3);
8612
+ fmt->addParam("rz", 2);
8613
+ fmt->addParam("s", 4);
8614
+ fmt->addParam("convention", "position_vector");
8615
+ fmt->addStep("helmert");
8616
+ fmt->setCurrentStepInverted(true);
8617
+ fmt->addParam("x", 10);
8618
+ fmt->addParam("y", 20);
8619
+ fmt->addParam("z", 30);
8620
+ fmt->addParam("rx", 1); // <== CAUSE
8621
+ fmt->addParam("ry", -2);
8622
+ fmt->addParam("rz", -3);
8623
+ fmt->addParam("s", 4);
8624
+ fmt->addParam("convention", "coordinate_frame");
8625
+ EXPECT_TRUE(fmt->toString() != "+proj=noop");
8626
+ }
8627
+ }
8628
+
8629
+ // ---------------------------------------------------------------------------
8630
+
8479
8631
TEST(io, projstringformatter_cart_grs80_wgs84) {
8480
8632
auto fmt = PROJStringFormatter::create();
8481
8633
fmt->addStep("cart");
0 commit comments