ferencd@0: // ferencd@0: // VMime library (http://www.vmime.org) ferencd@0: // Copyright (C) 2002-2013 Vincent Richard ferencd@0: // ferencd@0: // This program is free software; you can redistribute it and/or ferencd@0: // modify it under the terms of the GNU General Public License as ferencd@0: // published by the Free Software Foundation; either version 3 of ferencd@0: // the License, or (at your option) any later version. ferencd@0: // ferencd@0: // This program is distributed in the hope that it will be useful, ferencd@0: // but WITHOUT ANY WARRANTY; without even the implied warranty of ferencd@0: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ferencd@0: // General Public License for more details. ferencd@0: // ferencd@0: // You should have received a copy of the GNU General Public License along ferencd@0: // with this program; if not, write to the Free Software Foundation, Inc., ferencd@0: // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ferencd@0: // ferencd@0: // Linking this library statically or dynamically with other modules is making ferencd@0: // a combined work based on this library. Thus, the terms and conditions of ferencd@0: // the GNU General Public License cover the whole combination. ferencd@0: // ferencd@0: ferencd@0: #include "tests/testUtils.hpp" ferencd@0: ferencd@0: #include "vmime/utility/path.hpp" ferencd@0: ferencd@0: ferencd@0: VMIME_TEST_SUITE_BEGIN(utilityPathTest) ferencd@0: ferencd@0: VMIME_TEST_LIST_BEGIN ferencd@0: VMIME_TEST(testConstruct1) ferencd@0: VMIME_TEST(testConstruct2) ferencd@0: VMIME_TEST(testConstruct3) ferencd@0: VMIME_TEST(testConstruct4) ferencd@0: ferencd@0: VMIME_TEST(testAppendComponent) ferencd@0: ferencd@0: VMIME_TEST(testOperatorDiv1) ferencd@0: VMIME_TEST(testOperatorDiv2) ferencd@0: ferencd@0: VMIME_TEST(testOperatorDivEqual1) ferencd@0: VMIME_TEST(testOperatorDivEqual2) ferencd@0: ferencd@0: VMIME_TEST(testGetParent) ferencd@0: ferencd@0: VMIME_TEST(testComparison) ferencd@0: ferencd@0: VMIME_TEST(testGetLastComponent) ferencd@0: ferencd@0: VMIME_TEST(testIsDirectParentOf) ferencd@0: VMIME_TEST(testIsParentOf) ferencd@0: VMIME_TEST(testIsParentOf_EquivalentCharset) ferencd@0: ferencd@0: VMIME_TEST(testRenameParent) ferencd@0: ferencd@0: VMIME_TEST(testFromString) ferencd@0: VMIME_TEST(testFromString_IgnoreLeadingOrTrailingSep) ferencd@0: VMIME_TEST(testToString) ferencd@0: VMIME_TEST_LIST_END ferencd@0: ferencd@0: ferencd@0: typedef vmime::utility::path path; ferencd@0: typedef vmime::utility::path::component comp; ferencd@0: ferencd@0: ferencd@0: void testConstruct1() ferencd@0: { ferencd@0: VASSERT_EQ("1", true, path().isEmpty()); ferencd@0: VASSERT_EQ("2", 0, path().getSize()); ferencd@0: } ferencd@0: ferencd@0: void testConstruct2() ferencd@0: { ferencd@0: path p(comp("foo")); ferencd@0: ferencd@0: VASSERT_EQ("1", false, p.isEmpty()); ferencd@0: VASSERT_EQ("2", 1, p.getSize()); ferencd@0: VASSERT_EQ("3", "foo", p.getComponentAt(0).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testAppendComponent() ferencd@0: { ferencd@0: path p; ferencd@0: ferencd@0: VASSERT_EQ("1", 0, p.getSize()); ferencd@0: ferencd@0: comp c("foo"); ferencd@0: p.appendComponent(c); ferencd@0: ferencd@0: VASSERT_EQ("2", 1, p.getSize()); ferencd@0: VASSERT_EQ("3", c.getBuffer(), p.getComponentAt(0).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testConstruct3() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: p1.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p2(p1); ferencd@0: ferencd@0: VASSERT_EQ("1", 2, p2.getSize()); ferencd@0: VASSERT_EQ("2", "foo", p2.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("3", "bar", p2.getComponentAt(1).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testConstruct4() ferencd@0: { ferencd@0: // Same as path::path(const component&) ferencd@0: path p("foo"); ferencd@0: ferencd@0: VASSERT_EQ("1", false, p.isEmpty()); ferencd@0: VASSERT_EQ("2", 1, p.getSize()); ferencd@0: VASSERT_EQ("3", "foo", p.getComponentAt(0).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testOperatorDiv1() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: p1.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("baz")); ferencd@0: ferencd@0: path p3 = p1 / p2; ferencd@0: ferencd@0: VASSERT_EQ("1", 3, p3.getSize()); ferencd@0: VASSERT_EQ("2", p1.getComponentAt(0).getBuffer(), p3.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("3", p1.getComponentAt(1).getBuffer(), p3.getComponentAt(1).getBuffer()); ferencd@0: VASSERT_EQ("4", p2.getComponentAt(0).getBuffer(), p3.getComponentAt(2).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testOperatorDiv2() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: p1.appendComponent(comp("bar")); ferencd@0: ferencd@0: comp c("baz"); ferencd@0: ferencd@0: path p2 = p1 / c; ferencd@0: ferencd@0: VASSERT_EQ("1", 3, p2.getSize()); ferencd@0: VASSERT_EQ("2", p1.getComponentAt(0).getBuffer(), p2.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("3", p1.getComponentAt(1).getBuffer(), p2.getComponentAt(1).getBuffer()); ferencd@0: VASSERT_EQ("4", c.getBuffer(), p2.getComponentAt(2).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testOperatorDivEqual1() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: p1.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("baz")); ferencd@0: ferencd@0: path p3(p1); ferencd@0: p3 /= p2; ferencd@0: ferencd@0: VASSERT_EQ("1", 3, p3.getSize()); ferencd@0: VASSERT_EQ("2", p1.getComponentAt(0).getBuffer(), p3.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("3", p1.getComponentAt(1).getBuffer(), p3.getComponentAt(1).getBuffer()); ferencd@0: VASSERT_EQ("4", p2.getComponentAt(0).getBuffer(), p3.getComponentAt(2).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testOperatorDivEqual2() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: p1.appendComponent(comp("bar")); ferencd@0: ferencd@0: comp c("baz"); ferencd@0: ferencd@0: path p2(p1); ferencd@0: p2 /= c; ferencd@0: ferencd@0: VASSERT_EQ("1", 3, p2.getSize()); ferencd@0: VASSERT_EQ("2", p1.getComponentAt(0).getBuffer(), p2.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("3", p1.getComponentAt(1).getBuffer(), p2.getComponentAt(1).getBuffer()); ferencd@0: VASSERT_EQ("4", c.getBuffer(), p2.getComponentAt(2).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testGetParent() ferencd@0: { ferencd@0: path p1; ferencd@0: path p1p = p1.getParent(); ferencd@0: ferencd@0: VASSERT_EQ("1", true, p1p.isEmpty()); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("foo")); ferencd@0: p2.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p2p = p2.getParent(); ferencd@0: ferencd@0: VASSERT_EQ("2", 1, p2p.getSize()); ferencd@0: VASSERT_EQ("3", p2.getComponentAt(0).getBuffer(), p2p.getComponentAt(0).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testComparison() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: p1.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("foo")); ferencd@0: p2.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p3; ferencd@0: p3.appendComponent(comp("foo")); ferencd@0: p3.appendComponent(comp("bar")); ferencd@0: p3.appendComponent(comp("baz")); ferencd@0: ferencd@0: VASSERT_EQ("1", true, p1 == p2); ferencd@0: VASSERT_EQ("2", false, p1 == p3); ferencd@0: ferencd@0: VASSERT_EQ("3", false, p1 != p2); ferencd@0: VASSERT_EQ("4", true, p1 != p3); ferencd@0: ferencd@0: VASSERT_EQ("5", true, p3.getParent() == p1); ferencd@0: } ferencd@0: ferencd@0: void testGetLastComponent() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: p1.appendComponent(comp("bar")); ferencd@0: p1.appendComponent(comp("baz")); ferencd@0: ferencd@0: VASSERT_EQ("1", "baz", p1.getLastComponent().getBuffer()); ferencd@0: VASSERT_EQ("2", "bar", p1.getParent().getLastComponent().getBuffer()); ferencd@0: VASSERT_EQ("3", "foo", p1.getParent().getParent().getLastComponent().getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testIsDirectParentOf() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("foo")); ferencd@0: p2.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p3; ferencd@0: p3.appendComponent(comp("foo")); ferencd@0: p3.appendComponent(comp("bar")); ferencd@0: p3.appendComponent(comp("baz")); ferencd@0: ferencd@0: VASSERT_EQ("1", true, p1.isDirectParentOf(p2)); ferencd@0: VASSERT_EQ("2", true, p2.isDirectParentOf(p3)); ferencd@0: VASSERT_EQ("3", false, p1.isDirectParentOf(p3)); ferencd@0: VASSERT_EQ("4", false, p2.isDirectParentOf(p1)); ferencd@0: } ferencd@0: ferencd@0: void testIsParentOf() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo")); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("foo")); ferencd@0: p2.appendComponent(comp("bar")); ferencd@0: ferencd@0: path p3; ferencd@0: p3.appendComponent(comp("foo")); ferencd@0: p3.appendComponent(comp("bar")); ferencd@0: p3.appendComponent(comp("baz")); ferencd@0: ferencd@0: VASSERT_EQ("1", true, p1.isParentOf(p2)); ferencd@0: VASSERT_EQ("2", true, p2.isParentOf(p3)); ferencd@0: VASSERT_EQ("3", true, p1.isParentOf(p3)); ferencd@0: VASSERT_EQ("4", false, p2.isParentOf(p1)); ferencd@0: } ferencd@0: ferencd@0: void testIsParentOf_EquivalentCharset() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("foo", "us-ascii")); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("foo", "utf-8")); ferencd@0: p2.appendComponent(comp("bar")); ferencd@0: p2.appendComponent(comp("baz")); ferencd@0: ferencd@0: VASSERT_EQ("1", true, p1.isParentOf(p2)); ferencd@0: } ferencd@0: ferencd@0: void testRenameParent() ferencd@0: { ferencd@0: path p1; ferencd@0: p1.appendComponent(comp("a")); ferencd@0: p1.appendComponent(comp("b")); ferencd@0: p1.appendComponent(comp("c")); ferencd@0: p1.appendComponent(comp("d")); ferencd@0: ferencd@0: path p2; ferencd@0: p2.appendComponent(comp("a")); ferencd@0: p2.appendComponent(comp("b")); ferencd@0: ferencd@0: path p3; ferencd@0: p3.appendComponent(comp("x")); ferencd@0: p3.appendComponent(comp("y")); ferencd@0: p3.appendComponent(comp("z")); ferencd@0: ferencd@0: path p(p1); ferencd@0: p.renameParent(p2, p3); ferencd@0: ferencd@0: VASSERT_EQ("1", 5, p.getSize()); ferencd@0: VASSERT_EQ("2", "x", p.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("3", "y", p.getComponentAt(1).getBuffer()); ferencd@0: VASSERT_EQ("4", "z", p.getComponentAt(2).getBuffer()); ferencd@0: VASSERT_EQ("5", "c", p.getComponentAt(3).getBuffer()); ferencd@0: VASSERT_EQ("6", "d", p.getComponentAt(4).getBuffer()); ferencd@0: } ferencd@0: ferencd@0: void testFromString() ferencd@0: { ferencd@0: path p = path::fromString("ab/cde/f", "/", vmime::charset("my-charset")); ferencd@0: ferencd@0: VASSERT_EQ("count", 3, p.getSize()); ferencd@0: VASSERT_EQ("buffer1", "ab", p.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("charset1", "my-charset", p.getComponentAt(0).getCharset().getName()); ferencd@0: VASSERT_EQ("buffer2", "cde", p.getComponentAt(1).getBuffer()); ferencd@0: VASSERT_EQ("charset2", "my-charset", p.getComponentAt(1).getCharset().getName()); ferencd@0: VASSERT_EQ("buffer3", "f", p.getComponentAt(2).getBuffer()); ferencd@0: VASSERT_EQ("charset3", "my-charset", p.getComponentAt(2).getCharset().getName()); ferencd@0: } ferencd@0: ferencd@0: void testFromString_IgnoreLeadingOrTrailingSep() ferencd@0: { ferencd@0: path p = path::fromString("//ab/cde/f////", "/", vmime::charset("my-charset")); ferencd@0: ferencd@0: VASSERT_EQ("count", 3, p.getSize()); ferencd@0: VASSERT_EQ("buffer1", "ab", p.getComponentAt(0).getBuffer()); ferencd@0: VASSERT_EQ("charset1", "my-charset", p.getComponentAt(0).getCharset().getName()); ferencd@0: VASSERT_EQ("buffer2", "cde", p.getComponentAt(1).getBuffer()); ferencd@0: VASSERT_EQ("charset2", "my-charset", p.getComponentAt(1).getCharset().getName()); ferencd@0: VASSERT_EQ("buffer3", "f", p.getComponentAt(2).getBuffer()); ferencd@0: VASSERT_EQ("charset3", "my-charset", p.getComponentAt(2).getCharset().getName()); ferencd@0: } ferencd@0: ferencd@0: void testToString() ferencd@0: { ferencd@0: path p; ferencd@0: p.appendComponent(comp("ab")); ferencd@0: p.appendComponent(comp("cde")); ferencd@0: p.appendComponent(comp("f")); ferencd@0: ferencd@0: VASSERT_EQ("string", "ab/cde/f", p.toString("/", vmime::charset("us-ascii"))); ferencd@0: } ferencd@0: ferencd@0: VMIME_TEST_SUITE_END ferencd@0: