// Copyright (c) 2015-2016 The Khronos Group Inc.
//
// Licensed 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_spirv.h"

namespace {

TEST(FixWord, Default) {
  spv_endianness_t endian;
  if (I32_ENDIAN_HOST == I32_ENDIAN_LITTLE) {
    endian = SPV_ENDIANNESS_LITTLE;
  } else {
    endian = SPV_ENDIANNESS_BIG;
  }
  uint32_t word = 0x53780921;
  ASSERT_EQ(word, spvFixWord(word, endian));
}

TEST(FixWord, Reorder) {
  spv_endianness_t endian;
  if (I32_ENDIAN_HOST == I32_ENDIAN_LITTLE) {
    endian = SPV_ENDIANNESS_BIG;
  } else {
    endian = SPV_ENDIANNESS_LITTLE;
  }
  uint32_t word = 0x53780921;
  uint32_t result = 0x21097853;
  ASSERT_EQ(result, spvFixWord(word, endian));
}

TEST(FixDoubleWord, Default) {
  spv_endianness_t endian =
      (I32_ENDIAN_HOST == I32_ENDIAN_LITTLE ? SPV_ENDIANNESS_LITTLE
                                            : SPV_ENDIANNESS_BIG);
  uint32_t low = 0x53780921;
  uint32_t high = 0xdeadbeef;
  uint64_t result = 0xdeadbeef53780921;
  ASSERT_EQ(result, spvFixDoubleWord(low, high, endian));
}

TEST(FixDoubleWord, Reorder) {
  spv_endianness_t endian =
      (I32_ENDIAN_HOST == I32_ENDIAN_LITTLE ? SPV_ENDIANNESS_BIG
                                            : SPV_ENDIANNESS_LITTLE);
  uint32_t low = 0x53780921;
  uint32_t high = 0xdeadbeef;
  uint64_t result = 0xefbeadde21097853;
  ASSERT_EQ(result, spvFixDoubleWord(low, high, endian));
}

}  // anonymous namespace
