blob: 5a67c28c79d6c4ef028287c2afba3d834821eb10 [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 "unit_test.h"
#include "qpid/amqp_0_10/specification.h"
#include "qpid/amqp_0_10/ApplyControl.h"
QPID_AUTO_TEST_SUITE(VisitorTestSuite)
using namespace qpid::amqp_0_10;
struct GetCode : public ApplyFunctor<uint8_t> {
template <class T> uint8_t operator()(const T&) const { return T::CODE; }
};
struct SetChannelMax : ApplyFunctor<void> {
template <class T> void operator()(T&) const { BOOST_FAIL(""); }
void operator()(connection::Tune& t) const { t.channelMax=42; }
};
struct TestFunctor {
typedef bool result_type;
bool operator()(const connection::Tune& tune) {
BOOST_CHECK_EQUAL(tune.channelMax, 1u);
BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
return true;
}
template <class T>
bool operator()(const T&) { return false; }
};
QPID_AUTO_TEST_CASE(testApply) {
connection::Tune tune(1,2,3,4);
Control* p = &tune;
// boost oddity - without the cast we get undefined symbol errors.
BOOST_CHECK_EQUAL(apply(GetCode(), *p), (uint8_t)connection::Tune::CODE);
TestFunctor tf;
BOOST_CHECK(apply(tf, *p));
connection::Start start;
p = &start;
BOOST_CHECK(!apply(tf, *p));
apply(SetChannelMax(), tune);
BOOST_CHECK_EQUAL(tune.channelMax, 42);
}
struct VoidTestFunctor {
typedef void result_type;
int code;
VoidTestFunctor() : code() {}
void operator()(const connection::Tune& tune) {
BOOST_CHECK_EQUAL(tune.channelMax, 1u);
BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
code=connection::Tune::CODE;
}
template <class T>
void operator()(const T&) { code=0xFF; }
};
QPID_AUTO_TEST_CASE(testApplyVoid) {
connection::Tune tune(1,2,3,4);
Control* p = &tune;
VoidTestFunctor tf;
apply(tf, *p);
BOOST_CHECK_EQUAL(uint8_t(connection::Tune::CODE), tf.code);
connection::Start start;
p = &start;
apply(tf, *p);
BOOST_CHECK_EQUAL(0xFF, tf.code);
}
QPID_AUTO_TEST_SUITE_END()