// Copyright (c) 2015 Marshall A. Greenblatt. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ---------------------------------------------------------------------------
//
// The contents of this file must follow a specific format in order to
// support the CEF translator tool. See the translator.README.txt file in the
// tools directory for more information.
//
// THIS FILE IS FOR TESTING PURPOSES ONLY.
//
// The APIs defined in this file are for testing purposes only. They should only
// be included from unit test targets.
//

#ifndef CEF_INCLUDE_TEST_CEF_TEST_H_
#define CEF_INCLUDE_TEST_CEF_TEST_H_
#pragma once

#if !defined(BUILDING_CEF_SHARED) && !defined(WRAPPING_CEF_SHARED) && \
    !defined(UNIT_TEST)
#error This file can be included for unit tests only
#endif

#include <map>
#include <vector>

#include "include/cef_base.h"

class CefTranslatorTestRefPtrClient;
class CefTranslatorTestRefPtrClientChild;
class CefTranslatorTestRefPtrLibrary;
class CefTranslatorTestRefPtrLibraryChild;
class CefTranslatorTestScopedClient;
class CefTranslatorTestScopedClientChild;
class CefTranslatorTestScopedLibrary;
class CefTranslatorTestScopedLibraryChild;

// Test values.
#define TEST_INT_VAL 5
#define TEST_INT_VAL2 60
#define TEST_BOOL_VAL true
#define TEST_DOUBLE_VAL 4.543
#define TEST_LONG_VAL -65
#define TEST_SIZET_VAL 3U
#define TEST_STRING_VAL "My test string"
#define TEST_STRING_VAL2 "My 2nd test string"
#define TEST_STRING_VAL3 "My 3rd test string"
#define TEST_STRING_KEY "key0"
#define TEST_STRING_KEY2 "key1"
#define TEST_STRING_KEY3 "key2"
#define TEST_X_VAL 44
#define TEST_Y_VAL 754
#define TEST_X_VAL2 900
#define TEST_Y_VAL2 300

///
// Class for testing all of the possible data transfer types.
///
/*--cef(source=library)--*/
class CefTranslatorTest : public CefBaseRefCounted {
 public:
  ///
  // Create the test object.
  ///
  /*--cef()--*/
  static CefRefPtr<CefTranslatorTest> Create();

  // PRIMITIVE VALUES

  ///
  // Return a void value.
  ///
  /*--cef()--*/
  virtual void GetVoid() = 0;

  ///
  // Return a bool value.
  ///
  /*--cef()--*/
  virtual bool GetBool() = 0;

  ///
  // Return an int value.
  ///
  /*--cef()--*/
  virtual int GetInt() = 0;

  ///
  // Return a double value.
  ///
  /*--cef()--*/
  virtual double GetDouble() = 0;

  ///
  // Return a long value.
  ///
  /*--cef()--*/
  virtual long GetLong() = 0;

  ///
  // Return a size_t value.
  ///
  /*--cef()--*/
  virtual size_t GetSizet() = 0;

  ///
  // Set a void value.
  ///
  /*--cef()--*/
  virtual bool SetVoid() = 0;

  ///
  // Set a bool value.
  ///
  /*--cef()--*/
  virtual bool SetBool(bool val) = 0;

  ///
  // Set an int value.
  ///
  /*--cef()--*/
  virtual bool SetInt(int val) = 0;

  ///
  // Set a double value.
  ///
  /*--cef()--*/
  virtual bool SetDouble(double val) = 0;

  ///
  // Set a long value.
  ///
  /*--cef()--*/
  virtual bool SetLong(long val) = 0;

  ///
  // Set a size_t value.
  ///
  /*--cef()--*/
  virtual bool SetSizet(size_t val) = 0;

  // PRIMITIVE LIST VALUES

  // Test both with and without a typedef.
  typedef std::vector<int> IntList;

  ///
  // Set a int list value.
  ///
  /*--cef()--*/
  virtual bool SetIntList(const std::vector<int>& val) = 0;

  ///
  // Return an int list value by out-param.
  ///
  /*--cef(count_func=val:GetIntListSize)--*/
  virtual bool GetIntListByRef(IntList& val) = 0;

  ///
  // Return the number of points that will be output above.
  ///
  /*--cef()--*/
  virtual size_t GetIntListSize() = 0;

  // STRING VALUES

  ///
  // Return a string value.
  ///
  /*--cef()--*/
  virtual CefString GetString() = 0;

  ///
  // Set a string value.
  ///
  /*--cef()--*/
  virtual bool SetString(const CefString& val) = 0;

  ///
  // Return a string value by out-param.
  ///
  /*--cef()--*/
  virtual void GetStringByRef(CefString& val) = 0;

  // STRING LIST VALUES

  // Test both with and without a typedef.
  typedef std::vector<CefString> StringList;

  ///
  // Set a string list value.
  ///
  /*--cef()--*/
  virtual bool SetStringList(const std::vector<CefString>& val) = 0;

  ///
  // Return a string list value by out-param.
  ///
  /*--cef()--*/
  virtual bool GetStringListByRef(StringList& val) = 0;

  // STRING MAP VALUES

  // Test both with and without a typedef.
  typedef std::map<CefString, CefString> StringMap;

  ///
  // Set a string map value.
  ///
  /*--cef()--*/
  virtual bool SetStringMap(const StringMap& val) = 0;

  ///
  // Return a string map value by out-param.
  ///
  /*--cef()--*/
  virtual bool GetStringMapByRef(std::map<CefString, CefString>& val) = 0;

  // STRING MULTIMAP VALUES

  // Test both with and without a typedef.
  typedef std::multimap<CefString, CefString> StringMultimap;

  ///
  // Set a string multimap value.
  ///
  /*--cef()--*/
  virtual bool SetStringMultimap(
      const std::multimap<CefString, CefString>& val) = 0;

  ///
  // Return a string multimap value by out-param.
  ///
  /*--cef()--*/
  virtual bool GetStringMultimapByRef(StringMultimap& val) = 0;

  // STRUCT VALUES

  ///
  // Return a point value.
  ///
  /*--cef()--*/
  virtual CefPoint GetPoint() = 0;

  ///
  // Set a point value.
  ///
  /*--cef()--*/
  virtual bool SetPoint(const CefPoint& val) = 0;

  ///
  // Return a point value by out-param.
  ///
  /*--cef()--*/
  virtual void GetPointByRef(CefPoint& val) = 0;

  // STRUCT LIST VALUES

  // Test both with and without a typedef.
  typedef std::vector<CefPoint> PointList;

  ///
  // Set a point list vlaue.
  ///
  /*--cef()--*/
  virtual bool SetPointList(const std::vector<CefPoint>& val) = 0;

  ///
  // Return a point list value by out-param.
  ///
  /*--cef(count_func=val:GetPointListSize)--*/
  virtual bool GetPointListByRef(PointList& val) = 0;

  ///
  // Return the number of points that will be output above.
  ///
  /*--cef()--*/
  virtual size_t GetPointListSize() = 0;

  // LIBRARY-SIDE REFPTR VALUES

  ///
  // Return an new library-side object.
  ///
  /*--cef()--*/
  virtual CefRefPtr<CefTranslatorTestRefPtrLibrary> GetRefPtrLibrary(
      int val) = 0;

  ///
  // Set an object. Returns the value from
  // CefTranslatorTestRefPtrLibrary::GetValue().
  // This tests input and execution of a library-side object type.
  ///
  /*--cef()--*/
  virtual int SetRefPtrLibrary(
      CefRefPtr<CefTranslatorTestRefPtrLibrary> val) = 0;

  ///
  // Set an object. Returns the object passed in. This tests input and output
  // of a library-side object type.
  ///
  /*--cef()--*/
  virtual CefRefPtr<CefTranslatorTestRefPtrLibrary> SetRefPtrLibraryAndReturn(
      CefRefPtr<CefTranslatorTestRefPtrLibrary> val) = 0;

  ///
  // Set a child object. Returns the value from
  // CefTranslatorTestRefPtrLibrary::GetValue(). This tests input of a library-
  // side child object type and execution as the parent type.
  ///
  /*--cef()--*/
  virtual int SetChildRefPtrLibrary(
      CefRefPtr<CefTranslatorTestRefPtrLibraryChild> val) = 0;

  ///
  // Set a child object. Returns the object as the parent type. This tests input
  // of a library-side child object type and return as the parent type.
  ///
  /*--cef()--*/
  virtual CefRefPtr<CefTranslatorTestRefPtrLibrary>
  SetChildRefPtrLibraryAndReturnParent(
      CefRefPtr<CefTranslatorTestRefPtrLibraryChild> val) = 0;

  // LIBRARY-SIDE REFPTR LIST VALUES

  // Test both with and without a typedef.
  typedef std::vector<CefRefPtr<CefTranslatorTestRefPtrLibrary>>
      RefPtrLibraryList;

  ///
  // Set an object list vlaue.
  ///
  /*--cef()--*/
  virtual bool SetRefPtrLibraryList(
      const std::vector<CefRefPtr<CefTranslatorTestRefPtrLibrary>>& val,
      int val1,
      int val2) = 0;

  ///
  // Return an object list value by out-param.
  ///
  /*--cef(count_func=val:GetRefPtrLibraryListSize)--*/
  virtual bool GetRefPtrLibraryListByRef(RefPtrLibraryList& val,
                                         int val1,
                                         int val2) = 0;

  ///
  // Return the number of object that will be output above.
  ///
  /*--cef()--*/
  virtual size_t GetRefPtrLibraryListSize() = 0;

  // CLIENT-SIDE REFPTR VALUES

  ///
  // Set an object. Returns the value from
  // CefTranslatorTestRefPtrClient::GetValue().
  // This tests input and execution of a client-side object type.
  ///
  /*--cef()--*/
  virtual int SetRefPtrClient(CefRefPtr<CefTranslatorTestRefPtrClient> val) = 0;

  ///
  // Set an object. Returns the handler passed in. This tests input and output
  // of a client-side object type.
  ///
  /*--cef()--*/
  virtual CefRefPtr<CefTranslatorTestRefPtrClient> SetRefPtrClientAndReturn(
      CefRefPtr<CefTranslatorTestRefPtrClient> val) = 0;

  ///
  // Set a child object. Returns the value from
  // CefTranslatorTestRefPtrClient::GetValue(). This tests input of a client-
  // side child object type and execution as the parent type.
  ///
  /*--cef()--*/
  virtual int SetChildRefPtrClient(
      CefRefPtr<CefTranslatorTestRefPtrClientChild> val) = 0;

  ///
  // Set a child object. Returns the object as the parent type. This tests
  // input of a client-side child object type and return as the parent type.
  ///
  /*--cef()--*/
  virtual CefRefPtr<CefTranslatorTestRefPtrClient>
  SetChildRefPtrClientAndReturnParent(
      CefRefPtr<CefTranslatorTestRefPtrClientChild> val) = 0;

  // CLIENT-SIDE REFPTR LIST VALUES

  // Test both with and without a typedef.
  typedef std::vector<CefRefPtr<CefTranslatorTestRefPtrClient>>
      RefPtrClientList;

  ///
  // Set an object list vlaue.
  ///
  /*--cef()--*/
  virtual bool SetRefPtrClientList(
      const std::vector<CefRefPtr<CefTranslatorTestRefPtrClient>>& val,
      int val1,
      int val2) = 0;

  ///
  // Return an object list value by out-param.
  ///
  /*--cef(count_func=val:GetRefPtrLibraryListSize)--*/
  virtual bool GetRefPtrClientListByRef(
      RefPtrClientList& val,
      CefRefPtr<CefTranslatorTestRefPtrClient> val1,
      CefRefPtr<CefTranslatorTestRefPtrClient> val2) = 0;

  ///
  // Return the number of object that will be output above.
  ///
  /*--cef()--*/
  virtual size_t GetRefPtrClientListSize() = 0;

  // LIBRARY-SIDE OWNPTR VALUES

  ///
  // Return an new library-side object.
  ///
  /*--cef()--*/
  virtual CefOwnPtr<CefTranslatorTestScopedLibrary> GetOwnPtrLibrary(
      int val) = 0;

  ///
  // Set an object. Returns the value from
  // CefTranslatorTestScopedLibrary::GetValue().
  // This tests input and execution of a library-side object type.
  ///
  /*--cef()--*/
  virtual int SetOwnPtrLibrary(
      CefOwnPtr<CefTranslatorTestScopedLibrary> val) = 0;

  ///
  // Set an object. Returns the object passed in. This tests input and output
  // of a library-side object type.
  ///
  /*--cef()--*/
  virtual CefOwnPtr<CefTranslatorTestScopedLibrary> SetOwnPtrLibraryAndReturn(
      CefOwnPtr<CefTranslatorTestScopedLibrary> val) = 0;

  ///
  // Set a child object. Returns the value from
  // CefTranslatorTestScopedLibrary::GetValue(). This tests input of a library-
  // side child object type and execution as the parent type.
  ///
  /*--cef()--*/
  virtual int SetChildOwnPtrLibrary(
      CefOwnPtr<CefTranslatorTestScopedLibraryChild> val) = 0;

  ///
  // Set a child object. Returns the object as the parent type. This tests input
  // of a library-side child object type and return as the parent type.
  ///
  /*--cef()--*/
  virtual CefOwnPtr<CefTranslatorTestScopedLibrary>
  SetChildOwnPtrLibraryAndReturnParent(
      CefOwnPtr<CefTranslatorTestScopedLibraryChild> val) = 0;

  // CLIENT-SIDE OWNPTR VALUES

  ///
  // Set an object. Returns the value from
  // CefTranslatorTestScopedClient::GetValue().
  // This tests input and execution of a client-side object type.
  ///
  /*--cef()--*/
  virtual int SetOwnPtrClient(CefOwnPtr<CefTranslatorTestScopedClient> val) = 0;

  ///
  // Set an object. Returns the handler passed in. This tests input and output
  // of a client-side object type.
  ///
  /*--cef()--*/
  virtual CefOwnPtr<CefTranslatorTestScopedClient> SetOwnPtrClientAndReturn(
      CefOwnPtr<CefTranslatorTestScopedClient> val) = 0;

  ///
  // Set a child object. Returns the value from
  // CefTranslatorTestScopedClient::GetValue(). This tests input of a client-
  // side child object type and execution as the parent type.
  ///
  /*--cef()--*/
  virtual int SetChildOwnPtrClient(
      CefOwnPtr<CefTranslatorTestScopedClientChild> val) = 0;

  ///
  // Set a child object. Returns the object as the parent type. This tests
  // input of a client-side child object type and return as the parent type.
  ///
  /*--cef()--*/
  virtual CefOwnPtr<CefTranslatorTestScopedClient>
  SetChildOwnPtrClientAndReturnParent(
      CefOwnPtr<CefTranslatorTestScopedClientChild> val) = 0;

  // LIBRARY-SIDE RAWPTR VALUES

  ///
  // Set an object. Returns the value from
  // CefTranslatorTestScopedLibrary::GetValue().
  // This tests input and execution of a library-side object type.
  ///
  /*--cef()--*/
  virtual int SetRawPtrLibrary(
      CefRawPtr<CefTranslatorTestScopedLibrary> val) = 0;

  ///
  // Set a child object. Returns the value from
  // CefTranslatorTestScopedLibrary::GetValue(). This tests input of a library-
  // side child object type and execution as the parent type.
  ///
  /*--cef()--*/
  virtual int SetChildRawPtrLibrary(
      CefRawPtr<CefTranslatorTestScopedLibraryChild> val) = 0;

  // LIBRARY-SIDE RAWPTR LIST VALUES

  // Test both with and without a typedef.
  typedef std::vector<CefRawPtr<CefTranslatorTestScopedLibrary>>
      RawPtrLibraryList;

  ///
  // Set an object list vlaue.
  ///
  /*--cef()--*/
  virtual bool SetRawPtrLibraryList(
      const std::vector<CefRawPtr<CefTranslatorTestScopedLibrary>>& val,
      int val1,
      int val2) = 0;

  // CLIENT-SIDE RAWPTR VALUES

  ///
  // Set an object. Returns the value from
  // CefTranslatorTestScopedClient::GetValue().
  // This tests input and execution of a client-side object type.
  ///
  /*--cef()--*/
  virtual int SetRawPtrClient(CefRawPtr<CefTranslatorTestScopedClient> val) = 0;

  ///
  // Set a child object. Returns the value from
  // CefTranslatorTestScopedClient::GetValue(). This tests input of a client-
  // side child object type and execution as the parent type.
  ///
  /*--cef()--*/
  virtual int SetChildRawPtrClient(
      CefRawPtr<CefTranslatorTestScopedClientChild> val) = 0;

  // CLIENT-SIDE RAWPTR LIST VALUES

  // Test both with and without a typedef.
  typedef std::vector<CefRawPtr<CefTranslatorTestScopedClient>>
      RawPtrClientList;

  ///
  // Set an object list vlaue.
  ///
  /*--cef()--*/
  virtual bool SetRawPtrClientList(
      const std::vector<CefRawPtr<CefTranslatorTestScopedClient>>& val,
      int val1,
      int val2) = 0;
};

///
// Library-side test object for RefPtr.
///
/*--cef(source=library)--*/
class CefTranslatorTestRefPtrLibrary : public CefBaseRefCounted {
 public:
  ///
  // Create the test object.
  ///
  /*--cef()--*/
  static CefRefPtr<CefTranslatorTestRefPtrLibrary> Create(int value);

  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetValue() = 0;

  ///
  // Set a value.
  ///
  /*--cef()--*/
  virtual void SetValue(int value) = 0;
};

///
// Library-side child test object for RefPtr.
///
/*--cef(source=library)--*/
class CefTranslatorTestRefPtrLibraryChild
    : public CefTranslatorTestRefPtrLibrary {
 public:
  ///
  // Create the test object.
  ///
  /*--cef()--*/
  static CefRefPtr<CefTranslatorTestRefPtrLibraryChild> Create(int value,
                                                               int other_value);

  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetOtherValue() = 0;

  ///
  // Set a value.
  ///
  /*--cef()--*/
  virtual void SetOtherValue(int value) = 0;
};

///
// Another library-side child test object for RefPtr.
///
/*--cef(source=library)--*/
class CefTranslatorTestRefPtrLibraryChildChild
    : public CefTranslatorTestRefPtrLibraryChild {
 public:
  ///
  // Create the test object.
  ///
  /*--cef()--*/
  static CefRefPtr<CefTranslatorTestRefPtrLibraryChildChild>
  Create(int value, int other_value, int other_other_value);

  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetOtherOtherValue() = 0;

  ///
  // Set a value.
  ///
  /*--cef()--*/
  virtual void SetOtherOtherValue(int value) = 0;
};

///
// Client-side test object for RefPtr.
///
/*--cef(source=client)--*/
class CefTranslatorTestRefPtrClient : public virtual CefBaseRefCounted {
 public:
  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetValue() = 0;
};

///
// Client-side child test object for RefPtr.
///
/*--cef(source=client)--*/
class CefTranslatorTestRefPtrClientChild
    : public CefTranslatorTestRefPtrClient {
 public:
  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetOtherValue() = 0;
};

///
// Library-side test object for OwnPtr/RawPtr.
///
/*--cef(source=library)--*/
class CefTranslatorTestScopedLibrary : public CefBaseScoped {
 public:
  ///
  // Create the test object.
  ///
  /*--cef()--*/
  static CefOwnPtr<CefTranslatorTestScopedLibrary> Create(int value);

  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetValue() = 0;

  ///
  // Set a value.
  ///
  /*--cef()--*/
  virtual void SetValue(int value) = 0;
};

///
// Library-side child test object for OwnPtr/RawPtr.
///
/*--cef(source=library)--*/
class CefTranslatorTestScopedLibraryChild
    : public CefTranslatorTestScopedLibrary {
 public:
  ///
  // Create the test object.
  ///
  /*--cef()--*/
  static CefOwnPtr<CefTranslatorTestScopedLibraryChild> Create(int value,
                                                               int other_value);

  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetOtherValue() = 0;

  ///
  // Set a value.
  ///
  /*--cef()--*/
  virtual void SetOtherValue(int value) = 0;
};

///
// Another library-side child test object for OwnPtr/RawPtr.
///
/*--cef(source=library)--*/
class CefTranslatorTestScopedLibraryChildChild
    : public CefTranslatorTestScopedLibraryChild {
 public:
  ///
  // Create the test object.
  ///
  /*--cef()--*/
  static CefOwnPtr<CefTranslatorTestScopedLibraryChildChild>
  Create(int value, int other_value, int other_other_value);

  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetOtherOtherValue() = 0;

  ///
  // Set a value.
  ///
  /*--cef()--*/
  virtual void SetOtherOtherValue(int value) = 0;
};

///
// Client-side test object for OwnPtr/RawPtr.
///
/*--cef(source=client)--*/
class CefTranslatorTestScopedClient : public virtual CefBaseScoped {
 public:
  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetValue() = 0;
};

///
// Client-side child test object for OwnPtr/RawPtr.
///
/*--cef(source=client)--*/
class CefTranslatorTestScopedClientChild
    : public CefTranslatorTestScopedClient {
 public:
  ///
  // Return a value.
  ///
  /*--cef()--*/
  virtual int GetOtherValue() = 0;
};

#endif  // CEF_INCLUDE_TEST_CEF_TEST_H_
