Fixed issue 2945 (#2946)

* Fixed #2945

* Added unit tests for #2945

* Dissalow iterator on empty Var (#2945)

* Updated unit tests for #2945

* More concise unit tests for #2945

* Removed some more clutter (#2945)
This commit is contained in:
akete 2020-03-03 20:47:53 +01:00 committed by GitHub
parent 7ca90cb0c3
commit 1d16cb115b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 8 deletions

View File

@ -737,7 +737,7 @@ inline const std::type_info& Var::type() const
inline Var::ConstIterator Var::begin() const
{
if (isEmpty()) return ConstIterator(const_cast<Var*>(this), true);
if (size() == 0) return ConstIterator(const_cast<Var*>(this), true);
return ConstIterator(const_cast<Var*>(this), false);
}
@ -749,7 +749,7 @@ inline Var::ConstIterator Var::end() const
inline Var::Iterator Var::begin()
{
if (isEmpty()) return Iterator(const_cast<Var*>(this), true);
if (size() == 0) return Iterator(const_cast<Var*>(this), true);
return Iterator(const_cast<Var*>(this), false);
}

View File

@ -31,6 +31,7 @@ VarIterator::VarIterator(Var* pVar, bool positionEnd):
_pVar(pVar),
_position(positionEnd ? POSITION_END : 0)
{
if (!_pVar || _pVar->isEmpty()) throw InvalidAccessException("Cannot create iterator on empty Var");
}

View File

@ -2973,8 +2973,15 @@ void VarTest::testEmpty()
void VarTest::testIterator()
{
Var da;
assertTrue (da.isEmpty());
assertTrue (da.begin() == da.end());
try
{
auto it = da.begin();
fail("calling begin() on empty Var must throw");
}
catch (const InvalidAccessException&) { }
da = Poco::Dynamic::Array();
assertTrue(da.begin() == da.end());
da = 1;
assertTrue (!da.isEmpty());

View File

@ -184,14 +184,29 @@ private:
void testContainerIterator()
{
C cont;
Poco::Dynamic::Var arr(cont);
int counter = 0;
// test empty
assertTrue (arr.size() == 0);
Poco::Dynamic::Var::Iterator it = arr.begin();
Poco::Dynamic::Var::Iterator end = arr.end();
for (; it != end; ++it)
{
*it = ++counter;
}
assertTrue(counter == 0);
// test non-empty
cont.push_back(1);
cont.push_back("2");
cont.push_back(3.5);
Poco::Dynamic::Var arr(cont);
arr = cont;
assertTrue (arr.size() == 3);
Poco::Dynamic::Var::Iterator it = arr.begin();
Poco::Dynamic::Var::Iterator end = arr.end();
int counter = 0;
it = arr.begin();
end = arr.end();
counter = 0;
for (; it != end; ++it)
{
switch (++counter)