blob: 797bc70bb16e8a3519b5bd20c41b946e301caa5e [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 "proton/codec/decoder.hpp"
#include "proton/codec/encoder.hpp"
#include "proton/error.hpp"
#include "proton/value.hpp"
#include "test_bits.hpp"
#include <string>
#include <sstream>
#include <fstream>
#include <streambuf>
#include <iosfwd>
namespace {
using namespace std;
using namespace proton;
using proton::codec::encoder;
using proton::codec::decoder;
using proton::internal::data;
using test::str;
std::string tests_dir;
string read(string filename) {
filename = tests_dir+string("/interop/")+filename+string(".amqp");
ifstream ifs(filename.c_str());
if (!ifs.good()) FAIL("Can't open " << filename);
return string(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());
}
// Test data ostream operator
void test_data_ostream() {
data dt(data::create());
decoder d(dt);
d.decode(read("primitives"));
ASSERT_EQUAL("true, false, 42, 42, -42, 12345, -12345, 12345, -12345, 0.125, 0.125", str(dt));
}
// Test extracting to exact AMQP types works correctly, extracting to invalid types fails.
void test_decoder_primitives_exact() {
value dv;
decoder d(dv);
d.decode(read("primitives"));
ASSERT(d.more());
try { get< ::int8_t>(d); FAIL("got bool as byte"); } catch(const conversion_error&){}
ASSERT_EQUAL(true, get<bool>(d));
ASSERT_EQUAL(false, get<bool>(d));
try { get< ::int8_t>(d); FAIL("got ubyte as byte"); } catch(const conversion_error&){}
ASSERT_EQUAL(42, get< ::uint8_t>(d));
try { get< ::int32_t>(d); FAIL("got uint as ushort"); } catch(const conversion_error&){}
ASSERT_EQUAL(42, get< ::uint16_t>(d));
try { get< ::uint16_t>(d); FAIL("got short as ushort"); } catch(const conversion_error&){}
ASSERT_EQUAL(-42, get< ::int16_t>(d));
ASSERT_EQUAL(12345u, get< ::uint32_t>(d));
ASSERT_EQUAL(-12345, get< ::int32_t>(d));
ASSERT_EQUAL(12345u, get< ::uint64_t>(d));
ASSERT_EQUAL(-12345, get< ::int64_t>(d));
try { get<double>(d); FAIL("got float as double"); } catch(const conversion_error&){}
ASSERT_EQUAL(0.125f, get<float>(d));
try { get<float>(d); FAIL("got double as float"); } catch(const conversion_error&){}
ASSERT_EQUAL(0.125, get<double>(d));
ASSERT(!d.more());
}
// Test inserting primitive sand encoding as AMQP.
void test_encoder_primitives() {
value dv;
encoder e(dv);
e << true << false;
e << ::uint8_t(42);
e << ::uint16_t(42) << ::int16_t(-42);
e << ::uint32_t(12345) << ::int32_t(-12345);
e << ::uint64_t(12345) << ::int64_t(-12345);
e << float(0.125) << double(0.125);
ASSERT_EQUAL("true, false, 42, 42, -42, 12345, -12345, 12345, -12345, 0.125, 0.125", str(e));
std::string data = e.encode();
ASSERT_EQUAL(read("primitives"), data);
}
}
int main(int argc, char** argv) {
int failed = 0;
if (argc != 2) {
cerr << "Usage: " << argv[0] << " tests-dir" << endl;
return 1;
}
tests_dir = argv[1];
RUN_TEST(failed, test_data_ostream());
RUN_TEST(failed, test_decoder_primitives_exact());
RUN_TEST(failed, test_encoder_primitives());
return failed;
}