// Copyright 2010-2015, Google Inc.
// 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 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.

#include "renderer/unix/pango_wrapper_interface.h"
#include "renderer/unix/text_renderer.h"
#include "testing/base/public/gmock.h"
#include "testing/base/public/gunit.h"

using ::testing::Expectation;
using ::testing::Return;

namespace mozc {
namespace renderer {
namespace gtk {

class FontSpecMock : public FontSpecInterface {
 public:
  MOCK_CONST_METHOD1(GetFontAlignment, PangoAlignment(FONT_TYPE font_type));
  MOCK_CONST_METHOD1(GetFontAttributes, PangoAttrList *(FONT_TYPE font_type));
  MOCK_CONST_METHOD1(GetFontDescription,
                     const PangoFontDescription *(FONT_TYPE font_type));
  MOCK_METHOD1(Reload, void(const string &font_description));
};

class PangoWrapperMock : public PangoWrapperInterface {
 public:
  MOCK_METHOD3(RendererDrawLayout,
               void(PangoLayoutWrapperInterface *layout, int x, int y));
  MOCK_METHOD0(GetContext, PangoContext *());
  MOCK_METHOD1(CopyAttributes, PangoAttrList *(PangoAttrList *attr));
  MOCK_METHOD1(AttributesUnref, void(PangoAttrList *attr));
};

class PangoLayoutWrapperMock : public PangoLayoutWrapperInterface {
 public:
  MOCK_METHOD1(SetText, void(const string &text));
  MOCK_METHOD1(SetAlignment, void(PangoAlignment align));
  MOCK_METHOD1(SetAttributes, void(PangoAttrList *attr));
  MOCK_METHOD1(SetFontDescription, void(const PangoFontDescription *font_desc));
  MOCK_METHOD1(SetWidth, void(int width));
  MOCK_METHOD1(SetHeight, void(int height));
  MOCK_CONST_METHOD0(GetPixelSize, Size());
  MOCK_METHOD0(GetPangoLayout, PangoLayout *());
};

class TextRendererTest : public testing::Test {
 protected:
  PangoWrapperMock *SetUpPangoMock(TextRenderer *text_renderer) {
    PangoWrapperMock *mock = new PangoWrapperMock();
    text_renderer->pango_.reset(mock);
    return mock;
  }
  FontSpecMock *SetUpFontSpecMock(TextRenderer *text_renderer) {
    FontSpecMock *mock = new FontSpecMock();
    text_renderer->font_spec_.reset(mock);
    return mock;
  }
};

TEST_F(TextRendererTest, GetPixelSizeTest) {
  FontSpecMock *font_spec_mock = new FontSpecMock();
  TextRenderer text_renderer(font_spec_mock);
  PangoWrapperMock *pango_mock = SetUpPangoMock(&text_renderer);

  const string text = "hogehoge";
  PangoLayoutWrapperMock layout_mock;
  PangoAlignment align = PANGO_ALIGN_CENTER;
  PangoAttrList *attributes = reinterpret_cast<PangoAttrList*>(0xabcdef01);
  PangoAttrList *copied_attributes
      = reinterpret_cast<PangoAttrList*>(0x237492);
  PangoFontDescription *font_desc
      = reinterpret_cast<PangoFontDescription*>(0x01abcdef);
  FontSpecInterface::FONT_TYPE font_type
      = FontSpecInterface::FONTSET_FOOTER_LABEL;
  Size size(12, 34);

  Expectation set_text_expectation
      = EXPECT_CALL(layout_mock, SetText(text));
  Expectation set_alignment_expectation
      = EXPECT_CALL(layout_mock, SetAlignment(align));
  Expectation set_attributes
      = EXPECT_CALL(layout_mock, SetAttributes(copied_attributes));
  Expectation set_font_description_expectation
      = EXPECT_CALL(layout_mock, SetFontDescription(font_desc));
  EXPECT_CALL(*font_spec_mock, GetFontAlignment(font_type))
      .WillOnce(Return(align));
  EXPECT_CALL(*font_spec_mock, GetFontAttributes(font_type))
      .WillOnce(Return(attributes));
  EXPECT_CALL(*pango_mock, CopyAttributes(attributes))
      .WillOnce(Return(copied_attributes));
  EXPECT_CALL(*font_spec_mock, GetFontDescription(font_type))
      .WillOnce(Return(font_desc));
  Expectation get_pixel_expectation
      = EXPECT_CALL(layout_mock, GetPixelSize())
          .After(set_text_expectation)
          .After(set_alignment_expectation)
          .After(set_attributes)
          .After(set_font_description_expectation)
          .WillOnce(Return(size));
  EXPECT_CALL(*pango_mock, AttributesUnref(copied_attributes))
      .After(set_attributes);

  Size actual_size
      = text_renderer.TextRenderer::GetPixelSizeInternal(font_type,
                                                         text,
                                                         &layout_mock);
  EXPECT_EQ(actual_size.width, size.width);
  EXPECT_EQ(actual_size.height, size.height);
}

TEST_F(TextRendererTest, GetMultilinePixelSizeTest) {
  FontSpecMock *font_spec_mock = new FontSpecMock();
  TextRenderer text_renderer(font_spec_mock);
  PangoWrapperMock *pango_mock = SetUpPangoMock(&text_renderer);

  const string text = "hogehoge";
  PangoLayoutWrapperMock layout_mock;
  PangoAlignment align = PANGO_ALIGN_CENTER;
  PangoAttrList *attributes = reinterpret_cast<PangoAttrList*>(0xabcdef01);
  PangoAttrList *copied_attributes
      = reinterpret_cast<PangoAttrList*>(0x237492);
  PangoFontDescription *font_desc
      = reinterpret_cast<PangoFontDescription*>(0x01abcdef);
  FontSpecInterface::FONT_TYPE font_type
      = FontSpecInterface::FONTSET_FOOTER_LABEL;
  int width = 12345;
  Size size(12, 34);

  Expectation set_text_expectation
      = EXPECT_CALL(layout_mock, SetText(text));
  Expectation set_alignment_expectation
      = EXPECT_CALL(layout_mock, SetAlignment(align));
  Expectation set_attributes
      = EXPECT_CALL(layout_mock, SetAttributes(copied_attributes));
  EXPECT_CALL(*pango_mock, CopyAttributes(attributes))
      .WillOnce(Return(copied_attributes));
  Expectation set_font_description_expectation
      = EXPECT_CALL(layout_mock, SetFontDescription(font_desc));
  Expectation set_width_expectation
      = EXPECT_CALL(layout_mock, SetWidth(width * PANGO_SCALE));
  EXPECT_CALL(*font_spec_mock, GetFontAlignment(font_type))
      .WillOnce(Return(align));
  EXPECT_CALL(*font_spec_mock, GetFontAttributes(font_type))
      .WillOnce(Return(attributes));
  EXPECT_CALL(*font_spec_mock, GetFontDescription(font_type))
      .WillOnce(Return(font_desc));
  Expectation get_pixel_expectation
      = EXPECT_CALL(layout_mock, GetPixelSize())
          .After(set_text_expectation)
          .After(set_alignment_expectation)
          .After(set_attributes)
          .After(set_font_description_expectation)
          .WillOnce(Return(size));
  EXPECT_CALL(*pango_mock, AttributesUnref(copied_attributes))
      .After(set_attributes);

  Size actual_size
      = text_renderer.TextRenderer::GetMultiLinePixelSizeInternal(font_type,
                                                                  text,
                                                                  width,
                                                                  &layout_mock);
  EXPECT_EQ(actual_size.width, size.width);
  EXPECT_EQ(actual_size.height, size.height);
}

TEST_F(TextRendererTest, RenderTextTest) {
  FontSpecMock *font_spec_mock = new FontSpecMock();
  TextRenderer text_renderer(font_spec_mock);
  PangoWrapperMock *pango_mock = SetUpPangoMock(&text_renderer);
  PangoLayoutWrapperMock layout_mock;

  const string text = "hogehoge";
  Rect rect(10, 20, 30, 40);
  Size size(12, 34);
  PangoAlignment align = PANGO_ALIGN_CENTER;
  PangoAttrList *attributes = reinterpret_cast<PangoAttrList*>(0xabcdef01);
  PangoAttrList *copied_attributes
      = reinterpret_cast<PangoAttrList*>(0x237492);
  PangoFontDescription *font_desc
      = reinterpret_cast<PangoFontDescription*>(0x01abcdef);
  FontSpecInterface::FONT_TYPE font_type
      = FontSpecInterface::FONTSET_FOOTER_LABEL;

  EXPECT_CALL(*font_spec_mock, GetFontAlignment(font_type))
      .WillRepeatedly(Return(align));
  EXPECT_CALL(*font_spec_mock, GetFontAttributes(font_type))
      .WillRepeatedly(Return(attributes));
  EXPECT_CALL(*font_spec_mock, GetFontDescription(font_type))
      .WillRepeatedly(Return(font_desc));

  Expectation set_alignment_expectation
      = EXPECT_CALL(layout_mock, SetAlignment(align));
  Expectation set_attributes
      = EXPECT_CALL(layout_mock, SetAttributes(copied_attributes));
  EXPECT_CALL(*pango_mock, CopyAttributes(attributes))
      .WillOnce(Return(copied_attributes));
  Expectation set_font_description_expectation
      = EXPECT_CALL(layout_mock, SetFontDescription(font_desc));

  Expectation set_text_expectation
      = EXPECT_CALL(layout_mock, SetText(text));
  Expectation set_width_expectation
      = EXPECT_CALL(layout_mock, SetWidth(rect.size.width * PANGO_SCALE));
  Expectation set_height_expectation
      = EXPECT_CALL(layout_mock, SetHeight(rect.size.height * PANGO_SCALE));
  Expectation get_pixel_size_expectation
      = EXPECT_CALL(layout_mock, GetPixelSize())
          .WillOnce(Return(size));
  EXPECT_CALL(*pango_mock, AttributesUnref(copied_attributes))
      .After(set_attributes);

  // Vertical centering
  const int expected_x = rect.origin.x * PANGO_SCALE;
  const int expected_y
      = (rect.origin.y + (rect.size.height - size.height)/2) * PANGO_SCALE;

  Expectation rendering_expectation =
      EXPECT_CALL(*pango_mock,
                  RendererDrawLayout(&layout_mock, expected_x, expected_y))
          .After(set_alignment_expectation)
          .After(set_attributes)
          .After(set_font_description_expectation)
          .After(set_text_expectation)
          .After(set_width_expectation)
          .After(set_height_expectation)
          .After(get_pixel_size_expectation);

  text_renderer.RenderTextInternal(text, rect, font_type, &layout_mock);
}

TEST_F(TextRendererTest, ReloadFontConfigTest) {
  FontSpecMock *font_spec_mock = new FontSpecMock();
  TextRenderer text_renderer(font_spec_mock);
  const char kDummyFontDescription[] = "Foo,Bar,Baz";

  EXPECT_CALL(*font_spec_mock, Reload(kDummyFontDescription));
  text_renderer.ReloadFontConfig(kDummyFontDescription);
}

}  // namespace gtk
}  // namespace renderer
}  // namespace mozc
