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

// Assembler tests for instructions in the "Barrier Instructions" section
// of the SPIR-V spec.

#include "unit_spirv.h"

#include "test_fixture.h"
#include "gmock/gmock.h"

namespace {

using ::testing::ElementsAre;
using ::testing::Eq;
using ::testing::_;
using spvtest::MakeInstruction;
using spvtest::TextToBinaryTest;

// Test OpMemoryBarrier

using OpMemoryBarrier = spvtest::TextToBinaryTest;

TEST_F(OpMemoryBarrier, Good) {
  const std::string input = "OpMemoryBarrier %1 %2\n";
  EXPECT_THAT(CompiledInstructions(input),
              Eq(MakeInstruction(SpvOpMemoryBarrier, {1, 2})));
  EXPECT_THAT(EncodeAndDecodeSuccessfully(input), Eq(input));
}

TEST_F(OpMemoryBarrier, BadMissingScopeId) {
  const std::string input = "OpMemoryBarrier\n";
  EXPECT_THAT(CompileFailure(input),
              Eq("Expected operand, found end of stream."));
}

TEST_F(OpMemoryBarrier, BadInvalidScopeId) {
  const std::string input = "OpMemoryBarrier 99\n";
  EXPECT_THAT(CompileFailure(input), Eq("Expected id to start with %."));
}

TEST_F(OpMemoryBarrier, BadMissingMemorySemanticsId) {
  const std::string input = "OpMemoryBarrier %scope\n";
  EXPECT_THAT(CompileFailure(input),
              Eq("Expected operand, found end of stream."));
}

TEST_F(OpMemoryBarrier, BadInvalidMemorySemanticsId) {
  const std::string input = "OpMemoryBarrier %scope 14\n";
  EXPECT_THAT(CompileFailure(input), Eq("Expected id to start with %."));
}

// TODO(dneto): OpControlBarrier
// TODO(dneto): OpGroupAsyncCopy
// TODO(dneto): OpGroupWaitEvents
// TODO(dneto): OpGroupAll
// TODO(dneto): OpGroupAny
// TODO(dneto): OpGroupBroadcast
// TODO(dneto): OpGroupIAdd
// TODO(dneto): OpGroupFAdd
// TODO(dneto): OpGroupFMin
// TODO(dneto): OpGroupUMin
// TODO(dneto): OpGroupSMin
// TODO(dneto): OpGroupFMax
// TODO(dneto): OpGroupUMax
// TODO(dneto): OpGroupSMax

using NamedMemoryBarrierTest = spvtest::TextToBinaryTest;

TEST_F(NamedMemoryBarrierTest, OpcodeUnrecognizedInV10) {
  EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier %bar %scope %semantics",
                             SPV_ENV_UNIVERSAL_1_0),
              Eq("Invalid Opcode name 'OpMemoryNamedBarrier'"));
}

TEST_F(NamedMemoryBarrierTest, ArgumentCount) {
  EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier", SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected operand, found end of stream."));
  EXPECT_THAT(
      CompileFailure("OpMemoryNamedBarrier %bar", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected operand, found end of stream."));
  EXPECT_THAT(
      CompileFailure("OpMemoryNamedBarrier %bar %scope", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected operand, found end of stream."));
  EXPECT_THAT(
      CompiledInstructions("OpMemoryNamedBarrier %bar %scope %semantics",
                           SPV_ENV_UNIVERSAL_1_1),
      ElementsAre(spvOpcodeMake(4, SpvOpMemoryNamedBarrier), _, _, _));
  EXPECT_THAT(
      CompileFailure("OpMemoryNamedBarrier %bar %scope %semantics %extra",
                     SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected '=', found end of stream."));
}

TEST_F(NamedMemoryBarrierTest, ArgumentTypes) {
  EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier 123 %scope %semantics",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected id to start with %."));
  EXPECT_THAT(CompileFailure("OpMemoryNamedBarrier %bar %scope \"semantics\"",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected id to start with %."));
}

using TypeNamedBarrierTest = spvtest::TextToBinaryTest;

TEST_F(TypeNamedBarrierTest, OpcodeUnrecognizedInV10) {
  EXPECT_THAT(CompileFailure("%t = OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_0),
              Eq("Invalid Opcode name 'OpTypeNamedBarrier'"));
}

TEST_F(TypeNamedBarrierTest, ArgumentCount) {
  EXPECT_THAT(CompileFailure("OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected <result-id> at the beginning of an instruction, "
                 "found 'OpTypeNamedBarrier'."));
  EXPECT_THAT(
      CompiledInstructions("%t = OpTypeNamedBarrier", SPV_ENV_UNIVERSAL_1_1),
      ElementsAre(spvOpcodeMake(2, SpvOpTypeNamedBarrier), _));
  EXPECT_THAT(
      CompileFailure("%t = OpTypeNamedBarrier 1 2 3", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected <opcode> or <result-id> at the beginning of an instruction, "
         "found '1'."));
}

using NamedBarrierInitializeTest = spvtest::TextToBinaryTest;

TEST_F(NamedBarrierInitializeTest, OpcodeUnrecognizedInV10) {
  EXPECT_THAT(CompileFailure("%bar = OpNamedBarrierInitialize %type %count",
                             SPV_ENV_UNIVERSAL_1_0),
              Eq("Invalid Opcode name 'OpNamedBarrierInitialize'"));
}

TEST_F(NamedBarrierInitializeTest, ArgumentCount) {
  EXPECT_THAT(
      CompileFailure("%bar = OpNamedBarrierInitialize", SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected operand, found end of stream."));
  EXPECT_THAT(CompileFailure("%bar = OpNamedBarrierInitialize %ype",
                             SPV_ENV_UNIVERSAL_1_1),
              Eq("Expected operand, found end of stream."));
  EXPECT_THAT(
      CompiledInstructions("%bar = OpNamedBarrierInitialize %type %count",
                           SPV_ENV_UNIVERSAL_1_1),
      ElementsAre(spvOpcodeMake(4, SpvOpNamedBarrierInitialize), _, _, _));
  EXPECT_THAT(
      CompileFailure("%bar = OpNamedBarrierInitialize %type %count \"extra\"",
                     SPV_ENV_UNIVERSAL_1_1),
      Eq("Expected <opcode> or <result-id> at the beginning of an instruction, "
         "found '\"extra\"'."));
}

}  // anonymous namespace
