diff --git a/.github/workflows/macos-arm.yml b/.github/workflows/arm.yml similarity index 87% rename from .github/workflows/macos-arm.yml rename to .github/workflows/arm.yml index 0648012274a..345d752e187 100644 --- a/.github/workflows/macos-arm.yml +++ b/.github/workflows/arm.yml @@ -1,4 +1,4 @@ -name: ITK.macOS.Arm64 +name: ITK.Arm64 on: push: @@ -36,12 +36,24 @@ env: jobs: build: runs-on: ${{ matrix.os }} - timeout-minutes: 0 + timeout-minutes: 600 strategy: fail-fast: false matrix: include: + - os: ubuntu-24.04-arm + name: "Ubuntu-24.04-arm" + cmake-build-type: "Release" + cmake-generator: "Ninja" + python-version: "" + ctest-cache: | + BUILD_SHARED_LIBS:BOOL=OFF + BUILD_EXAMPLES:BOOL=OFF + ITK_WRAP_PYTHON:BOOL=OFF + ITK_USE_CLANG_FORMAT:BOOL=OFF + ctest-options: "" + - os: macos-15 name: "x86_64-rosetta" cmake-build-type: "Release" @@ -67,7 +79,7 @@ jobs: ITK_USE_CLANG_FORMAT:BOOL=OFF ctest-options: "-E itkPyBufferMemoryLeakTest" - name: macOS-${{ matrix.name }} + name: ARMBUILD-${{ matrix.name }} steps: - name: Checkout @@ -122,6 +134,6 @@ jobs: c++ --version cmake --version - ctest -S ${{ github.workspace }}/ITK-dashboard/dashboard.cmake -VV -j 4 ${{ matrix.ctest-options }} + ctest -S ${{ github.workspace }}/ITK-dashboard/dashboard.cmake --output-on-failure -j 4 ${{ matrix.ctest-options }} env: CTEST_OUTPUT_ON_FAILURE: 1 diff --git a/Modules/Core/Common/src/itkMetaDataDictionary.cxx b/Modules/Core/Common/src/itkMetaDataDictionary.cxx index 9787c1e1d84..da87fceb2e9 100644 --- a/Modules/Core/Common/src/itkMetaDataDictionary.cxx +++ b/Modules/Core/Common/src/itkMetaDataDictionary.cxx @@ -48,6 +48,7 @@ MetaDataDictionary::Print(std::ostream & os) const { os << it.first << " "; it.second->Print(os); + os << std::endl; } } diff --git a/Modules/Core/Common/test/itkMetaDataDictionaryGTest.cxx b/Modules/Core/Common/test/itkMetaDataDictionaryGTest.cxx index da70101e0ae..bb2dd071a09 100644 --- a/Modules/Core/Common/test/itkMetaDataDictionaryGTest.cxx +++ b/Modules/Core/Common/test/itkMetaDataDictionaryGTest.cxx @@ -44,6 +44,157 @@ createMetaDataDictionary() return metaDataDictionary; } +// DUPLICATE CODE IN HDF5ImageIOTest +namespace +{ +template +void +AddMetaData(itk::MetaDataDictionary & metaDict, const std::string & key, const T & knownValue) +{ + itk::EncapsulateMetaData(metaDict, key, knownValue); +} + +template +int +VerifyMetaData(const itk::MetaDataDictionary & metaDict, const std::string & key, const T & knownValue) +{ + int status = EXIT_SUCCESS; + T exposedValue{}; + if (!itk::ExposeMetaData(metaDict, key, exposedValue)) + { + std::cerr << "Failure ExposeMetaData '" << key << "'" << std::endl; + status = EXIT_FAILURE; + } + if constexpr (std::is_floating_point_v) + { + if (itk::Math::NotAlmostEquals(exposedValue, knownValue)) + { + std::cerr << "Incorrect meta value read in for " << key << " '" << exposedValue << "' != '" << knownValue << "'" + << std::endl; + status = EXIT_FAILURE; + } + } + else + { + if (exposedValue != knownValue) + { + std::cerr << "Incorrect meta value read in for " << key << " '" << exposedValue << "' != '" << knownValue << "'" + << std::endl; + status = EXIT_FAILURE; + } + } + if (status == EXIT_FAILURE) + { + std::cerr << "========================================" << std::endl; + metaDict.Print(std::cerr); + std::cerr << "========================================" << std::endl; + } + return status; +} +} // namespace + + +template +static int +CheckMetaData(itk::MetaDataDictionary & metaDict, const std::string & key, const T & knownValue) +{ + AddMetaData(metaDict, key, knownValue); + return VerifyMetaData(metaDict, key, knownValue); +} + + +static int +doExposeMetaDatas() +{ + // Simplified version of tests found in HDF5 reading/writing + // that are broken out here to improve localization of bugs + // found during linux-arm building + itk::MetaDataDictionary metaDict; + int success = EXIT_SUCCESS; + + if (CheckMetaData(metaDict, "TestBool", false) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestChar", 'c') != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestUChar", 'u') != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestShort", 1) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestUShort", 3) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestInt", 5) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestUInt", 7) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestLong", 5) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestULong", 7) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestLLong", -5) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestULLong", 7ull) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestFloat", 1.23456f) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + if (CheckMetaData(metaDict, "TestDouble", 1.23456) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + + itk::Array metaDataCharArray(5); + metaDataCharArray[0] = 'h'; + metaDataCharArray[1] = 'e'; + metaDataCharArray[2] = 'l'; + metaDataCharArray[3] = 'l'; + metaDataCharArray[4] = 'o'; + if (CheckMetaData>(metaDict, "TestCharArray", metaDataCharArray) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + + itk::Array metaDataDoubleArray(5); + metaDataDoubleArray[0] = 3.0; + metaDataDoubleArray[1] = 1.0; + metaDataDoubleArray[2] = 4.0; + metaDataDoubleArray[3] = 5.0; + metaDataDoubleArray[4] = 2.0; + if (CheckMetaData>(metaDict, "TestDoubleArray", metaDataDoubleArray) != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + + if (CheckMetaData(metaDict, "StdString", "Test std::string") != EXIT_SUCCESS) + { + success = EXIT_FAILURE; + } + return success; +} + + template itk::MetaDataObjectBase::Pointer createMetaDataObject(const T & invalue) @@ -56,6 +207,9 @@ createMetaDataObject(const T & invalue) TEST(MetaDataDictionary, Basic) { + // Isolate + EXPECT_EQ(doExposeMetaDatas(), EXIT_SUCCESS); + // This test exercises and checks the non-constant interface itk::MetaDataDictionary dic = createMetaDataDictionary(); diff --git a/Modules/IO/HDF5/src/itkHDF5ImageIO.cxx b/Modules/IO/HDF5/src/itkHDF5ImageIO.cxx index 6daf59a87ee..bf056c3ee5d 100644 --- a/Modules/IO/HDF5/src/itkHDF5ImageIO.cxx +++ b/Modules/IO/HDF5/src/itkHDF5ImageIO.cxx @@ -80,32 +80,32 @@ GetType() H5::PredType GetType() \ { \ return H5Type; \ - } - -GetH5TypeSpecialize(float, H5::PredType::NATIVE_FLOAT) GetH5TypeSpecialize(double, H5::PredType::NATIVE_DOUBLE) - - GetH5TypeSpecialize(char, H5::PredType::NATIVE_CHAR) GetH5TypeSpecialize(unsigned char, H5::PredType::NATIVE_UCHAR) - - GetH5TypeSpecialize(short, H5::PredType::NATIVE_SHORT) - GetH5TypeSpecialize(short unsigned int, H5::PredType::NATIVE_USHORT) - - GetH5TypeSpecialize(int, H5::PredType::NATIVE_INT) GetH5TypeSpecialize(unsigned int, H5::PredType::NATIVE_UINT) - - GetH5TypeSpecialize(long, H5::PredType::NATIVE_LONG) - GetH5TypeSpecialize(long unsigned int, H5::PredType::NATIVE_ULONG) - - GetH5TypeSpecialize(long long, H5::PredType::NATIVE_LLONG) - GetH5TypeSpecialize(unsigned long long, H5::PredType::NATIVE_ULLONG) + }; \ + ITK_MACROEND_NOOP_STATEMENT + +GetH5TypeSpecialize(float, H5::PredType::NATIVE_FLOAT); +GetH5TypeSpecialize(double, H5::PredType::NATIVE_DOUBLE); +GetH5TypeSpecialize(char, H5::PredType::NATIVE_CHAR); +GetH5TypeSpecialize(unsigned char, H5::PredType::NATIVE_UCHAR); +GetH5TypeSpecialize(short, H5::PredType::NATIVE_SHORT); +GetH5TypeSpecialize(short unsigned int, H5::PredType::NATIVE_USHORT); +GetH5TypeSpecialize(int, H5::PredType::NATIVE_INT); +GetH5TypeSpecialize(unsigned int, H5::PredType::NATIVE_UINT); +GetH5TypeSpecialize(long, H5::PredType::NATIVE_LONG); +GetH5TypeSpecialize(long unsigned int, H5::PredType::NATIVE_ULONG); +GetH5TypeSpecialize(long long, H5::PredType::NATIVE_LLONG); +GetH5TypeSpecialize(unsigned long long, H5::PredType::NATIVE_ULLONG); /* The following types are not implemented. This comment serves * to indicate that the full complement of possible H5::PredType - * types are not implemented int the ITK IO reader/writer + * types is not implemented int the ITK IO reader/writer * GetH5TypeSpecialize(bool, H5::PredType::NATIVE_HBOOL) */ #undef GetH5TypeSpecialize - inline IOComponentEnum PredTypeToComponentType(H5::DataType & type) +inline IOComponentEnum +PredTypeToComponentType(H5::DataType & type) { if (type == H5::PredType::NATIVE_UCHAR) { @@ -964,12 +964,12 @@ template bool HDF5ImageIO::WriteMeta(const std::string & name, MetaDataObjectBase * metaObjBase) { - auto * metaObj = dynamic_cast *>(metaObjBase); - if (metaObj == nullptr) + if (metaObjBase == nullptr || metaObjBase->GetMetaDataObjectTypeInfo() != typeid(TType)) { return false; } - TType val = metaObj->GetMetaDataObjectValue(); + auto * metaObj = static_cast *>(metaObjBase); + TType val = metaObj->GetMetaDataObjectValue(); this->WriteScalar(name, val); return true; } @@ -979,11 +979,11 @@ bool HDF5ImageIO::WriteMetaArray(const std::string & name, MetaDataObjectBase * metaObjBase) { using MetaDataArrayObject = MetaDataObject>; - auto * metaObj = dynamic_cast(metaObjBase); - if (metaObj == nullptr) + if (metaObjBase == nullptr || metaObjBase->GetMetaDataObjectTypeInfo() != typeid(Array)) { return false; } + auto * metaObj = static_cast(metaObjBase); Array val = metaObj->GetMetaDataObjectValue(); std::vector vecVal(val.GetSize()); for (unsigned int i = 0; i < val.size(); ++i) diff --git a/Modules/IO/HDF5/test/itkHDF5ImageIOTest.cxx b/Modules/IO/HDF5/test/itkHDF5ImageIOTest.cxx index ed3fea13a08..7b30274eead 100644 --- a/Modules/IO/HDF5/test/itkHDF5ImageIOTest.cxx +++ b/Modules/IO/HDF5/test/itkHDF5ImageIOTest.cxx @@ -22,6 +22,56 @@ #include "itkMetaDataObject.h" #include "itkMath.h" #include "itkTestingMacros.h" +#include + +// DUPLICATE CODE IN itkMetaDictionaryGTest.cxx +namespace +{ +template +void +AddMetaData(itk::MetaDataDictionary & metaDict, const std::string & key, const T & knownValue) +{ + itk::EncapsulateMetaData(metaDict, key, knownValue); +} + +template +int +VerifyMetaData(const itk::MetaDataDictionary & metaDict, const std::string & key, const T & knownValue) +{ + int status = EXIT_SUCCESS; + T exposedValue{}; + if (!itk::ExposeMetaData(metaDict, key, exposedValue)) + { + std::cerr << "Failure ExposeMetaData '" << key << "'" << std::endl; + status = EXIT_FAILURE; + } + if constexpr (std::is_floating_point_v) + { + if (itk::Math::NotAlmostEquals(exposedValue, knownValue)) + { + std::cerr << "Incorrect meta value read in for " << key << " '" << exposedValue << "' != '" << knownValue << "'" + << std::endl; + status = EXIT_FAILURE; + } + } + else + { + if (exposedValue != knownValue) + { + std::cerr << "Incorrect meta value read in for " << key << " '" << exposedValue << "' != '" << knownValue << "'" + << std::endl; + status = EXIT_FAILURE; + } + } + if (status == EXIT_FAILURE) + { + std::cerr << "========================================" << std::endl; + metaDict.Print(std::cerr); + std::cerr << "========================================" << std::endl; + } + return status; +} +} // namespace template int @@ -55,44 +105,20 @@ HDF5ReadWriteTest(const char * fileName) // // add some unique metadata itk::MetaDataDictionary & metaDict(im->GetMetaDataDictionary()); - constexpr bool metaDataBool(false); - itk::EncapsulateMetaData(metaDict, "TestBool", metaDataBool); - - constexpr char metaDataChar('c'); - itk::EncapsulateMetaData(metaDict, "TestChar", metaDataChar); - - constexpr unsigned char metaDataUChar('u'); - itk::EncapsulateMetaData(metaDict, "TestUChar", metaDataUChar); - - constexpr short metaDataShort{ 1 }; - itk::EncapsulateMetaData(metaDict, "TestShort", metaDataShort); - constexpr unsigned short metaDataUShort{ 3 }; - itk::EncapsulateMetaData(metaDict, "TestUShort", metaDataUShort); - - constexpr int metaDataInt{ 5 }; - itk::EncapsulateMetaData(metaDict, "TestInt", metaDataInt); - - constexpr unsigned int metaDataUInt{ 7 }; - itk::EncapsulateMetaData(metaDict, "TestUInt", metaDataUInt); - - constexpr long metaDataLong{ 5 }; - itk::EncapsulateMetaData(metaDict, "TestLong", metaDataLong); - - constexpr unsigned long metaDataULong{ 7 }; - itk::EncapsulateMetaData(metaDict, "TestULong", metaDataULong); - - constexpr long long metaDataLLong(-5); - itk::EncapsulateMetaData(metaDict, "TestLLong", metaDataLLong); - - constexpr unsigned long long metaDataULLong(7ull); - itk::EncapsulateMetaData(metaDict, "TestULLong", metaDataULLong); - - constexpr float metaDataFloat(1.23456); - itk::EncapsulateMetaData(metaDict, "TestFloat", metaDataFloat); - - constexpr double metaDataDouble(1.23456); - itk::EncapsulateMetaData(metaDict, "TestDouble", metaDataDouble); + AddMetaData(metaDict, "TestBool", false); + AddMetaData(metaDict, "TestChar", 'c'); + AddMetaData(metaDict, "TestUChar", 'u'); + AddMetaData(metaDict, "TestShort", 1); + AddMetaData(metaDict, "TestUShort", 3); + AddMetaData(metaDict, "TestInt", 5); + AddMetaData(metaDict, "TestUInt", 7); + AddMetaData(metaDict, "TestLong", 5); + AddMetaData(metaDict, "TestULong", 7); + AddMetaData(metaDict, "TestLLong", -5); + AddMetaData(metaDict, "TestULLong", 7ull); + AddMetaData(metaDict, "TestFloat", 1.23456f); + AddMetaData(metaDict, "TestDouble", 1.23456); itk::Array metaDataCharArray(5); metaDataCharArray[0] = 'h'; @@ -100,7 +126,7 @@ HDF5ReadWriteTest(const char * fileName) metaDataCharArray[2] = 'l'; metaDataCharArray[3] = 'l'; metaDataCharArray[4] = 'o'; - itk::EncapsulateMetaData>(metaDict, "TestCharArray", metaDataCharArray); + AddMetaData>(metaDict, "TestCharArray", metaDataCharArray); itk::Array metaDataDoubleArray(5); metaDataDoubleArray[0] = 3.0; @@ -108,10 +134,9 @@ HDF5ReadWriteTest(const char * fileName) metaDataDoubleArray[2] = 4.0; metaDataDoubleArray[3] = 5.0; metaDataDoubleArray[4] = 2.0; - itk::EncapsulateMetaData>(metaDict, "TestDoubleArray", metaDataDoubleArray); + AddMetaData>(metaDict, "TestDoubleArray", metaDataDoubleArray); - const std::string metaDataStdString("Test std::string"); - itk::EncapsulateMetaData(metaDict, "StdString", metaDataStdString); + AddMetaData(metaDict, "StdString", "Test std::string"); // // fill image buffer @@ -152,143 +177,75 @@ HDF5ReadWriteTest(const char * fileName) << std::endl; return EXIT_FAILURE; } + std::cout << "Checking MetaDataDictionary Values:" << std::endl; // // Check MetaData const itk::MetaDataDictionary & metaDict2(im2->GetMetaDataDictionary()); - bool metaDataBool2(false); - - if (!itk::ExposeMetaData(metaDict2, "TestBool", metaDataBool2) || metaDataBool != metaDataBool2) + if (VerifyMetaData(metaDict2, "TestBool", false) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestBool " << metaDataBool << ' ' << metaDataBool2 << std::endl; + metaDict2.Print(std::cerr); success = EXIT_FAILURE; } - - char metaDataChar2(0); - if (!itk::ExposeMetaData(metaDict2, "TestChar", metaDataChar2) || metaDataChar2 != metaDataChar) + if (VerifyMetaData(metaDict2, "TestChar", 'c') != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestChar " << metaDataChar2 << ' ' << metaDataChar << std::endl; success = EXIT_FAILURE; } - - unsigned char metaDataUChar2(0); - if (!itk::ExposeMetaData(metaDict2, "TestUChar", metaDataUChar2) || metaDataUChar2 != metaDataUChar) + if (VerifyMetaData(metaDict2, "TestUChar", 'u') != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestUChar " << metaDataUChar2 << ' ' << metaDataUChar << std::endl; success = EXIT_FAILURE; } - - short metaDataShort2(-1); - if (!itk::ExposeMetaData(metaDict2, "TestShort", metaDataShort2) || metaDataShort2 != metaDataShort) + if (VerifyMetaData(metaDict2, "TestShort", 1) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestShort " << metaDataShort2 << ' ' << metaDataShort << std::endl; success = EXIT_FAILURE; } - - unsigned short metaDataUShort2(0); - if (!itk::ExposeMetaData(metaDict2, "TestUShort", metaDataUShort2) || - metaDataUShort2 != metaDataUShort) + if (VerifyMetaData(metaDict2, "TestUShort", 3) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestUShort " << metaDataUShort2 << ' ' << metaDataUShort << std::endl; success = EXIT_FAILURE; } - - int metaDataInt2(1234); - if (!itk::ExposeMetaData(metaDict2, "TestInt", metaDataInt2) || metaDataInt2 != metaDataInt) + if (VerifyMetaData(metaDict2, "TestInt", 5) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestInt " << metaDataInt2 << ' ' << metaDataInt << std::endl; success = EXIT_FAILURE; } - - unsigned int metaDataUInt2(1234); - if (!itk::ExposeMetaData(metaDict2, "TestUInt", metaDataUInt2) || metaDataUInt2 != metaDataUInt) + if (VerifyMetaData(metaDict2, "TestUInt", 7) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestUInt " << metaDataUInt2 << ' ' << metaDataUInt << std::endl; success = EXIT_FAILURE; } - - long metaDataLong2(0); - if (!itk::ExposeMetaData(metaDict2, "TestLong", metaDataLong2) || metaDataLong2 != metaDataLong) + if (VerifyMetaData(metaDict2, "TestLong", 5) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestLong " << metaDataLong2 << ' ' << metaDataLong << std::endl; success = EXIT_FAILURE; } - - unsigned long metaDataULong2(0); - if (!itk::ExposeMetaData(metaDict2, "TestULong", metaDataULong2) || metaDataULong2 != metaDataULong) + if (VerifyMetaData(metaDict2, "TestULong", 7) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestULong " << metaDataULong2 << ' ' << metaDataULong << std::endl; success = EXIT_FAILURE; } - - long long metaDataLLong2(0); - if (!itk::ExposeMetaData(metaDict2, "TestLLong", metaDataLLong2) || metaDataLLong2 != metaDataLLong) + if (VerifyMetaData(metaDict2, "TestLLong", -5) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestLLong " << metaDataLLong2 << ' ' << metaDataLLong << std::endl; success = EXIT_FAILURE; } - - unsigned long long metaDataULLong2(0); - if (!itk::ExposeMetaData(metaDict2, "TestULLong", metaDataULLong2) || - metaDataULLong2 != metaDataULLong) + if (VerifyMetaData(metaDict2, "TestULLong", 7ull) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestULLong " << metaDataULLong2 << ' ' << metaDataULLong << std::endl; success = EXIT_FAILURE; } - - float metaDataFloat2(0.0f); - if (!itk::ExposeMetaData(metaDict2, "TestFloat", metaDataFloat2) || - itk::Math::NotAlmostEquals(metaDataFloat2, metaDataFloat)) + if (VerifyMetaData(metaDict2, "TestFloat", 1.23456f) != EXIT_SUCCESS) { - std::cerr << "Failure Reading metaData " - << "TestFloat " << metaDataFloat2 << ' ' << metaDataFloat << std::endl; success = EXIT_FAILURE; } - - double metaDataDouble2(0.0); - if (!itk::ExposeMetaData(metaDict2, "TestDouble", metaDataDouble2) || - itk::Math::NotAlmostEquals(metaDataDouble2, metaDataDouble)) + if (VerifyMetaData(metaDict2, "TestDouble", 1.23456) != EXIT_SUCCESS) { - std::cerr << "Failure reading metaData " - << "TestDouble " << metaDataDouble2 << ' ' << metaDataDouble << std::endl; success = EXIT_FAILURE; } - itk::Array metaDataCharArray2{}; - if (!itk::ExposeMetaData>(metaDict2, "TestCharArray", metaDataCharArray2) || - metaDataCharArray2 != metaDataCharArray) + if (VerifyMetaData>(metaDict2, "TestCharArray", metaDataCharArray) != EXIT_SUCCESS) { - std::cerr << "Failure reading metaData " - << "TestCharArray" << metaDataCharArray2 << ' ' << metaDataCharArray2 << std::endl; success = EXIT_FAILURE; } - - itk::Array metaDataDoubleArray2{}; - if (!itk::ExposeMetaData>(metaDict2, "TestDoubleArray", metaDataDoubleArray2) || - metaDataDoubleArray2 != metaDataDoubleArray) + if (VerifyMetaData>(metaDict2, "TestDoubleArray", metaDataDoubleArray) != EXIT_SUCCESS) { - std::cerr << "Failure reading metaData " - << "TestDoubleArray " << metaDataDoubleArray2 << ' ' << metaDataDoubleArray << std::endl; success = EXIT_FAILURE; } - - std::string metaDataStdString2(""); - if (!itk::ExposeMetaData(metaDict2, "StdString", metaDataStdString2) || - metaDataStdString2 != metaDataStdString) + if (VerifyMetaData(metaDict2, "StdString", std::string("Test std::string")) != EXIT_SUCCESS) { - std::cerr << "Failure reading metaData " - << "StdString " << metaDataStdString2 << ' ' << metaDataStdString << std::endl; success = EXIT_FAILURE; } diff --git a/Modules/IO/MINC/test/itkMINCImageIOTest4.cxx b/Modules/IO/MINC/test/itkMINCImageIOTest4.cxx index 7105e185989..f531865b781 100644 --- a/Modules/IO/MINC/test/itkMINCImageIOTest4.cxx +++ b/Modules/IO/MINC/test/itkMINCImageIOTest4.cxx @@ -115,7 +115,7 @@ int itkMINCImageIOTest4(int argc, char * argv[]) { // Save the format stream variables for std::cout - // They will be restored when coutState goes out of scope + // They will be restored when coutState goes out of // scope. const itk::StdStreamStateSave coutState(std::cout); @@ -129,8 +129,8 @@ itkMINCImageIOTest4(int argc, char * argv[]) const char * input = argv[1]; const char * output = argv[2]; - int RAStofromLPSTest = atoi(argv[3]); - bool RAStofromLPS = RAStofromLPSTest < 0 ? false : RAStofromLPSTest == 1; + const int RAStofromLPSTest = atoi(argv[3]); + const bool RAStofromLPS = RAStofromLPSTest < 0 ? false : RAStofromLPSTest == 1; double total = 0.0; double mx = 0.0; @@ -159,30 +159,29 @@ itkMINCImageIOTest4(int argc, char * argv[]) constexpr double epsilon{ 1e-3 }; + int ret = EXIT_SUCCESS; try { - int ret = EXIT_SUCCESS; std::cout.precision(10); if (test_image_moments>(input, nullptr, total, mx, my, mz, epsilon, RAStofromLPS) != EXIT_SUCCESS) { + std::cerr << "Failed the double float precision read operation" << std::endl; ret = EXIT_FAILURE; } // write out only float image if (test_image_moments>(input, output, total, mx, my, mz, epsilon, RAStofromLPS) != EXIT_SUCCESS) { + std::cerr << "Failed the single float precision read or write operation" << std::endl; ret = EXIT_FAILURE; } - return ret; } catch (const itk::ExceptionObject & excp) { std::cerr << excp << std::endl; - return EXIT_FAILURE; + ret = EXIT_FAILURE; } - - - return EXIT_SUCCESS; + return ret; } diff --git a/README.md b/README.md index 631abbffc07..6469a7000e4 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ ITK: The Insight Toolkit | Azure Pipelines | macOS | [![Build Status](https://dev.azure.com/itkrobotmacos/ITK.macOS/_apis/build/status/ITK.macOS?branchName=main)](https://dev.azure.com/itkrobotmacos/ITK.macOS/_build/latest?definitionId=2&branchName=main) | [![Build Status](https://dev.azure.com/itkrobotmacospython/ITK.macOS.Python/_apis/build/status/ITK.macOS.Python?branchName=main)](https://dev.azure.com/itkrobotmacospython/ITK.macOS.Python/_build/latest?definitionId=2&branchName=main) | | GitHub Actions | Linux, Windows, macOS | [![ITK.Pixi](https://github.com/InsightSoftwareConsortium/ITK/actions/workflows/pixi.yml/badge.svg)](https://github.com/InsightSoftwareConsortium/ITK/actions/workflows/pixi.yml) | | | GitHub Actions | macOS (Apple Silicon)| [![ITK.macOS.Arm64](https://github.com/InsightSoftwareConsortium/ITK/actions/workflows/macos-arm.yml/badge.svg)](https://github.com/InsightSoftwareConsortium/ITK/actions/workflows/macos-arm.yml)| | +| GitHub Actions | Linux, macOS ARM64| [![ITK.Arm64](https://github.com/InsightSoftwareConsortium/ITK/actions/workflows/arm.yml/badge.svg)](https://github.com/InsightSoftwareConsortium/ITK/actions/workflows/arm.yml)| | | Azure Pipelines | Linux (Code coverage)| [![Build Status](https://dev.azure.com/itkrobotbatch/ITK.Coverage/_apis/build/status/ITK.Coverage?branchName=main)](https://dev.azure.com/itkrobotbatch/ITK.Coverage/_build/latest?definitionId=3&branchName=main) | | Links