From 5622f85e6c2137b7bd838493dfaf64cca041c3db Mon Sep 17 00:00:00 2001 From: Kelvin Rodriguez Date: Wed, 9 Dec 2020 12:32:12 -0700 Subject: [PATCH] Std2isis gtests (#4172) * added std2isis tests * removed old tests * added unittests * removed image importer unittest * addressed comments --- isis/src/base/apps/std2isis/main.cpp | 32 +-- isis/src/base/apps/std2isis/std2isis.cpp | 36 +++ isis/src/base/apps/std2isis/std2isis.h | 10 + isis/src/base/apps/std2isis/tsts/Makefile | 4 - .../src/base/apps/std2isis/tsts/argb/Makefile | 8 - .../base/apps/std2isis/tsts/default/Makefile | 8 - .../apps/std2isis/tsts/grayscale/Makefile | 8 - .../base/apps/std2isis/tsts/jpeg2000/Makefile | 12 - .../base/apps/std2isis/tsts/special/Makefile | 10 - .../src/base/apps/std2isis/tsts/tiff/Makefile | 10 - .../objs/ImageImporter/ImageImporter.truth | 7 - isis/src/base/objs/ImageImporter/unitTest.cpp | 39 --- isis/tests/FunctionalTestsStd2Isis.cpp | 227 ++++++++++++++++++ isis/tests/ImageImporterTests.cpp | 120 +++++++++ .../data/stdFormatImages/grayscale.png} | Bin isis/tests/data/stdFormatImages/grayscale.tif | Bin 0 -> 1131 bytes isis/tests/data/stdFormatImages/rgb.jp2 | Bin 0 -> 9416 bytes isis/tests/data/stdFormatImages/rgb.jpg | Bin 0 -> 8375 bytes isis/tests/data/stdFormatImages/rgb.png | Bin 0 -> 47908 bytes isis/tests/data/stdFormatImages/rgb.tif | Bin 0 -> 47136 bytes isis/tests/data/stdFormatImages/special.png | Bin 0 -> 47908 bytes 21 files changed, 397 insertions(+), 134 deletions(-) create mode 100644 isis/src/base/apps/std2isis/std2isis.cpp create mode 100644 isis/src/base/apps/std2isis/std2isis.h delete mode 100644 isis/src/base/apps/std2isis/tsts/Makefile delete mode 100644 isis/src/base/apps/std2isis/tsts/argb/Makefile delete mode 100644 isis/src/base/apps/std2isis/tsts/default/Makefile delete mode 100644 isis/src/base/apps/std2isis/tsts/grayscale/Makefile delete mode 100644 isis/src/base/apps/std2isis/tsts/jpeg2000/Makefile delete mode 100644 isis/src/base/apps/std2isis/tsts/special/Makefile delete mode 100644 isis/src/base/apps/std2isis/tsts/tiff/Makefile delete mode 100644 isis/src/base/objs/ImageImporter/ImageImporter.truth delete mode 100644 isis/src/base/objs/ImageImporter/unitTest.cpp create mode 100644 isis/tests/FunctionalTestsStd2Isis.cpp create mode 100644 isis/tests/ImageImporterTests.cpp rename isis/{src/base/objs/ImageImporter/test.png => tests/data/stdFormatImages/grayscale.png} (100%) create mode 100644 isis/tests/data/stdFormatImages/grayscale.tif create mode 100644 isis/tests/data/stdFormatImages/rgb.jp2 create mode 100644 isis/tests/data/stdFormatImages/rgb.jpg create mode 100644 isis/tests/data/stdFormatImages/rgb.png create mode 100644 isis/tests/data/stdFormatImages/rgb.tif create mode 100644 isis/tests/data/stdFormatImages/special.png diff --git a/isis/src/base/apps/std2isis/main.cpp b/isis/src/base/apps/std2isis/main.cpp index 4a72801d3f..d74adb4698 100644 --- a/isis/src/base/apps/std2isis/main.cpp +++ b/isis/src/base/apps/std2isis/main.cpp @@ -5,35 +5,11 @@ #include "ImageImporter.h" #include "UserInterface.h" -using namespace Isis; +#include "std2isis.h" +using namespace Isis; void IsisMain() { UserInterface &ui = Application::GetUserInterface(); - - FileName inputName = ui.GetFileName("FROM"); - ImageImporter *importer = ImageImporter::fromFileName(inputName); - - // Explicitly set band dimension if a specific color mode is desired - IString mode = ui.GetString("MODE"); - if (mode != "AUTO") { - int bands = mode == "GRAYSCALE" ? 1 : mode == "ARGB" ? 4 : 3; - importer->setBands(bands); - } - - // Set special pixel ranges - if (ui.GetBoolean("SETNULLRANGE")) - importer->setNullRange(ui.GetDouble("NULLMIN"), ui.GetDouble("NULLMAX")); - if (ui.GetBoolean("SETHRSRANGE")) - importer->setHrsRange(ui.GetDouble("HRSMIN"), ui.GetDouble("HRSMAX")); - if (ui.GetBoolean("SETLRSRANGE")) - importer->setLrsRange(ui.GetDouble("LRSMIN"), ui.GetDouble("LRSMAX")); - - // Import the image - FileName outputName = ui.GetFileName("TO"); - CubeAttributeOutput &att = ui.GetOutputAttribute("TO"); - importer->import(outputName, att); - - delete importer; -} - + std2isis(ui); +} \ No newline at end of file diff --git a/isis/src/base/apps/std2isis/std2isis.cpp b/isis/src/base/apps/std2isis/std2isis.cpp new file mode 100644 index 0000000000..05c367b2e8 --- /dev/null +++ b/isis/src/base/apps/std2isis/std2isis.cpp @@ -0,0 +1,36 @@ +#include + +#include "ImageImporter.h" +#include "UserInterface.h" + +#include "std2isis.h" + +namespace Isis { + void std2isis(UserInterface &ui) { + FileName inputName = ui.GetFileName("FROM"); + ImageImporter *importer = ImageImporter::fromFileName(inputName); + + // Explicitly set band dimension if a specific color mode is desired + IString mode = ui.GetString("MODE"); + if (mode != "AUTO") { + int bands = mode == "GRAYSCALE" ? 1 : mode == "ARGB" ? 4 : 3; + importer->setBands(bands); + } + + // Set special pixel ranges + if (ui.GetBoolean("SETNULLRANGE")) + importer->setNullRange(ui.GetDouble("NULLMIN"), ui.GetDouble("NULLMAX")); + if (ui.GetBoolean("SETHRSRANGE")) + importer->setHrsRange(ui.GetDouble("HRSMIN"), ui.GetDouble("HRSMAX")); + if (ui.GetBoolean("SETLRSRANGE")) + importer->setLrsRange(ui.GetDouble("LRSMIN"), ui.GetDouble("LRSMAX")); + + // Import the image + FileName outputName = ui.GetFileName("TO"); + CubeAttributeOutput &att = ui.GetOutputAttribute("TO"); + importer->import(outputName, att); + + delete importer; + } + +} \ No newline at end of file diff --git a/isis/src/base/apps/std2isis/std2isis.h b/isis/src/base/apps/std2isis/std2isis.h new file mode 100644 index 0000000000..e47bc07f22 --- /dev/null +++ b/isis/src/base/apps/std2isis/std2isis.h @@ -0,0 +1,10 @@ +#ifndef std2isis_h +#define std2isis_h + +#include "UserInterface.h" + +namespace Isis { + extern void std2isis(UserInterface &ui); +} + +#endif \ No newline at end of file diff --git a/isis/src/base/apps/std2isis/tsts/Makefile b/isis/src/base/apps/std2isis/tsts/Makefile deleted file mode 100644 index 46d84c74c2..0000000000 --- a/isis/src/base/apps/std2isis/tsts/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -BLANKS = "%-6s" -LENGTH = "%-40s" - -include $(ISISROOT)/make/isismake.tststree diff --git a/isis/src/base/apps/std2isis/tsts/argb/Makefile b/isis/src/base/apps/std2isis/tsts/argb/Makefile deleted file mode 100644 index 085fee4323..0000000000 --- a/isis/src/base/apps/std2isis/tsts/argb/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -APPNAME = std2isis - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/in.jpg TO=$(OUTPUT)/out.cub \ - mode=argb \ - > /dev/null; diff --git a/isis/src/base/apps/std2isis/tsts/default/Makefile b/isis/src/base/apps/std2isis/tsts/default/Makefile deleted file mode 100644 index cc9a78b56d..0000000000 --- a/isis/src/base/apps/std2isis/tsts/default/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -APPNAME = std2isis - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/in.png TO=$(OUTPUT)/out.cub \ - > /dev/null; - catlab from=$(OUTPUT)/out.cub to=$(OUTPUT)/outLabel.pvl > /dev/null; diff --git a/isis/src/base/apps/std2isis/tsts/grayscale/Makefile b/isis/src/base/apps/std2isis/tsts/grayscale/Makefile deleted file mode 100644 index b0dbe31946..0000000000 --- a/isis/src/base/apps/std2isis/tsts/grayscale/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -APPNAME = std2isis - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/in.png TO=$(OUTPUT)/out.cub \ - mode=grayscale \ - > /dev/null; diff --git a/isis/src/base/apps/std2isis/tsts/jpeg2000/Makefile b/isis/src/base/apps/std2isis/tsts/jpeg2000/Makefile deleted file mode 100644 index 807028546d..0000000000 --- a/isis/src/base/apps/std2isis/tsts/jpeg2000/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -APPNAME = std2isis - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/PSP_001892_1715_COLOR.JP2 \ - TO=$(OUTPUT)/PSP_001892_1715_COLOR.cub \ - > /dev/null; - - $(APPNAME) FROM=$(INPUT)/PSP_001892_1715_RED.JP2 \ - TO=$(OUTPUT)/PSP_001892_1715_RED.cub \ - > /dev/null; diff --git a/isis/src/base/apps/std2isis/tsts/special/Makefile b/isis/src/base/apps/std2isis/tsts/special/Makefile deleted file mode 100644 index 1f8abd063b..0000000000 --- a/isis/src/base/apps/std2isis/tsts/special/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -APPNAME = std2isis - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/in.png TO=$(OUTPUT)/out.cub \ - mode=grayscale \ - setnullrange=yes nullmin=100 nullmax=240 sethrsrange=yes \ - hrsmin=200 hrsmax=260 setlrsrange=yes lrsmin=0 lrsmax=100 \ - > /dev/null; diff --git a/isis/src/base/apps/std2isis/tsts/tiff/Makefile b/isis/src/base/apps/std2isis/tsts/tiff/Makefile deleted file mode 100644 index de47dbf141..0000000000 --- a/isis/src/base/apps/std2isis/tsts/tiff/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -APPNAME = std2isis - -include $(ISISROOT)/make/isismake.tsts - -commands: - $(APPNAME) FROM=$(INPUT)/grayscale.tif TO=$(OUTPUT)/grayscale.cub \ - > /dev/null; - - $(APPNAME) FROM=$(INPUT)/rgb.tif TO=$(OUTPUT)/rgb.cub \ - > /dev/null; diff --git a/isis/src/base/objs/ImageImporter/ImageImporter.truth b/isis/src/base/objs/ImageImporter/ImageImporter.truth deleted file mode 100644 index 87497c95cb..0000000000 --- a/isis/src/base/objs/ImageImporter/ImageImporter.truth +++ /dev/null @@ -1,7 +0,0 @@ -Testing ImageImporter... - -Creating Instance -Importing -Clean-up - -Done diff --git a/isis/src/base/objs/ImageImporter/unitTest.cpp b/isis/src/base/objs/ImageImporter/unitTest.cpp deleted file mode 100644 index 2d76414a28..0000000000 --- a/isis/src/base/objs/ImageImporter/unitTest.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include - -#include - -#include "FileName.h" -#include "IException.h" -#include "ImageImporter.h" -#include "Preference.h" - -using namespace std; -using namespace Isis; - - -int main(int argc, char *argv[]) { - Preference::Preferences(true); - cout << setprecision(9); - - try { - cout << "Testing ImageImporter..." << endl << endl; - FileName inputName("test.png"); - - cout << "Creating Instance" << endl; - ImageImporter *importer = ImageImporter::fromFileName(inputName); - - cout << "Importing" << endl; - FileName outputName("test.cub"); - importer->import(outputName); - - cout << "Clean-up" << endl; - delete importer; - QFile::remove(outputName.expanded()); - - cout << endl << "Done" << endl; - } - catch (IException &e) { - e.print(); - } -} - diff --git a/isis/tests/FunctionalTestsStd2Isis.cpp b/isis/tests/FunctionalTestsStd2Isis.cpp new file mode 100644 index 0000000000..06702e4066 --- /dev/null +++ b/isis/tests/FunctionalTestsStd2Isis.cpp @@ -0,0 +1,227 @@ +#include +#include + +#include +#include +#include +#include + +#include "Fixtures.h" +#include "Pvl.h" +#include "PvlGroup.h" +#include "TestUtilities.h" +#include "Cube.h" +#include "Histogram.h" + +#include "gmock/gmock.h" + +#include "std2isis.h" + +using namespace Isis; + +static QString APP_XML = FileName("$ISISROOT/bin/xml/std2isis.xml").expanded(); + +TEST_F(TempTestingFiles, FunctionalTestsStd2IsisDefault) { + QString outCubeFileName = tempDir.path() + "/outTemp.cub"; + + QVector args = {"from=data/stdFormatImages/rgb.png", "to="+outCubeFileName}; + + UserInterface options(APP_XML, args); + try { + std2isis(options); + } + catch (IException &e) { + FAIL() << "Unable to translate image: " << e.what() << std::endl; + } + + Cube outCube(outCubeFileName); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 126); + ASSERT_EQ((int)dimensions["Lines"], 126); + ASSERT_EQ((int)dimensions["Bands"], 3); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Red"); + ASSERT_EQ(bandbin["Name"][1].toStdString(), "Green"); + ASSERT_EQ(bandbin["Name"][2].toStdString(), "Blue"); + + std::unique_ptr hist (outCube.histogram()); + ASSERT_NEAR(hist->Average(), 113.11904761904762, .00001); + ASSERT_EQ(hist->Sum(), 1795878); + ASSERT_EQ(hist->ValidPixels(), 15876); + ASSERT_NEAR(hist->StandardDeviation(), 97.569786532996, .0001); +} + + +TEST_F(TempTestingFiles, FunctionalTestsStd2IsisArgb) { + QString outCubeFileName = tempDir.path() + "/outTemp.cub"; + + QVector args = {"from=data/stdFormatImages/rgb.png", "to="+outCubeFileName, "mode=argb" }; + + UserInterface options(APP_XML, args); + try { + std2isis(options); + } + catch (IException &e) { + FAIL() << "Unable to translate image: " << e.what() << std::endl; + } + + Cube outCube(outCubeFileName); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 126); + ASSERT_EQ((int)dimensions["Lines"], 126); + ASSERT_EQ((int)dimensions["Bands"], 4); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Red"); + ASSERT_EQ(bandbin["Name"][1].toStdString(), "Green"); + ASSERT_EQ(bandbin["Name"][2].toStdString(), "Blue"); + ASSERT_EQ(bandbin["Name"][3].toStdString(), "Alpha"); + + std::unique_ptr hist (outCube.histogram()); + ASSERT_NEAR(hist->Average(), 113.11904761904762, .00001); + ASSERT_EQ(hist->Sum(), 1795878); + ASSERT_EQ(hist->ValidPixels(), 15876); + ASSERT_NEAR(hist->StandardDeviation(), 97.569786532996, .0001); +} + + +TEST_F(TempTestingFiles, FunctionalTestsStd2IsisTiffGrayscale) { + QString outCubeFileName = tempDir.path() + "/outTemp.cub"; + + QVector args = {"from=data/stdFormatImages/rgb.tif", "to="+outCubeFileName, "mode=grayscale"}; + + UserInterface options(APP_XML, args); + try { + std2isis(options); + } + catch (IException &e) { + FAIL() << "Unable to translate image: " << e.what() << std::endl; + } + + Cube outCube(outCubeFileName); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 256); + ASSERT_EQ((int)dimensions["Lines"], 192); + ASSERT_EQ((int)dimensions["Bands"], 1); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Gray"); + + std::unique_ptr hist (outCube.histogram()); + ASSERT_NEAR(hist->Average(), 96.403951009114579, .00001); + ASSERT_EQ(hist->Sum(), 4738447); + ASSERT_EQ(hist->ValidPixels(), 49152); + ASSERT_NEAR(hist->StandardDeviation(), 34.639987308489523, .0001); +} + + +TEST_F(TempTestingFiles, FunctionalTestsStd2IsisSpecial) { + QString outCubeFileName = tempDir.path() + "/outTemp.cub"; + + QVector args = {"from=data/stdFormatImages/rgb.png", "to="+outCubeFileName, "setnullrange=yes", + "nullmin=100", "nullmax=240", "sethrsrange=yes", "mode=grayscale", + "hrsmin=200", "hrsmax=260", "setlrsrange=yes", "lrsmin=0", + "lrsmax=100" }; + + UserInterface options(APP_XML, args); + try { + std2isis(options); + } + catch (IException &e) { + FAIL() << "Unable to translate image: " << e.what() << std::endl; + } + + Cube outCube(outCubeFileName); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 126); + ASSERT_EQ((int)dimensions["Lines"], 126); + ASSERT_EQ((int)dimensions["Bands"], 1); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Gray"); + + std::unique_ptr hist (outCube.histogram()); + + ASSERT_EQ(hist->LrsPixels(), 5983); + ASSERT_EQ(hist->HrsPixels(), 957); + ASSERT_EQ(hist->NullPixels(), 8936); + ASSERT_NEAR(hist->Average(), -1.7976931348623149e+308, .00001); + ASSERT_EQ(hist->Sum(), 0); + ASSERT_EQ(hist->ValidPixels(), 0); + ASSERT_NEAR(hist->StandardDeviation(), -1.7976931348623149e+308, .0001); +} + + +TEST_F(TempTestingFiles, FunctionalTestsStd2IsisJp2) { + QString outCubeFileName = tempDir.path() + "/outTemp.cub"; + + QVector args = {"from=data/stdFormatImages/rgb.jp2", "to="+outCubeFileName }; + + UserInterface options(APP_XML, args); + try { + std2isis(options); + } + catch (IException &e) { + FAIL() << "Unable to translate image: " << e.what() << std::endl; + } + + Cube outCube(outCubeFileName); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 126); + ASSERT_EQ((int)dimensions["Lines"], 126); + ASSERT_EQ((int)dimensions["Bands"], 3); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Red"); + ASSERT_EQ(bandbin["Name"][1].toStdString(), "Green"); + ASSERT_EQ(bandbin["Name"][2].toStdString(), "Blue"); + + std::unique_ptr hist (outCube.histogram()); + + ASSERT_NEAR(hist->Average(), 113.12452758881331, .00001); + ASSERT_EQ(hist->Sum(), 1795965); + ASSERT_EQ(hist->ValidPixels(), 15876); + ASSERT_NEAR(hist->StandardDeviation(), 97.354405991298336, .0001); +} + diff --git a/isis/tests/ImageImporterTests.cpp b/isis/tests/ImageImporterTests.cpp new file mode 100644 index 0000000000..1fb43861b6 --- /dev/null +++ b/isis/tests/ImageImporterTests.cpp @@ -0,0 +1,120 @@ +#include +#include +#include + +#include "Cube.h" +#include "Fixtures.h" +#include "TestUtilities.h" +#include "ImageImporter.h" +#include "Histogram.h" + +#include "gmock/gmock.h" + +using namespace Isis; + +// Expected fail on MacOS +TEST_F(TempTestingFiles, DISABLED_UnitTestImageImporterTestJpeg) { + FileName inputName("data/stdFormatImages/rgb.jpg"); + + ImageImporter *importer = ImageImporter::fromFileName(inputName); + FileName outputName(tempDir.path() + "/out.cub"); + importer->import(outputName); + delete importer; + + Cube outCube(outputName.expanded()); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 126); + ASSERT_EQ((int)dimensions["Lines"], 126); + ASSERT_EQ((int)dimensions["Bands"], 3); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Red"); + ASSERT_EQ(bandbin["Name"][1].toStdString(), "Green"); + ASSERT_EQ(bandbin["Name"][2].toStdString(), "Blue"); + + std::unique_ptr hist (outCube.histogram()); + ASSERT_NEAR(hist->Average(), 113.11904761904762, .00001); + ASSERT_EQ(hist->Sum(), 1795878); + ASSERT_EQ(hist->ValidPixels(), 15876); + ASSERT_NEAR(hist->StandardDeviation(), 97.569786532996, .0001); +} + + +TEST_F(TempTestingFiles, UnitTestImageImporterStd2IsisTiffRgb) { + FileName inputName("data/stdFormatImages/rgb.tif"); + + ImageImporter *importer = ImageImporter::fromFileName(inputName); + FileName outputName(tempDir.path() + "/out.cub"); + importer->import(outputName); + delete importer; + + Cube outCube(outputName.expanded()); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 256); + ASSERT_EQ((int)dimensions["Lines"], 192); + ASSERT_EQ((int)dimensions["Bands"], 3); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Red"); + ASSERT_EQ(bandbin["Name"][1].toStdString(), "Green"); + ASSERT_EQ(bandbin["Name"][2].toStdString(), "Blue"); + + std::unique_ptr hist (outCube.histogram()); + ASSERT_NEAR(hist->Average(), 88.4844970703125, .00001); + ASSERT_EQ(hist->Sum(), 4349190); + ASSERT_EQ(hist->ValidPixels(), 49152); + ASSERT_NEAR(hist->StandardDeviation(), 64.032045970490174, .0001); +} + + +TEST_F(TempTestingFiles, UnitTestImageImporterStd2IsisJp2) { + FileName inputName("data/stdFormatImages/rgb.jp2"); + + ImageImporter *importer = ImageImporter::fromFileName(inputName); + FileName outputName(tempDir.path() + "/out.cub"); + importer->import(outputName); + delete importer; + + Cube outCube(outputName.expanded()); + Pvl *outLabel = outCube.label(); + + PvlGroup dimensions = outLabel->findGroup("Dimensions", Pvl::Traverse); + ASSERT_EQ((int)dimensions["Samples"], 126); + ASSERT_EQ((int)dimensions["Lines"], 126); + ASSERT_EQ((int)dimensions["Bands"], 3); + + PvlGroup pixels = outLabel->findGroup("Pixels", Pvl::Traverse); + ASSERT_EQ(pixels["Type"][0].toStdString(), "Real"); + ASSERT_EQ(pixels["ByteOrder"][0].toStdString(), "Lsb"); + ASSERT_EQ((double)pixels["Base"], 0.0); + ASSERT_EQ((double)pixels["Multiplier"], 1.0); + + PvlGroup bandbin = outLabel->findGroup("BandBin", Pvl::Traverse); + ASSERT_EQ(bandbin["Name"][0].toStdString(), "Red"); + ASSERT_EQ(bandbin["Name"][1].toStdString(), "Green"); + ASSERT_EQ(bandbin["Name"][2].toStdString(), "Blue"); + + std::unique_ptr hist (outCube.histogram()); + + ASSERT_NEAR(hist->Average(), 113.12452758881331, .00001); + ASSERT_EQ(hist->Sum(), 1795965); + ASSERT_EQ(hist->ValidPixels(), 15876); + ASSERT_NEAR(hist->StandardDeviation(), 97.354405991298336, .0001); +} + diff --git a/isis/src/base/objs/ImageImporter/test.png b/isis/tests/data/stdFormatImages/grayscale.png similarity index 100% rename from isis/src/base/objs/ImageImporter/test.png rename to isis/tests/data/stdFormatImages/grayscale.png diff --git a/isis/tests/data/stdFormatImages/grayscale.tif b/isis/tests/data/stdFormatImages/grayscale.tif new file mode 100644 index 0000000000000000000000000000000000000000..2278aff182282077134d68ad95b6ae786ece74b1 GIT binary patch literal 1131 zcmZ8gJ#Q015S@u{5e<@!Zb1YJiwc2aoV#6mNmM&@Z!*bJshFc^n-Fo7#8C9Bs;FV`I_ceQ zNJpf2a#K_&6-iN4C>y+>mI2^!D=;a(ef^I*y2+0N)my5ncZ+BFL3@D}x1f%GgOWT{ z7Ww{1sUL9ma!Nz(NugAzpA%Wh5($(Pk|8Il$V*REGL|%_I@uJIwMz9;WYLR7l6oVc z?u0pJ;nZZ27o&kcb86ICEF~Bmg8NR2oLt@HHv1A=BdFo}6Hus@dbULH>4gj#iiwD= z#}V5=F~v+Ql7JGWh#F{t*h}Wr;Uq%_XL3rC#5>Lzlt<&vc+`N_84C&^BF^iGRl`M~ zQe!;~a*z)yeJw2piGmf26tCh+mJx~?c!Ez~IN4IHE``>eQCTpqqpm0GDq%4(V+El8 znKTfmy>E=gJKCbKqw*@H2oui9V!<2JkHlkU>)XTOut$6X+nwTzsFc$Ut!%Brl#v@# z*F6NQV|+CrruR6w#IJyNO1uMHD>1};uYw;Cy!0fjrV$3H+qlmUD;itDk5-s}AP{g}Pw literal 0 HcmV?d00001 diff --git a/isis/tests/data/stdFormatImages/rgb.jp2 b/isis/tests/data/stdFormatImages/rgb.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..1c48c8d8729585bf7e564a295691630832f7761c GIT binary patch literal 9416 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 literal 0 HcmV?d00001 diff --git a/isis/tests/data/stdFormatImages/rgb.jpg b/isis/tests/data/stdFormatImages/rgb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d11f89165c2b79a5231e2857158ece1f5bcce775 GIT binary patch literal 8375 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