// 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 "testing/base/public/googletest.h"
#include "testing/base/public/gunit.h"
#include "win32/ime/ime_types.h"
#include "win32/ime/ime_ui_visibility_tracker.h"

namespace mozc {
namespace win32 {
TEST(ImeUIVisibilityTrackerTest, BasicTest) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // At first, no window is visible because IME does not have input focus.
  EXPECT_FALSE(tracker.IsAnyWindowVisible());

  // Notify the tracker that the IME is getting input focus.
  tracker.OnFocus();

  // Suggest window is visible by default when the IME has input focus.
  EXPECT_TRUE(tracker.IsSuggestWindowVisible());

  // Candidate window is not visible by default when the IME has input focus.
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());

  // Composition window is not visible by default when the IME has input focus.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // Notify the tracker of the UI visibility bits passed from the application
  // as lParam of WM_IME_SETCONTEXT.  These bits update the visibility for
  // each UI component.
  // ISC_SHOWUIALL means that the application allows the IME to show all the UI
  // components.
  const ShowUIAttributes ui_attributes(ISC_SHOWUIALL);
  tracker.OnSetContext(ui_attributes);

  // WM_IME_SETCONTEXT/ISC_SHOWUIALL do not change the UI visibilities.
  EXPECT_TRUE(tracker.IsSuggestWindowVisible());
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());
}

// When a user changes the input method by the LangBar, WM_IME_SETCONTEXT will
// not be sent.  Even in this case, the suggest window should be visible by
// default.
TEST(ImeUIVisibilityTrackerTest,
     SuggestWindowShouldBeVisibleWhenImeIsChangedByLangBar) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // At first, no window is visible because IME does not have input focus.
  EXPECT_FALSE(tracker.IsAnyWindowVisible());

  // Even when the input context has already got focus, |OnFocus| will be
  // called from ImeSelect.
  tracker.OnFocus();

  // Suggest window is visible just after the IME is changed by the LangBar.
  EXPECT_TRUE(tracker.IsSuggestWindowVisible());
}

// When a user changes the input method by the LangBar, WM_IME_SETCONTEXT will
// not be sent.  Even in this case, the composition window can be visible,
// without any focus change, which finally invokes ImeSetActiveContext.
TEST(ImeUIVisibilityTrackerTest,
     CompositionWindowCanBeShownWhenImeIsChangedByLangBar) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // At first, no window is visible because IME does not have input focus.
  EXPECT_FALSE(tracker.IsAnyWindowVisible());

  // Even when the input context has already got focus, |OnFocus| will be
  // called from ImeSelect.
  tracker.OnFocus();

  // Composition window is not visible by default after the IME is changed by
  // the LangBar.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // WM_IME_STARTCOMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_STARTCOMPOSITION, 0, 0));

  // Since WM_IME_STARTCOMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // If WM_IME_STARTCOMPOSITION is passed to the IME UI Window, the IME is
  // responsible to draw the composition window.
  tracker.OnStartComposition();
  EXPECT_TRUE(tracker.IsCompositionWindowVisible());
}


// When a user changes the input method by the LangBar, WM_IME_SETCONTEXT will
// not be sent.  Even in this case, the candiate window can be visible,
// without any focus change, which finally invokes ImeSetActiveContext.
TEST(ImeUIVisibilityTrackerTest,
     CandidateWindowCanBeShownWhenImeIsChangedByLangBar) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // At first, no window is visible because IME does not have input focus.
  EXPECT_FALSE(tracker.IsAnyWindowVisible());

  // Even when the input context has already got focus, |OnFocus| will be
  // called from ImeSelect.
  tracker.OnFocus();

  // Candidate window is not visible by default after the IME is changed by the
  // LangBar.
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());

  // Since WM_IME_NOTIFY/IMN_OPENCANDIDATE is a visibility-test-message, the
  // IME calls BeginVisibilityTestForCandidateWindow the message is
  // posted.
  tracker.BeginVisibilityTestForCandidateWindow();

  // BeginVisibilityTestForCandidateWindow changes the visibility bit for
  // candidate window.  However, it does not change the visibility bit for
  // suggestion window.
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());

  // If WM_IME_NOTIFY/IMN_OPENCANDIDATE is passed to the IME UI Window, the IME
  // is responsible to draw the candidate window.
  tracker.OnNotify(IMN_OPENCANDIDATE, 1);
  EXPECT_TRUE(tracker.IsCandidateWindowVisible());
}

TEST(ImeUIVisibilityTrackerTest, HideSuggestWindowBySetInputContext) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // At first, no window is visible because IME does not have input focus.
  EXPECT_FALSE(tracker.IsAnyWindowVisible());

  // Notify the tracker that the IME is getting input focus.
  tracker.OnFocus();

  // Suggest window is visible by default when the IME has input focus.
  EXPECT_TRUE(tracker.IsSuggestWindowVisible());

  // Candidate window is not visible by default when the IME has input focus.
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());

  // Composition window is not visible by default when the IME has input focus.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // Suggest window should be visible if all the candidate windows are visible.
  // You may see this situation in Chrome, as reported in b/3002445.
  tracker.OnSetContext(ShowUIAttributes(ISC_SHOWUIALLCANDIDATEWINDOW));

  // Suggest window should be visible.
  EXPECT_TRUE(tracker.IsSuggestWindowVisible());

  // Suggest window should be invisible if none of the bits in
  // ISC_SHOWUIALLCANDIDATEWINDOW is cleared, where ISC_SHOWUICANDIDATEWINDOW
  // means that the first candidate window can be shown but the others must be
  // invisible.
  tracker.OnSetContext(ShowUIAttributes(ISC_SHOWUICANDIDATEWINDOW));

  // Suggest window should be invisible.
  EXPECT_FALSE(tracker.IsSuggestWindowVisible());
}


TEST(ImeUIVisibilityTrackerTest, CompositionIsDrawnByIME) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // Notify the tracker that the IME is getting input focus.
  tracker.OnFocus();

  // Notify the tracker of the UI visibility bits passed from the application
  // as lParam of WM_IME_SETCONTEXT.  These bits update the visibility for
  // each UI component.
  const ShowUIAttributes ui_attributes(ISC_SHOWUIALL);
  tracker.OnSetContext(ui_attributes);

  // WM_IME_STARTCOMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_STARTCOMPOSITION, 0, 0));

  // Since WM_IME_STARTCOMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // BeginVisibilityTestForCompositionWindow changes the visibility bit for
  // composition window.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // If WM_IME_STARTCOMPOSITION is passed to the IME UI Window, the IME is
  // responsible to draw the composition window.
  tracker.OnStartComposition();
  EXPECT_TRUE(tracker.IsCompositionWindowVisible());

  // UIVisibilityTracker ignores these bits though.
  const DWORD kCompositionUpdateBits =
      (GCS_COMPREADSTR | GCS_COMPREADATTR | GCS_COMPREADCLAUSE | GCS_COMPSTR |
       GCS_COMPATTR | GCS_COMPCLAUSE | GCS_CURSORPOS | GCS_DELTASTART);

  // WM_IME_COMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_COMPOSITION, 0, kCompositionUpdateBits));

  // Since WM_IME_COMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // BeginVisibilityTestForCompositionWindow changes the visibility bit for
  // composition window.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // If the IME UI Window receives WM_IME_COMPOSITION, the IME is responsible
  // to draw the composition window.
  tracker.OnComposition();
  EXPECT_TRUE(tracker.IsCompositionWindowVisible());

  // WM_IME_ENDCOMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_ENDCOMPOSITION, 0, 0));

  // Since WM_IME_ENDCOMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // BeginVisibilityTestForCompositionWindow changes the visibility bit for
  // composition window.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // WM_IME_ENDCOMPOSITION makes the composition window invisible either way.
  tracker.OnEndComposition();
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());
}

TEST(ImeUIVisibilityTrackerTest, CompositionIsDrawnByApplication) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // Notify the tracker that the IME is getting input focus.
  tracker.OnFocus();

  // Notify the tracker of the UI visibility bits passed from the application
  // as lParam of WM_IME_SETCONTEXT.  These bits update the visibility for
  // each UI component.
  // Some applications such as GTK applications or OOo does not clear the UI
  // visibility bits even though they draw their own composition windows.
  // We conform with those applications.
  const ShowUIAttributes ui_attributes(ISC_SHOWUIALL);
  tracker.OnSetContext(ui_attributes);

  // WM_IME_STARTCOMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_STARTCOMPOSITION, 0, 0));

  // Since WM_IME_STARTCOMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // BeginVisibilityTestForCompositionWindow changes the visibility bit for
  // composition window.
  // If WM_IME_STARTCOMPOSITION is not passed to the IME UI Window, the
  // application is responsible to draw the composition window.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // UIVisibilityTracker ignores these bits though.
  const DWORD kCompositionUpdateBits =
      (GCS_COMPREADSTR | GCS_COMPREADATTR | GCS_COMPREADCLAUSE | GCS_COMPSTR |
       GCS_COMPATTR | GCS_COMPCLAUSE | GCS_CURSORPOS | GCS_DELTASTART);

  // WM_IME_COMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_COMPOSITION, 0, kCompositionUpdateBits));

  // Since WM_IME_COMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // BeginVisibilityTestForCompositionWindow changes the visibility bit for
  // composition window.
  // If WM_IME_COMPOSITION is not passed to the IME UI Window, the application
  // is responsible to draw the composition window.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());

  // WM_IME_ENDCOMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_ENDCOMPOSITION, 0, 0));

  // Since WM_IME_ENDCOMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // BeginVisibilityTestForCompositionWindow changes the visibility bit for
  // composition window.
  // WM_IME_ENDCOMPOSITION makes the composition window invisible either way.
  EXPECT_FALSE(tracker.IsCompositionWindowVisible());
}

TEST(ImeUIVisibilityTrackerTest, CandidateIsDrawnByIME) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // Notify the tracker that the IME is getting input focus.
  tracker.OnFocus();

  // Notify the tracker of the UI visibility bits passed from the application
  // as lParam of WM_IME_SETCONTEXT.  These bits update the visibility for
  // each UI component.
  const ShowUIAttributes ui_attributes(ISC_SHOWUIALL);
  tracker.OnSetContext(ui_attributes);

  // IMN_OPENCANDIDATE should be marked as a visibility-test-message by
  // IsVisibilityTestMessageForCandidateWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_NOTIFY, IMN_OPENCANDIDATE, 1));

  // Since WM_IME_NOTIFY/IMN_OPENCANDIDATE is a visibility-test-message, the
  // IME calls BeginVisibilityTestForCandidateWindow the message is
  // posted.
  tracker.BeginVisibilityTestForCandidateWindow();

  // BeginVisibilityTestForCandidateWindow changes the visibility bit for
  // candidate window.  However, it does not change the visibility bit for
  // suggestion window.
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());
  EXPECT_TRUE(tracker.IsSuggestWindowVisible());

  // If WM_IME_NOTIFY/IMN_OPENCANDIDATE is passed to the IME UI Window, the IME
  // is responsible to draw the candidate window.
  tracker.OnNotify(IMN_OPENCANDIDATE, 1);
  EXPECT_TRUE(tracker.IsCandidateWindowVisible());

  // WM_IME_NOTIFY/IMN_CHANGECANDIDATE is not marked as a visibility-test-
  // message by IsVisibilityTestMessageForCandidateWindow.
  EXPECT_FALSE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_NOTIFY, IMN_CHANGECANDIDATE, 1));

  // WM_IME_NOTIFY/IMN_CLOSECANDIDATE is not marked as a visibility-test-
  // message by IsVisibilityTestMessageForCandidateWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_NOTIFY, IMN_CLOSECANDIDATE, 1));

  // Since WM_IME_NOTIFY/IMN_CLOSECANDIDATE is a visibility-test-message, the
  // IME calls BeginVisibilityTestForCandidateWindow the message is
  // posted.
  tracker.BeginVisibilityTestForCandidateWindow();

  // BeginVisibilityTestForCandidateWindow changes the visibility bit for
  // candidate window.
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());

  // WM_IME_NOTIFY/IMN_CLOSECANDIDATE makes the candidate window invisible
  // either way.
  tracker.OnNotify(IMN_CLOSECANDIDATE, 1);
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());
}

TEST(ImeUIVisibilityTrackerTest, CandidateIsDrawnByApplication) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // Notify the tracker that the IME is getting input focus.
  tracker.OnFocus();

  // Notify the tracker of the UI visibility bits passed from the application
  // as lParam of WM_IME_SETCONTEXT.  These bits update the visibility for
  // each UI component.
  // Some game applications might not clear the UI visibility bits even though
  // they draw their own candidate windows.
  // We conform with those applications.
  const ShowUIAttributes ui_attributes(ISC_SHOWUIALL);
  tracker.OnSetContext(ui_attributes);

  // IMN_OPENCANDIDATE should be marked as a visibility-test-message by
  // IsVisibilityTestMessageForCandidateWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_NOTIFY, IMN_OPENCANDIDATE, 1));

  // Since WM_IME_NOTIFY/IMN_OPENCANDIDATE is a visibility-test-message, the
  // IME calls BeginVisibilityTestForCandidateWindow before the message is
  // posted.
  tracker.BeginVisibilityTestForCandidateWindow();

  // BeginVisibilityTestForCandidateWindow changes the visibility bit for
  // candidate window.  However, it does not change the visibility bit for
  // suggestion window.
  // If WM_IME_NOTIFY/IMN_OPENCANDIDATE is not passed to the IME UI Window, the
  // application is responsible to draw the candidate window.
  EXPECT_FALSE(tracker.IsCandidateWindowVisible());
  EXPECT_TRUE(tracker.IsSuggestWindowVisible());

  // WM_IME_NOTIFY/IMN_CHANGECANDIDATE is not marked as a visibility-test-
  // message by IsVisibilityTestMessageForCandidateWindow.
  EXPECT_FALSE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_NOTIFY, IMN_CHANGECANDIDATE, 1));

  // WM_IME_NOTIFY/IMN_CLOSECANDIDATE is not marked as a visibility-test-
  // message by IsVisibilityTestMessageForCandidateWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_NOTIFY, IMN_CLOSECANDIDATE, 1));

  // Since WM_IME_NOTIFY/IMN_CLOSECANDIDATE is a visibility-test-message, the
  // IME calls BeginVisibilityTestForCandidateWindow before the message is
  // posted.
  // WM_IME_NOTIFY/IMN_CLOSECANDIDATE makes the candidate window invisible
  // either way.
  tracker.BeginVisibilityTestForCandidateWindow();

  EXPECT_FALSE(tracker.IsCandidateWindowVisible());
}

// Some applications such as gvim 7.3.55, Notepad++ 5.8.4 (Scintilla 2.22),
// EmEditor 10.0.4, do not pass WM_IME_COMPOSITION message to ::DefWindowProc
// when |lParam| contains GCS_RESULTSTR flag. (b/3223935)
TEST(ImeUIVisibilityTrackerTest,
     Issue3223935_WM_IME_COMPOSITION_IsEatenIfItContainsResultString) {
  UIVisibilityTracker tracker;

  tracker.Initialize();

  // Notify the tracker that the IME is getting input focus.
  tracker.OnFocus();

  // Notify the tracker of the UI visibility bits passed from the application
  // as lParam of WM_IME_SETCONTEXT.  These bits update the visibility for
  // each UI component.
  // Some game applications might not clear the UI visibility bits even though
  // they draw their own candidate windows.
  // We conform with those applications.
  const ShowUIAttributes ui_attributes(ISC_SHOWUIALL);
  tracker.OnSetContext(ui_attributes);

  // WM_IME_STARTCOMPOSITION should be marked as a visibility-test-message by
  // BeginVisibilityTestForCompositionWindow.
  EXPECT_TRUE(
      UIVisibilityTracker::IsVisibilityTestMessageForComposiwionWindow(
          WM_IME_STARTCOMPOSITION, 0, 0));

  // Since WM_IME_STARTCOMPOSITION is a visibility-test-message, the IME calls
  // BeginVisibilityTestForCompositionWindow the message is posted.
  tracker.BeginVisibilityTestForCompositionWindow();

  // If WM_IME_STARTCOMPOSITION is passed to the IME UI Window, the IME is
  // responsible to draw the composition window.
  tracker.OnStartComposition();
  EXPECT_TRUE(tracker.IsCompositionWindowVisible());

  // |lParam| contains GCS_RESULTSTR.  Do not use WM_IME_COMPOSITION as a
  // visibility-test-message in this case.
  EXPECT_FALSE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_COMPOSITION, 0, GCS_RESULTSTR));

  // |lParam| contains GCS_RESULTSTR.  Do not use WM_IME_COMPOSITION as a
  // visibility-test-message in this case.
  EXPECT_FALSE(
      UIVisibilityTracker::IsVisibilityTestMessageForCandidateWindow(
          WM_IME_COMPOSITION, 0, GCS_COMPSTR | GCS_RESULTSTR));

  // Composition Window should be visible.
  EXPECT_TRUE(tracker.IsCompositionWindowVisible());
}
}  // namespace win32
}  // namespace mozc
