1 /*
2  * Distributed under the OSI-approved Apache License, Version 2.0.  See
3  * accompanying file Copyright.txt for details.
4  */
5 #include <cmath>
6 #include <cstdint>
7 #include <cstring>
8 
9 #include <iostream>
10 #include <limits>
11 #include <stdexcept>
12 
13 #include <adios2.h>
14 #include <adios2/common/ADIOSTypes.h>
15 #include <adios2/helper/adiosString.h>
16 
17 #include <gtest/gtest.h>
18 
TEST(ADIOS2HelperString,ADIOS2HelperStringFNF)19 TEST(ADIOS2HelperString, ADIOS2HelperStringFNF)
20 {
21 
22     const std::string fname("nosuchfile.txt");
23     const std::string hint("");
24 
25     ASSERT_THROW(adios2::helper::FileToString(fname, hint),
26                  std::ios_base::failure);
27 }
28 
TEST(ADIOS2HelperString,ADIOS2HelperStringParameterMapFromVector)29 TEST(ADIOS2HelperString, ADIOS2HelperStringParameterMapFromVector)
30 {
31 
32     const std::vector<std::string> badparam_in = {"badparam"};
33     const std::vector<std::string> emptyparam_in = {"emptyparam="};
34     const std::vector<std::string> dupparam_in = {"dupparam=1", "dupparam=2"};
35     const std::vector<std::string> param_in = {"param1=1", "param2=2",
36                                                "param3=3"};
37 
38     adios2::Params parameters =
39         adios2::helper::BuildParametersMap(param_in, '=');
40 
41     ASSERT_EQ(parameters.find("param1")->second, "1");
42     ASSERT_EQ(parameters.find("param2")->second, "2");
43     ASSERT_EQ(parameters.find("param3")->second, "3");
44 
45     ASSERT_THROW(adios2::helper::BuildParametersMap(badparam_in, '='),
46                  std::invalid_argument);
47     ASSERT_THROW(adios2::helper::BuildParametersMap(emptyparam_in, '='),
48                  std::invalid_argument);
49     ASSERT_THROW(adios2::helper::BuildParametersMap(dupparam_in, '='),
50                  std::invalid_argument);
51 }
52 
TEST(ADIOS2HelperString,ADIOS2HelperStringParameterMapFromString)53 TEST(ADIOS2HelperString, ADIOS2HelperStringParameterMapFromString)
54 {
55 
56     const std::string badparam_in = "badparam";
57     const std::string emptyparam_in = "emptyparam=";
58     const std::string dupparam_in = "dupparam = 1 , dupparam=2";
59     const std::string param_in =
60         "param1=1, param2=2,                                       "
61         "                    param3=3";
62 
63     adios2::Params parameters =
64         adios2::helper::BuildParametersMap(param_in, '=', ',');
65 
66     ASSERT_EQ(parameters.find("param1")->second, "1");
67     ASSERT_EQ(parameters.find("param2")->second, "2");
68     ASSERT_EQ(parameters.find("param3")->second, "3");
69 
70     ASSERT_THROW(adios2::helper::BuildParametersMap(badparam_in, '=', ','),
71                  std::invalid_argument);
72     ASSERT_THROW(adios2::helper::BuildParametersMap(emptyparam_in, '=', ','),
73                  std::invalid_argument);
74     ASSERT_THROW(adios2::helper::BuildParametersMap(dupparam_in, '=', ','),
75                  std::invalid_argument);
76 }
77 
TEST(ADIOS2HelperString,ADIOS2HelperStringAddExtension)78 TEST(ADIOS2HelperString, ADIOS2HelperStringAddExtension)
79 {
80 
81     const std::string abc("abc");
82     const std::string abcbp("abc.bp");
83     const std::string ext(".bp");
84 
85     ASSERT_EQ(adios2::helper::AddExtension(abc, ext), abcbp);
86     ASSERT_EQ(adios2::helper::AddExtension(abcbp, ext), abcbp);
87 }
88 
TEST(ADIOS2HelperString,ADIOS2HelperStringEndsWithCaseSensitive)89 TEST(ADIOS2HelperString, ADIOS2HelperStringEndsWithCaseSensitive)
90 {
91 
92     const std::string abcdefgh("abcd.efgh");
93     const std::string theend(".efgh");
94     const std::string notanend(".ephs");
95     const std::string shortstr("abc");
96 
97     ASSERT_TRUE(adios2::helper::EndsWith(abcdefgh, theend));
98     ASSERT_FALSE(adios2::helper::EndsWith(abcdefgh, notanend));
99     ASSERT_FALSE(adios2::helper::EndsWith(shortstr, theend));
100 }
101 
TEST(ADIOS2HelperString,ADIOS2HelperStringEndsWithCaseInsensitive)102 TEST(ADIOS2HelperString, ADIOS2HelperStringEndsWithCaseInsensitive)
103 {
104 
105     const std::string abcdefgh("abCd.eFgH");
106     const std::string end1(".efGh");
107     const std::string end2(".efgh");
108     const std::string noend1(".ephs");
109     const std::string noend2(".efdHs");
110     const std::string shortstr("ABC");
111 
112     ASSERT_TRUE(adios2::helper::EndsWith(abcdefgh, end1, false));
113     ASSERT_TRUE(adios2::helper::EndsWith(abcdefgh, end2, false));
114     ASSERT_FALSE(adios2::helper::EndsWith(abcdefgh, noend1, false));
115     ASSERT_FALSE(adios2::helper::EndsWith(abcdefgh, noend2, false));
116     ASSERT_FALSE(adios2::helper::EndsWith(shortstr, end1, false));
117 }
118 
TEST(ADIOS2HelperString,ADIOS2HelperStringConversion)119 TEST(ADIOS2HelperString, ADIOS2HelperStringConversion)
120 {
121 
122     const std::string dbl("123.1230");
123     const std::string uint("123");
124     const std::string notnum("notnum");
125     const std::string hint("");
126 
127     const double diff =
128         std::abs(adios2::helper::StringTo<double>(dbl, hint) - 123.123);
129     ASSERT_LT(diff, 1E-4);
130 
131     ASSERT_THROW(adios2::helper::StringTo<double>(notnum, hint),
132                  std::invalid_argument);
133     ASSERT_EQ(adios2::helper::StringTo<uint32_t>(uint, hint), 123);
134     ASSERT_THROW(adios2::helper::StringTo<uint32_t>(notnum, hint),
135                  std::invalid_argument);
136 }
137 
TEST(ADIOS2HelperString,ADIOS2HelperDimString)138 TEST(ADIOS2HelperString, ADIOS2HelperDimString)
139 {
140 
141     const adios2::Dims dimensions = {1, 2, 3};
142     const std::string dimstr("Dims(3):[1, 2, 3]");
143 
144     ASSERT_EQ(adios2::helper::DimsToString(dimensions), dimstr);
145 }
146 
TEST(ADIOS2HelperString,ADIOS2HelperGlobalName)147 TEST(ADIOS2HelperString, ADIOS2HelperGlobalName)
148 {
149 
150     const std::string localName("myfile.bp");
151     const std::string prefix("mydir");
152     const std::string separator("/");
153     const std::string global("mydir/myfile.bp");
154 
155     ASSERT_EQ(adios2::helper::GlobalName(localName, prefix, separator), global);
156 }
157 
main(int argc,char ** argv)158 int main(int argc, char **argv)
159 {
160 
161     int result;
162     ::testing::InitGoogleTest(&argc, argv);
163     result = RUN_ALL_TESTS();
164 
165     return result;
166 }
167