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

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

using ::testing::Eq;

namespace {

using RoundTripLiteralsTest =
    spvtest::TextToBinaryTestBase<::testing::TestWithParam<std::string>>;

TEST_P(RoundTripLiteralsTest, Sample) {
  EXPECT_THAT(EncodeAndDecodeSuccessfully(GetParam()), Eq(GetParam()));
}

// clang-format off
INSTANTIATE_TEST_CASE_P(
    StringLiterals, RoundTripLiteralsTest,
    ::testing::ValuesIn(std::vector<std::string>{
        "OpName %1 \"\"\n",           // empty
        "OpName %1 \"foo\"\n",        // normal
        "OpName %1 \"foo bar\"\n",    // string with spaces
        "OpName %1 \"foo\tbar\"\n",   // string with tab
        "OpName %1 \"\tfoo\"\n",      // starts with tab
        "OpName %1 \" foo\"\n",       // starts with space
        "OpName %1 \"foo \"\n",       // ends with space
        "OpName %1 \"foo\t\"\n",       // ends with tab
        "OpName %1 \"foo\nbar\"\n",               // contains newline
        "OpName %1 \"\nfoo\nbar\"\n",             // starts with newline
        "OpName %1 \"\n\n\nfoo\nbar\"\n",         // multiple newlines
        "OpName %1 \"\\\"foo\nbar\\\"\"\n",       // escaped quote
        "OpName %1 \"\\\\foo\nbar\\\\\"\n",       // escaped backslash
        "OpName %1 \"\xE4\xBA\xB2\"\n",             // UTF-8
    }),);
// clang-format on

using RoundTripSpecialCaseLiteralsTest = spvtest::TextToBinaryTestBase<
    ::testing::TestWithParam<std::pair<std::string, std::string>>>;

// Test case where the generated disassembly is not the same as the
// assembly passed in.
TEST_P(RoundTripSpecialCaseLiteralsTest, Sample) {
  EXPECT_THAT(EncodeAndDecodeSuccessfully(std::get<0>(GetParam())),
              Eq(std::get<1>(GetParam())));
}

// clang-format off
INSTANTIATE_TEST_CASE_P(
    StringLiterals, RoundTripSpecialCaseLiteralsTest,
    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
      {"OpName %1 \"\\foo\"\n", "OpName %1 \"foo\"\n"}, // Escape f
      {"OpName %1 \"\\\nfoo\"\n", "OpName %1 \"\nfoo\"\n"}, // Escape newline
      {"OpName %1 \"\\\xE4\xBA\xB2\"\n", "OpName %1 \"\xE4\xBA\xB2\"\n"}, // Escape utf-8
    }),);
// clang-format on

}  // anonymous namespace
