// Copyright 2017 Google Inc. All Rights Reserved.
//
// 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 "base/logging.h"

#include "cobalt/bindings/testing/arbitrary_interface.h"
#include "cobalt/bindings/testing/base_interface.h"
#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/sequence_user.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::ContainsRegex;

namespace cobalt {
namespace bindings {
namespace testing {
namespace {

class SequenceBindingsTest : public InterfaceBindingsTest<SequenceUser> {};

TEST_F(SequenceBindingsTest, InterfaceSequence) {
  std::string result;

  EXPECT_TRUE(EvaluateScript("test.setInterfaceSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getInterfaceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequence("
                     "    [ new ArbitraryInterface(), "
                     "      new ArbitraryInterface(), "
                     "      new ArbitraryInterface()])",
                     &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getInterfaceSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());

  EXPECT_FALSE(EvaluateScript("test.setInterfaceSequence(7)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setInterfaceSequence(undefined)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setInterfaceSequence(null)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setInterfaceSequence([1])", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setInterfaceSequence(['one'])", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(
      EvaluateScript("test.setInterfaceSequence([new Object()])", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript(
      "test.setInterfaceSequence([new BaseInterface()])", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  // After all that the value should be unchanged, because the function won't be
  // called.
  EXPECT_TRUE(EvaluateScript("test.getInterfaceSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());

  // We should be able to clear it out this way.
  EXPECT_TRUE(EvaluateScript("test.setInterfaceSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getInterfaceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());
}

TEST_F(SequenceBindingsTest, InterfaceSequenceSequenceSequence) {
  std::string result;

  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence([])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence("
                     "    [[[ new ArbitraryInterface(), "
                     "        new ArbitraryInterface(), "
                     "        new ArbitraryInterface() ]]])",
                     &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());
  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence([])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence("
                     "    [[[ new ArbitraryInterface() ], "
                     "      [ new ArbitraryInterface() ], "
                     "      [ new ArbitraryInterface() ]]])",
                     &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());
  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence([])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence("
                     "    [[[ new ArbitraryInterface(), "
                     "        new ArbitraryInterface() ], "
                     "      [ new ArbitraryInterface() ]]])",
                     &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());
  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence([])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence("
                     "    [[[ new ArbitraryInterface() ]], "
                     "     [[ new ArbitraryInterface() ], "
                     "      [ new ArbitraryInterface() ]]])",
                     &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());

  EXPECT_FALSE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence(7)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript(
      "test.setInterfaceSequenceSequenceSequence(undefined)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setInterfaceSequenceSequenceSequence(null)",
                              &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setInterfaceSequenceSequenceSequence([1])",
                              &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript(
      "test.setInterfaceSequenceSequenceSequence(['one'])", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript(
      "test.setInterfaceSequenceSequenceSequence([new Object()])", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript(
      "test.setInterfaceSequenceSequenceSequence([new BaseInterface()])",
      &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  // After all that the value should be unchanged, because the function won't be
  // called.
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());

  // We should be able to clear it out this way.
  EXPECT_TRUE(
      EvaluateScript("test.setInterfaceSequenceSequenceSequence([])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getInterfaceSequenceSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());
}

TEST_F(SequenceBindingsTest, LongSequence) {
  std::string result;
  EXPECT_TRUE(EvaluateScript("test.setLongSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getLongSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(EvaluateScript("test.setLongSequence([99, 88, 77])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getLongSequence()", &result))
      << result;
  EXPECT_STREQ("99,88,77", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setLongSequence([500, 1000, 10000])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getLongSequence()", &result))
      << result;
  EXPECT_STREQ("500,1000,10000", result.c_str());

  EXPECT_FALSE(EvaluateScript("test.setLongSequence(7)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setLongSequence(undefined)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setLongSequence(null)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  // After all that the value should be unchanged.
  EXPECT_TRUE(EvaluateScript("test.getLongSequence()", &result))
      << result;
  EXPECT_STREQ("500,1000,10000", result.c_str());

  // This is true because a string coerces into a number.
  EXPECT_TRUE(EvaluateScript("test.setLongSequence(['321'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getLongSequence()", &result))
      << result;
  EXPECT_STREQ("321", result.c_str());

  // We should be able to clear it out this way.
  EXPECT_TRUE(EvaluateScript("test.setLongSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getLongSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());
}

TEST_F(SequenceBindingsTest, StringSequence) {
  std::string result;
  EXPECT_TRUE(EvaluateScript("test.setStringSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(EvaluateScript("test.setStringSequence(['a'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("a", result.c_str());

  EXPECT_TRUE(EvaluateScript("test.setStringSequence(['a', 'b'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("a,b", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setStringSequence(['a', 'b', 'c'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("a,b,c", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setStringSequence(['!', '@', '#'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("!,@,#", result.c_str());

  EXPECT_FALSE(EvaluateScript("test.setStringSequence(7)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setStringSequence(undefined)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setStringSequence(null)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  // After all that the value should be unchanged, because the function won't be
  // called.
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("!,@,#", result.c_str());

  // These are true because pretty much everything coerces into a string.
  EXPECT_TRUE(EvaluateScript("test.setStringSequence([1])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("1", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setStringSequence([new Object()])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("[object Object]", result.c_str());

  EXPECT_TRUE(EvaluateScript(
      "test.setStringSequence([new ArbitraryInterface()])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("[object ArbitraryInterface]", result.c_str());

  // We should be able to clear it out this way.
  EXPECT_TRUE(EvaluateScript("test.setStringSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());
}

TEST_F(SequenceBindingsTest, StringSequenceSequence) {
  std::string result;
  EXPECT_TRUE(EvaluateScript("test.setStringSequenceSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_FALSE(
      EvaluateScript("test.setStringSequenceSequence(['a'])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.setStringSequenceSequence([['a']])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("a", result.c_str());

  EXPECT_TRUE(EvaluateScript("test.setStringSequenceSequence([['a'], ['b']])",
                             &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("a,b", result.c_str());

  EXPECT_TRUE(EvaluateScript(
      "test.setStringSequenceSequence([['a', 'b'], ['c']])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("a,b,c", result.c_str());

  EXPECT_TRUE(EvaluateScript(
      "test.setStringSequenceSequence([['!', '@', '#']])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("!,@,#", result.c_str());

  EXPECT_FALSE(EvaluateScript("test.setStringSequenceSequence(7)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(
      EvaluateScript("test.setStringSequenceSequence(undefined)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setStringSequenceSequence(null)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setStringSequenceSequence([1])", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  // After all that the value should be unchanged, because the function won't be
  // called.
  EXPECT_TRUE(EvaluateScript("test.getStringSequenceSequence()", &result))
      << result;
  EXPECT_STREQ("!,@,#", result.c_str());

  // We should be able to clear it out this way.
  EXPECT_TRUE(EvaluateScript("test.setStringSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getStringSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());
}

TEST_F(SequenceBindingsTest, UnionOfStringAndStringSequence) {
  std::string result;
  EXPECT_TRUE(
      EvaluateScript("test.setUnionOfStringAndStringSequence('')", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setUnionOfStringAndStringSequence(['a'])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("a", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setUnionOfStringAndStringSequence('d')", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("d", result.c_str());

  EXPECT_TRUE(EvaluateScript(
      "test.setUnionOfStringAndStringSequence(['a', 'b'])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("a,b", result.c_str());

  EXPECT_TRUE(EvaluateScript(
      "test.setUnionOfStringAndStringSequence(['a', 'b', 'c'])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("a,b,c", result.c_str());

  // This works because numbers coerce to strings.
  EXPECT_TRUE(EvaluateScript(
      "test.setUnionOfStringAndStringSequence([1, 2, 3])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("1,2,3", result.c_str());

  // Conversion failure cases.
  EXPECT_FALSE(
      EvaluateScript("test.setUnionOfStringAndStringSequence(7)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript(
      "test.setUnionOfStringAndStringSequence(undefined)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(
      EvaluateScript("test.setUnionOfStringAndStringSequence(null)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  // After all that the value should be unchanged, because the function won't be
  // called.
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("1,2,3", result.c_str());

  // We should be able to clear it out this way.
  EXPECT_TRUE(
      EvaluateScript("test.setUnionOfStringAndStringSequence([])", &result))
      << result;
  EXPECT_TRUE(
      EvaluateScript("test.getUnionOfStringAndStringSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());
}

TEST_F(SequenceBindingsTest, SequenceUnion) {
  std::string result;
  EXPECT_TRUE(EvaluateScript("test.setUnionSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());

  EXPECT_TRUE(EvaluateScript("test.setUnionSequence(['a'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ("a", result.c_str());

  EXPECT_TRUE(EvaluateScript("test.setUnionSequence(['a', 'b'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ("a,b", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setUnionSequence(['a', 'b', 'c'])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ("a,b,c", result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setUnionSequence("
                     "    [ new ArbitraryInterface(), "
                     "      new ArbitraryInterface(), "
                     "      new ArbitraryInterface()])",
                     &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ(
      "[object ArbitraryInterface],[object ArbitraryInterface],"
      "[object ArbitraryInterface]",
      result.c_str());

  EXPECT_TRUE(
      EvaluateScript("test.setUnionSequence("
                     "    [ 'a', "
                     "      new ArbitraryInterface(), "
                     "      'c'])",
                     &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ("a,[object ArbitraryInterface],c", result.c_str());

  // Conversion failure cases.
  EXPECT_FALSE(EvaluateScript("test.setUnionSequence(7)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setUnionSequence(undefined)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  EXPECT_FALSE(EvaluateScript("test.setUnionSequence(null)", &result))
      << result;
  EXPECT_THAT(result.c_str(), ContainsRegex("TypeError:"));

  // After all that the value should be unchanged, because the function won't be
  // called.
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ("a,[object ArbitraryInterface],c", result.c_str());

  // We should be able to clear it out this way.
  EXPECT_TRUE(EvaluateScript("test.setUnionSequence([])", &result))
      << result;
  EXPECT_TRUE(EvaluateScript("test.getUnionSequence()", &result))
      << result;
  EXPECT_STREQ("", result.c_str());
}

}  // namespace
}  // namespace testing
}  // namespace bindings
}  // namespace cobalt
