From 7f036973d3b44b1b6aeaca90431cc57d6b7149ed Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Tue, 30 Jun 2026 19:13:23 +0000 Subject: [PATCH] ENH: add streaming and invalid-encoding tests for AnatomicalOrientation --- .../Common/src/itkAnatomicalOrientation.cxx | 7 +- .../test/itkAnatomicalOrientationGTest.cxx | 72 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/Modules/Core/Common/src/itkAnatomicalOrientation.cxx b/Modules/Core/Common/src/itkAnatomicalOrientation.cxx index 3317fe55c09..d7e423d7c22 100644 --- a/Modules/Core/Common/src/itkAnatomicalOrientation.cxx +++ b/Modules/Core/Common/src/itkAnatomicalOrientation.cxx @@ -70,7 +70,12 @@ AnatomicalOrientation::GetAsPositiveStringEncoding() const std::string AnatomicalOrientation::GetAsNegativeStringEncoding() const { - return ConvertStringEncoding(GetAsPositiveStringEncoding()); + const std::string positive = GetAsPositiveStringEncoding(); + if (positive == "INVALID") + { + return "INVALID"; + } + return ConvertStringEncoding(positive); } diff --git a/Modules/Core/Common/test/itkAnatomicalOrientationGTest.cxx b/Modules/Core/Common/test/itkAnatomicalOrientationGTest.cxx index 1a74b04dad0..a27c211a201 100644 --- a/Modules/Core/Common/test/itkAnatomicalOrientationGTest.cxx +++ b/Modules/Core/Common/test/itkAnatomicalOrientationGTest.cxx @@ -25,6 +25,7 @@ #include "itkAnatomicalOrientation.h" #include "itkImage.h" #include +#include TEST(AnatomicalOrientation, ConstructionAndValues) @@ -267,3 +268,74 @@ TEST(AnatomicalOrientation, LegacyInteroperability) EXPECT_EQ(itk_rai.GetAsPositiveStringEncoding(), "LPS"); } #endif + +TEST(AnatomicalOrientation, StreamingCoordinateEnum) +{ + using CE = itk::AnatomicalOrientation::CoordinateEnum; + + auto stream = [](CE c) -> std::string { + std::ostringstream oss; + oss << c; + return oss.str(); + }; + + EXPECT_EQ("right-to-left", stream(CE::RightToLeft)); + EXPECT_EQ("left-to-right", stream(CE::LeftToRight)); + EXPECT_EQ("anterior-to-posterior", stream(CE::AnteriorToPosterior)); + EXPECT_EQ("posterior-to-anterior", stream(CE::PosteriorToAnterior)); + EXPECT_EQ("inferior-to-superior", stream(CE::InferiorToSuperior)); + EXPECT_EQ("superior-to-inferior", stream(CE::SuperiorToInferior)); + EXPECT_EQ("unknown", stream(CE::UNKNOWN)); +} + +TEST(AnatomicalOrientation, StreamingPositiveEnum) +{ + using OE = itk::AnatomicalOrientation::PositiveEnum; + + std::ostringstream oss; + oss << OE::LPS; + EXPECT_EQ("LPS", oss.str()); + + oss.str(""); + oss << OE::RAS; + EXPECT_EQ("RAS", oss.str()); +} + +TEST(AnatomicalOrientation, StreamingNegativeEnum) +{ + using NOE = itk::AnatomicalOrientation::NegativeEnum; + + std::ostringstream oss; + oss << NOE::LPI; + EXPECT_EQ("LPI", oss.str()); + + oss.str(""); + oss << NOE::RAI; + EXPECT_EQ("RAI", oss.str()); +} + +TEST(AnatomicalOrientation, StreamingOrientation) +{ + using OE = itk::AnatomicalOrientation::PositiveEnum; + + // operator<<(ostream, AnatomicalOrientation) outputs each CoordinateEnum term space-separated + const itk::AnatomicalOrientation lps(OE::LPS); + std::ostringstream oss; + oss << lps; + EXPECT_EQ("right-to-left anterior-to-posterior inferior-to-superior", oss.str()); + + oss.str(""); + oss << itk::AnatomicalOrientation(OE::RAS); + EXPECT_EQ("left-to-right posterior-to-anterior inferior-to-superior", oss.str()); +} + +TEST(AnatomicalOrientation, InvalidNegativeStringEncoding) +{ + // GetAsNegativeStringEncoding on INVALID orientation exercises the + // default branch of ConvertStringEncoding (non-orientation characters) + const itk::AnatomicalOrientation invalid = itk::AnatomicalOrientation::CreateFromPositiveStringEncoding("bad"); + EXPECT_EQ(itk::AnatomicalOrientation::PositiveEnum::INVALID, invalid.GetAsPositiveOrientation()); + + const std::string negStr = invalid.GetAsNegativeStringEncoding(); + EXPECT_EQ("INVALID", negStr); +}