diff --git a/isis/tests/TestUtilities.cpp b/isis/tests/TestUtilities.cpp index c664a92ed84c4ae50b823a22dbcb6c13b322460f..58c740331d5fadb14989474b7c71fb6a6ceff41b 100644 --- a/isis/tests/TestUtilities.cpp +++ b/isis/tests/TestUtilities.cpp @@ -342,7 +342,7 @@ namespace Isis { // Check to see if a QString contains only numeric values. bool isNumeric(QString str){ - QRegExp re("-*\\d*.*\\d*"); + QRegExp re("^(?:[+-]?(?:\\d+|\\d*\\.(?=\\d)\\d*)(?:[eE][+-]?\\d+)?)$"); return re.exactMatch(str); } @@ -351,11 +351,11 @@ namespace Isis { void compareCsvLine(CSVReader::CSVAxis csvLine, QString headerStr, int initialIndex) { QStringList compareMe = headerStr.split(","); for (int i=initialIndex; i<compareMe.size(); i++) { - if (isNumeric(compareMe[i].trimmed())) { + if (isNumeric(compareMe[i].trimmed()) && isNumeric(QString(csvLine[i].trimmed()))) { EXPECT_NEAR(csvLine[i].toDouble(), compareMe[i].toDouble(), 0.000001); } else{ - EXPECT_EQ(QString(csvLine[i]).toStdString(), compareMe[i].toStdString()); + EXPECT_EQ(QString(csvLine[i].trimmed()).toStdString(), compareMe[i].trimmed().toStdString()); } } }; @@ -365,11 +365,11 @@ namespace Isis { void compareCsvLine(CSVReader::CSVAxis csvLine, CSVReader::CSVAxis csvLine2, int initialIndex, double tolerance) { for (int i=initialIndex; i < csvLine.dim(); i++) { - if (isNumeric(QString(csvLine[i].trimmed()))) { + if (isNumeric(QString(csvLine[i].trimmed())) && isNumeric(QString(csvLine2[i].trimmed()))) { EXPECT_NEAR(csvLine[i].toDouble(), csvLine2[i].toDouble(), tolerance); } else{ - EXPECT_EQ(QString(csvLine[i]).toStdString(), csvLine2[i].toStdString()); + EXPECT_EQ(QString(csvLine[i].trimmed()).toStdString(), csvLine2[i].trimmed().toStdString()); } } }; diff --git a/isis/tests/TestUtilitiesTests.cpp b/isis/tests/TestUtilitiesTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4f3558c668a612bb87151be544b39f3ab48341b5 --- /dev/null +++ b/isis/tests/TestUtilitiesTests.cpp @@ -0,0 +1,137 @@ +#include "TestUtilities.h" +#include "gmock/gmock.h" +#include "gtest/gtest-spi.h" + +using namespace Isis; +using namespace testing; + +TEST(TestUtilities, IsNumeric) { + EXPECT_TRUE(isNumeric("0") ); + EXPECT_TRUE(isNumeric("1") ); + EXPECT_TRUE(isNumeric("3.14") ); + EXPECT_TRUE(isNumeric("347") ); + EXPECT_TRUE(isNumeric("194602754") ); + EXPECT_TRUE(isNumeric("-3") ); + EXPECT_TRUE(isNumeric("-4867") ); + EXPECT_TRUE(isNumeric("5e7") ); // sci notation + EXPECT_TRUE(isNumeric("3.875e18") ); // sci notation + EXPECT_TRUE(isNumeric("-4.55") ); + EXPECT_TRUE(isNumeric("34564.488564")); + EXPECT_TRUE(isNumeric(".99431") ); + + EXPECT_FALSE(isNumeric("abcdef") ); // alphabet (hex) + EXPECT_FALSE(isNumeric("kittenrainbowmagic")); // alphabet + EXPECT_FALSE(isNumeric("13466-234") ); // hyphen + EXPECT_FALSE(isNumeric("e34e") ); // Wrong e's + EXPECT_FALSE(isNumeric("e3") ); + EXPECT_FALSE(isNumeric("5.4e") ); + EXPECT_FALSE(isNumeric("Hello World") ); // Words + EXPECT_FALSE(isNumeric("123 4 56") ); // Spaces + EXPECT_FALSE(isNumeric("45..54") ); // Double Decimal + EXPECT_FALSE(isNumeric("321.") ); // Decimal Point with no digits + EXPECT_FALSE(isNumeric("22/7") ); // Fractional Pi + EXPECT_FALSE(isNumeric("2024.07.31") ); // Decimal Date + EXPECT_FALSE(isNumeric("2/3/2007") ); // Date + EXPECT_FALSE(isNumeric("6A1F") ); // Hexadecimal + EXPECT_FALSE(isNumeric("89-e3") ); +} + +TEST(TestUtilities, CompareCsvLine) { + CSVReader csv = CSVReader("data/testUtilities/testcsv1.csv", + false, 0, ',', false, true); + CSVReader::CSVAxis csvLine; + CSVReader::CSVAxis csvLine2; + + + // Sample line with many words + csvLine = csv.getRow(0); + compareCsvLine(csvLine, "3-d,3-d,3-d,Sigma,Sigma,Sigma,Correction,Correction,Correction,Coordinate,Coordinate,Coordinate"); + + EXPECT_NONFATAL_FAILURE({ + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "3-c,3-e,3-f,Sigma,Alpha,Sigma,Correction,Correction,Correction,Coordinate,Coordinate,Coordinate"), ""); + }, "Actual: 4"); // need double-layer expect for more than one expected failure with "Actual: 3" for 3 failures. + + + // Test for Near doubles, csv file has 3.141592653589793. Default tolerance 0.000001 + csvLine = csv.getRow(1); + compareCsvLine(csvLine, "Near Doubles, 3.1415926535898"); + compareCsvLine(csvLine, "Near Doubles, 3.141593"); + + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Near Doubles, 3.14159"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Near Doubles, 3.141591"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Near Doubles, Pi"), ""); + + + // Scientific Notation (csv has sci notation) + csvLine = csv.getRow(2); + compareCsvLine(csvLine, "Sci Notation, 4.78e3"); + compareCsvLine(csvLine, "Sci Notation, 4780"); + + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Sci Notation, 478"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Sci Notation, 4783"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Sci Notation, Text"), ""); + + + // Scientific Notation (csv has standard notation) + csvLine = csv.getRow(3); + compareCsvLine(csvLine, "Sci Notation, 4.78e3"); + compareCsvLine(csvLine, "Sci Notation, 4780"); + + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Sci Notation, 478"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Sci Notation, 4783"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Sci Notation, Text"), ""); + + // Compare only second cell and onward + compareCsvLine(csvLine, "Pie Notation, 4780", 1); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Pie Notation, 4780"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Pie Notation, 4783", 1), ""); + + + // Text vs Numbers + csvLine = csv.getRow(4); + compareCsvLine(csvLine, "Zeroes and Strings, 0"); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "0, 0"), ""); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Zeroes and Strings, Zeroes and Strings"), ""); + + // Compare Multiple Lines + csvLine = csv.getRow(0); + csvLine2 = csv.getRow(5); + compareCsvLine(csvLine, csvLine2); + csvLine2 = csv.getRow(6); + + EXPECT_NONFATAL_FAILURE({ + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, csvLine2), ""); + }, "Actual: 6"); + + + // Sample line with lots of numbers + csvLine = csv.getRow(7); + compareCsvLine(csvLine, "AS15_000031957,FREE,3,0,0.33,24.25013429,6.15097050,1735.93990543,270.68671676,265.71819251,500.96944842,860.25781493,-1823.63228489,-677.74533463,1573.65050943,169.59077243,712.98695596"); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "AS15_000031957,FREE,3,0,0.33,24.25013429,6.15097050,1742.85730233,270.68671676,265.71819251,500.96944842,860.25781493,-1823.63228489,-677.74533463,1573.65050943,169.59077243,712.98695596"), ""); + + + // long numbers + csvLine = csv.getRow(8); + compareCsvLine(csvLine, "Long Numbers, 3.14159265358979323846264338327950288419716939937510"); + compareCsvLine(csvLine, "Long Numbers, 3.14159265358979323846264338327950288419716939937510e0"); + compareCsvLine(csvLine, "Long Numbers, 3.1415926535898"); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Long Numbers, 3.1417"), ""); + + + // plus and minus + csvLine = csv.getRow(9); + compareCsvLine(csvLine, "Plus and Minus, 0, -1, +302, 5.46e-3, -4.7e4, 3+4, 56-62, 89-e3"); + compareCsvLine(csvLine, "Plus and Minus, 0, -1, 302, .00546, -4.7e4, 3+4, 56-62, 89-e3"); + EXPECT_NONFATAL_FAILURE({ + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, "Plus and Minus, 0, -1, +302, 5.46e3, 4.7e4, 3+A, 56-62, 89-e3"), ""); + }, "Actual: 3"); + + + // very small + csvLine = csv.getRow(10); + csvLine2 = csv.getRow(11); + compareCsvLine(csvLine, "Very Small, 3.685e-38"); + compareCsvLine(csvLine, "Very Small, 4.152e-36"); + compareCsvLine(csvLine, csvLine, 1, 1e-42); + EXPECT_NONFATAL_FAILURE(compareCsvLine(csvLine, csvLine2, 1, 1e-39), ""); +} diff --git a/isis/tests/data/testUtilities/testcsv1.csv b/isis/tests/data/testUtilities/testcsv1.csv new file mode 100644 index 0000000000000000000000000000000000000000..620322ac4466892a8dcff950ead663e6ea08a3bc --- /dev/null +++ b/isis/tests/data/testUtilities/testcsv1.csv @@ -0,0 +1,12 @@ +3-d,3-d,3-d,Sigma,Sigma,Sigma,Correction,Correction,Correction,Coordinate,Coordinate,Coordinate +Near Doubles, 3.141592653589793 +Sci Notation, 4.78e3 +Sci Notation, 4780 +Zeroes and Strings, 0 +3-d,3-d,3-d,Sigma,Sigma,Sigma,Correction,Correction,Correction,Coordinate,Coordinate,Coordinate +3-d,3-d,3-d,Sigma,Sigma,Sigma,Coordinate,Coordinate,Coordinate,Correction,Correction,Correction +AS15_000031957,FREE,3,0,0.33,24.25013429,6.15097050,1735.93990543,270.68671676,265.71819251,500.96944842,860.25781493,-1823.63228489,-677.74533463,1573.65050943,169.59077243,712.98695596 +Long Numbers, 3.14159265358979323846264338327950288419716939937510 +Plus and Minus, 0, -1, +302, 5.46e-3, -4.7e4, 3+4, 56-62, 89-e3 +Very Small, 3.685e-38 +Very Small, 4.152e-36 \ No newline at end of file