cog/Frameworks/TagLib/taglib/tests/test_bytevector.cpp

600 lines
21 KiB
C++

/***************************************************************************
copyright : (C) 2007 by Lukas Lalinsky
email : lukas@oxygene.sk
***************************************************************************/
/***************************************************************************
* This library is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License version *
* 2.1 as published by the Free Software Foundation. *
* *
* This library 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 *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA *
* 02110-1301 USA *
* *
* Alternatively, this file is available under the Mozilla Public *
* License Version 1.1. You may obtain a copy of the License at *
* http://www.mozilla.org/MPL/ *
***************************************************************************/
#define _USE_MATH_DEFINES
#include <cmath>
#include <tbytevector.h>
#include <tbytevectorlist.h>
#include <cppunit/extensions/HelperMacros.h>
using namespace std;
using namespace TagLib;
class TestByteVector : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(TestByteVector);
CPPUNIT_TEST(testByteVector);
CPPUNIT_TEST(testFind1);
CPPUNIT_TEST(testFind2);
CPPUNIT_TEST(testFind3);
CPPUNIT_TEST(testRfind1);
CPPUNIT_TEST(testRfind2);
CPPUNIT_TEST(testRfind3);
CPPUNIT_TEST(testToHex);
CPPUNIT_TEST(testIntegerConversion);
CPPUNIT_TEST(testFloatingPointConversion);
CPPUNIT_TEST(testReplace);
CPPUNIT_TEST(testReplaceAndDetach);
CPPUNIT_TEST(testIterator);
CPPUNIT_TEST(testResize);
CPPUNIT_TEST(testAppend1);
CPPUNIT_TEST(testAppend2);
CPPUNIT_TEST(testBase64);
CPPUNIT_TEST_SUITE_END();
public:
void testByteVector()
{
ByteVector s1("foo");
CPPUNIT_ASSERT(ByteVectorList::split(s1, " ").size() == 1);
ByteVector s2("f");
CPPUNIT_ASSERT(ByteVectorList::split(s2, " ").size() == 1);
CPPUNIT_ASSERT(ByteVector().isEmpty());
CPPUNIT_ASSERT_EQUAL(0U, ByteVector().size());
CPPUNIT_ASSERT(ByteVector("asdf").clear().isEmpty());
CPPUNIT_ASSERT_EQUAL(0U, ByteVector("asdf").clear().size());
CPPUNIT_ASSERT_EQUAL(ByteVector(), ByteVector("asdf").clear());
ByteVector i("blah blah");
ByteVector j("blah");
CPPUNIT_ASSERT(i.containsAt(j, 5, 0));
CPPUNIT_ASSERT(i.containsAt(j, 6, 1));
CPPUNIT_ASSERT(i.containsAt(j, 6, 1, 3));
i.clear();
CPPUNIT_ASSERT(i.isEmpty());
}
void testFind1()
{
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO"));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 0));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 1));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 2));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 3));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 4));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 5));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 6));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 7));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 8));
// Intentional out-of-bounds access.
ByteVector v("0123456789x");
v.resize(10);
v.data()[10] = 'x';
CPPUNIT_ASSERT_EQUAL(-1, v.find("789x", 7));
}
void testFind2()
{
CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01", 1).find("\x01"));
CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01\x02", 2).find("\x01\x02"));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01", 1).find("\x02"));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01\x02", 2).find("\x01\x03"));
}
void testFind3()
{
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S'));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 0));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 1));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 2));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 3));
CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 4));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 5));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 6));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 7));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 8));
}
void testRfind1()
{
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 0));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 1));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 2));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 3));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 4));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 5));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 6));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 7));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 8));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS"));
}
void testRfind2()
{
ByteVector r0("**************");
ByteVector r1("OggS**********");
ByteVector r2("**********OggS");
ByteVector r3("OggS******OggS");
ByteVector r4("OggS*OggS*OggS");
CPPUNIT_ASSERT_EQUAL(-1, r0.find("OggS"));
CPPUNIT_ASSERT_EQUAL(-1, r0.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL(0, r1.find("OggS"));
CPPUNIT_ASSERT_EQUAL(0, r1.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL(10, r2.find("OggS"));
CPPUNIT_ASSERT_EQUAL(10, r2.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL(0, r3.find("OggS"));
CPPUNIT_ASSERT_EQUAL(10, r3.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 0));
CPPUNIT_ASSERT_EQUAL(5, r4.rfind("OggS", 7));
CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 12));
}
void testRfind3()
{
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 0));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 1));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 2));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 3));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 4));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 5));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 6));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 7));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 8));
CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O'));
}
void testToHex()
{
ByteVector v("\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f", 16);
CPPUNIT_ASSERT_EQUAL(ByteVector("f0e1d2c3b4a5968778695a4b3c2d1e0f"), v.toHex());
}
void testIntegerConversion()
{
const ByteVector data("\x00\xff\x01\xff\x00\xff\x01\xff\x00\xff\x01\xff\x00\xff", 14);
CPPUNIT_ASSERT_EQUAL((short)0x00ff, data.toShort());
CPPUNIT_ASSERT_EQUAL((short)0xff00, data.toShort(false));
CPPUNIT_ASSERT_EQUAL((short)0xff01, data.toShort(5U));
CPPUNIT_ASSERT_EQUAL((short)0x01ff, data.toShort(5U, false));
CPPUNIT_ASSERT_EQUAL((short)0xff, data.toShort(13U));
CPPUNIT_ASSERT_EQUAL((short)0xff, data.toShort(13U, false));
CPPUNIT_ASSERT_EQUAL((unsigned short)0x00ff, data.toUShort());
CPPUNIT_ASSERT_EQUAL((unsigned short)0xff00, data.toUShort(false));
CPPUNIT_ASSERT_EQUAL((unsigned short)0xff01, data.toUShort(5U));
CPPUNIT_ASSERT_EQUAL((unsigned short)0x01ff, data.toUShort(5U, false));
CPPUNIT_ASSERT_EQUAL((unsigned short)0xff, data.toUShort(13U));
CPPUNIT_ASSERT_EQUAL((unsigned short)0xff, data.toUShort(13U, false));
CPPUNIT_ASSERT_EQUAL(0x00ff01ffU, data.toUInt());
CPPUNIT_ASSERT_EQUAL(0xff01ff00U, data.toUInt(false));
CPPUNIT_ASSERT_EQUAL(0xff01ff00U, data.toUInt(5U));
CPPUNIT_ASSERT_EQUAL(0x00ff01ffU, data.toUInt(5U, false));
CPPUNIT_ASSERT_EQUAL(0x00ffU, data.toUInt(12U));
CPPUNIT_ASSERT_EQUAL(0xff00U, data.toUInt(12U, false));
CPPUNIT_ASSERT_EQUAL(0x00ff01U, data.toUInt(0U, 3U));
CPPUNIT_ASSERT_EQUAL(0x01ff00U, data.toUInt(0U, 3U, false));
CPPUNIT_ASSERT_EQUAL(0xff01ffU, data.toUInt(5U, 3U));
CPPUNIT_ASSERT_EQUAL(0xff01ffU, data.toUInt(5U, 3U, false));
CPPUNIT_ASSERT_EQUAL(0x00ffU, data.toUInt(12U, 3U));
CPPUNIT_ASSERT_EQUAL(0xff00U, data.toUInt(12U, 3U, false));
CPPUNIT_ASSERT_EQUAL((long long)0x00ff01ff00ff01ffULL, data.toLongLong());
CPPUNIT_ASSERT_EQUAL((long long)0xff01ff00ff01ff00ULL, data.toLongLong(false));
CPPUNIT_ASSERT_EQUAL((long long)0xff01ff00ff01ff00ULL, data.toLongLong(5U));
CPPUNIT_ASSERT_EQUAL((long long)0x00ff01ff00ff01ffULL, data.toLongLong(5U, false));
CPPUNIT_ASSERT_EQUAL((long long)0x00ffU, data.toLongLong(12U));
CPPUNIT_ASSERT_EQUAL((long long)0xff00U, data.toLongLong(12U, false));
}
void testFloatingPointConversion()
{
const double Tolerance = 1.0e-7;
const ByteVector pi32le("\xdb\x0f\x49\x40", 4);
CPPUNIT_ASSERT(std::abs(pi32le.toFloat32LE(0) - M_PI) < Tolerance);
CPPUNIT_ASSERT_EQUAL(pi32le, ByteVector::fromFloat32LE(pi32le.toFloat32LE(0)));
const ByteVector pi32be("\x40\x49\x0f\xdb", 4);
CPPUNIT_ASSERT(std::abs(pi32be.toFloat32BE(0) - M_PI) < Tolerance);
CPPUNIT_ASSERT_EQUAL(pi32be, ByteVector::fromFloat32BE(pi32be.toFloat32BE(0)));
const ByteVector pi64le("\x18\x2d\x44\x54\xfb\x21\x09\x40", 8);
CPPUNIT_ASSERT(std::abs(pi64le.toFloat64LE(0) - M_PI) < Tolerance);
CPPUNIT_ASSERT_EQUAL(pi64le, ByteVector::fromFloat64LE(pi64le.toFloat64LE(0)));
const ByteVector pi64be("\x40\x09\x21\xfb\x54\x44\x2d\x18", 8);
CPPUNIT_ASSERT(std::abs(pi64be.toFloat64BE(0) - M_PI) < Tolerance);
CPPUNIT_ASSERT_EQUAL(pi64be, ByteVector::fromFloat64BE(pi64be.toFloat64BE(0)));
const ByteVector pi80le("\x00\xc0\x68\x21\xa2\xda\x0f\xc9\x00\x40", 10);
CPPUNIT_ASSERT(std::abs(pi80le.toFloat80LE(0) - M_PI) < Tolerance);
const ByteVector pi80be("\x40\x00\xc9\x0f\xda\xa2\x21\x68\xc0\x00", 10);
CPPUNIT_ASSERT(std::abs(pi80be.toFloat80BE(0) - M_PI) < Tolerance);
}
void testReplace()
{
{
ByteVector a("abcdabf");
a.replace(ByteVector(""), ByteVector("<a>"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabf");
a.replace(ByteVector("foobartoolong"), ByteVector("<a>"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabf");
a.replace(ByteVector("xx"), ByteVector("yy"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabf");
a.replace(ByteVector("a"), ByteVector("x"));
CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a);
a.replace(ByteVector("x"), ByteVector("a"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabf");
a.replace('a', 'x');
CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a);
a.replace('x', 'a');
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabf");
a.replace(ByteVector("ab"), ByteVector("xy"));
CPPUNIT_ASSERT_EQUAL(ByteVector("xycdxyf"), a);
a.replace(ByteVector("xy"), ByteVector("ab"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabf");
a.replace(ByteVector("a"), ByteVector("<a>"));
CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>bf"), a);
a.replace(ByteVector("<a>"), ByteVector("a"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabf");
a.replace(ByteVector("b"), ByteVector("<b>"));
CPPUNIT_ASSERT_EQUAL(ByteVector("a<b>cda<b>f"), a);
a.replace(ByteVector("<b>"), ByteVector("b"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a);
}
{
ByteVector a("abcdabc");
a.replace(ByteVector("c"), ByteVector("<c>"));
CPPUNIT_ASSERT_EQUAL(ByteVector("ab<c>dab<c>"), a);
a.replace(ByteVector("<c>"), ByteVector("c"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabc"), a);
}
{
ByteVector a("abcdaba");
a.replace(ByteVector("a"), ByteVector("<a>"));
CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>b<a>"), a);
a.replace(ByteVector("<a>"), ByteVector("a"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdaba"), a);
}
}
void testReplaceAndDetach()
{
{
ByteVector a("abcdabf");
ByteVector b = a;
a.replace(ByteVector("a"), ByteVector("x"));
CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a);
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b);
}
{
ByteVector a("abcdabf");
ByteVector b = a;
a.replace('a', 'x');
CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a);
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b);
}
{
ByteVector a("abcdabf");
ByteVector b = a;
a.replace(ByteVector("ab"), ByteVector("xy"));
CPPUNIT_ASSERT_EQUAL(ByteVector("xycdxyf"), a);
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b);
}
{
ByteVector a("abcdabf");
ByteVector b = a;
a.replace(ByteVector("a"), ByteVector("<a>"));
CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>bf"), a);
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b);
}
{
ByteVector a("ab<c>dab<c>");
ByteVector b = a;
a.replace(ByteVector("<c>"), ByteVector("c"));
CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabc"), a);
CPPUNIT_ASSERT_EQUAL(ByteVector("ab<c>dab<c>"), b);
}
}
void testIterator()
{
ByteVector v1("taglib");
ByteVector v2 = v1;
ByteVector::Iterator it1 = v1.begin();
ByteVector::Iterator it2 = v2.begin();
CPPUNIT_ASSERT_EQUAL('t', *it1);
CPPUNIT_ASSERT_EQUAL('t', *it2);
std::advance(it1, 4);
std::advance(it2, 4);
*it2 = 'I';
CPPUNIT_ASSERT_EQUAL('i', *it1);
CPPUNIT_ASSERT_EQUAL('I', *it2);
CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v1);
CPPUNIT_ASSERT_EQUAL(ByteVector("taglIb"), v2);
ByteVector::ReverseIterator it3 = v1.rbegin();
ByteVector::ReverseIterator it4 = v2.rbegin();
CPPUNIT_ASSERT_EQUAL('b', *it3);
CPPUNIT_ASSERT_EQUAL('b', *it4);
std::advance(it3, 4);
std::advance(it4, 4);
*it4 = 'A';
CPPUNIT_ASSERT_EQUAL('a', *it3);
CPPUNIT_ASSERT_EQUAL('A', *it4);
CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v1);
CPPUNIT_ASSERT_EQUAL(ByteVector("tAglIb"), v2);
ByteVector v3;
v3 = ByteVector("0123456789").mid(3, 4);
it1 = v3.begin();
it2 = v3.end() - 1;
CPPUNIT_ASSERT_EQUAL('3', *it1);
CPPUNIT_ASSERT_EQUAL('6', *it2);
it3 = v3.rbegin();
it4 = v3.rend() - 1;
CPPUNIT_ASSERT_EQUAL('6', *it3);
CPPUNIT_ASSERT_EQUAL('3', *it4);
}
void testResize()
{
ByteVector a = ByteVector("0123456789");
ByteVector b = a.mid(3, 4);
b.resize(6, 'A');
CPPUNIT_ASSERT_EQUAL((unsigned int)6, b.size());
CPPUNIT_ASSERT_EQUAL('6', b[3]);
CPPUNIT_ASSERT_EQUAL('A', b[4]);
CPPUNIT_ASSERT_EQUAL('A', b[5]);
b.resize(10, 'B');
CPPUNIT_ASSERT_EQUAL((unsigned int)10, b.size());
CPPUNIT_ASSERT_EQUAL('6', b[3]);
CPPUNIT_ASSERT_EQUAL('B', b[6]);
CPPUNIT_ASSERT_EQUAL('B', b[9]);
b.resize(3, 'C');
CPPUNIT_ASSERT_EQUAL((unsigned int)3, b.size());
CPPUNIT_ASSERT_EQUAL(-1, b.find('C'));
b.resize(3);
CPPUNIT_ASSERT_EQUAL((unsigned int)3, b.size());
// Check if a and b were properly detached.
CPPUNIT_ASSERT_EQUAL((unsigned int)10, a.size());
CPPUNIT_ASSERT_EQUAL('3', a[3]);
CPPUNIT_ASSERT_EQUAL('5', a[5]);
// Special case that refCount == 1 and d->offset != 0.
ByteVector c = ByteVector("0123456789").mid(3, 4);
c.resize(6, 'A');
CPPUNIT_ASSERT_EQUAL((unsigned int)6, c.size());
CPPUNIT_ASSERT_EQUAL('6', c[3]);
CPPUNIT_ASSERT_EQUAL('A', c[4]);
CPPUNIT_ASSERT_EQUAL('A', c[5]);
c.resize(10, 'B');
CPPUNIT_ASSERT_EQUAL((unsigned int)10, c.size());
CPPUNIT_ASSERT_EQUAL('6', c[3]);
CPPUNIT_ASSERT_EQUAL('B', c[6]);
CPPUNIT_ASSERT_EQUAL('B', c[9]);
c.resize(3, 'C');
CPPUNIT_ASSERT_EQUAL((unsigned int)3, c.size());
CPPUNIT_ASSERT_EQUAL(-1, c.find('C'));
}
void testAppend1()
{
ByteVector v1("foo");
v1.append("bar");
CPPUNIT_ASSERT_EQUAL(ByteVector("foobar"), v1);
ByteVector v2("foo");
v2.append("b");
CPPUNIT_ASSERT_EQUAL(ByteVector("foob"), v2);
ByteVector v3;
v3.append("b");
CPPUNIT_ASSERT_EQUAL(ByteVector("b"), v3);
ByteVector v4("foo");
v4.append(v1);
CPPUNIT_ASSERT_EQUAL(ByteVector("foofoobar"), v4);
ByteVector v5("foo");
v5.append('b');
CPPUNIT_ASSERT_EQUAL(ByteVector("foob"), v5);
ByteVector v6;
v6.append('b');
CPPUNIT_ASSERT_EQUAL(ByteVector("b"), v6);
ByteVector v7("taglib");
ByteVector v8 = v7;
v7.append("ABC");
CPPUNIT_ASSERT_EQUAL(ByteVector("taglibABC"), v7);
v7.append('1');
v7.append('2');
v7.append('3');
CPPUNIT_ASSERT_EQUAL(ByteVector("taglibABC123"), v7);
CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v8);
}
void testAppend2()
{
ByteVector a("1234");
a.append(a);
CPPUNIT_ASSERT_EQUAL(ByteVector("12341234"), a);
}
void testBase64()
{
ByteVector sempty;
ByteVector t0("a"); // test 1 byte
ByteVector t1("any carnal pleasure.");
ByteVector t2("any carnal pleasure");
ByteVector t3("any carnal pleasur");
ByteVector s0("a"); // test 1 byte
ByteVector s1("any carnal pleasure.");
ByteVector s2("any carnal pleasure");
ByteVector s3("any carnal pleasur");
ByteVector eempty;
ByteVector e0("YQ==");
ByteVector e1("YW55IGNhcm5hbCBwbGVhc3VyZS4=");
ByteVector e2("YW55IGNhcm5hbCBwbGVhc3VyZQ==");
ByteVector e3("YW55IGNhcm5hbCBwbGVhc3Vy");
// Encode
CPPUNIT_ASSERT_EQUAL(eempty, sempty.toBase64());
CPPUNIT_ASSERT_EQUAL(e0, s0.toBase64());
CPPUNIT_ASSERT_EQUAL(e1, s1.toBase64());
CPPUNIT_ASSERT_EQUAL(e2, s2.toBase64());
CPPUNIT_ASSERT_EQUAL(e3, s3.toBase64());
// Decode
CPPUNIT_ASSERT_EQUAL(sempty, ByteVector::fromBase64(eempty));
CPPUNIT_ASSERT_EQUAL(s0, ByteVector::fromBase64(e0));
CPPUNIT_ASSERT_EQUAL(s1, ByteVector::fromBase64(e1));
CPPUNIT_ASSERT_EQUAL(s2, ByteVector::fromBase64(e2));
CPPUNIT_ASSERT_EQUAL(s3, ByteVector::fromBase64(e3));
CPPUNIT_ASSERT_EQUAL(t0, ByteVector::fromBase64(s0.toBase64()));
CPPUNIT_ASSERT_EQUAL(t1, ByteVector::fromBase64(s1.toBase64()));
CPPUNIT_ASSERT_EQUAL(t2, ByteVector::fromBase64(s2.toBase64()));
CPPUNIT_ASSERT_EQUAL(t3, ByteVector::fromBase64(s3.toBase64()));
ByteVector all((unsigned int)256);
// in order
{
for(int i = 0; i < 256; i++){
all[i]=(unsigned char)i;
}
ByteVector b64 = all.toBase64();
ByteVector original = ByteVector::fromBase64(b64);
CPPUNIT_ASSERT_EQUAL(all,original);
}
// reverse
{
for(int i = 0; i < 256; i++){
all[i]=(unsigned char)255-i;
}
ByteVector b64 = all.toBase64();
ByteVector original = ByteVector::fromBase64(b64);
CPPUNIT_ASSERT_EQUAL(all,original);
}
// all zeroes
{
for(int i = 0; i < 256; i++){
all[i]=0;
}
ByteVector b64 = all.toBase64();
ByteVector original = ByteVector::fromBase64(b64);
CPPUNIT_ASSERT_EQUAL(all,original);
}
// all ones
{
for(int i = 0; i < 256; i++){
all[i]=(unsigned char)0xff;
}
ByteVector b64 = all.toBase64();
ByteVector original = ByteVector::fromBase64(b64);
CPPUNIT_ASSERT_EQUAL(all,original);
}
// Missing end bytes
{
// No missing bytes
ByteVector m0("YW55IGNhcm5hbCBwbGVhc3VyZQ==");
CPPUNIT_ASSERT_EQUAL(s2,ByteVector::fromBase64(m0));
// 1 missing byte
ByteVector m1("YW55IGNhcm5hbCBwbGVhc3VyZQ=");
CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m1));
// 2 missing bytes
ByteVector m2("YW55IGNhcm5hbCBwbGVhc3VyZQ");
CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m2));
// 3 missing bytes
ByteVector m3("YW55IGNhcm5hbCBwbGVhc3VyZ");
CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m3));
}
// Grok invalid characters
{
ByteVector invalid("abd\x00\x01\x02\x03\x04");
CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(invalid));
}
}
};
CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVector);