KPath: Fixed Normalize() return code, changed Leaf().
* Normalize() now returns the error code that vfs_normalize_path() returns. * Leaf() now returns "" instead of "/" for the root. It's not used outside of KPath. * Adapted RemoveLeaf() to deal with this correctly. * "KPath = string" no longer changes the buffer size. * Added missing operator tests for =, ==, and !=.
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004-2008, Ingo Weinhold, [email protected].
|
* Copyright 2004-2008, Ingo Weinhold, [email protected].
|
||||||
|
* Copyright 2008-2017, Axel Dörfler, [email protected].
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -106,7 +107,7 @@ KPath::Adopt(KPath& other)
|
|||||||
status_t
|
status_t
|
||||||
KPath::InitCheck() const
|
KPath::InitCheck() const
|
||||||
{
|
{
|
||||||
return fBuffer ? B_OK : B_NO_MEMORY;
|
return fBuffer != NULL ? B_OK : B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -203,14 +204,11 @@ KPath::Leaf() const
|
|||||||
if (fBuffer == NULL)
|
if (fBuffer == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// only "/" has trailing slashes -- then we have to return the complete
|
for (int32 i = fPathLength - 1; i >= 0; i--) {
|
||||||
// buffer, as we have to do in case there are no slashes at all
|
if (fBuffer[i] == '/')
|
||||||
if (fPathLength != 1 || fBuffer[0] != '/') {
|
return fBuffer + i + 1;
|
||||||
for (int32 i = fPathLength - 1; i >= 0; i--) {
|
|
||||||
if (fBuffer[i] == '/')
|
|
||||||
return fBuffer + i + 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return fBuffer;
|
return fBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,7 +240,7 @@ KPath::RemoveLeaf()
|
|||||||
{
|
{
|
||||||
// get the leaf -- bail out, if not initialized or only the "/" is left
|
// get the leaf -- bail out, if not initialized or only the "/" is left
|
||||||
const char* leaf = Leaf();
|
const char* leaf = Leaf();
|
||||||
if (leaf == NULL || leaf == fBuffer)
|
if (leaf == NULL || leaf == fBuffer || leaf[0] == '\0')
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// chop off the leaf
|
// chop off the leaf
|
||||||
@@ -305,6 +303,7 @@ KPath::Normalize(bool traverseLeafLink)
|
|||||||
// it completely to avoid weird problems.
|
// it completely to avoid weird problems.
|
||||||
fBuffer[0] = '\0';
|
fBuffer[0] = '\0';
|
||||||
fPathLength = 0;
|
fPathLength = 0;
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
fPathLength = strlen(fBuffer);
|
fPathLength = strlen(fBuffer);
|
||||||
@@ -323,7 +322,7 @@ KPath::operator=(const KPath& other)
|
|||||||
KPath&
|
KPath&
|
||||||
KPath::operator=(const char* path)
|
KPath::operator=(const char* path)
|
||||||
{
|
{
|
||||||
SetTo(path);
|
SetPath(path);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,7 +330,7 @@ KPath::operator=(const char* path)
|
|||||||
bool
|
bool
|
||||||
KPath::operator==(const KPath& other) const
|
KPath::operator==(const KPath& other) const
|
||||||
{
|
{
|
||||||
if (!fBuffer)
|
if (fBuffer == NULL)
|
||||||
return !other.fBuffer;
|
return !other.fBuffer;
|
||||||
|
|
||||||
return other.fBuffer
|
return other.fBuffer
|
||||||
@@ -343,7 +342,7 @@ KPath::operator==(const KPath& other) const
|
|||||||
bool
|
bool
|
||||||
KPath::operator==(const char* path) const
|
KPath::operator==(const char* path) const
|
||||||
{
|
{
|
||||||
if (!fBuffer)
|
if (fBuffer == NULL)
|
||||||
return (!path);
|
return (!path);
|
||||||
|
|
||||||
return path && strcmp(fBuffer, path) == 0;
|
return path && strcmp(fBuffer, path) == 0;
|
||||||
|
|||||||
@@ -97,8 +97,7 @@ KPathTest::TestLeaf()
|
|||||||
|
|
||||||
path.SetTo("/");
|
path.SetTo("/");
|
||||||
CPPUNIT_ASSERT(strcmp(path.Path(), "/") == 0);
|
CPPUNIT_ASSERT(strcmp(path.Path(), "/") == 0);
|
||||||
// CPPUNIT_ASSERT(path.Leaf() == NULL);
|
CPPUNIT_ASSERT(strcmp(path.Leaf(), "") == 0);
|
||||||
// TODO: why '/'?
|
|
||||||
|
|
||||||
path.SetTo("a/b");
|
path.SetTo("a/b");
|
||||||
CPPUNIT_ASSERT(strcmp(path.Path(), "a/b") == 0);
|
CPPUNIT_ASSERT(strcmp(path.Path(), "a/b") == 0);
|
||||||
@@ -150,19 +149,30 @@ KPathTest::TestRemoveLeaf()
|
|||||||
|
|
||||||
path.SetTo("a//b/c");
|
path.SetTo("a//b/c");
|
||||||
removed = path.RemoveLeaf();
|
removed = path.RemoveLeaf();
|
||||||
CPPUNIT_ASSERT(removed);
|
CPPUNIT_ASSERT_MESSAGE("1. removed", removed);
|
||||||
CPPUNIT_ASSERT(strcmp(path.Path(), "a//b") == 0);
|
CPPUNIT_ASSERT(strcmp(path.Path(), "a//b") == 0);
|
||||||
CPPUNIT_ASSERT(path.Length() == 4);
|
CPPUNIT_ASSERT(path.Length() == 4);
|
||||||
|
|
||||||
removed = path.RemoveLeaf();
|
removed = path.RemoveLeaf();
|
||||||
CPPUNIT_ASSERT(removed);
|
CPPUNIT_ASSERT_MESSAGE("2. removed", removed);
|
||||||
CPPUNIT_ASSERT(strcmp(path.Path(), "a") == 0);
|
CPPUNIT_ASSERT(strcmp(path.Path(), "a") == 0);
|
||||||
CPPUNIT_ASSERT(path.Length() == 1);
|
CPPUNIT_ASSERT(path.Length() == 1);
|
||||||
|
|
||||||
removed = path.RemoveLeaf();
|
removed = path.RemoveLeaf();
|
||||||
CPPUNIT_ASSERT(!removed);
|
CPPUNIT_ASSERT_MESSAGE("3. !removed", !removed);
|
||||||
CPPUNIT_ASSERT(strcmp(path.Path(), "a") == 0);
|
CPPUNIT_ASSERT(strcmp(path.Path(), "a") == 0);
|
||||||
CPPUNIT_ASSERT(path.Length() == 1);
|
CPPUNIT_ASSERT(path.Length() == 1);
|
||||||
|
|
||||||
|
path.SetTo("/a");
|
||||||
|
removed = path.RemoveLeaf();
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("4. removed", removed);
|
||||||
|
CPPUNIT_ASSERT(strcmp(path.Path(), "/") == 0);
|
||||||
|
CPPUNIT_ASSERT(path.Length() == 1);
|
||||||
|
|
||||||
|
removed = path.RemoveLeaf();
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("5. !removed", !removed);
|
||||||
|
CPPUNIT_ASSERT(strcmp(path.Path(), "/") == 0);
|
||||||
|
CPPUNIT_ASSERT(path.Length() == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -218,9 +228,53 @@ KPathTest::TestNormalize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KPathTest::TestAssign()
|
||||||
|
{
|
||||||
|
KPath one("first", false, 10);
|
||||||
|
CPPUNIT_ASSERT(one.Length() == 5);
|
||||||
|
KPath two("second", false, 20);
|
||||||
|
|
||||||
|
two = one;
|
||||||
|
CPPUNIT_ASSERT(strcmp(two.Path(), one.Path()) == 0);
|
||||||
|
CPPUNIT_ASSERT(two.Path() != one.Path());
|
||||||
|
CPPUNIT_ASSERT(two.BufferSize() == one.BufferSize());
|
||||||
|
CPPUNIT_ASSERT(two.Length() == one.Length());
|
||||||
|
|
||||||
|
one = "/whatever";
|
||||||
|
CPPUNIT_ASSERT(one.Length() == 9);
|
||||||
|
CPPUNIT_ASSERT(one.BufferSize() == two.BufferSize());
|
||||||
|
CPPUNIT_ASSERT(strcmp(one.Path(), "/whatever") == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
KPathTest::TestEquals()
|
KPathTest::TestEquals()
|
||||||
{
|
{
|
||||||
|
KPath a("one");
|
||||||
|
KPath b("two");
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("1.", !(a == b));
|
||||||
|
|
||||||
|
b = a;
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("2.", a == b);
|
||||||
|
|
||||||
|
b = "ones";
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("3.", !(a == b));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KPathTest::TestNotEquals()
|
||||||
|
{
|
||||||
|
KPath a("one");
|
||||||
|
KPath b("two");
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("1.", a != b);
|
||||||
|
|
||||||
|
b = a;
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("2.", !(a != b));
|
||||||
|
|
||||||
|
b = "ones";
|
||||||
|
CPPUNIT_ASSERT_MESSAGE("3.", a != b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -243,8 +297,12 @@ KPathTest::AddTests(BTestSuite& parent)
|
|||||||
"KPathTest::TestDetachBuffer", &KPathTest::TestDetachBuffer));
|
"KPathTest::TestDetachBuffer", &KPathTest::TestDetachBuffer));
|
||||||
suite.addTest(new CppUnit::TestCaller<KPathTest>(
|
suite.addTest(new CppUnit::TestCaller<KPathTest>(
|
||||||
"KPathTest::TestNormalize", &KPathTest::TestNormalize));
|
"KPathTest::TestNormalize", &KPathTest::TestNormalize));
|
||||||
|
suite.addTest(new CppUnit::TestCaller<KPathTest>(
|
||||||
|
"KPathTest::TestAssign", &KPathTest::TestAssign));
|
||||||
suite.addTest(new CppUnit::TestCaller<KPathTest>(
|
suite.addTest(new CppUnit::TestCaller<KPathTest>(
|
||||||
"KPathTest::TestEquals", &KPathTest::TestEquals));
|
"KPathTest::TestEquals", &KPathTest::TestEquals));
|
||||||
|
suite.addTest(new CppUnit::TestCaller<KPathTest>(
|
||||||
|
"KPathTest::TestNotEquals", &KPathTest::TestNotEquals));
|
||||||
|
|
||||||
parent.addTest("KPathTest", &suite);
|
parent.addTest("KPathTest", &suite);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ public:
|
|||||||
void TestAdopt();
|
void TestAdopt();
|
||||||
void TestDetachBuffer();
|
void TestDetachBuffer();
|
||||||
void TestNormalize();
|
void TestNormalize();
|
||||||
|
void TestAssign();
|
||||||
void TestEquals();
|
void TestEquals();
|
||||||
|
void TestNotEquals();
|
||||||
|
|
||||||
static void AddTests(BTestSuite& suite);
|
static void AddTests(BTestSuite& suite);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user