/*
 * 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 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 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 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 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 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 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 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 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); }

  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); }

  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); }

  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);
  }

  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); }

  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);
  }

  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);
  }

  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);
  }

  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_
