// 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 "base/file_stream.h"
#include "base/file_util.h"
#include "base/number_util.h"
#include "base/protobuf/descriptor.h"
#include "base/protobuf/message.h"
#include "base/protobuf/text_format.h"
#include "base/scoped_ptr.h"
#include "base/string_piece.h"
#include "base/util.h"
#include "config/config.pb.h"
#include "config/config_handler.h"
#include "converter/converter_interface.h"
#include "engine/mock_data_engine_factory.h"
#include "engine/user_data_manager_interface.h"
#include "session/commands.pb.h"
#include "session/key_parser.h"
#include "session/request_test_util.h"
#include "session/session_handler_test_util.h"
#include "testing/base/public/gunit.h"
#include "usage_stats/usage_stats.h"
#include "usage_stats/usage_stats_testing_util.h"

DECLARE_string(test_srcdir);
DECLARE_string(test_tmpdir);

namespace {

using mozc::FileUtil;
using mozc::InputFileStream;
using mozc::KeyParser;
using mozc::NumberUtil;
using mozc::StringPiece;
using mozc::Util;
using mozc::commands::CandidateList;
using mozc::commands::CandidateWord;
using mozc::commands::CompositionMode;
using mozc::commands::CompositionMode_Parse;
using mozc::commands::Input;
using mozc::commands::KeyEvent;
using mozc::commands::Output;
using mozc::commands::Request;
using mozc::commands::RequestForUnitTest;
using mozc::config::Config;
using mozc::config::ConfigHandler;
using mozc::MockDataEngineFactory;
using mozc::EngineInterface;
using mozc::protobuf::FieldDescriptor;
using mozc::protobuf::Message;
using mozc::protobuf::TextFormat;
using mozc::session::testing::SessionHandlerTestBase;
using mozc::session::testing::TestSessionClient;
using testing::WithParamInterface;

class SessionHandlerScenarioTest : public SessionHandlerTestBase,
                                   public WithParamInterface<const char *> {
 protected:
  virtual void SetUp() {
    // Note that singleton Config instance is backed up and restored
    // by SessionHandlerTestBase's SetUp and TearDown methods.
    SessionHandlerTestBase::SetUp();

    engine_.reset(MockDataEngineFactory::Create());
    client_.reset(new TestSessionClient(engine_.get()));
    config_.reset(new Config);
    last_output_.reset(new Output);
    request_.reset(new Request);

    ConfigHandler::GetConfig(config_.get());
  }

  void ClearAll() {
    ResetContext();
    ClearUserPrediction();
    ClearUsageStats();
  }

  void ResetContext() {
    ASSERT_TRUE(client_->ResetContext());
    last_output_->Clear();
  }

  void ClearUserPrediction() {
    EXPECT_TRUE(client_->ClearUserPrediction());
    EXPECT_TRUE(engine_->GetUserDataManager()->WaitForSyncerForTest());
  }

  void ClearUsageStats() {
    mozc::usage_stats::UsageStats::ClearAllStatsForTest();
  }

  scoped_ptr<EngineInterface> engine_;
  scoped_ptr<TestSessionClient> client_;
  scoped_ptr<Config> config_;
  scoped_ptr<Output> last_output_;
  scoped_ptr<Request> request_;
};

// Tests should be passed.
const char *kScenarioFileList[] = {
#define DATA_DIR "data/test/session/scenario/"
  DATA_DIR "auto_partial_suggestion.txt",
  DATA_DIR "b12751061_scenario.txt",
  DATA_DIR "b16123009_scenario.txt",
  DATA_DIR "b7132535_scenario.txt",
  DATA_DIR "b7321313_scenario.txt",
  DATA_DIR "b7548679_scenario.txt",
  DATA_DIR "b8690065_scenario.txt",
  DATA_DIR "b8703702_scenario.txt",
  DATA_DIR "change_request.txt",
  DATA_DIR "clear_user_prediction.txt",
  DATA_DIR "commit.txt",
  DATA_DIR "composition_display_as.txt",
  DATA_DIR "conversion.txt",
  DATA_DIR "conversion_display_as.txt",
  DATA_DIR "conversion_with_history_segment.txt",
  DATA_DIR "conversion_with_long_history_segments.txt",
  DATA_DIR "convert_from_full_ascii_to_t13n.txt",
  DATA_DIR "convert_from_full_katakana_to_t13n.txt",
  DATA_DIR "convert_from_half_ascii_to_t13n.txt",
  DATA_DIR "convert_from_half_katakana_to_t13n.txt",
  DATA_DIR "convert_from_hiragana_to_t13n.txt",
  DATA_DIR "delete_history.txt",
  DATA_DIR "desktop_t13n_candidates.txt",
#if !defined(OS_MACOSX)
  // "InputModeX" commands are not supported on Mac.
  // Mac: We do not have the way to change the mode indicator from IME.
  DATA_DIR "input_mode.txt",
#endif  // !OS_MACOSX
  DATA_DIR "insert_characters.txt",
  DATA_DIR "mobile_qwerty_transliteration_scenario.txt",
  DATA_DIR "mobile_t13n_candidates.txt",
  DATA_DIR "on_off_cancel.txt",
  DATA_DIR "partial_suggestion.txt",
  DATA_DIR "pending_character.txt",
  DATA_DIR "predict_and_convert.txt",
  DATA_DIR "reconvert.txt",
  DATA_DIR "revert.txt",
  DATA_DIR "segment_focus.txt",
  DATA_DIR "segment_width.txt",
  DATA_DIR "twelvekeys_switch_inputmode_scenario.txt",
  DATA_DIR "twelvekeys_toggle_flick_alphabet_scenario.txt",
  DATA_DIR "twelvekeys_toggle_hiragana_preedit_scenario.txt",
  DATA_DIR "undo.txt",
#undef DATA_DIR
};

INSTANTIATE_TEST_CASE_P(SessionHandlerScenarioParameters,
                        SessionHandlerScenarioTest,
                        ::testing::ValuesIn(kScenarioFileList));

const char *kUsageStatsScenarioFileList[] = {
#define DATA_DIR "data/test/session/scenario/usage_stats/"
  DATA_DIR "auto_partial_suggestion.txt",
  DATA_DIR "backspace_after_commit.txt",
  DATA_DIR "backspace_after_commit_after_backspace.txt",
  DATA_DIR "composition.txt",
  DATA_DIR "continue_input.txt",
  DATA_DIR "continuous_input.txt",
  DATA_DIR "conversion.txt",
  DATA_DIR "insert_space.txt",
  DATA_DIR "language_aware_input.txt",
  DATA_DIR "mouse_select_from_suggestion.txt",
  DATA_DIR "multiple_backspace_after_commit.txt",
  DATA_DIR "multiple_segments.txt",
  DATA_DIR "numpad_in_direct_input_mode.txt",
  DATA_DIR "prediction.txt",
  DATA_DIR "select_candidates_in_multiple_segments.txt",
  DATA_DIR "select_candidates_in_multiple_segments_and_expand_segment.txt",
  DATA_DIR "select_minor_conversion.txt",
  DATA_DIR "select_minor_prediction.txt",
  DATA_DIR "select_prediction.txt",
  DATA_DIR "select_t13n_by_key.txt",
#ifndef OS_LINUX
  // This test requires cascading window.
  // TODO(hsumita): Removes this ifndef block.
  DATA_DIR "select_t13n_on_cascading_window.txt",
#endif  // OS_LINUX
  DATA_DIR "suggestion.txt",
  DATA_DIR "switch_kana_type.txt",
  DATA_DIR "zero_query_suggestion.txt",
#undef DATA_DIR
};
INSTANTIATE_TEST_CASE_P(SessionHandlerUsageStatsScenarioParameters,
                        SessionHandlerScenarioTest,
                        ::testing::ValuesIn(kUsageStatsScenarioFileList));

// Temporarily disabled test scenario.
//
// NOTE: If you want to have test scenario which does not pass at this
// moment but for the recording, you can describe it as follows.
const char *kFailedScenarioFileList[] = {
  // Requires multiple session handling.
  "data/test/session/scenario/usage_stats/multiple_sessions.txt",
};
INSTANTIATE_TEST_CASE_P(DISABLED_SessionHandlerScenarioParameters,
                        SessionHandlerScenarioTest,
                        ::testing::ValuesIn(kFailedScenarioFileList));

bool GetCandidateIdByValue(const StringPiece value,
                           const Output &output, uint32 *id) {
  if (!output.has_all_candidate_words()) {
    return false;
  }

  const CandidateList &all_candidate_words =  output.all_candidate_words();
  for (int i = 0; i < all_candidate_words.candidates_size(); ++i) {
    const CandidateWord &candidate_word = all_candidate_words.candidates(i);
    if (candidate_word.has_value() &&
        candidate_word.value() == value) {
      *id = i;
      return true;
    }
  }
  return false;
}

bool SetOrAddFieldValueFromString(const string &name, const string &value,
                                  Message *message) {
  const FieldDescriptor *field =
      message->GetDescriptor()->FindFieldByName(name);
  if (!field) {
    LOG(ERROR) << "Unknown field name: " << name;
    return false;
  }
  // String type value should be quoted for ParseFieldValueFromString().
  if (field->type() == FieldDescriptor::TYPE_STRING &&
      (value[0] != '"' || value[value.size() - 1] != '"')) {
    LOG(ERROR) << "String type value should be quoted: " << value;
    return false;
  }
  return TextFormat::ParseFieldValueFromString(value, field, message);
}

// Parses protobuf from string without validation.
// input sample: context.experimental_features="chrome_omnibox"
// We cannot use TextFormat::ParseFromString since it doesn't allow invalid
// protobuf. (e.g. lack of required field)
bool ParseProtobufFromString(const string &text, Message *message) {
  const size_t separator_pos = text.find('=');
  const string full_name = text.substr(0, separator_pos);
  const string value = text.substr(separator_pos + 1);
  vector<string> names;
  Util::SplitStringUsing(full_name, ".", &names);

  Message *msg = message;
  for (size_t i = 0; i < names.size() - 1; ++i) {
    const FieldDescriptor *field =
        msg->GetDescriptor()->FindFieldByName(names[i]);
    if (!field) {
      LOG(ERROR) << "Unknown field name: " << names[i];
      return false;
    }
    msg = msg->GetReflection()->MutableMessage(msg, field);
  }

  return SetOrAddFieldValueFromString(names[names.size() - 1], value, msg);
}

bool IsInAllCandidateWords(
    const StringPiece expected_candidate,
    const Output &output) {
  uint32 tmp;
  return GetCandidateIdByValue(expected_candidate, output, &tmp);
}

::testing::AssertionResult IsInAllCandidateWordsWithFormat(
    const char *expected_candidate_string,
    const char *output_string,
    const string &expected_candidate,
    const Output &output) {
  if (!IsInAllCandidateWords(expected_candidate, output)) {
    return ::testing::AssertionFailure()
        << expected_candidate_string << "(" << expected_candidate << ")"
        << " is not found in " << output_string << "\n"
        << output.Utf8DebugString();
  }
  return ::testing::AssertionSuccess();
}

::testing::AssertionResult IsNotInAllCandidateWordsWithFormat(
    const char *expected_candidate_string,
    const char *output_string,
    const StringPiece expected_candidate,
    const Output &output) {
  if (IsInAllCandidateWords(expected_candidate, output)) {
    return ::testing::AssertionFailure()
        << expected_candidate_string << "(" << expected_candidate << ")"
        << " is found in " << output_string << "\n"
        << output.Utf8DebugString();
  }
  return ::testing::AssertionSuccess();
}

#define EXPECT_IN_ALL_CANDIDATE_WORDS(expected_candidate, output) \
  EXPECT_PRED_FORMAT2(IsInAllCandidateWordsWithFormat, \
                      expected_candidate, output)
#define EXPECT_NOT_IN_ALL_CANDIDATE_WORDS(expected_candidate, output) \
  EXPECT_PRED_FORMAT2(IsNotInAllCandidateWordsWithFormat, \
                      expected_candidate, output)

TEST_P(SessionHandlerScenarioTest, TestImpl) {
  // Open the scenario file.
  string scenario_file = GetParam();
  const string &scenario_path =
      FileUtil::JoinPath(FLAGS_test_srcdir, scenario_file);
  ASSERT_TRUE(FileUtil::FileExists(scenario_path))
      << "Scenario file is not found: " << scenario_path;
  InputFileStream input_stream(scenario_path.c_str());

  // Set up session.
  ASSERT_TRUE(client_->CreateSession()) << "Client initialization is failed.";

  string line_text;
  int line_number = 0;
  vector<string> columns;
  while (getline(input_stream, line_text)) {
    ++line_number;
    SCOPED_TRACE(Util::StringPrintf("Scenario: %s [%s:%d]",
                                    line_text.c_str(),
                                    scenario_file.c_str(),
                                    line_number));

    if (line_text.empty() || line_text[0] == '#') {
      // Skip an empty or comment line.
      continue;
    }

    columns.clear();
    Util::SplitStringUsing(line_text, "\t", &columns);
    CHECK_GE(columns.size(), 1);
    const string &command = columns[0];
    // TODO(hidehiko): Refactor out about each command when the number of
    //   supported commands is increased.
    if (command == "RESET_CONTEXT") {
      ASSERT_EQ(1, columns.size());
      ResetContext();
    } else if (command == "SEND_KEYS") {
      ASSERT_EQ(2, columns.size());
      const string &keys = columns[1];
      KeyEvent key_event;
      for (size_t i = 0; i < keys.size(); ++i) {
        key_event.Clear();
        key_event.set_key_code(keys[i]);
        ASSERT_TRUE(client_->SendKey(key_event, last_output_.get()))
            << "Failed at " << i << "th key";
      }
    } else if (command == "SEND_KANA_KEYS") {
      ASSERT_LE(3, columns.size())
          << "SEND_KEY requires more than or equal to two columns "
          << line_text;
      const string &keys = columns[1];
      const string &kanas = columns[2];
      ASSERT_EQ(keys.size(), Util::CharsLen(kanas))
          << "1st and 2nd column must have the same number of characters.";
      KeyEvent key_event;
      for (size_t i = 0; i < keys.size(); ++i) {
        key_event.Clear();
        key_event.set_key_code(keys[i]);
        key_event.set_key_string(Util::SubString(kanas, i, 1));
        ASSERT_TRUE(client_->SendKey(key_event, last_output_.get()))
            << "Failed at " << i << "th " << line_text;
      }
    } else if (command == "SEND_KEY") {
      ASSERT_EQ(2, columns.size());
      KeyEvent key_event;
      ASSERT_TRUE(KeyParser::ParseKey(columns[1], &key_event));
      ASSERT_TRUE(client_->SendKey(key_event, last_output_.get()));
    } else if (command == "SEND_KEY_WITH_OPTION") {
      ASSERT_LE(3, columns.size());
      KeyEvent key_event;
      ASSERT_TRUE(KeyParser::ParseKey(columns[1], &key_event));
      Input option;
      for (size_t i = 2; i < columns.size(); ++i) {
        ASSERT_TRUE(ParseProtobufFromString(columns[i], &option));
      }
      ASSERT_TRUE(client_->SendKeyWithOption(key_event, option,
                                             last_output_.get()));
    } else if (command == "TEST_SEND_KEY") {
      ASSERT_EQ(2, columns.size());
      KeyEvent key_event;
      ASSERT_TRUE(KeyParser::ParseKey(columns[1], &key_event));
      ASSERT_TRUE(client_->TestSendKey(key_event, last_output_.get()));
    } else if (command == "TEST_SEND_KEY_WITH_OPTION") {
      ASSERT_LE(3, columns.size());
      KeyEvent key_event;
      ASSERT_TRUE(KeyParser::ParseKey(columns[1], &key_event));
      Input option;
      for (size_t i = 2; i < columns.size(); ++i) {
        ASSERT_TRUE(ParseProtobufFromString(columns[i], &option));
      }
      ASSERT_TRUE(client_->TestSendKeyWithOption(key_event, option,
        last_output_.get()));
    } else if (command == "SELECT_CANDIDATE") {
      ASSERT_EQ(2, columns.size());
      ASSERT_TRUE(client_->SelectCandidate(
          NumberUtil::SimpleAtoi(columns[1]), last_output_.get()));
    } else if (command == "SELECT_CANDIDATE_BY_VALUE") {
      ASSERT_EQ(2, columns.size());
      uint32 id;
      ASSERT_TRUE(GetCandidateIdByValue(columns[1], *last_output_, &id));
      ASSERT_TRUE(client_->SelectCandidate(id, last_output_.get()));
    } else if (command == "SUBMIT_CANDIDATE") {
      ASSERT_EQ(2, columns.size());
      ASSERT_TRUE(client_->SubmitCandidate(
          NumberUtil::SimpleAtoi(columns[1]), last_output_.get()));
    } else if (command == "SUBMIT_CANDIDATE_BY_VALUE") {
      ASSERT_EQ(2, columns.size());
      uint32 id;
      ASSERT_TRUE(GetCandidateIdByValue(columns[1], *last_output_, &id));
      ASSERT_TRUE(client_->SubmitCandidate(id, last_output_.get()));
    } else if (command == "UNDO_OR_REWIND") {
      ASSERT_TRUE(client_->UndoOrRewind(last_output_.get()));
    } else if (command == "SWITCH_INPUT_MODE") {
      ASSERT_EQ(2, columns.size());
      CompositionMode composition_mode;
      ASSERT_TRUE(CompositionMode_Parse(columns[1], &composition_mode))
          << "Unknown CompositionMode";
      ASSERT_TRUE(client_->SwitchInputMode(composition_mode));
    } else if (command == "SET_DEFAULT_REQUEST") {
      request_->CopyFrom(Request::default_instance());
      ASSERT_TRUE(client_->SetRequest(*request_, last_output_.get()));
    } else if (command == "SET_MOBILE_REQUEST") {
      RequestForUnitTest::FillMobileRequest(request_.get());
      ASSERT_TRUE(client_->SetRequest(*request_, last_output_.get()));
    } else if (command == "SET_REQUEST") {
      ASSERT_EQ(3, columns.size());
      ASSERT_TRUE(SetOrAddFieldValueFromString(columns[1], columns[2],
                                               request_.get()));
      ASSERT_TRUE(client_->SetRequest(*request_, last_output_.get()));
    } else if (command == "SET_CONFIG") {
      ASSERT_EQ(3, columns.size());
      ASSERT_TRUE(SetOrAddFieldValueFromString(columns[1], columns[2],
                                               config_.get()));
      ASSERT_TRUE(ConfigHandler::SetConfig(*config_));
      ASSERT_TRUE(client_->Reload());
    } else if (command == "SET_SELECTION_TEXT") {
      ASSERT_EQ(2, columns.size());
      client_->SetCallbackText(columns[1]);
    } else if (command == "UPDATE_MOBILE_KEYBOARD") {
      ASSERT_EQ(3, columns.size());
      Request::SpecialRomanjiTable special_romanji_table;
      ASSERT_TRUE(Request::SpecialRomanjiTable_Parse(
          columns[1], &special_romanji_table))
          << "Unknown SpecialRomanjiTable";
      Request::SpaceOnAlphanumeric space_on_alphanumeric;
      ASSERT_TRUE(Request::SpaceOnAlphanumeric_Parse(
          columns[2], &space_on_alphanumeric))
          << "Unknown SpaceOnAlphanumeric";
      request_->set_special_romanji_table(special_romanji_table);
      request_->set_space_on_alphanumeric(space_on_alphanumeric);
      ASSERT_TRUE(client_->SetRequest(*request_, last_output_.get()));
    } else if (command == "CLEAR_ALL") {
      ASSERT_EQ(1, columns.size());
      ClearAll();
    } else if (command == "CLEAR_USER_PREDICTION") {
      ASSERT_EQ(1, columns.size());
      ClearUserPrediction();
    } else if (command == "CLEAR_USAGE_STATS") {
      ASSERT_EQ(1, columns.size());
      ClearUsageStats();
    } else if (command == "EXPECT_CONSUMED") {
      ASSERT_EQ(2, columns.size());
      ASSERT_TRUE(last_output_->has_consumed());
      EXPECT_EQ(columns[1] == "true", last_output_->consumed());
    } else if (command == "EXPECT_PREEDIT") {
      // Concat preedit segments and assert.
      const string &expected_preedit = columns.size() == 1 ? "" : columns[1];
      string preedit_string;
      const mozc::commands::Preedit &preedit = last_output_->preedit();
      for (int i = 0; i < preedit.segment_size(); ++i) {
        preedit_string += preedit.segment(i).value();
      }
      EXPECT_EQ(expected_preedit, preedit_string)
          << "Expected preedit: " << expected_preedit << "\n"
          << "Actual preedit: " <<preedit.Utf8DebugString();
    } else if (command == "EXPECT_PREEDIT_IN_DETAIL") {
      ASSERT_LE(1, columns.size());
      const mozc::commands::Preedit &preedit = last_output_->preedit();
      ASSERT_EQ(columns.size() - 1, preedit.segment_size());
      for (int i = 0; i < preedit.segment_size(); ++i) {
        EXPECT_EQ(columns[i + 1], preedit.segment(i).value())
            << "Segment index = " << i;
      }
    } else if (command == "EXPECT_PREEDIT_CURSOR_POS") {
      // Concat preedit segments and assert.
      ASSERT_EQ(2, columns.size());
      const size_t &expected_pos = NumberUtil::SimpleAtoi(columns[1]);
      const mozc::commands::Preedit &preedit = last_output_->preedit();
      EXPECT_EQ(expected_pos, preedit.cursor()) << preedit.Utf8DebugString();
    } else if (command == "EXPECT_CANDIDATE") {
      ASSERT_EQ(3, columns.size());
      uint32 candidate_id = 0;
      const bool has_result = GetCandidateIdByValue(columns[2], *last_output_,
                                                    &candidate_id);
      EXPECT_TRUE(has_result) << columns[2] + " is not found\n"
                              << last_output_->candidates().Utf8DebugString();
      if (has_result) {
        EXPECT_EQ(NumberUtil::SimpleAtoi(columns[1]), candidate_id);
      }
    } else if (command == "EXPECT_RESULT") {
      if (columns.size() == 2 && !columns[1].empty()) {
        ASSERT_TRUE(last_output_->has_result());
        const mozc::commands::Result &result = last_output_->result();
        EXPECT_EQ(columns[1], result.value()) << result.Utf8DebugString();
      } else {
        EXPECT_FALSE(last_output_->has_result())
            << last_output_->result().Utf8DebugString();
      }
    } else if (command == "EXPECT_IN_ALL_CANDIDATE_WORDS") {
      ASSERT_EQ(2, columns.size());
      EXPECT_IN_ALL_CANDIDATE_WORDS(columns[1], *last_output_)
          << columns[1] << " is not found.\n"
          << last_output_->Utf8DebugString();
    } else if (command == "EXPECT_NOT_IN_ALL_CANDIDATE_WORDS") {
      ASSERT_EQ(2, columns.size());
      EXPECT_NOT_IN_ALL_CANDIDATE_WORDS(columns[1], *last_output_);
    } else if (command == "EXPECT_HAS_CANDIDATES") {
      ASSERT_TRUE(last_output_->has_candidates());
    } else if (command == "EXPECT_NO_CANDIDATES") {
      ASSERT_FALSE(last_output_->has_candidates());
    } else if (command == "EXPECT_SEGMENTS_SIZE") {
      ASSERT_EQ(2, columns.size());
      ASSERT_EQ(NumberUtil::SimpleAtoi(columns[1]),
                last_output_->preedit().segment_size());
    } else if (command == "EXPECT_HIGHLIGHTED_SEGMENT_INDEX") {
      ASSERT_EQ(2, columns.size());
      ASSERT_TRUE(last_output_->has_preedit());
      const mozc::commands::Preedit &preedit = last_output_->preedit();
      int index = -1;
      for (int i = 0; i < preedit.segment_size(); ++i) {
        if (preedit.segment(i).annotation() ==
            mozc::commands::Preedit::Segment::HIGHLIGHT) {
          index = i;
          break;
        }
      }
      ASSERT_EQ(NumberUtil::SimpleAtoi(columns[1]), index);
    } else if (command == "EXPECT_USAGE_STATS_COUNT") {
      ASSERT_EQ(3, columns.size());
      const uint32 expected_value = NumberUtil::SimpleAtoi(columns[2]);
      if (expected_value == 0) {
        EXPECT_STATS_NOT_EXIST(columns[1]);
      } else {
        EXPECT_COUNT_STATS(columns[1], expected_value);
      }
    } else if (command == "EXPECT_USAGE_STATS_INTEGER") {
      ASSERT_EQ(3, columns.size());
      EXPECT_INTEGER_STATS(columns[1], NumberUtil::SimpleAtoi(columns[2]));
    } else if (command == "EXPECT_USAGE_STATS_BOOLEAN") {
      ASSERT_EQ(3, columns.size());
      EXPECT_BOOLEAN_STATS(columns[1], columns[2] == "true");
    } else if (command == "EXPECT_USAGE_STATS_TIMING") {
      ASSERT_EQ(6, columns.size());
      const uint64 expected_total = NumberUtil::SimpleAtoi(columns[2]);
      const uint32 expected_num = NumberUtil::SimpleAtoi(columns[3]);
      const uint32 expected_min = NumberUtil::SimpleAtoi(columns[4]);
      const uint32 expected_max = NumberUtil::SimpleAtoi(columns[5]);
      if (expected_num == 0) {
        EXPECT_STATS_NOT_EXIST(columns[1]);
      } else {
        EXPECT_TIMING_STATS(columns[1], expected_total, expected_num,
                            expected_min, expected_max);
      }
    } else {
      FAIL() << "Unknown command";
    }
  }

  // Shut down.
  ASSERT_TRUE(client_->DeleteSession());
}

#undef EXPECT_IN_ALL_CANDIDATE_WORDS
#undef EXPECT_NOT_IN_ALL_CANDIDATE_WORDS

}  // namespace
