blob: 5d0e80761b37d34ec948ed7511a3263d7c1c409d [file] [log] [blame]
//===- BinaryCodingTests.cpp ----------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "llbuild/Basic/BinaryCoding.h"
#include "gtest/gtest.h"
using namespace llbuild;
using namespace llbuild::basic;
struct CustomType {
friend struct BinaryCodingTraits<CustomType>;
uint32_t a;
uint32_t b;
};
inline bool operator==(CustomType lhs, CustomType rhs) {
return lhs.a == rhs.a && lhs.b == rhs.b;
}
template<>
struct BinaryCodingTraits<CustomType> {
static inline void encode(const CustomType& value,
BinaryEncoder& coder) {
coder.write(value.a);
coder.write(value.b);
}
static inline void decode(CustomType& value, BinaryDecoder& coder) {
coder.read(value.a);
coder.read(value.b);
}
};
namespace {
template<typename T>
static std::vector<uint8_t> encode(T value) {
BinaryEncoder encoder;
encoder.write(value);
return encoder.contents();
}
template<typename T>
static T decode(std::vector<uint8_t> data) {
BinaryDecoder decoder(data);
// FIXME: Don't do default initialization.
T result;
decoder.read(result);
return result;
}
template<typename T>
void checkRoundtrip(T value) {
// Equal types should encode equal.
auto data = encode(value);
auto dataCopy = encode(T(value));
EXPECT_EQ(data, dataCopy);
// Check decoding.
auto decodedValue = decode<T>(data);
auto decodedValueCopy = decode<T>(dataCopy);
EXPECT_EQ(decodedValue, decodedValueCopy);
// Check roundtrip.
EXPECT_EQ(decodedValue, value);
}
TEST(BinaryCodingTests, basic) {
// Check the coding of basic types.
checkRoundtrip(uint8_t(0xAB));
checkRoundtrip(uint16_t(0xABCD));
checkRoundtrip(uint32_t(0xABCD0123));
checkRoundtrip(uint64_t(0xABCD01234567DCBAULL));
}
TEST(BinaryCodingTests, bytes) {
BinaryEncoder encoder;
encoder.writeBytes(StringRef("hello"));
encoder.writeBytes(StringRef("world"));
auto result = encoder.contents();
// Check the raw encoding.
EXPECT_EQ(StringRef((char*)result.data(), result.size()),
StringRef("helloworld"));
// Check the decode.
BinaryDecoder decoder(result);
StringRef s1, s2;
decoder.readBytes(5, s1);
decoder.readBytes(5, s2);
EXPECT_EQ(s1, StringRef("hello"));
EXPECT_EQ(s2, StringRef("world"));
}
TEST(BinaryCodingTests, customType) {
// Check the coding of basic types.
checkRoundtrip(CustomType{ 0xABCD, 0x1234 });
}
}