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

#ifndef COBALT_BINDINGS_TESTING_NUMERIC_TYPES_TEST_INTERFACE_H_
#define COBALT_BINDINGS_TESTING_NUMERIC_TYPES_TEST_INTERFACE_H_

#include <limits>

#include "cobalt/script/wrappable.h"
#include "testing/gmock/include/gmock/gmock.h"

namespace cobalt {
namespace bindings {
namespace testing {

class NumericTypesTestInterface : public script::Wrappable {
 public:
  virtual int8_t ByteReturnOperation() { return 0; }
  virtual void ByteArgumentOperation(int8_t value) {}
  virtual int8_t byte_property() { return 0; }
  virtual void set_byte_property(int8_t value) {}
  virtual int8_t byte_clamp_property() { return 0; }
  virtual void set_byte_clamp_property(int8_t value) {}

  virtual uint8_t OctetReturnOperation() { return 0; }
  virtual void OctetArgumentOperation(uint8_t value) {}
  virtual uint8_t octet_property() { return 0; }
  virtual void set_octet_property(uint8_t value) {}
  virtual uint8_t octet_clamp_property() { return 0; }
  virtual void set_octet_clamp_property(uint8_t value) {}

  virtual int16_t ShortReturnOperation() { return 0; }
  virtual void ShortArgumentOperation(int16_t value) {}
  virtual int16_t short_property() { return 0; }
  virtual void set_short_property(int16_t value) {}
  virtual int16_t short_clamp_property() { return 0; }
  virtual void set_short_clamp_property(int16_t value) {}

  virtual uint16_t UnsignedShortReturnOperation() { return 0; }
  virtual void UnsignedShortArgumentOperation(uint16_t value) {}
  virtual uint16_t unsigned_short_property() { return 0; }
  virtual void set_unsigned_short_property(uint16_t value) {}
  virtual uint16_t unsigned_short_clamp_property() { return 0; }
  virtual void set_unsigned_short_clamp_property(uint16_t value) {}

  virtual int32_t LongReturnOperation() { return 0; }
  virtual void LongArgumentOperation(int32_t value) {}
  virtual int32_t long_property() { return 0; }
  virtual void set_long_property(int32_t value) {}
  virtual int32_t long_clamp_property() { return 0; }
  virtual void set_long_clamp_property(int32_t value) {}

  virtual uint32_t UnsignedLongReturnOperation() { return 0; }
  virtual void UnsignedLongArgumentOperation(uint32_t value) {}
  virtual uint32_t unsigned_long_property() { return 0; }
  virtual void set_unsigned_long_property(uint32_t value) {}
  virtual uint32_t unsigned_long_clamp_property() { return 0; }
  virtual void set_unsigned_long_clamp_property(uint32_t value) {}

  virtual int64_t LongLongReturnOperation() { return 0; }
  virtual void LongLongArgumentOperation(int64_t value) {}
  virtual int64_t long_long_property() { return 0; }
  virtual void set_long_long_property(int64_t value) {}
  virtual int64_t long_long_clamp_property() { return 0; }
  virtual void set_long_long_clamp_property(int64_t value) {}

  virtual uint64_t UnsignedLongLongReturnOperation() { return 0; }
  virtual void UnsignedLongLongArgumentOperation(uint64_t value) {}
  virtual uint64_t unsigned_long_long_property() { return 0; }
  virtual void set_unsigned_long_long_property(uint64_t value) {}
  virtual uint64_t unsigned_long_long_clamp_property() { return 0; }
  virtual void set_unsigned_long_long_clamp_property(uint64_t value) {}

  virtual double DoubleReturnOperation() { return 0; }
  virtual void DoubleArgumentOperation(double value) {}
  virtual double double_property() { return 0; }
  virtual void set_double_property(double value) {}

  virtual double UnrestrictedDoubleReturnOperation() { return 0; }
  virtual void UnrestrictedDoubleArgumentOperation(double value) {}
  virtual double unrestricted_double_property() { return 0; }
  virtual void set_unrestricted_double_property(double value) {}

  DEFINE_WRAPPABLE_TYPE(NumericTypesTestInterface);
};

// Inheriting from an instantiation of this class allows for the mocking
// and testing of one type, while returning default values for the ones that
// are not being tested.
// Since the mock function names are the same for every type, expectations can
// be set in TYPED_TEST cases without needing to change the name of the
// mock function.
template <typename T>
class NumericTypesTestInterfaceT : public NumericTypesTestInterface {
 public:
  MOCK_METHOD0_T(MockReturnValueOperation, T());
  MOCK_METHOD1_T(MockArgumentOperation, void(T));
  MOCK_METHOD0_T(mock_get_property, T());
  MOCK_METHOD1_T(mock_set_property, void(T));

  typedef T BaseType;
};

class ByteTypeTest : public NumericTypesTestInterfaceT<int8_t> {
 public:
  int8_t ByteReturnOperation() OVERRIDE { return MockReturnValueOperation(); }
  void ByteArgumentOperation(int8_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  int8_t byte_property() OVERRIDE { return mock_get_property(); }
  void set_byte_property(int8_t value) OVERRIDE { mock_set_property(value); }
  int8_t byte_clamp_property() OVERRIDE { return mock_get_property(); }
  void set_byte_clamp_property(int8_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "byte"; }
  static int8_t max_value() { return 127; }
  static int8_t min_value() { return -128; }
  static const char* max_value_string() { return "127"; }
  static const char* min_value_string() { return "-128"; }
};

class OctetTypeTest : public NumericTypesTestInterfaceT<uint8_t> {
 public:
  uint8_t OctetReturnOperation() OVERRIDE { return MockReturnValueOperation(); }
  void OctetArgumentOperation(uint8_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  uint8_t octet_property() OVERRIDE { return mock_get_property(); }
  void set_octet_property(uint8_t value) OVERRIDE { mock_set_property(value); }
  uint8_t octet_clamp_property() OVERRIDE { return mock_get_property(); }
  void set_octet_clamp_property(uint8_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "octet"; }
  static uint8_t max_value() { return 255; }
  static uint8_t min_value() { return 0; }
  static const char* max_value_string() { return "255"; }
  static const char* min_value_string() { return "0"; }
};

class ShortTypeTest : public NumericTypesTestInterfaceT<int16_t> {
 public:
  int16_t ShortReturnOperation() OVERRIDE { return MockReturnValueOperation(); }
  void ShortArgumentOperation(int16_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  int16_t short_property() OVERRIDE { return mock_get_property(); }
  void set_short_property(int16_t value) OVERRIDE { mock_set_property(value); }
  int16_t short_clamp_property() OVERRIDE { return mock_get_property(); }
  void set_short_clamp_property(int16_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "short"; }
  static int16_t max_value() { return 32767; }
  static int16_t min_value() { return -32768; }
  static const char* max_value_string() { return "32767"; }
  static const char* min_value_string() { return "-32768"; }
};

class UnsignedShortTypeTest : public NumericTypesTestInterfaceT<uint16_t> {
 public:
  uint16_t UnsignedShortReturnOperation() OVERRIDE {
    return MockReturnValueOperation();
  }
  void UnsignedShortArgumentOperation(uint16_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  uint16_t unsigned_short_property() OVERRIDE { return mock_get_property(); }
  void set_unsigned_short_property(uint16_t value) OVERRIDE {
    mock_set_property(value);
  }
  uint16_t unsigned_short_clamp_property() OVERRIDE {
    return mock_get_property();
  }
  void set_unsigned_short_clamp_property(uint16_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "unsignedShort"; }
  static uint16_t max_value() { return 65535; }
  static uint16_t min_value() { return 0; }
  static const char* max_value_string() { return "65535"; }
  static const char* min_value_string() { return "0"; }
};

class LongTypeTest : public NumericTypesTestInterfaceT<int32_t> {
 public:
  int32_t LongReturnOperation() OVERRIDE { return MockReturnValueOperation(); }
  void LongArgumentOperation(int32_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  int32_t long_property() OVERRIDE { return mock_get_property(); }
  void set_long_property(int32_t value) OVERRIDE { mock_set_property(value); }
  int32_t long_clamp_property() OVERRIDE { return mock_get_property(); }
  void set_long_clamp_property(int32_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "long"; }
  static int32_t max_value() { return 2147483647; }
  static int32_t min_value() {
    // The minimum integer value cannot be written as -2147483648,
    // see https://msdn.microsoft.com/en-us/library/4kh09110.aspx for details.
    // Express it as a 64-bit integer literal and static_cast to int32_t.
    return static_cast<int32_t>(-2147483648ll);
  }
  static const char* max_value_string() { return "2147483647"; }
  static const char* min_value_string() { return "-2147483648"; }
};

class UnsignedLongTypeTest : public NumericTypesTestInterfaceT<uint32_t> {
 public:
  uint32_t UnsignedLongReturnOperation() OVERRIDE {
    return MockReturnValueOperation();
  }
  void UnsignedLongArgumentOperation(uint32_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  uint32_t unsigned_long_property() OVERRIDE { return mock_get_property(); }
  void set_unsigned_long_property(uint32_t value) OVERRIDE {
    mock_set_property(value);
  }
  uint32_t unsigned_long_clamp_property() OVERRIDE {
    return mock_get_property();
  }
  void set_unsigned_long_clamp_property(uint32_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "unsignedLong"; }
  static uint32_t max_value() { return 4294967295; }
  static uint32_t min_value() { return 0; }
  static const char* max_value_string() { return "4294967295"; }
  static const char* min_value_string() { return "0"; }
};

#if defined(ENGINE_SUPPORTS_INT64)
class LongLongTypeTest : public NumericTypesTestInterfaceT<int64_t> {
 public:
  int64_t LongLongReturnOperation() OVERRIDE {
    return MockReturnValueOperation();
  }
  void LongLongArgumentOperation(int64_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  int64_t long_long_property() OVERRIDE { return mock_get_property(); }
  void set_long_long_property(int64_t value) OVERRIDE {
    mock_set_property(value);
  }
  int64_t long_long_clamp_property() OVERRIDE { return mock_get_property(); }
  void set_long_long_clamp_property(int64_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "longLong"; }
  static int64_t max_value() { return 9223372036854775807ll; }
  static int64_t min_value() { return -9223372036854775807ll - 1; }
  // This is what 9223372036854775807 maps to in javascript.
  static const char* max_value_string() { return "9223372036854776000"; }
  static const char* min_value_string() { return "-9223372036854776000"; }
};

class UnsignedLongLongTypeTest : public NumericTypesTestInterfaceT<uint64_t> {
 public:
  uint64_t UnsignedLongLongReturnOperation() OVERRIDE {
    return MockReturnValueOperation();
  }
  void UnsignedLongLongArgumentOperation(uint64_t value) OVERRIDE {
    MockArgumentOperation(value);
  }
  uint64_t unsigned_long_long_property() OVERRIDE {
    return mock_get_property();
  }
  void set_unsigned_long_long_property(uint64_t value) OVERRIDE {
    mock_set_property(value);
  }
  uint64_t unsigned_long_long_clamp_property() OVERRIDE {
    return mock_get_property();
  }
  void set_unsigned_long_long_clamp_property(uint64_t value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "unsignedLongLong"; }

  static uint64_t max_value() { return 18446744073709551615ull; }
  static uint64_t min_value() { return 0; }
  // This is what the value 18446744073709551615 maps to in javascript.
  static const char* max_value_string() { return "18446744073709552000"; }
  static const char* min_value_string() { return "0"; }
};
#endif  // ENGINE_SUPPORTS_INT64

class DoubleTypeTest : public NumericTypesTestInterfaceT<double> {
 public:
  double DoubleReturnOperation() OVERRIDE { return MockReturnValueOperation(); }
  void DoubleArgumentOperation(double value) OVERRIDE {
    MockArgumentOperation(value);
  }
  double double_property() OVERRIDE { return mock_get_property(); }
  void set_double_property(double value) OVERRIDE { mock_set_property(value); }

  static const char* type_string() { return "double"; }
  static bool is_restricted() { return true; }
  static double positive_infinity() {
    return std::numeric_limits<double>::infinity();
  }
  static double negative_infinity() { return -positive_infinity(); }
};

class UnrestrictedDoubleTypeTest : public NumericTypesTestInterfaceT<double> {
 public:
  double UnrestrictedDoubleReturnOperation() OVERRIDE {
    return MockReturnValueOperation();
  }
  void UnrestrictedDoubleArgumentOperation(double value) OVERRIDE {
    MockArgumentOperation(value);
  }
  double unrestricted_double_property() OVERRIDE { return mock_get_property(); }
  void set_unrestricted_double_property(double value) OVERRIDE {
    mock_set_property(value);
  }

  static const char* type_string() { return "unrestrictedDouble"; }
  static bool is_restricted() { return false; }
  static double positive_infinity() {
    return std::numeric_limits<double>::infinity();
  }
  static double negative_infinity() { return -positive_infinity(); }
};

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

#endif  // COBALT_BINDINGS_TESTING_NUMERIC_TYPES_TEST_INTERFACE_H_
