Skip to content
Snippets Groups Projects
Commit 3233be49 authored by Marco Biasini's avatar Marco Biasini
Browse files

Fix bug in processing of loop rows spanning more than 2 rows

Fixes BZDNG-299
parent 080b744e
No related branches found
No related tags found
No related merge requests found
...@@ -344,7 +344,7 @@ void StarParser::ParseLoop() ...@@ -344,7 +344,7 @@ void StarParser::ParseLoop()
} else { } else {
tmp_values.push_back(tline.str()); tmp_values.push_back(tline.str());
const char* d=tmp_values.back().c_str(); const char* d=tmp_values.back().c_str();
for (size_t i=std::max(before-1, 0); i<columns.size(); ++i) { for (size_t i=before; i<columns.size(); ++i) {
columns[i]=StringRef(d+(columns[i].begin()-tline.begin()), columns[i]=StringRef(d+(columns[i].begin()-tline.begin()),
columns[i].size()); columns[i].size());
} }
......
...@@ -117,6 +117,46 @@ public: ...@@ -117,6 +117,46 @@ public:
bool visit_two; bool visit_two;
}; };
class HardLoopTestParser : public StarParser {
public:
HardLoopTestParser(std::istream& stream): StarParser(stream), cur_char_('A')
{ }
virtual bool OnBeginLoop(const StarLoopDesc& header)
{
return true;
}
virtual void OnDataRow(const StarLoopDesc& header,
const std::vector<StringRef>& columns)
{
BOOST_CHECK_EQUAL(columns[0][0], cur_char_);
BOOST_CHECK_EQUAL(columns[0].size(), 1);
++cur_char_;
BOOST_CHECK_EQUAL(columns[1][0], cur_char_);
BOOST_CHECK_EQUAL(columns[1].size(), 1);
++cur_char_;
BOOST_CHECK_EQUAL(columns[2][0], cur_char_);
BOOST_CHECK_EQUAL(columns[2].size(), 1);
++cur_char_;
BOOST_CHECK_EQUAL(columns[3][0], cur_char_);
BOOST_CHECK_EQUAL(columns[3].size(), 1);
++cur_char_;
BOOST_CHECK_EQUAL(columns[4][0], cur_char_);
BOOST_CHECK_EQUAL(columns[4].size(), 1);
++cur_char_;
BOOST_CHECK_EQUAL(columns[5][0], cur_char_);
BOOST_CHECK_EQUAL(columns[5].size(), 1);
++cur_char_;
}
virtual void OnEndLoop()
{
BOOST_CHECK_EQUAL(cur_char_, 'S');
}
char cur_char_;
};
class ItemsAsRowTestParser : public StarParser { class ItemsAsRowTestParser : public StarParser {
public: public:
ItemsAsRowTestParser(std::istream& stream): StarParser(stream, true), ItemsAsRowTestParser(std::istream& stream): StarParser(stream, true),
...@@ -282,6 +322,13 @@ BOOST_AUTO_TEST_CASE(star_multi) ...@@ -282,6 +322,13 @@ BOOST_AUTO_TEST_CASE(star_multi)
BOOST_CHECK(star_p.visit_one); BOOST_CHECK(star_p.visit_one);
BOOST_CHECK(star_p.visit_two); BOOST_CHECK(star_p.visit_two);
} }
BOOST_AUTO_TEST_CASE(star_multiline_loop)
{
std::ifstream s("testfiles/multiline-loop.cif");
HardLoopTestParser star_p(s);
star_p.Parse();
}
BOOST_AUTO_TEST_CASE(star_loop) BOOST_AUTO_TEST_CASE(star_loop)
{ {
......
data_multiline_loop
loop_
_a.u
_a.v
_a.w
_a.x
_a.y
_a.z
A B C
D
E F
G
H
I
J
K
L
M
N
O
P
Q
R
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment