diff options
Diffstat (limited to 'tests/byte_tests.cpp')
-rw-r--r-- | tests/byte_tests.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/tests/byte_tests.cpp b/tests/byte_tests.cpp new file mode 100644 index 0000000..8cb0da8 --- /dev/null +++ b/tests/byte_tests.cpp @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +/////////////////////////////////////////////////////////////////////////////// + +#include <UnitTest++/UnitTest++.h> +#include <gsl/gsl_byte> + +#include <iostream> +#include <list> +#include <map> +#include <memory> +#include <string> +#include <vector> + +using namespace std; +using namespace gsl; + +namespace +{ + +SUITE(byte_tests) +{ + TEST(construction) + { + { + byte b = static_cast<byte>(4); + CHECK(static_cast<unsigned char>(b) == 4); + } + + { + byte b = byte(12); + CHECK(static_cast<unsigned char>(b) == 12); + } + + { + byte b = to_byte<12>(); + CHECK(static_cast<unsigned char>(b) == 12); + } + { + unsigned char uc = 12; + byte b = to_byte(uc); + CHECK(static_cast<unsigned char>(b) == 12); + } + + // waiting for C++17 enum class direct initializer support + //{ + // byte b { 14 }; + // CHECK(static_cast<unsigned char>(b) == 14); + //} + } + + TEST(bitwise_operations) + { + byte b = to_byte<0xFF>(); + + byte a = to_byte<0x00>(); + CHECK((b | a) == to_byte<0xFF>()); + CHECK(a == to_byte<0x00>()); + + a |= b; + CHECK(a == to_byte<0xFF>()); + + a = to_byte<0x01>(); + CHECK((b & a) == to_byte<0x01>()); + + a &= b; + CHECK(a == to_byte<0x01>()); + + CHECK((b ^ a) == to_byte<0xFE>()); + + CHECK(a == to_byte<0x01>()); + a ^= b; + CHECK(a == to_byte<0xFE>()); + + a = to_byte<0x01>(); + CHECK(~a == to_byte<0xFE>()); + + a = to_byte<0xFF>(); + CHECK((a << 4) == to_byte<0xF0>()); + CHECK((a >> 4) == to_byte<0x0F>()); + + a <<= 4; + CHECK(a == to_byte<0xF0>()); + a >>= 4; + CHECK(a == to_byte<0x0F>()); + } + + TEST(to_integer) + { + byte b = to_byte<0x12>(); + + CHECK(0x12 == gsl::to_integer<char>(b)); + CHECK(0x12 == gsl::to_integer<short>(b)); + CHECK(0x12 == gsl::to_integer<long>(b)); + CHECK(0x12 == gsl::to_integer<long long>(b)); + + CHECK(0x12 == gsl::to_integer<unsigned char>(b)); + CHECK(0x12 == gsl::to_integer<unsigned short>(b)); + CHECK(0x12 == gsl::to_integer<unsigned long>(b)); + CHECK(0x12 == gsl::to_integer<unsigned long long>(b)); + +// CHECK(0x12 == gsl::to_integer<float>(b)); // expect compile-time error +// CHECK(0x12 == gsl::to_integer<double>(b)); // expect compile-time error + } + + int modify_both(gsl::byte& b, int& i) + { + i = 10; + b = to_byte<5>(); + return i; + } + + TEST(aliasing) + { + int i{ 0 }; + int res = modify_both(reinterpret_cast<byte&>(i), i); + CHECK(res == i); + } +} + +} + +int main(int, const char* []) { return UnitTest::RunAllTests(); } |