Skip to content
Snippets Groups Projects
Commit ee805811 authored by Bienchen's avatar Bienchen
Browse files

Added conversion functions to StarParser

parent 94384319
No related branches found
No related tags found
No related merge requests found
...@@ -45,7 +45,7 @@ StarParser::StarParser(const String& filename, bool items_as_row): ...@@ -45,7 +45,7 @@ StarParser::StarParser(const String& filename, bool items_as_row):
} }
String StarParser::FormatDiagnostic(StarDiagType type, const String& message, String StarParser::FormatDiagnostic(StarDiagType type, const String& message,
int line) int line) const
{ {
std::stringstream ss; std::stringstream ss;
ss << filename_ << ":"; ss << filename_ << ":";
...@@ -66,6 +66,45 @@ String StarParser::FormatDiagnostic(StarDiagType type, const String& message, ...@@ -66,6 +66,45 @@ String StarParser::FormatDiagnostic(StarDiagType type, const String& message,
return ss.str(); return ss.str();
} }
float StarParser::TryGetFloat(const StringRef& data, const String& name) const
{
std::pair<bool, float> value = data.to_float();
if (!value.first) {
throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR,
"Expecting floating point value for " +
name + ", found '" + data.str() +
"' instead.", line_num_));
}
return value.second;
}
int StarParser::TryGetInt(const StringRef& data, const String& name) const
{
std::pair<bool, int> value = data.to_int();
if (!value.first) {
throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR,
"Expecting integer value for " +
name + ", found '" + data.str() +
"' instead.", line_num_));
}
return value.second;
}
bool StarParser::TryGetBool(const StringRef& data, const String& name) const
{
if (data.length() == 1) {
if (data[0] == 'Y' || data[0] == 'y') {
return true;
} else if (data[0] == 'N' || data[0] == 'n') {
return false;
}
}
throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR,
"Expecting Boolean (Y/N) value for "+
name + ", found '" + data.str() +
"' instead.", line_num_));
}
bool StarParser::SplitLine(const StringRef& line, bool StarParser::SplitLine(const StringRef& line,
std::vector<StringRef>& parts, bool clear) std::vector<StringRef>& parts, bool clear)
......
...@@ -148,9 +148,33 @@ public: ...@@ -148,9 +148,33 @@ public:
/// OnBeginData() returned true. /// OnBeginData() returned true.
virtual void OnEndData() { } virtual void OnEndData() { }
/// \brief try to convert a value to float, on failure raise an exception.
///
/// \param data value to be converted
/// \param name to be included in the message
///
/// \return converted value
float TryGetFloat(const StringRef& data, const String& name) const;
/// \brief try to convert a value to integer, on failure raise an exception.
///
/// \param data value to be converted
/// \param name to be included in the message
///
/// \return converted value
int TryGetInt(const StringRef& data, const String& name) const;
/// \brief try to convert a value to bool, on failure raise an exception.
///
/// \param data value to be converted
/// \param name to be included in the message
///
/// \return converted value
bool TryGetBool(const StringRef& data, const String& name) const;
/// \brief format diagnostic and returns it as a string. /// \brief format diagnostic and returns it as a string.
String FormatDiagnostic(StarDiagType type, const String& message, String FormatDiagnostic(StarDiagType type, const String& message,
int line=-1); int line=-1) const;
void SetFilename(const String& filename) void SetFilename(const String& filename)
{ {
......
...@@ -395,5 +395,54 @@ BOOST_AUTO_TEST_CASE(star_loop_category_change_inplace) ...@@ -395,5 +395,54 @@ BOOST_AUTO_TEST_CASE(star_loop_category_change_inplace)
BOOST_CHECK_THROW(star_p.Parse(), IOException); BOOST_CHECK_THROW(star_p.Parse(), IOException);
} }
BOOST_AUTO_TEST_CASE(star_try_float_conversions)
{
BOOST_MESSAGE(" Running star_try_float_conversions tests...");
std::ifstream s("testfiles/loop_category_change_inplace.cif");
DataItemTestParser star_p(s);
StringRef data = StringRef("1.5", 3);
BOOST_CHECK_CLOSE(star_p.TryGetFloat(data,"positive float test"),1.5f,0.001f);
data = StringRef("foo", 3);
BOOST_CHECK_THROW(star_p.TryGetFloat(data, "negative float test"),
IOException);
BOOST_MESSAGE(" done.");
}
BOOST_AUTO_TEST_CASE(star_try_int_conversions)
{
BOOST_MESSAGE(" Running star_try_int_conversions tests...");
std::ifstream s("testfiles/loop_category_change_inplace.cif");
DataItemTestParser star_p(s);
StringRef data = StringRef("101", 3);
BOOST_CHECK_EQUAL(star_p.TryGetInt(data, "positive int test"), 101);
data = StringRef("foo", 3);
BOOST_CHECK_THROW(star_p.TryGetInt(data, "negative int test"),
IOException);
BOOST_MESSAGE(" done.");
}
BOOST_AUTO_TEST_CASE(star_try_bool_conversions)
{
BOOST_MESSAGE(" Running star_try_bool_conversions tests...");
std::ifstream s("testfiles/loop_category_change_inplace.cif");
DataItemTestParser star_p(s);
StringRef data = StringRef("Y", 1);
BOOST_CHECK(star_p.TryGetBool(data, "positive bool test ("+data.str()+")"));
data = StringRef("y", 1);
BOOST_CHECK(star_p.TryGetBool(data, "positive bool test ("+data.str()+")"));
data = StringRef("N", 1);
BOOST_CHECK(!star_p.TryGetBool(data, "positive bool test ("+data.str()+")"));
data = StringRef("n", 1);
BOOST_CHECK(!star_p.TryGetBool(data, "positive bool test ("+data.str()+")"));
data = StringRef("J", 1);
BOOST_CHECK_THROW(star_p.TryGetInt(data,
"negative bool test ("+data.str()+")"),
IOException);
data = StringRef("Foo", 3);
BOOST_CHECK_THROW(star_p.TryGetInt(data,
"negative bool test ("+data.str()+")"),
IOException);
BOOST_MESSAGE(" done.");
}
BOOST_AUTO_TEST_SUITE_END(); BOOST_AUTO_TEST_SUITE_END();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment