// Copyright (c) 2016 Google 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 "gmock/gmock.h"
#include "test/test_fixture.h"

namespace spvtools {
namespace {

using ::spvtest::MakeInstruction;
using ::testing::Eq;

using OpTypePipeStorageTest = spvtest::TextToBinaryTest;

// It can assemble, but should not validate.  Validation checks for version
// and capability are in another test file.
TEST_F(OpTypePipeStorageTest, OpcodeAssemblesInV10) {
  EXPECT_THAT(
      CompiledInstructions("%res = OpTypePipeStorage", SPV_ENV_UNIVERSAL_1_0),
      Eq(MakeInstruction(SpvOpTypePipeStorage, {1})));
}

TEST_F(OpTypePipeStorageTest, ArgumentCount) {
  EXPECT_THAT(
      CompileFailure("OpTypePipeStorage", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected <result-id> at the beginning of an instruction, found "
         "'OpTypePipeStorage'."));
  EXPECT_THAT(
      CompiledInstructions("%res = OpTypePipeStorage", SPV_ENV_UNIVERSAL_1_1),
      Eq(MakeInstruction(SpvOpTypePipeStorage, {1})));
  EXPECT_THAT(CompileFailure("%res = OpTypePipeStorage %1 %2 %3 %4 %5",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("'=' expected after result id."));
}

using OpConstantPipeStorageTest = spvtest::TextToBinaryTest;

TEST_F(OpConstantPipeStorageTest, OpcodeAssemblesInV10) {
  EXPECT_THAT(CompiledInstructions("%1 = OpConstantPipeStorage %2 3 4 5",
                                   SPV_ENV_UNIVERSAL_1_0),
              Eq(MakeInstruction(SpvOpConstantPipeStorage, {1, 2, 3, 4, 5})));
}

TEST_F(OpConstantPipeStorageTest, ArgumentCount) {
  EXPECT_THAT(
      CompileFailure("OpConstantPipeStorage", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected <result-id> at the beginning of an instruction, found "
         "'OpConstantPipeStorage'."));
  EXPECT_THAT(
      CompileFailure("%1 = OpConstantPipeStorage", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected operand for OpConstantPipeStorage instruction, but found "
         "the end of the stream."));
  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 4",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected operand for OpConstantPipeStorage instruction, but "
                 "found the end of the stream."));
  EXPECT_THAT(CompiledInstructions("%1 = OpConstantPipeStorage %2 3 4 5",
                                   SPV_ENV_UNIVERSAL_1_1),
              Eq(MakeInstruction(SpvOpConstantPipeStorage, {1, 2, 3, 4, 5})));
  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 4 5 %6 %7",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("'=' expected after result id."));
}

TEST_F(OpConstantPipeStorageTest, ArgumentTypes) {
  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 %3 4 5",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Invalid unsigned integer literal: %3"));
  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 %4 5",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Invalid unsigned integer literal: %4"));
  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage 2 3 4 5",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected id to start with %."));
  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 4 \"ab\"",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Invalid unsigned integer literal: \"ab\""));
}

using OpCreatePipeFromPipeStorageTest = spvtest::TextToBinaryTest;

TEST_F(OpCreatePipeFromPipeStorageTest, OpcodeAssemblesInV10) {
  EXPECT_THAT(CompiledInstructions("%1 = OpCreatePipeFromPipeStorage %2 %3",
                                   SPV_ENV_UNIVERSAL_1_0),
              Eq(MakeInstruction(SpvOpCreatePipeFromPipeStorage, {1, 2, 3})));
}

TEST_F(OpCreatePipeFromPipeStorageTest, ArgumentCount) {
  EXPECT_THAT(
      CompileFailure("OpCreatePipeFromPipeStorage", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected <result-id> at the beginning of an instruction, found "
         "'OpCreatePipeFromPipeStorage'."));
  EXPECT_THAT(
      CompileFailure("%1 = OpCreatePipeFromPipeStorage", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected operand for OpCreatePipeFromPipeStorage instruction, but "
         "found the end of the stream."));
  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage %2 OpNop",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected operand for OpCreatePipeFromPipeStorage "
                 "instruction, but found the next instruction instead."));
  EXPECT_THAT(CompiledInstructions("%1 = OpCreatePipeFromPipeStorage %2 %3",
                                   SPV_ENV_UNIVERSAL_1_1),
              Eq(MakeInstruction(SpvOpCreatePipeFromPipeStorage, {1, 2, 3})));
  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage %2 %3 %4 %5",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("'=' expected after result id."));
}

TEST_F(OpCreatePipeFromPipeStorageTest, ArgumentTypes) {
  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage \"\" %3",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected id to start with %."));
  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage %2 3",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected id to start with %."));
}

}  // namespace
}  // namespace spvtools
