blob: de2936349247707ac5a1e9d9c2da265f10d9f690 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <boost/test/included/unit_test_framework.hpp>
#include <boost/test/unit_test.hpp>
#include "Specific.hh"
#include "Stream.hh"
using std::auto_ptr;
using std::string;
using std::vector;
using std::map;
using boost::array;
namespace avro {
class C {
int32_t i_;
int64_t l_;
public:
C() : i_(0), l_(0) { }
C(int32_t i, int64_t l) : i_(i), l_(l) { }
int32_t i() const { return i_; }
int64_t l() const { return l_; }
void i(int32_t ii) { i_ = ii; }
void l(int64_t ll) { l_ = ll; }
bool operator==(const C& oth) const {
return i_ == oth.i_ && l_ == oth.l_;
}
};
template <> struct codec_traits<C> {
static void encode(Encoder& e, const C& c) {
e.encodeInt(c.i());
e.encodeLong(c.l());
}
static void decode(Decoder& d, C& c) {
c.i(d.decodeInt());
c.l(d.decodeLong());
}
};
namespace specific {
class Test {
auto_ptr<OutputStream> os;
EncoderPtr e;
DecoderPtr d;
public:
Test() : os(memoryOutputStream()), e(binaryEncoder()), d(binaryDecoder()) {
e->init(*os);
}
template <typename T> void encode(const T& t) {
avro::encode(*e, t);
e->flush();
}
template <typename T> void decode(T& t) {
auto_ptr<InputStream> is = memoryInputStream(*os);
d->init(*is);
avro::decode(*d, t);
}
};
template <typename T> T encodeAndDecode(const T& t)
{
Test tst;
tst.encode(t);
T actual = T();
tst.decode(actual);
return actual;
}
void testBool()
{
bool b = encodeAndDecode(true);
BOOST_CHECK_EQUAL(b, true);
}
void testInt()
{
int32_t n = 10;
int32_t b = encodeAndDecode(n);
BOOST_CHECK_EQUAL(b, n);
}
void testLong()
{
int64_t n = -109;
int64_t b = encodeAndDecode(n);
BOOST_CHECK_EQUAL(b, n);
}
void testFloat()
{
float n = 10.19;
float b = encodeAndDecode(n);
BOOST_CHECK_CLOSE(b, n, 0.00001);
}
void testDouble()
{
double n = 10.00001;
double b = encodeAndDecode(n);
BOOST_CHECK_CLOSE(b, n, 0.00000001);
}
void testString()
{
string n = "abc";
string b = encodeAndDecode(n);
BOOST_CHECK_EQUAL(b, n);
}
void testBytes()
{
uint8_t values[] = { 1, 7, 23, 47, 83 };
vector<uint8_t> n(values, values + 5);
vector<uint8_t> b = encodeAndDecode(n);
BOOST_CHECK_EQUAL_COLLECTIONS(b.begin(), b.end(), n.begin(), n.end());
}
void testFixed()
{
array<uint8_t, 5> n = { 1, 7, 23, 47, 83 };
array<uint8_t, 5> b = encodeAndDecode(n);
BOOST_CHECK_EQUAL_COLLECTIONS(b.begin(), b.end(), n.begin(), n.end());
}
void testArray()
{
int32_t values[] = { 101, 709, 409, 34 };
vector<int32_t> n(values, values + 4);
vector<int32_t> b = encodeAndDecode(n);
BOOST_CHECK_EQUAL_COLLECTIONS(b.begin(), b.end(), n.begin(), n.end());
}
void testMap()
{
map<string, int32_t> n;
n["a"] = 1;
n["b"] = 101;
map<string, int32_t> b = encodeAndDecode(n);
BOOST_CHECK(b == n);
}
void testCustom()
{
C n(10, 1023);
C b = encodeAndDecode(n);
BOOST_CHECK(b == n);
}
}
}
boost::unit_test::test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
using namespace boost::unit_test;
test_suite* ts= BOOST_TEST_SUITE("Specific tests");
ts->add(BOOST_TEST_CASE(avro::specific::testBool));
ts->add(BOOST_TEST_CASE(avro::specific::testInt));
ts->add(BOOST_TEST_CASE(avro::specific::testLong));
ts->add(BOOST_TEST_CASE(avro::specific::testFloat));
ts->add(BOOST_TEST_CASE(avro::specific::testDouble));
ts->add(BOOST_TEST_CASE(avro::specific::testString));
ts->add(BOOST_TEST_CASE(avro::specific::testBytes));
ts->add(BOOST_TEST_CASE(avro::specific::testFixed));
ts->add(BOOST_TEST_CASE(avro::specific::testArray));
ts->add(BOOST_TEST_CASE(avro::specific::testMap));
ts->add(BOOST_TEST_CASE(avro::specific::testCustom));
return ts;
}