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

#include "pass_utils.h"

namespace {

using namespace spvtools;

TEST(JoinAllInsts, Cases) {
  EXPECT_EQ("", JoinAllInsts({}));
  EXPECT_EQ("a\n", JoinAllInsts({"a"}));
  EXPECT_EQ("a\nb\n", JoinAllInsts({"a", "b"}));
  EXPECT_EQ("a\nb\nc\n", JoinAllInsts({"a", "b", "c"}));
  EXPECT_EQ("hello,\nworld!\n\n\n", JoinAllInsts({"hello,", "world!", "\n"}));
}

TEST(JoinNonDebugInsts, Cases) {
  EXPECT_EQ("", JoinNonDebugInsts({}));
  EXPECT_EQ("a\n", JoinNonDebugInsts({"a"}));
  EXPECT_EQ("", JoinNonDebugInsts({"OpName"}));
  EXPECT_EQ("a\nb\n", JoinNonDebugInsts({"a", "b"}));
  EXPECT_EQ("", JoinNonDebugInsts({"OpName", "%1 = OpString \"42\""}));
  EXPECT_EQ("Opstring\n", JoinNonDebugInsts({"OpName", "Opstring"}));
  EXPECT_EQ("the only remaining string\n",
            JoinNonDebugInsts(
                {"OpSourceContinued", "OpSource", "OpSourceExtension",
                 "lgtm OpName", "hello OpMemberName", "this is a OpString",
                 "lonely OpLine", "happy OpNoLine", "OpModuleProcessed",
                 "the only remaining string"}));
}

namespace {
struct SubstringReplacementTestCase {
  const char* orig_str;
  const char* find_substr;
  const char* replace_substr;
  const char* expected_str;
  bool replace_should_succeed;
};
}
using FindAndReplaceTest =
    ::testing::TestWithParam<SubstringReplacementTestCase>;

TEST_P(FindAndReplaceTest, SubstringReplacement) {
  auto process = std::string(GetParam().orig_str);
  EXPECT_EQ(GetParam().replace_should_succeed,
            FindAndReplace(&process, GetParam().find_substr,
                           GetParam().replace_substr))
      << "Original string: " << GetParam().orig_str
      << " replace: " << GetParam().find_substr
      << " to: " << GetParam().replace_substr
      << " should returns: " << GetParam().replace_should_succeed;
  EXPECT_STREQ(GetParam().expected_str, process.c_str())
      << "Original string: " << GetParam().orig_str
      << " replace: " << GetParam().find_substr
      << " to: " << GetParam().replace_substr
      << " expected string: " << GetParam().expected_str;
}

INSTANTIATE_TEST_CASE_P(
    SubstringReplacement, FindAndReplaceTest,
    ::testing::ValuesIn(std::vector<SubstringReplacementTestCase>({
        // orig string, find substring, replace substring, expected string,
        // replacement happened
        {"", "", "", "", false},
        {"", "b", "", "", false},
        {"", "", "c", "", false},
        {"", "a", "b", "", false},

        {"a", "", "c", "a", false},
        {"a", "b", "c", "a", false},
        {"a", "b", "", "a", false},
        {"a", "a", "", "", true},
        {"a", "a", "b", "b", true},

        {"ab", "a", "b", "bb", true},
        {"ab", "a", "", "b", true},
        {"ab", "b", "", "a", true},
        {"ab", "ab", "", "", true},
        {"ab", "ab", "cd", "cd", true},
        {"bc", "abc", "efg", "bc", false},

        {"abc", "ab", "bc", "bcc", true},
        {"abc", "ab", "", "c", true},
        {"abc", "bc", "", "a", true},
        {"abc", "bc", "d", "ad", true},
        {"abc", "a", "123", "123bc", true},
        {"abc", "ab", "a", "ac", true},
        {"abc", "a", "aab", "aabbc", true},
        {"abc", "abcd", "efg", "abc", false},
    })));
}  // anonymous namespace
