Skip to content
Snippets Groups Projects
StringsTest.h 12.7 KiB
Newer Older
#ifndef MANTID_SUPPORTTEST_H_
#define MANTID_SUPPORTTEST_H_

#include <cxxtest/TestSuite.h>
Alex Buts's avatar
Alex Buts committed
#include <Poco/Path.h>
#include <string>

   \class StringsTest
   \brief test of Strings components
   \date September 2005
   \author S.Ansell
   Checks the basic string operations in Strings
  void test_replace()
  {
    std::string in = "hello\nI hate\nnewlines.\n";
    std::string out = replace(in, "\n", " ");
    TS_ASSERT_EQUALS(out, "hello I hate newlines. ");

    TS_ASSERT_EQUALS(replace("bla", "bla", ""), "");
    TS_ASSERT_EQUALS(replace("FirstSecond", "First", ""), "Second");
    TS_ASSERT_EQUALS(replace("FirstSecond", "Second", ""), "First");
    TS_ASSERT_EQUALS(replace("Hello You", " ", " I am stupid, "), "Hello I am stupid, You");
  }

  void test_replaceAll()
  {
    const std::string input = "Lots and lots of spaces in this sentence.";
    std::string out = replaceAll(input, " ", "_");
    std::string expected = "Lots_and_lots_of_spaces_in_this_sentence.";
    TS_ASSERT_EQUALS(out, expected);

    out = replaceAll(input, "L", "Lots and l");
    expected = "Lots and lots and lots of spaces in this sentence.";
    TS_ASSERT_EQUALS(out, expected);
  }

Alex Buts's avatar
Alex Buts committed
  void testSplitEmptyPath(){
      std::vector<std::string> result;
      TSM_ASSERT(" should return 0",!split_path("",result));	
      TSM_ASSERT(" final path should be emtpy",result.empty());
Alex Buts's avatar
Alex Buts committed
  }
  void testSplitRemoveSpaces(){
      std::vector<std::string> result;
      TSM_ASSERT_EQUALS(" should return 1",1,split_path("aaaa bbbb",result));	
      TSM_ASSERT_EQUALS("should replace spaces","aaaa_bbbb",result[0]);
Alex Buts's avatar
Alex Buts committed
  }
  void testSplitIn2(){
      std::vector<std::string> result;
      TSM_ASSERT_EQUALS("should split in 2",2,split_path("aaaa\\bbbbb",result));	
      TS_ASSERT_EQUALS("aaaa",result[0]);	
Alex Buts's avatar
Alex Buts committed
      TS_ASSERT_EQUALS("bbbbb",result[1]);	

  }
  void testSplitIn2IgnoreEdges(){
      std::vector<std::string> result;
      TSM_ASSERT_EQUALS("should split in 2",2,split_path("/aaaa\\bbbbb/",result));	
      TS_ASSERT_EQUALS("aaaa",result[0]);	
Alex Buts's avatar
Alex Buts committed
      TS_ASSERT_EQUALS("bbbbb",result[1]);	

  }
  void testSplitIn3IgnoreEdgesDelete1(){
      std::vector<std::string> result;
      TSM_ASSERT_EQUALS("should split in 2",2,split_path("/aaaa\\bbbbb/./cccccc/../",result));	
      TS_ASSERT_EQUALS("aaaa",result[0]);	
Alex Buts's avatar
Alex Buts committed
      TS_ASSERT_EQUALS("bbbbb",result[1]);	

  }
  void testSplitIn3IgnoreEdgesDelete1b(){
      std::vector<std::string> result;
      TSM_ASSERT_EQUALS("should split in 3",3,split_path("/aaaa\\bbbbb/./cccccc/../ee",result));	
      TS_ASSERT_EQUALS("aaaa",result[0]);	
Alex Buts's avatar
Alex Buts committed
      TS_ASSERT_EQUALS("bbbbb",result[1]);	
      TS_ASSERT_EQUALS("ee",result[2]);	

  }
  void testSplitExpandFullPath(){
      Poco::Path test;
      test = test.absolute();
      std::string wkPath = test.toString();
      std::vector<std::string> base;
      size_t depth= split_path(wkPath,base);

      std::vector<std::string> result;
      TS_ASSERT_EQUALS(depth+2,split_path("./aaaa\\bbbbb/./",result));	
      TS_ASSERT_EQUALS("aaaa",result[depth]);	
Alex Buts's avatar
Alex Buts committed
      TS_ASSERT_EQUALS("bbbbb",result[depth+1]);	


  }
  void testSplitExpandMoveUpPath(){
      Poco::Path test;
      test = test.absolute();
      std::string wkPath = test.toString();
      std::vector<std::string> base;
      size_t depth= split_path(wkPath,base);

      std::vector<std::string> result;
      TS_ASSERT_EQUALS(depth+1,split_path("../aaaa\\bbbbb/./",result));	
      TS_ASSERT_EQUALS("aaaa",result[depth-1]);	
Alex Buts's avatar
Alex Buts committed
      TS_ASSERT_EQUALS("bbbbb",result[depth]);	


  }
  void testSplitTrhowOutOfrange(){
      std::vector<std::string> result;
      TSM_ASSERT_EQUALS("should return empty path",0,split_path("/aaaa\\bbbbb/../../",result));	
      TSM_ASSERT_EQUALS("should return empty path",0,result.size());
      TSM_ASSERT_THROWS(" this path should go out of range",split_path("/aaaa\\bbbbb/../../../",result),std::invalid_argument);
Alex Buts's avatar
Alex Buts committed

  }
  void testExtractWord()
  /**
     Applies a test to the extractWord
     The object is to find a suitable lenght
     of a string in a group of words
     @retval -1 :: failed find word in string
     when the pattern exists.
  */
  {
    std::string Ln="Name wav wavelength other stuff";
    int retVal=extractWord(Ln,"wavelengt",4);
    TS_ASSERT_EQUALS(retVal, 1);
    TS_ASSERT_EQUALS(Ln, "Name wav  other stuff"); 
  }

  void testConvert()
  {
        
    int i;
    //valid double convert
    TS_ASSERT_EQUALS(convert("   568   ",i), 1);
    TS_ASSERT_EQUALS(i,568);
    double X;
    //valid double convert
    TS_ASSERT_EQUALS(convert("   3.4   ",X), 1);
    TS_ASSERT_EQUALS(X,3.4);
    X=9.0;
    //invalid leading stuff
    TS_ASSERT_EQUALS(convert("   e3.4   ",X),0);
    TS_ASSERT_EQUALS(X,9.0);
    //invalid trailing stuff
    TS_ASSERT_EQUALS(convert("   3.4g   ",X),0);
    TS_ASSERT_EQUALS(X,9.0);
    std::string Y;
    TS_ASSERT_EQUALS(convert("   3.4y   ",Y),1);
    TS_ASSERT_EQUALS(Y,"3.4y");
  }

  void testSection()
  {
    std::string Mline="V 1 tth ";
    std::string Y;
    TS_ASSERT_EQUALS(section(Mline,Y),1);
    TS_ASSERT_EQUALS(Y,"V");
    TS_ASSERT_EQUALS(Mline," 1 tth ");  // Note the non-remove spc
  }

  void testSectPartNum()
  {
    double X;
    std::string NTest="   3.4   ";
    TS_ASSERT_EQUALS(sectPartNum(NTest,X),1);
    TS_ASSERT_EQUALS(X,3.4);
    X=9.0;
    NTest="   3.4g   ";
    TS_ASSERT_EQUALS(sectPartNum(NTest,X),1);
    TS_ASSERT_EQUALS(X,3.4);
    X=9.0;
    NTest="   e3.4   ";
    TS_ASSERT_DIFFERS(sectPartNum(NTest,X),1);
    TS_ASSERT_EQUALS(X,9.0);
  }

  void test_SplitToKeyValuePairs_Returns_Empty_Map_For_Empty_String()
  {
    auto keyValues = splitToKeyValues("");

    TS_ASSERT(keyValues.empty());
  }

  void test_SplitToKeyValuePairs_Returns_Empty_Map_For_String_With_No_Values()
  {
    auto keyValues = splitToKeyValues("key,key,key");

    TS_ASSERT(keyValues.empty());
  }

  void test_SplitToKeyValuePairs_Uses_Equals_And_Comma_As_Separators_By_Default()
  {
    auto keyValues = splitToKeyValues("key1=value1, key2=value2");

    TS_ASSERT_EQUALS(keyValues.size(), 2);
    TS_ASSERT_EQUALS(keyValues.at("key1"), "value1");
    TS_ASSERT_EQUALS(keyValues.at("key2"), "value2");
  }

  void test_SplitToKeyValuePairs_Uses_KeyValueSep_If_Given()
  {
    auto keyValues = splitToKeyValues("key1@value1, key2@value2", "@");

    TS_ASSERT_EQUALS(keyValues.size(), 2);
    TS_ASSERT_EQUALS(keyValues.at("key1"), "value1");
    TS_ASSERT_EQUALS(keyValues.at("key2"), "value2");
  }

  void test_SplitToKeyValuePairs_Uses_KeyValueSep_And_ListSep_If_Given()
  {
    auto keyValues = splitToKeyValues("key1@value1: key2@value2", "@", ":");

    TS_ASSERT_EQUALS(keyValues.size(), 2);
    TS_ASSERT_EQUALS(keyValues.at("key1"), "value1");
    TS_ASSERT_EQUALS(keyValues.at("key2"), "value2");
  }

  void test_SplitToKeyValuePairs_Does_Not_Ignore_Spaces_Within_Key_Or_Value()
  {
    auto keyValues = splitToKeyValues("key 1@value1: key2@value 2", "@", ":");

    TS_ASSERT_EQUALS(keyValues.size(), 2);
    TS_ASSERT_EQUALS(keyValues.at("key 1"), "value1");
    TS_ASSERT_EQUALS(keyValues.at("key2"), "value 2");
  }

  void test_SplitToKeyValuePairs_Ignores_Items_Without_A_Key_Or_Value()
  {
    auto keyValues = splitToKeyValues("key1=,key2=value2,=value3");

    TS_ASSERT_EQUALS(keyValues.size(), 1);
    TS_ASSERT_EQUALS(keyValues.at("key2"), "value2");
  }

  void test_join()
  {
    std::vector<std::string> v;
    std::string out;

    out = join(v.begin(), v.end(), ",");
    TS_ASSERT_EQUALS( out, "");

    v.push_back("Help");
    v.push_back("Me");
    v.push_back("I'm");
    v.push_back("Stuck");
    v.push_back("Inside");
    v.push_back("A");
    v.push_back("Test");

    out = join(v.begin(), v.end(), ",");
    TS_ASSERT_EQUALS( out, "Help,Me,I'm,Stuck,Inside,A,Test");
  void test_endsWithInt()
  {
    TS_ASSERT_EQUALS( endsWithInt("pixel22"), 22);
    TS_ASSERT_EQUALS( endsWithInt("pixel000123"), 123);
    TS_ASSERT_EQUALS( endsWithInt("pixel99"), 99);
    TS_ASSERT_EQUALS( endsWithInt("bla123bla"), -1);
    TS_ASSERT_EQUALS( endsWithInt(""), -1);
    TS_ASSERT_EQUALS( endsWithInt("123bla"), -1);
    TS_ASSERT_EQUALS( endsWithInt("123b"), -1);
    TS_ASSERT_EQUALS( endsWithInt("123"), 123);
  }
Alex Buts's avatar
Alex Buts committed
  void test_isMember()
  {
      std::vector<std::string> group(5,"");
      group[0]="A";
      group[1]="A1";
      group[2]="B0";
      group[3]="C";

      TS_ASSERT_EQUALS(1,isMember(group,"A1"));
      TS_ASSERT_EQUALS(-1,isMember(group," "));
      TS_ASSERT_EQUALS(-1,isMember(group,"nothing"));
      TS_ASSERT_EQUALS(0,isMember(group,"A"));
      TS_ASSERT_EQUALS(3,isMember(group,"C"));
  }

  void test_parseRange_defaultSimple()
  {
    std::vector<int> result;
    TS_ASSERT_THROWS_NOTHING(result = parseRange("3,1,4,0,2,5"));
    std::vector<int> expected(6);
    expected[0] = 3;
    expected[1] = 1;
    expected[2] = 4;
    expected[3] = 0;
    expected[4] = 2;
    expected[5] = 5;
    TS_ASSERT_EQUALS(result, expected);
  }

  void test_parseRange_defaultRanges()
  {
    std::vector<int> result;
    TS_ASSERT_THROWS_NOTHING(result = parseRange("  1, 2 - 5,   6   ,7,8,    9,10-12"));

    std::vector<int> expected;
    expected.reserve(12);
    for(int i = 1; i <= 12; i++)
      expected.push_back(i);

    TS_ASSERT_EQUALS(result, expected);
  }

  void test_parseRange_emptyElements()
  {
    std::vector<int> expected(3);
    expected[0] = 1;
    expected[1] = 2;
    expected[2] = 3;

    std::vector<int> result1;
    TS_ASSERT_THROWS_NOTHING(result1 = parseRange(",1,2,3"));
    TS_ASSERT_EQUALS(result1, expected);

    std::vector<int> result2;
    TS_ASSERT_THROWS_NOTHING(result2 = parseRange("1,2,3,"));
    TS_ASSERT_EQUALS(result2, expected);

    std::vector<int> result3;
    TS_ASSERT_THROWS_NOTHING(result3 = parseRange("1,2,,,,3"));
    TS_ASSERT_EQUALS(result3, expected);
  }

  void test_parseRange_mapStyleSimple()
  {
    std::vector<int> result;
    TS_ASSERT_THROWS_NOTHING(result = parseRange("   52   53   54   55   56   57   58   192", " "));

    std::vector<int> expected;
    expected.reserve(8);
    for(int i = 52; i <= 58; i++)
      expected.push_back(i);
    expected.push_back(192);

    TS_ASSERT_EQUALS(result, expected);
  }

  void test_parseRange_mapStyleRanges()
  {
    std::vector<int> result;
    TS_ASSERT_THROWS_NOTHING(result = parseRange("  1- 3 4    5 - 7  8 -10  ", " "));

    std::vector<int> expected;
    expected.reserve(10);
    for(int i = 1; i <= 10; i++)
      expected.push_back(i);

    TS_ASSERT_EQUALS(result, expected);
  }

  void test_parseRange_customRangeSep()
  {
    std::vector<int> result;
    TS_ASSERT_THROWS_NOTHING(result = parseRange("1-2,3:5,6-7,8:10", ",","-:"));

    std::vector<int> expected;
    expected.reserve(10);
    for(int i = 1; i <= 10; i++)
      expected.push_back(i);

    TS_ASSERT_EQUALS(result, expected);
  }

  void test_parseRange_emptyString()
  {
    std::vector<int> result;
    TS_ASSERT_THROWS_NOTHING(result = parseRange(""));
    TS_ASSERT(result.empty());
  }

  void test_parseRange_invalidElement()
  {
    TS_ASSERT_THROWS_EQUALS(parseRange("1,2,3,a,5"), const std::invalid_argument& e, 
                            e.what(), std::string("Invalid element: a"));

    TS_ASSERT_THROWS_EQUALS(parseRange("1|,|3|4", "|"), const std::invalid_argument& e, 
                            e.what(), std::string("Invalid element: ,"));
  } 

  void test_parseRange_invalidRange()
  {
    TS_ASSERT_THROWS_EQUALS(parseRange("1,2,3,-5,6"), const std::invalid_argument& e, 
                            e.what(), std::string("Invalid range: -5"));

    TS_ASSERT_THROWS_EQUALS(parseRange("-3 4", " "), const std::invalid_argument& e, 
                            e.what(), std::string("Invalid range: -3"));

    TS_ASSERT_THROWS_EQUALS(parseRange("1,2,a-4,5"), const std::invalid_argument& e, 
                            e.what(), std::string("Invalid range: a-4"));

    TS_ASSERT_THROWS_EQUALS(parseRange("1,2-,5,6"), const std::invalid_argument& e, 
                            e.what(), std::string("Invalid range: 2-"));

    TS_ASSERT_THROWS_EQUALS(parseRange("1 5-", " "), const std::invalid_argument& e, 
                            e.what(), std::string("Invalid range: 5-"));
  }

  void test_parseRange_multipleRangeSep()
  {
    TS_ASSERT_THROWS_EQUALS(parseRange("1--5 6  7", " "), const std::invalid_argument& e, 
                            e.what(), std::string("Multiple range separators: 1--5"));

    TS_ASSERT_THROWS_EQUALS(parseRange("----"), const std::invalid_argument& e, 
                            e.what(), std::string("Multiple range separators: ----"));
  }

  void test_parseRange_reversedRange()
  {
    TS_ASSERT_THROWS_EQUALS(parseRange("5-1,6,7"), const std::invalid_argument& e, 
                            e.what(), std::string("Range boundaries are reversed: 5-1"));
  }
};

#endif //MANTID_SUPPORTTEST_H_