// Copyright 2017 The Cobalt Authors. 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 <limits>

#include "base/stringprintf.h"
#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/derived_dictionary.h"
#include "cobalt/bindings/testing/dictionary_interface.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::_;
using ::testing::SaveArg;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef InterfaceBindingsTest<DictionaryInterface> DictionaryTest;
}  // namespace

TEST_F(DictionaryTest, NoValuesSet) {
  TestDictionary dictionary;
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript("test.dictionaryOperation({});", NULL));
  EXPECT_FALSE(dictionary.has_non_default_member());
  ASSERT_TRUE(dictionary.has_member_with_default());
  EXPECT_EQ(5, dictionary.member_with_default());

  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript("test.dictionaryOperation(undefined);", NULL));
  EXPECT_FALSE(dictionary.has_non_default_member());
  ASSERT_TRUE(dictionary.has_member_with_default());
  EXPECT_EQ(5, dictionary.member_with_default());

  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript("test.dictionaryOperation(null);", NULL));
  EXPECT_FALSE(dictionary.has_non_default_member());
  ASSERT_TRUE(dictionary.has_member_with_default());
  EXPECT_EQ(5, dictionary.member_with_default());
}

TEST_F(DictionaryTest, BooleanMember) {
  TestDictionary dictionary;
  EXPECT_FALSE(dictionary.has_boolean_member());
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {booleanMember : true} );", NULL));
  EXPECT_TRUE(dictionary.has_boolean_member());
  EXPECT_TRUE(dictionary.boolean_member());

  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {booleanMember : false} );", NULL));
  ASSERT_TRUE(dictionary.has_boolean_member());
  EXPECT_FALSE(dictionary.boolean_member());
}

TEST_F(DictionaryTest, ClampMember) {
  TestDictionary dictionary;
  EXPECT_FALSE(dictionary.has_short_clamp_member());
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));

  EXPECT_TRUE(EvaluateScript(
      StringPrintf("test.dictionaryOperation( {shortClampMember : %d } );",
                   std::numeric_limits<int32_t>::max()),
      NULL));
  ASSERT_TRUE(dictionary.has_short_clamp_member());
  EXPECT_EQ(std::numeric_limits<int16_t>::max(),
            dictionary.short_clamp_member());
}

TEST_F(DictionaryTest, LongMember) {
  TestDictionary dictionary;
  EXPECT_FALSE(dictionary.has_long_member());
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {longMember : 123456} );", NULL));
  ASSERT_TRUE(dictionary.has_long_member());
  EXPECT_EQ(123456, dictionary.long_member());
}

TEST_F(DictionaryTest, DoubleMember) {
  TestDictionary dictionary;
  EXPECT_FALSE(dictionary.has_double_member());
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {doubleMember : 123.456} );", NULL));
  ASSERT_TRUE(dictionary.has_double_member());
  EXPECT_EQ(123.456, dictionary.double_member());
}

TEST_F(DictionaryTest, StringMember) {
  TestDictionary dictionary;
  EXPECT_FALSE(dictionary.has_string_member());
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {stringMember : 'Cobalt'} );", NULL));
  ASSERT_TRUE(dictionary.has_string_member());
  EXPECT_EQ("Cobalt", dictionary.string_member());
}

TEST_F(DictionaryTest, ArbitraryInterfaceMember) {
  TestDictionary dictionary;
  EXPECT_FALSE(dictionary.has_interface_member());
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(
      EvaluateScript("test.dictionaryOperation( {interfaceMember : new "
                     "ArbitraryInterface()} );",
                     NULL));
  ASSERT_TRUE(dictionary.has_interface_member());
  EXPECT_TRUE(dictionary.interface_member() != NULL);
}

TEST_F(DictionaryTest, OverrideDefault) {
  TestDictionary dictionary;
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {memberWithDefault : 20} );", NULL));
  EXPECT_EQ(20, dictionary.member_with_default());
}

TEST_F(DictionaryTest, AnyMember) {
  TestDictionary dictionary;
  EXPECT_FALSE(dictionary.has_any_member());
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {anyMember : new ArbitraryInterface()} );",
      NULL));
  ASSERT_TRUE(dictionary.has_any_member());
  EXPECT_TRUE(dictionary.any_member() != NULL);

  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.dictionaryOperation( {anyMember : {'foo':'bar'}} );", NULL));
  ASSERT_TRUE(dictionary.has_any_member());
  EXPECT_TRUE(dictionary.any_member() != NULL);
}

TEST_F(DictionaryTest, OverrideAnyMemberWithDefault) {
  TestDictionary dictionary;
  EXPECT_TRUE(dictionary.has_any_member_with_default());
  EXPECT_TRUE(dictionary.any_member_with_default() == NULL);
  EXPECT_CALL(test_mock(), DictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(
      EvaluateScript("test.dictionaryOperation( {anyMemberWithDefault : new "
                     "ArbitraryInterface()} );",
                     NULL));
  ASSERT_TRUE(dictionary.has_any_member_with_default());
  EXPECT_TRUE(dictionary.any_member_with_default() != NULL);
}

TEST_F(DictionaryTest, DerivedDictionaryMember) {
  DerivedDictionary dictionary;
  EXPECT_CALL(test_mock(), DerivedDictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.derivedDictionaryOperation( {additionalMember : true} );", NULL));
  EXPECT_TRUE(dictionary.additional_member());
}

TEST_F(DictionaryTest, BaseDictionaryMemberOfDerivedDictionary) {
  DerivedDictionary dictionary;
  EXPECT_CALL(test_mock(), DerivedDictionaryOperation(_))
      .WillOnce(SaveArg<0>(&dictionary));
  EXPECT_TRUE(EvaluateScript(
      "test.derivedDictionaryOperation( {memberWithDefault : 25} );", NULL));
  EXPECT_EQ(25, dictionary.member_with_default());
}

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