// 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 {

// A sampling of word counts.  Covers extreme points well, and all bit
// positions, and some combinations of bit positions.
const uint16_t kSampleWordCounts[] = {
    0,   1,   2,   3,    4,    8,    16,   32,    64,    127,    128,
    256, 511, 512, 1024, 2048, 4096, 8192, 16384, 32768, 0xfffe, 0xffff};

// A sampling of opcode values.  Covers the lower values well, a few samples
// around the number of core instructions (as of this writing), and some
// higher values.
const uint16_t kSampleOpcodes[] = {0,   1,   2,    3,      4,     100,
                                   300, 305, 1023, 0xfffe, 0xffff};

TEST(OpcodeMake, Samples) {
  for (auto wordCount : kSampleWordCounts) {
    for (auto opcode : kSampleOpcodes) {
      uint32_t word = 0;
      word |= uint32_t(opcode);
      word |= uint32_t(wordCount) << 16;
      EXPECT_EQ(word, spvOpcodeMake(wordCount, SpvOp(opcode)));
    }
  }
}

}  // anonymous namespace
