/*************************************************************************** * test_GSupport.cpp - test support module * * ----------------------------------------------------------------------- * * copyright (C) 2010-2016 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ /** * @file test_GSupport.cpp * @brief Testing of support module * @author Juergen Knoedlseder */ /* __ Includes ___________________________________________________________ */ #ifdef HAVE_CONFIG_H #include #endif #include // getenv #include #include "GTools.hpp" #include "test_GSupport.hpp" /* __ Namespaces _________________________________________________________ */ /* __ Globals ____________________________________________________________ */ /* __ Debug definitions __________________________________________________ */ /* __ Constants __________________________________________________________ */ const std::string datadir = std::getenv("TEST_DATA"); const std::string csv_file = datadir + "/csv.dat"; /***********************************************************************//** * @brief Set parameters and tests ***************************************************************************/ void TestGSupport::set(void){ // Set test name name("GSupport"); // Append tests append(static_cast(&TestGSupport::test_tools), "Test GTools"); append(static_cast(&TestGSupport::test_expand_env), "Test Environment variable"); append(static_cast(&TestGSupport::test_node_array), "Test GNodeArray"); append(static_cast(&TestGSupport::test_bilinear), "Test GBilinear"); append(static_cast(&TestGSupport::test_url_file), "Test GUrlFile"); append(static_cast(&TestGSupport::test_url_string), "Test GUrlString"); append(static_cast(&TestGSupport::test_filename), "Test GFilename"); append(static_cast(&TestGSupport::test_csv), "Test GCsv"); // Return return; } /***********************************************************************//** * @brief Clone test suite * * @return Pointer to deep copy of test suite. ***************************************************************************/ TestGSupport* TestGSupport::clone(void) const { // Clone test suite return new TestGSupport(*this); } /***********************************************************************//** * @brief Test GTools * * Test the GTools functions ***************************************************************************/ void TestGSupport::test_tools(void) { // Strip whitespace test_value(gammalib::strip_whitespace(" World "), "World"); test_value(gammalib::strip_whitespace("World "), "World"); test_value(gammalib::strip_whitespace(" World"), "World"); // Strip characters test_value(gammalib::strip_chars("xxWorldyy", "xy"), "World"); test_value(gammalib::strip_chars("Worldxy", "xy"), "World"); test_value(gammalib::strip_chars("xxWorld", "x"), "World"); // Right strip characters test_value(gammalib::rstrip_chars("xxWorldyy", "xy"), "xxWorld"); test_value(gammalib::rstrip_chars("Worldxy", "xy"), "World"); test_value(gammalib::rstrip_chars("xxWorld", "x"), "xxWorld"); test_value(gammalib::rstrip_chars("0.0012300", "0"), "0.00123"); // Test noun number conversion test_value(gammalib::number("World", 0), "Worlds"); test_value(gammalib::number("World", 1), "World"); test_value(gammalib::number("World", 2), "Worlds"); // Test XML to string conversion std::string s_in = "Hallo World, you \"are\" my 'nice' & place"; std::string s_ref = "Hallo World, you "are" my 'nice'" " <planet> & place"; std::string s_out; s_out = gammalib::str2xml(s_in); test_value(s_out, s_ref); s_out = gammalib::xml2str(s_out); test_value(s_out, s_in); // Test power law flux computations test_value(gammalib::plaw_energy_flux(2.0, 3.0, 2.5, -1.0), 2.5); test_value(gammalib::plaw_energy_flux(2.0, 3.0, 2.5, -2.5), 2.56453824468); test_value(gammalib::plaw_photon_flux(2.0, 3.0, 2.5, -1.0), 1.01366277027); test_value(gammalib::plaw_photon_flux(2.0, 3.0, 2.5, -2.5), 1.06136118604); // Create vector of strings std::vector strings; strings.push_back("This"); strings.push_back("is"); strings.push_back("a"); strings.push_back("vector"); test_assert(gammalib::contains(strings, "a"), "\"a\" in vector"); test_assert(gammalib::contains(strings, "vector"), "\"vector\" in vector"); test_assert(!gammalib::contains(strings, "b"), "\"b\" not in vector"); test_assert(!gammalib::contains(strings, "isavector"), "\"isavector\" not in vector"); // Return return; } /***********************************************************************//** * @brief Test expand_env function * * Test the environment variable expansion function. ***************************************************************************/ void TestGSupport::test_expand_env(void) { // Declare strings that we use during the tests std::string s_in; std::string s_ref; std::string s_out; // Test 1: no environment variable s_in = "This string has no environment variable."; s_ref = s_in; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"no environment variable", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Get home environment variable std::string home(std::getenv("HOME")); // $ENV{HOME} environment variable within string s_in = "My $ENV{HOME} is my castle."; s_ref = "My "+home+" is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"$ENV{HOME} environment variable within string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // ${HOME} environment variable within string s_in = "My ${HOME} is my castle."; s_ref = "My "+home+" is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"${HOME} environment variable within string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // $HOME/path environment variable within string s_in = "My $HOME/path is my castle."; s_ref = "My "+home+"/path is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"$HOME/path environment variable within string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // $HOME environment variable at end of string s_in = "My $HOME"; s_ref = "My "+home; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"$HOME environment variable at end of string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Environment variable within single quotes s_in = "My '$(HOME)' is my castle."; s_ref = s_in; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"Environment variable within single quotes", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Environment variable within double quotes s_in = "My \"$(HOME)\" is my castle."; s_ref = "My \""+home+"\" is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"Environment variable within double quotes", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Non existing environment variable within string s_in = "My $(HOMEIXYZ) is my castle."; s_ref = "My $(HOMEIXYZ) is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"Non existing environment variable within string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Empty environment variable within string s_in = "My $() is my castle."; s_ref = "My $() is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"Empty environment variable within string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Two successive environment variables within string s_in = "My $(HOME)$ENV{HOME} is my castle."; s_ref = "My "+home+home+" is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"Two successive environment variables within string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // $(HOME) at beginning of string s_in = "$(HOME) is my castle."; s_ref = home+" is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"$(HOME) at beginning of string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // $ENV(HOME) at beginning of string s_in = "$ENV(HOME) is my castle."; s_ref = home+" is my castle."; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"$ENV(HOME) at beginning of string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // $(HOME) at end of string s_in = "My castle is $(HOME)"; s_ref = "My castle is "+home; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"$(HOME) at end of string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // $ENV{HOME}${HOME}$ENV(HOME)$(HOME) only string s_in = "$ENV{HOME}${HOME}$ENV(HOME)$(HOME)"; s_ref = home+home+home+home; s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"$ENV{HOME}${HOME}$ENV(HOME)$(HOME) only string", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Test ~ s_in = "My castle is ~"; s_ref = gammalib::expand_env("My castle is $(HOME)"); s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"String with ~", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Test ~+ s_in = "My castle is ~+"; s_ref = gammalib::expand_env("My castle is $(PWD)"); s_out = gammalib::expand_env(s_in); test_assert(s_out == s_ref,"String with ~+", "Unexpected string \""+s_out+"\" (expected \""+s_ref+"\")"); // Exit test return; } /***********************************************************************//** * @brief Test GNodeArray class * * Test the GNodeArray class. ***************************************************************************/ void TestGSupport::test_node_array(void) { // Test void constructor test_try("Void constructor"); try { GNodeArray array; test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test copy constructor test_try("Copy constructor"); try { GNodeArray array; GNodeArray array2(array); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test array constructor test_try("Array constructor"); try { double array[] = {0.0, 1.0, 2.0, 3.0, 5.0}; GNodeArray array2(5, array); test_try_success(); for (int i = 0; i < 5; ++i) { test_value(array2[i], array[i]); } } catch (std::exception &e) { test_try_failure(e); } // Test GVector constructor test_try("GVector constructor"); try { double array[] = {0.0, 1.0, 2.0, 3.0, 5.0}; GVector vector(5); for (int i = 0; i < 5; ++i) { vector[i] = array[i]; } GNodeArray array2(vector); test_try_success(); for (int i = 0; i < 5; ++i) { test_value(array2[i], vector[i]); } } catch (std::exception &e) { test_try_failure(e); } // Test std::vector constructor test_try("std::vector constructor"); try { double array[] = {0.0, 1.0, 2.0, 3.0, 5.0}; std::vector vector; for (int i = 0; i < 5; ++i) { vector.push_back(array[i]); } GNodeArray array2(vector); test_try_success(); for (int i = 0; i < 5; ++i) { test_value(array2[i], vector[i]); } } catch (std::exception &e) { test_try_failure(e); } // Test container manipulation test_try("Container manipulation"); try { GNodeArray array; test_assert(array.is_empty(), "Node array should be empty"); array.append(0.0); test_assert(!array.is_empty(), "Node array should not be empty"); test_value(array.size(), 1); array.append(1.0); array.append(2.0); array.append(3.0); array.append(5.0); test_value(array.size(), 5); array.insert(4, 4.0); test_value(array.size(), 6); for (int i = 0; i < array.size(); ++i) { test_value(array[i], double(i)); // 0, 1, 2, 3, 4, 5 } array.remove(1); array.remove(2); array.remove(3); test_value(array.size(), 3); for (int i = 0; i < array.size(); ++i) { test_value(array[i], double(2*i)); // 0, 2, 4 } GNodeArray array2; array2.append(6.0); array2.append(8.0); test_value(array2.size(), 2); array.extend(array2); test_value(array.size(), 5); for (int i = 0; i < array.size(); ++i) { test_value(array[i], double(2*i)); // 0, 2, 4, 6, 8 } test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test linear interpolation double array_lin[] = {-1.0, 0.0, 1.0}; test_node_array_interpolation(3, array_lin); // Test non-linear interpolation double array_nonlin[] = {-1.3, 0.0, 1.7}; test_node_array_interpolation(3, array_nonlin); // Test node array change using access operator[] GNodeArray nodes; nodes.append(1.0); nodes.append(2.0); nodes.append(3.0); nodes.set_value(2.5); test_value(nodes.inx_left(), 1, "Expected node 1"); test_value(nodes.inx_right(), 2, "Expected node 2"); test_value(nodes.wgt_left(), 0.5, 1.0e-6, "Expected weight 0.5"); test_value(nodes.wgt_right(), 0.5, 1.0e-6, "Expected weight 0.5"); nodes[1] = 3.0; nodes[2] = 4.0; nodes.set_value(2.5); test_value(nodes.inx_left(), 0, "Expected node 0"); test_value(nodes.inx_right(), 1, "Expected node 1"); test_value(nodes.wgt_left(), 0.25, 1.0e-6, "Expected weight 0.25"); test_value(nodes.wgt_right(), 0.75, 1.0e-6, "Expected weight 0.75"); // Remove test file GFilename filename("test_nodes.fits"); filename.remove(); // Check saving nodes.save("test_nodes.fits"); GNodeArray load1("test_nodes.fits"); test_value(load1.size(), 3, "GNodeArray should have 3 nodes."); test_value(load1[0], 1.0, 1.0e-7, "First node should be 1."); test_value(load1[1], 3.0, 1.0e-7, "First node should be 3."); test_value(load1[2], 4.0, 1.0e-7, "First node should be 4."); // Check saving in a different extnsion nodes.append(10.0); nodes.append(11.0); nodes.save("test_nodes.fits[NODE ARRAY]", true); GNodeArray load2("test_nodes.fits[NODE ARRAY]"); test_value(load2.size(), 5, "GNodeArray should have 5 nodes."); test_value(load2[0], 1.0, 1.0e-7, "First node should be 1."); test_value(load2[1], 3.0, 1.0e-7, "First node should be 3."); test_value(load2[2], 4.0, 1.0e-7, "First node should be 4."); test_value(load2[3], 10.0, 1.0e-7, "First node should be 10."); test_value(load2[4], 11.0, 1.0e-7, "First node should be 11."); // Return return; } /***********************************************************************//** * @brief Test GNodeArray class interpolation * * @param[in] num Number of nodes. * @param[in] nodes Nodes. * * Test the GNodeArray class interpolation method by comparing the * interpolation results for a linear function to the expected result. ***************************************************************************/ void TestGSupport::test_node_array_interpolation(const int& num, const double* nodes) { // Setup function parameters const double slope = 3.1; const double offset = 7.9; // Initialise node array GNodeArray array(num, nodes); // Setup node values std::vector values; for (int i = 0; i < 3; ++i) { values.push_back(nodes[i] * slope + offset); } // Test values for (double value = -2.0; value <= +2.0; value += 0.2) { double expected = value * slope + offset; double result = array.interpolate(value, values); test_value(result, expected); } // Return return; } /***********************************************************************//** * @brief Test GBilinear class * * Test the GBilinear class. ***************************************************************************/ void TestGSupport::test_bilinear(void) { // Test constructor GBilinear interpolator; // Test value setting and retrieving interpolator.index1() = 1; interpolator.index2() = 2; interpolator.index3() = 3; interpolator.index4() = 4; interpolator.weight1() = 1.0; interpolator.weight2() = 2.0; interpolator.weight3() = 3.0; interpolator.weight4() = 4.0; test_value(interpolator.index1(), 1); test_value(interpolator.index2(), 2); test_value(interpolator.index3(), 3); test_value(interpolator.index4(), 4); test_value(interpolator.weight1(), 1.0); test_value(interpolator.weight2(), 2.0); test_value(interpolator.weight3(), 3.0); test_value(interpolator.weight4(), 4.0); // Test copy constructor GBilinear interpolator2(interpolator); test_value(interpolator2.index1(), 1); test_value(interpolator2.index2(), 2); test_value(interpolator2.index3(), 3); test_value(interpolator2.index4(), 4); test_value(interpolator2.weight1(), 1.0); test_value(interpolator2.weight2(), 2.0); test_value(interpolator2.weight3(), 3.0); test_value(interpolator2.weight4(), 4.0); // Test interpolator double array[5] = {1.0, 2.0, 3.0, 4.0, 5.0}; double reference = 1.0 * array[1] + 2.0 * array[2] + 3.0 * array[3] + 4.0 * array[4]; test_value(interpolator(array), reference); test_value(interpolator2(array), reference); // Return return; } /***********************************************************************//** * @brief Test GUrlFile class * * Test the GUrlFile class. ***************************************************************************/ void TestGSupport::test_url_file(void) { // Test void constructor test_try("Void constructor"); try { GUrlFile url; test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test open constructor test_try("Open constructor"); try { GUrlFile url("test_url.dat", "w"); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test file writing GUrlFile url("test_url.dat", "w"); test_value(url.write("abcd", 4), 4); url.put_char('e'); url.printf("fghi%s%d%3.1fxyz", "jklm", 41, 9.9); url.close(); // Test file reading using read() method char buffer[100]; url.open("test_url.dat", "r"); test_value(url.read(buffer, 99), 21); std::string result = std::string(buffer, 21); test_assert(result.compare("abcdefghijklm419.9xyz") == 0, "Expected \"abcdefghijklm419.9xyz\" in file, found \""+ result+"\""); url.close(); // Test file reading using get_char() method result.clear(); url.open("test_url.dat", "r"); int character = 0; do { character = url.get_char(); if (character != EOF) { char c = (char)character; result.append(1, c); } } while (character != EOF); test_assert(result.compare("abcdefghijklm419.9xyz") == 0, "Expected \"abcdefghijklm419.9xyz\" in file, found \""+ result+"\""); url.close(); // Test file reading using scanf() method result.clear(); url.open("test_url.dat", "r"); url.scanf("%99s", buffer); result = std::string(buffer, 21); test_assert(result.compare("abcdefghijklm419.9xyz") == 0, "Expected \"abcdefghijklm419.9xyz\" in file, found \""+ result+"\""); url.close(); // Return return; } /***********************************************************************//** * @brief Test GUrlString class * * Test the GUrlString class. ***************************************************************************/ void TestGSupport::test_url_string(void) { // Test void constructor test_try("Void constructor"); try { GUrlString url; test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test open constructor test_try("Open constructor"); try { GUrlString url("My nice text string"); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test string writing GUrlString url; test_value(url.write("abcd", 4), 4); url.put_char('e'); url.printf("fghi%s%d%3.1fxyz", "jklm", 41, 9.9); // Test string reading using read() method char buffer[100]; url.rewind(); test_value(url.read(buffer, 99), 21); std::string result = std::string(buffer, 21); test_assert(result.compare("abcdefghijklm419.9xyz") == 0, "Expected \"abcdefghijklm419.9xyz\" in file, found \""+ result+"\""); // Test string reading using get_char() method result.clear(); url.rewind(); int character = 0; do { character = url.get_char(); if (character != EOF) { char c = (char)character; result.append(1, c); } } while (character != EOF); test_assert(result.compare("abcdefghijklm419.9xyz") == 0, "Expected \"abcdefghijklm419.9xyz\" in file, found \""+ result+"\""); // Test string reading using scanf() method char buffer2[100]; result.clear(); url.rewind(); url.scanf("%99s", buffer2); result = std::string(buffer2, 21); test_assert(result.compare("abcdefghijklm419.9xyz") == 0, "Expected \"abcdefghijklm419.9xyz\" in file, found \""+ result+"\""); url.close(); // Return return; } /***********************************************************************//** * @brief Test GFilename class * * Test the GFilename class. ***************************************************************************/ void TestGSupport::test_filename(void) { // Test void constructor test_try("Void constructor"); try { GFilename filename; test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Set filename without extension GFilename filename = "myfile.fits"; test_assert(filename.url() == "myfile.fits", "Expected \"myfile.fits\" filename, " "found \""+filename.url()+"\""); test_assert(!filename.has_extname(), "Expected that extension name is not set."); // Set filename with extension name filename = "myfile.fits[EVENTS]"; test_assert(filename.url() == "myfile.fits", "Expected \"myfile.fits\" filename, " "found \""+filename.url()+"\""); test_assert(filename.extname() == "EVENTS", "Expected \"EVENTS\" extension name, " "found \""+filename.extname()+"\""); test_assert(filename.has_extname(), "Expected that extension name is set."); // Set filename with extension name and version filename = "myfile.fits[EVENTS,2]"; test_assert(filename.url() == "myfile.fits", "Expected \"myfile.fits\" filename, " "found \""+filename.url()+"\""); test_assert(filename.extname() == "EVENTS", "Expected \"EVENTS\" extension name, " "found \""+filename.extname()+"\""); test_assert(filename.has_extname(), "Expected that extension name is set."); test_value(filename.extver(), 2); test_assert(filename.has_extver(), "Expected that extension version is set."); // Set filename with lower case extension name filename = "myfile.fits[events]"; test_assert(filename.extname() == "EVENTS", "Expected \"EVENTS\" extension name, " "found \""+filename.extname()+"\""); // Set filename with number in extension name filename = "myfile.fits[EVENTS_2D]"; test_assert(filename.extname() == "EVENTS_2D", "Expected \"EVENTS_2D\" extension name, " "found \""+filename.extname()+"\""); // Set filename with extension number and version filename = "myfile.fits[1,2]"; test_assert(filename.url() == "myfile.fits", "Expected \"myfile.fits\" filename, " "found \""+filename.url()+"\""); test_value(filename.extno(), 1); test_assert(filename.has_extno(), "Expected that extension number is set."); test_value(filename.extver(), 2); test_assert(filename.has_extver(), "Expected that extension version is set."); // Set filename with extension name and expression filename = "myfile.fits[EVENTS][ENERGY>0.1]"; test_assert(filename.url() == "myfile.fits", "Expected \"myfile.fits\" filename, " "found \""+filename.url()+"\""); test_assert(filename.extname() == "EVENTS", "Expected \"EVENTS\" extension name, " "found \""+filename.extname()+"\""); test_assert(filename.expression() == "ENERGY>0.1", "Expected \"EVENTS>0.1\" expression, " "found \""+filename.expression()+"\""); // Test missing closing symbol test_try("Missing ] symbol"); try { GFilename filename("myfile.fits["); test_try_failure(); } catch (GException::invalid_argument &e) { test_try_success(); } // Test character after closing symbol test_try("Character after ] symbol"); try { GFilename filename("myfile.fits[EVENTS]a"); test_try_failure(); } catch (GException::invalid_argument &e) { test_try_success(); } // Test character after closing symbol test_try("Character after ] symbol after expression"); try { GFilename filename("myfile.fits[EVENTS][ENERGY>0.1]a"); test_try_failure(); } catch (GException::invalid_argument &e) { test_try_success(); } // Test empty extension name test_try("Empty extension name"); try { GFilename filename("myfile.fits[]"); test_try_failure(); } catch (GException::invalid_argument &e) { test_try_success(); } // Test invalid extension number test_try("Invalid extension number"); try { GFilename filename("myfile.fits[-1]"); test_try_failure(); } catch (GException::invalid_argument &e) { test_try_success(); } // Test missing extension version test_try("Missing extension version"); try { GFilename filename("myfile.fits[EVENTS,]"); test_try_failure(); } catch (GException::invalid_argument &e) { test_try_success(); } // Test invalid extension version test_try("Invalid extension version"); try { GFilename filename("myfile.fits[EVENTS,-1]"); test_try_failure(); } catch (GException::invalid_argument &e) { test_try_success(); } // Test size operators filename = "myfile.fits"; test_assert(!filename.is_empty(), "Non empty file name expected."); test_value(filename.length(), 11); // Test default extension name filename = "myfile.fits"; test_assert(filename.extname("EVENTS") == "EVENTS", "Expected \"EVENTS\" extension name, " "found \""+filename.extname()+"\""); filename = "myfile.fits[LUCKY]"; test_assert(filename.extname("EVENTS") == "LUCKY", "Expected \"LUCKY\" extension name, " "found \""+filename.extname()+"\""); // Test default extension number filename = "myfile.fits"; test_value(filename.extno(1), 1); filename = "myfile.fits[3]"; test_value(filename.extno(1), 3); // Test default extension version filename = "myfile.fits"; test_value(filename.extver(1), 1); filename = "myfile.fits[3,3]"; test_value(filename.extver(1), 3); // Return return; } /***********************************************************************//** * @brief Test GCsv class * * Test the GCsv class. ***************************************************************************/ void TestGSupport::test_csv(void) { // Test void constructor GCsv csv1; test_value(csv1.size(), 0); test_value(csv1.ncols(), 0); test_value(csv1.nrows(), 0); // Test rows and columns constructor GCsv csv2(3,4); test_value(csv2.size(), 12); test_value(csv2.ncols(), 4); test_value(csv2.nrows(), 3); // Test filename constructor GCsv csv3(csv_file, ","); test_value(csv3.size(), 12); test_value(csv3.ncols(), 3); test_value(csv3.nrows(), 4); // Test copy constructor GCsv csv4(csv3); test_value(csv3.size(), 12); test_value(csv3.ncols(), 3); test_value(csv3.nrows(), 4); // Test clear method csv4.clear(); test_value(csv4.size(), 0); test_value(csv4.ncols(), 0); test_value(csv4.nrows(), 0); // Test clone method GCsv* csv5 = csv3.clone(); test_value(csv5->size(), 12); test_value(csv5->ncols(), 3); test_value(csv5->nrows(), 4); // Test append method std::vector row1; std::vector row2; row1.push_back("ra"); row1.push_back("dec"); row1.push_back("durations"); row2.push_back("10.0"); row2.push_back("-10.0"); row2.push_back("1000.0"); csv4.append(row1); csv4.append(row2); test_value(csv4.size(), 6); test_value(csv4.ncols(), 3); test_value(csv4.nrows(), 2); // Test operator access method test_value(csv4(0,0), "ra"); test_value(csv4(0,1), "dec"); test_value(csv4(0,2), "durations"); test_value(csv4(1,0), "10.0"); test_value(csv4(1,1), "-10.0"); test_value(csv4(1,2), "1000.0"); // Test access methods test_value(csv4.string(1,0), "10.0"); test_value(csv4.real(1,0), 10.0); test_value(csv4.integer(1,0), 10); // Test set methods csv4.string(1,0,"11.0"); test_value(csv4.string(1,0), "11.0"); csv4.real(1,0, 12.0); test_value(csv4.real(1,0), 12.0); csv4.integer(1,0, 13); test_value(csv4.integer(1,0), 13); // Test save method (make sure that former result is overwritten) csv4.save("test_csv.dat", ",", true); // Test load method GCsv csv6; csv6.load("test_csv.dat", ","); test_value(csv6.size(), 6); test_value(csv6.ncols(), 3); test_value(csv6.nrows(), 2); test_value(csv6(0,0), "ra"); test_value(csv6(0,1), "dec"); test_value(csv6(0,2), "durations"); test_value(csv6(1,0), "13"); test_value(csv6(1,1), "-10.0"); test_value(csv6(1,2), "1000.0"); // Return return; } /***********************************************************************//** * @brief Main test entry point ***************************************************************************/ int main(void) { // Allocate test suite container GTestSuites testsuites("Support module"); // Initially assume that we pass all tests bool success = true; // Create and append test suite TestGSupport test; // Append test to the container testsuites.append(test); // Run the testsuites success = testsuites.run(); // Save test report testsuites.save("reports/GSupport.xml"); // Return success status return (success ? 0 : 1); }