Initially I was thinking to sunset the
getLoadFile() as it's just another dump function for debugging purpose, but now I am going to need it in the search process. The original function will accept a
FileNode object and then recursively loop through each path until the last object has reached, then convert each object into the URL string.
std::list<string> FileBot::getLoadedFiles(FileNode *fileNode)
{
std::list<string> mlist;
if( fileNode == nullptr || fileNode->sibling.size() == 0 )
return mlist;
for( FileNodeListType::iterator it = fileNode->sibling.begin(); it != fileNode->sibling.end(); ++it )
{
FileNode *n = (&*it);
if( n->getType() == 'd' ) {
std::list<string> subList;
subList = getLoadedFiles(n);
mlist.insert(mlist.begin(), subList.begin(), subList.end());
}
else {
string filePath = constructPathAddress(n);
mlist.push_back(filePath);
}
}
return mlist;
}
This was originally used in path construction process to verify the path has correctly loaded into memory by verifying the URL returned. For now, I need this to retrieve all the
FileNode objects that park under a particular
FileNode object rather than the URL string. Thus, I am converting the list storage to store the
FileNode object instead of string:
std::list<FileNode*> FileBot::getLoadedFiles(FileNode *fileNode)
{
std::list<FileNode*> mlist;
...
for( FileNodeListType::iterator it = fileNode->sibling.begin(); it != fileNode->sibling.end(); ++it )
{
...
if( n->getType() == 'd' ) {
...
...
}
else {
mlist.push_back(n);
}
}
return mlist;
}
On the unit testing site, originally I have the following code to verify my desired URL was loaded into the memory. The
std::find is a very useful function to lookup a value in the list.
BOOST_AUTO_TEST_CASE(TL_5, *boost::unit_test::precondition(skipTest(false)))
{
...
// verify the file name was captured
std::list<string> files = fb.getLoadedFiles(root);
if( std::find(files.begin(), files.end(), "/home/kokhoe/workspaceqt/debug/FolderA/file_1.txt") == files.end() )
BOOST_TEST(false);
}
Due to the change to object type, the
std::find is unusable anymore. But I found a workaround on this, to lookup a value in the object list, that is to create a new functor for this purpose. The URL is now constructed and perform matching inside functor.
struct FileNodeFinder
{
FileNodeFinder(const std::string &s) : s_(s) {}
bool operator() (const FileNode* obj)
{
FileBotUnderTest fb;
return fb.constructPathAddress(obj).compare(s_) == 0 ? true : false ;
}
private:
const std::string s_;
};
Thus, the new way of doing work is like this:
BOOST_AUTO_TEST_CASE(TL_5, *boost::unit_test::precondition(skipTest(false)))
{
...
// verify the file name was captured
std::list<FileNode*>::iterator it = find_if(files.begin(),
files.end(),
FileNodeFinder("/home/kokhoe/workspaceqt/debug/FolderA/file_1.txt"));
FileNode *n = *it;
if( it == files.end() )
BOOST_FAIL("nothing were found");
}