QMCPACK
test_parser.cpp
Go to the documentation of this file.
1 #//////////////////////////////////////////////////////////////////////////////////////
2 #// This file is distributed under the University of Illinois/NCSA Open Source License.
3 #// See LICENSE file in top directory for details.
4 #//
5 #// Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 #//
7 #// File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 #//
9 #// File created by: Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
10 #//////////////////////////////////////////////////////////////////////////////////////
11 
12 
13 #include "catch.hpp"
14 
15 #include "Utilities/SimpleParser.h"
16 #include <stdio.h>
17 #include <string>
18 #include <sstream>
19 #include <vector>
20 
21 using std::string;
22 using std::vector;
23 namespace qmcplusplus
24 {
25 TEST_CASE("parsewords_empty", "[utilities]")
26 {
27  string input = "";
28  vector<string> outlist;
29  unsigned int num = parsewords(input.c_str(), outlist);
30 
31  REQUIRE(num == 0);
32  REQUIRE(outlist.size() == 0);
33 }
34 
35 struct ParseCase
36 {
37  string input; // input string
38  vector<string> output; // expected tokens
39  string extra_split; // extra characters to split on
40 
41  ParseCase(const string& in) : input(in) {}
42  ParseCase(const string& in, const vector<string>& out) : input(in), output(out) {}
43  ParseCase(const string& in, const vector<string>& out, const string& extra)
44  : input(in), output(out), extra_split(extra)
45  {}
46 };
47 using ParseCaseVector_t = vector<ParseCase>;
48 
49 
50 TEST_CASE("parsewords", "[utilities]")
51 {
52  ParseCaseVector_t tlist = {// Input string, list of expected tokens, extra split characters
53  {
54  "a",
55  {"a"},
56  },
57  {
58  "b=",
59  {"b"},
60  },
61  {
62  "=c",
63  {"c"},
64  },
65  {
66  "d=e",
67  {"d", "e"},
68  },
69  {
70  "f,g",
71  {"f", "g"},
72  },
73  {
74  "h\ti,j",
75  {"h", "i", "j"},
76  },
77  {
78  "k|m",
79  {"k|m"},
80  },
81  {"n|o", {"n", "o"}, "|"}};
82  for (auto& tc : tlist)
83  {
84  SECTION(string("Parsing string: ") + tc.input)
85  {
86  vector<string> outlist;
87  unsigned int num = parsewords(tc.input.c_str(), outlist, tc.extra_split);
88  REQUIRE(num == tc.output.size());
89  REQUIRE(outlist.size() == tc.output.size());
90  for (int i = 0; i < tc.output.size(); i++)
91  {
92  REQUIRE(outlist[i] == tc.output[i]);
93  }
94  }
95  }
96 }
97 
98 
99 TEST_CASE("readLine", "[utilities]")
100 {
101  ParseCaseVector_t tlist = {
102  // Input string, list of expected tokens, extra split characters
103  {"", {""}},
104  {"one", {"one"}},
105  {"one\ntwo", {"one", "two"}},
106  {"one;two", {"one", "two"}},
107  {"one\\\ntwo", {"onetwo"}},
108  {"one\\ two", {"one\\ two"}},
109  {"12345678901234567890extra", {"1234567890123456789"}}, // assuming bufLen=20 below
110  };
111 
112 
113  for (auto& tc : tlist)
114  {
115  SECTION(string("Parsing string: ") + tc.input)
116  {
117  const int bufLen = 20;
118  char buf[bufLen];
119  std::istringstream input(tc.input);
120  for (int i = 0; i < tc.output.size(); i++)
121  {
122  char* out = readLine(buf, bufLen, input);
123  REQUIRE(buf == tc.output[i]);
124  if (i == tc.output.size() - 1)
125  {
126  REQUIRE(out == NULL);
127  }
128  else
129  {
130  REQUIRE(out != NULL);
131  }
132  }
133  }
134  }
135 }
136 
137 
138 TEST_CASE("getwords", "[utilities]")
139 {
140  ParseCaseVector_t tlist = {
141  // Input string, list of expected tokens, extra split characters
142  {"one\n", {"one"}},
143  {"one,two\n", {"one", "two"}},
144  {"one|two\n", {"one|two"}},
145  {"a|b\n", {"a", "b"}, "|"},
146  };
147 
148  for (auto& tc : tlist)
149  {
150  SECTION(string("Parsing input: ") + tc.input)
151  {
152  vector<string> outlist;
153  std::istringstream input(tc.input);
154  int num = getwords(outlist, input, 0, tc.extra_split);
155  REQUIRE(num == tc.output.size());
156  REQUIRE(outlist.size() == tc.output.size());
157  for (int i = 0; i < tc.output.size(); i++)
158  {
159  REQUIRE(outlist[i] == tc.output[i]);
160  }
161  }
162  }
163 }
164 
165 TEST_CASE("getwordsWithMergedNumbers", "[utilities]")
166 {
167  // 1.0-2.0 -> 1.0 -2.0
168  // 105 C 5 Z 0.000000 0.000000 -0.567800-103.884284 -2.142253
169 
170  ParseCaseVector_t tlist = {// Input string, list of expected tokens, extra split characters
171  {"1\n", {"1"}},
172  {"1 2\n", {"1", "2"}},
173  {"1.0 -2.0\n", {"1.0", "-2.0"}},
174  {"1.0-2.0\n", {"1.0", "-2.0"}},
175  {"-1.0-2.0-3.0\n", {"-1.0", "-2.0", "-3.0"}},
176  {"105 C 5 Z 0.000000 0.000000 -0.567800-103.884284 -2.142253\n",
177  {"105", "C", "5", "Z", "0.000000", "0.000000", "-0.567800", "-103.884284", "-2.142253"}}};
178 
179  for (auto& tc : tlist)
180  {
181  SECTION(string("Parsing input: ") + tc.input)
182  {
183  vector<string> outlist;
184  std::istringstream input(tc.input);
185  int num = getwordsWithMergedNumbers(outlist, input);
186  REQUIRE(num == tc.output.size());
187  REQUIRE(outlist.size() == tc.output.size());
188  for (int i = 0; i < tc.output.size(); i++)
189  {
190  REQUIRE(outlist[i] == tc.output[i]);
191  }
192  }
193  }
194 }
195 
196 } // namespace qmcplusplus
ParseCase(const string &in, const vector< string > &out, const string &extra)
Definition: test_parser.cpp:43
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
char * readLine(char *s, int max, std::istream &fp)
TEST_CASE("complex_helper", "[type_traits]")
vector< ParseCase > ParseCaseVector_t
Definition: test_parser.cpp:47
REQUIRE(std::filesystem::exists(filename))
unsigned parsewords(const char *inbuf, std::vector< std::string > &slist, const std::string &extra_tokens)
vector< string > output
Definition: test_parser.cpp:38
ParseCase(const string &in, const vector< string > &out)
Definition: test_parser.cpp:42
testing::ValidSpinDensityInput input
int getwordsWithMergedNumbers(std::vector< std::string > &slist, std::istream &fp, int dummy, const std::string &extra_tokens)
int getwords(std::vector< std::string > &slist, std::istream &fp, std::string &aline)
ParseCase(const string &in)
Definition: test_parser.cpp:41