Skip to content

Commit

Permalink
Test updates
Browse files Browse the repository at this point in the history
  • Loading branch information
nyoungbq committed Jan 16, 2024
1 parent 6d92263 commit c7b07c4
Showing 1 changed file with 108 additions and 44 deletions.
152 changes: 108 additions & 44 deletions src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <catch2/catch.hpp>

#include "ITKImageProcessing/Filters/ITKImportImageStack.hpp"

Check warning on line 3 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

[clang-format] reported by reviewdog 🐶 Raw Output: src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:3:-#include "ITKImageProcessing/Filters/ITKImportImageStack.hpp"

Check failure on line 3 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]
#include "ITKImageProcessing/Filters/ITKImageReader.hpp"
#include "ITKImageProcessing/ITKImageProcessing_test_dirs.hpp"

Check warning on line 5 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

[clang-format] reported by reviewdog 🐶 Raw Output: src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:4:+#include "ITKImageProcessing/Filters/ITKImportImageStack.hpp"
#include "ITKTestBase.hpp"

Expand All @@ -20,6 +21,7 @@ namespace
const std::string k_ImageStackDir = unit_test::k_DataDir.str() + "/ImageStack";
const DataPath k_ImageGeomPath = {{"ImageGeometry"}};
const DataPath k_ImageDataPath = k_ImageGeomPath.createChildPath(ImageGeom::k_CellDataName).createChildPath("ImageData");
const std::string k_FlippedImageStackDirName = "image_flip_test_images";

void FillFlippedArgs(Arguments& args)
{
Expand All @@ -31,34 +33,55 @@ void FillFlippedArgs(Arguments& args)
args.insertOrAssign(ITKImportImageStack::k_ImageGeometryPath_Key, std::make_any<DataPath>(k_ImageGeomPath));
}

Result<> CompareFlippedGeometries(const ImageGeom* baseGeom, const ImageGeom* xFlipGeom, const ImageGeom* yFlipGeom)
void CompareFlippedGeometries(const DataStructure& dataStructure, const ImageGeom* baseGeom, const ImageGeom* xFlipGeom, const ImageGeom* yFlipGeom)
{
Result<> result = {};

REQUIRE(imageGeom != nullptr);
REQUIRE(baseGeom != nullptr);
REQUIRE(xFlipGeom != nullptr);
REQUIRE(yFlipGeom != nullptr);

SizeVec3 imageDims = imageGeom->getDimensions();
FloatVec3 imageOrigin = imageGeom->getOrigin();
FloatVec3 imageSpacing = imageGeom->getSpacing();
SizeVec3 imageDims = baseGeom->getDimensions();
FloatVec3 imageOrigin = baseGeom->getOrigin();
FloatVec3 imageSpacing = baseGeom->getSpacing();

std::array<usize, 3> dims = {524, 390, 3};
SizeVec3 dims = xFlipGeom->getDimensions();

REQUIRE(imageDims[0] == dims[0]);
REQUIRE(imageDims[1] == dims[1]);
REQUIRE(imageDims[2] == dims[2]);

FloatVec3 origin = xFlipGeom->getOrigin();

REQUIRE(imageOrigin[0] == Approx(origin[0]));
REQUIRE(imageOrigin[1] == Approx(origin[1]));
REQUIRE(imageOrigin[2] == Approx(origin[2]));

FloatVec3 spacing = xFlipGeom->getSpacing();

REQUIRE(imageSpacing[0] == Approx(spacing[0]));
REQUIRE(imageSpacing[1] == Approx(spacing[1]));
REQUIRE(imageSpacing[2] == Approx(spacing[2]));

const auto* imageData = dataStructure.getDataAs<UInt8Array>(k_ImageDataPath);
REQUIRE(imageData != nullptr);
dims = yFlipGeom->getDimensions();

REQUIRE(imageDims[0] == dims[0]);
REQUIRE(imageDims[1] == dims[1]);
REQUIRE(imageDims[2] == dims[2]);

origin = yFlipGeom->getOrigin();

REQUIRE(imageOrigin[0] == Approx(origin[0]));
REQUIRE(imageOrigin[1] == Approx(origin[1]));
REQUIRE(imageOrigin[2] == Approx(origin[2]));

spacing = yFlipGeom->getSpacing();

REQUIRE(imageSpacing[0] == Approx(spacing[0]));
REQUIRE(imageSpacing[1] == Approx(spacing[1]));
REQUIRE(imageSpacing[2] == Approx(spacing[2]));

return result;
//const auto* imageData = dataStructure.getDataAs<UInt8Array>(k_ImageDataPath);

Check warning on line 83 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

[clang-format] reported by reviewdog 🐶 Raw Output: src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:83:- //const auto* imageData = dataStructure.getDataAs<UInt8Array>(k_ImageDataPath); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:84:- //REQUIRE(imageData != nullptr); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:83:+ // const auto* imageData = dataStructure.getDataAs<UInt8Array>(k_ImageDataPath); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:84:+ // REQUIRE(imageData != nullptr);

Check failure on line 83 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]
//REQUIRE(imageData != nullptr);

Check failure on line 84 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]
}
} // namespace

Expand Down Expand Up @@ -197,33 +220,74 @@ TEST_CASE("ITKImageProcessing::ITKImportImageStack: CompareImage", "[ITKImagePro

TEST_CASE("ITKImageProcessing::ITKImportImageStack: Flipped Image Even-Even X/Y", "[ITKImageProcessing][ITKImportImageStack]")
{
ITKImportImageStack filter;
DataStructure dataStructure;
Arguments args;
const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "image_flip_test_images.tar.gz", k_FlippedImageStackDirName);

GeneratedFileListParameter::ValueType fileListInfo;
fileListInfo.inputPath = k_ImageStackDir;
fileListInfo.startIndex = 11;
fileListInfo.endIndex = 13;
fileListInfo.incrementIndex = 1;
fileListInfo.fileExtension = ".tif";
fileListInfo.filePrefix = "slice_";
fileListInfo.fileSuffix = "";
fileListInfo.paddingDigits = 2;
fileListInfo.ordering = GeneratedFileListParameter::Ordering::LowToHigh;

args.insertOrAssign(ITKImportImageStack::k_InputFileListInfo_Key, std::make_any<GeneratedFileListParameter::ValueType>(fileListInfo));
::FillFlippedArgs(args);
fs::path k_ImageFlipStackDir = fs::path(fmt::format("{}/{}", unit_test::k_TestFilesDir, k_FlippedImageStackDirName));
const std::string k_FilePrefix = "image_flip_even_even_";

auto preflightResult = filter.preflight(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions)

auto executeResult = filter.execute(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)

auto compareResult =
::CompareFlippedGeometries(dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));
SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
DataStructure dataStructure;
{
ITKImportImageStack filter;
Arguments args;

GeneratedFileListParameter::ValueType fileListInfo;
fileListInfo.inputPath = k_ImageFlipStackDir;

Check failure on line 234 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / build (windows-2022, v142)

binary '=': no operator found which takes a right-hand operand of type 'std::filesystem::path' (or there is no acceptable conversion) [D:\a\simplnx\simplnx\build\Plugins\ITKImageProcessing\test\ITKImageProcessingUnitTest.vcxproj]

Check failure on line 234 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / build (windows-2022, v143)

binary '=': no operator found which takes a right-hand operand of type 'std::filesystem::path' (or there is no acceptable conversion) [D:\a\simplnx\simplnx\build\Plugins\ITKImageProcessing\test\ITKImageProcessingUnitTest.vcxproj]
fileListInfo.startIndex = 1;
fileListInfo.endIndex = 1;
fileListInfo.incrementIndex = 1;
fileListInfo.fileExtension = ".png";
fileListInfo.filePrefix = k_FilePrefix;
fileListInfo.fileSuffix = "";
fileListInfo.paddingDigits = 1;
fileListInfo.ordering = GeneratedFileListParameter::Ordering::LowToHigh;

args.insertOrAssign(ITKImportImageStack::k_InputFileListInfo_Key, std::make_any<GeneratedFileListParameter::ValueType>(fileListInfo));
::FillFlippedArgs(args);

auto preflightResult = filter.preflight(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions)

auto executeResult = filter.execute(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)
}
{
ITKImageReader filter;
Arguments args;

fs::path filePath = k_ImageFlipStackDir / (k_FilePrefix + "flip_x.png");
DataPath arrayPath{{"ImageGeom", "ImageArray"}};
DataPath imagePath = arrayPath.getParent();
args.insertOrAssign(ITKImageReader::k_FileName_Key, filePath);
args.insertOrAssign(ITKImageReader::k_ImageGeometryPath_Key, imagePath);
args.insertOrAssign(ITKImageReader::k_ImageDataArrayPath_Key, arrayPath);

auto preflightResult = filter.preflight(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions)

auto executeResult = filter.execute(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)
}
{
ITKImageReader filter;
Arguments args;

fs::path filePath = k_ImageFlipStackDir / (k_FilePrefix + "flip_y.png");
DataPath arrayPath{{"ImageGeom", "ImageArray"}};
DataPath imagePath = arrayPath.getParent();
args.insertOrAssign(ITKImageReader::k_FileName_Key, filePath);
args.insertOrAssign(ITKImageReader::k_ImageGeometryPath_Key, imagePath);
args.insertOrAssign(ITKImageReader::k_ImageDataArrayPath_Key, arrayPath);

auto preflightResult = filter.preflight(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions)

auto executeResult = filter.execute(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)
}

Check failure on line 286 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]

// auto compareResult =

Check warning on line 288 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

[clang-format] reported by reviewdog 🐶 Raw Output: src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:288:-// auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:289:-// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:290:-// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result) src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:288:+ // auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:289:+ // ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:290:+ // dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:291:+ // SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)

Check failure on line 288 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]
// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));

Check failure on line 289 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]

Check failure on line 289 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]
// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
}

TEST_CASE("ITKImageProcessing::ITKImportImageStack: Flipped Image Even-Odd X/Y", "[ITKImageProcessing][ITKImportImageStack]")
Expand Down Expand Up @@ -252,9 +316,9 @@ TEST_CASE("ITKImageProcessing::ITKImportImageStack: Flipped Image Even-Odd X/Y",
auto executeResult = filter.execute(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)

Check failure on line 317 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]

auto compareResult =
::CompareFlippedGeometries(dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));
SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
// auto compareResult =

Check warning on line 319 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

[clang-format] reported by reviewdog 🐶 Raw Output: src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:319:-// auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:320:-// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:321:-// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result) src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:320:+ // auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:321:+ // ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:322:+ // dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:323:+ // SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)

Check failure on line 319 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]
// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));

Check failure on line 320 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

code should be clang-formatted [-Wclang-format-violations]
// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
}

TEST_CASE("ITKImageProcessing::ITKImportImageStack: Flipped Image Odd-Even X/Y", "[ITKImageProcessing][ITKImportImageStack]")
Expand Down Expand Up @@ -283,9 +347,9 @@ TEST_CASE("ITKImageProcessing::ITKImportImageStack: Flipped Image Odd-Even X/Y",
auto executeResult = filter.execute(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)

auto compareResult =
::CompareFlippedGeometries(dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));
SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
// auto compareResult =

Check warning on line 350 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

[clang-format] reported by reviewdog 🐶 Raw Output: src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:350:-// auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:351:-// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:352:-// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result) src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:352:+ // auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:353:+ // ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:354:+ // dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:355:+ // SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));
// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
}

TEST_CASE("ITKImageProcessing::ITKImportImageStack: Flipped Image Odd-Odd X/Y", "[ITKImageProcessing][ITKImportImageStack]")
Expand Down Expand Up @@ -314,7 +378,7 @@ TEST_CASE("ITKImageProcessing::ITKImportImageStack: Flipped Image Odd-Odd X/Y",
auto executeResult = filter.execute(dataStructure, args);
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)

auto compareResult =
::CompareFlippedGeometries(dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));
SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
// auto compareResult =

Check warning on line 381 in src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp

View workflow job for this annotation

GitHub Actions / clang_format_pr

[clang-format] reported by reviewdog 🐶 Raw Output: src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:381:-// auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:382:-// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:383:-// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result) src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:384:+ // auto compareResult = src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:385:+ // ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:386:+ // dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath)); src/Plugins/ITKImageProcessing/test/ITKImportImageStackTest.cpp:387:+ // SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
// ::CompareFlippedGeometries(dataStructure, dataStructure.getDataAs<ImageGeom>(k_BaseGeomPath), dataStructure.getDataAs<ImageGeom>(k_XFlippedGeomPath), dataStructure.getDataAs<ImageGeom>(k_YFlippedGeomPath));
// SIMPLNX_RESULT_REQUIRE_VALID(compareResult.result)
}

0 comments on commit c7b07c4

Please sign in to comment.