Files
unison/src/core/test/splitstring-test-suite.cc

159 lines
4.5 KiB
C++

/*
* Copyright (c) 2022 Lawrence Livermore National Laboratory
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Peter D. Barnes, Jr. <pdbarnes@llnl.gov>
*/
#include "ns3/string.h"
#include "ns3/test.h"
namespace ns3
{
namespace tests
{
/**
* \file
* \ingroup core-tests
* SplitString test suite implementation.
*/
/**
* \ingroup core-tests
* \defgroup environ-var-tests Environment variable caching tests
*/
/**
* \ingroup core-tests
*
* SplitString tests.
*/
class SplitStringTestCase : public TestCase
{
public:
/** Constructor */
SplitStringTestCase();
/** Destructor */
~SplitStringTestCase() override = default;
private:
/** Run the tests */
void DoRun() override;
/**
* Read \p str and check that it contains only the key,value pairs
* from \p expect.
* \param where The test condition being checked.
* \param str The environment variable to parse and check.
* \param expect The set of key,values expected.
*/
void Check(const std::string& where, const std::string& str, const StringVector& expect);
/** Test suite delimiter. */
const std::string m_delimiter{":|:"};
}; // class SplitStringTestCase
SplitStringTestCase::SplitStringTestCase()
: TestCase("split-string")
{
}
void
SplitStringTestCase::Check(const std::string& where,
const std::string& str,
const StringVector& expect)
{
const StringVector res = SplitString(str, m_delimiter);
// Print the res and expect
std::cout << where << ": '" << str << "'\nindex\texpect[" << expect.size() << "]\t\tresult["
<< res.size() << "]" << (expect.size() != res.size() ? "\tFAIL SIZE" : "")
<< "\n ";
NS_TEST_EXPECT_MSG_EQ(expect.size(),
res.size(),
"res and expect have different number of entries");
for (std::size_t i = 0; i < std::max(res.size(), expect.size()); ++i)
{
const std::string r = (i < res.size() ? res[i] : "''" + std::to_string(i));
const std::string e = (i < expect.size() ? expect[i] : "''" + std::to_string(i));
const bool ok = (r == e);
std::cout << i << "\t'" << e << (ok ? "'\t== '" : "'\t!= '") << r
<< (!ok ? "'\tFAIL MATCH" : "'") << "\n ";
NS_TEST_EXPECT_MSG_EQ(e, r, "res[i] does not match expect[i]");
}
std::cout << std::endl;
}
void
SplitStringTestCase::DoRun()
{
// Test points
// Empty string
Check("empty", "", {""});
// No delimiter
Check("no-delim", "token", {"token"});
// Extra leading, trailing delimiter: ":string", "string:"
Check("front-:|:", ":|:token", {"", "token"});
Check("back-:|:", "token:|:", {"token", ""});
// Double delimiter: ":|::|:token", "token:|::|:"
Check("front-:|::|:", ":|::|:token", {"", "", "token"});
Check("back-:|::|:", "token:|::|:", {"token", "", ""});
// Two tokens: "token1:|:token2"
Check("two", "token1:|:token2", {"token1", "token2"});
// Extra/double delimiters:|: ":|::|:token1:|:token2", ":|:token1:|:token2",
// "token1:|::|:token2", "token1:|:token2:|:",
Check(":|::|:two", ":|::|:token1:|:token2", {"", "", "token1", "token2"});
Check(":|:one:|:two", ":|:token1:|:token2", {"", "token1", "token2"});
Check("double:|:", "token1:|::|:token2", {"token1", "", "token2"});
Check("two:|:", "token1:|:token2:|::|:", {"token1", "token2", "", ""});
}
/**
* \ingroup typeid-tests
*
* TypeId test suites.
*/
class SplitStringTestSuite : public TestSuite
{
public:
SplitStringTestSuite();
};
SplitStringTestSuite::SplitStringTestSuite()
: TestSuite("split-string")
{
AddTestCase(new SplitStringTestCase);
}
/**
* \ingroup environ-var-tests
* Static variable for test initialization.
*/
static SplitStringTestSuite g_SplitStringTestSuite;
} // namespace tests
} // namespace ns3