// 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.

package org.mozc.android.inputmethod.japanese.model;

import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel.KeyboardMode;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.testing.Parameter;

import android.text.InputType;

import junit.framework.TestCase;

/**
 */
public class JapaneseSoftwareKeyboardModelTest extends TestCase {

  public void testGetKeyboardSpecification() {
    class TestData extends Parameter {
      final KeyboardLayout keyboardLayout;
      final KeyboardMode keyboardMode;
      final InputStyle inputStyle;
      final boolean qwertyLayoutForAlphabet;
      final KeyboardSpecification expectedKeyboardSpecification;

      TestData(KeyboardLayout keyboardLayout, KeyboardMode keyboardMode,
               InputStyle inputStyle, boolean qwertyLayoutForAlphabet,
               KeyboardSpecification expectedKeyboardSpecification) {
        this.keyboardLayout = keyboardLayout;
        this.keyboardMode = keyboardMode;
        this.inputStyle = inputStyle;
        this.qwertyLayoutForAlphabet = qwertyLayoutForAlphabet;
        this.expectedKeyboardSpecification = expectedKeyboardSpecification;
      }
    }

    TestData[] testDataList = {
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.TWELVE_KEY_FLICK_KANA),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.TWELVE_KEY_FLICK_KANA),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.TWELVE_KEY_FLICK_ALPHABET),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_ALPHABET),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET),

        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.QWERTY_KANA),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.QWERTY_KANA),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.QWERTY_KANA),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.QWERTY_KANA),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.QWERTY_KANA),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.QWERTY_KANA),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.QWERTY_ALPHABET),

        new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.GODAN_KANA),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.GODAN_KANA),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.GODAN_KANA),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.GODAN_KANA),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.GODAN_KANA),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.GODAN_KANA),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.QWERTY_ALPHABET),
        new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.QWERTY_ALPHABET),

        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.NUMBER),

        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE, false,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE, true,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.FLICK, false,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.FLICK, true,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE_FLICK, false,
                     KeyboardSpecification.SYMBOL_NUMBER),
        new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
                     InputStyle.TOGGLE_FLICK, true,
                     KeyboardSpecification.SYMBOL_NUMBER),

    };

    JapaneseSoftwareKeyboardModel model = new JapaneseSoftwareKeyboardModel();
    for (TestData parameter : testDataList) {
      model.setKeyboardLayout(parameter.keyboardLayout);
      model.setKeyboardMode(parameter.keyboardMode);
      model.setInputStyle(parameter.inputStyle);
      model.setQwertyLayoutForAlphabet(parameter.qwertyLayoutForAlphabet);
      assertEquals(parameter.toString(),
                   parameter.expectedKeyboardSpecification,
                   model.getKeyboardSpecification());
    }
  }

  public void testInputType() {
    class TestData extends Parameter {
      final int inputType;
      final KeyboardMode expectedKeyboardMode;

      TestData(int inputType, KeyboardMode expectedKeyboardMode) {
        this.inputType = inputType;
        this.expectedKeyboardMode = expectedKeyboardMode;
      }
    }

    TestData[] testDataListForTwelveKeys = {
        new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE,
                     KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL,
                     KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME,
                     KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD,
                     KeyboardMode.ALPHABET),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
                     null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
                     KeyboardMode.ALPHABET),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
                     KeyboardMode.ALPHABET),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD,
                     KeyboardMode.ALPHABET),
    };

    JapaneseSoftwareKeyboardModel model = new JapaneseSoftwareKeyboardModel();
    model.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
    model.setKeyboardMode(KeyboardMode.KANA);

    // Test for setting input type.
    for (TestData test : testDataListForTwelveKeys) {
      assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      model.setInputType(test.inputType);
      if (test.expectedKeyboardMode == null) {
        assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      } else {
        assertEquals(test.toString(), test.expectedKeyboardMode, model.getKeyboardMode());
      }
      model.setInputType(InputType.TYPE_NULL);
      assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
    }

    // Test for setting keyboard layout.
    for (TestData test : testDataListForTwelveKeys) {
      model.setInputType(test.inputType);
      // Flips keyboard layout.
      model.setKeyboardLayout(KeyboardLayout.QWERTY);
      model.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);

      if (test.expectedKeyboardMode == null) {
        assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      } else {
        assertEquals(test.toString(), test.expectedKeyboardMode, model.getKeyboardMode());
      }
    }

    TestData[] testDataListForQwertyAndGodan = {
        new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE,
                     KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL,
                     KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME,
                     KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.NUMBER),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD,
                     KeyboardMode.ALPHABET),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
                     null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
                     KeyboardMode.ALPHABET),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, null),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
                     KeyboardMode.ALPHABET),
        new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD,
                     KeyboardMode.ALPHABET),
    };


    // Reset to qwerty.
    model.setInputType(InputType.TYPE_NULL);
    model.setKeyboardLayout(KeyboardLayout.QWERTY);
    model.setKeyboardMode(KeyboardMode.KANA);

    // Test for setting input type.
    for (TestData test : testDataListForQwertyAndGodan) {
      assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      model.setInputType(test.inputType);
      if (test.expectedKeyboardMode == null) {
        assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      } else {
        assertEquals(test.toString(), test.expectedKeyboardMode, model.getKeyboardMode());
      }
      model.setInputType(InputType.TYPE_NULL);
      assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
    }

    // Test for setting keyboard layout.
    for (TestData test : testDataListForQwertyAndGodan) {
      model.setInputType(test.inputType);
      // Flips keyboard layout.
      model.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
      model.setKeyboardLayout(KeyboardLayout.QWERTY);

      if (test.expectedKeyboardMode == null) {
        assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      } else {
        assertEquals(test.toString(), test.expectedKeyboardMode, model.getKeyboardMode());
      }
    }

    // Reset to Godan.
    model.setInputType(InputType.TYPE_NULL);
    model.setKeyboardLayout(KeyboardLayout.GODAN);
    model.setKeyboardMode(KeyboardMode.KANA);

    // Test for setting input type.
    for (TestData test : testDataListForQwertyAndGodan) {
      assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      model.setInputType(test.inputType);
      if (test.expectedKeyboardMode == null) {
        assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      } else {
        assertEquals(test.toString(), test.expectedKeyboardMode, model.getKeyboardMode());
      }
      model.setInputType(InputType.TYPE_NULL);
      assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
    }

    // Test for setting keyboard layout.
    for (TestData test : testDataListForQwertyAndGodan) {
      model.setInputType(test.inputType);
      // Flips keyboard layout.
      model.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
      model.setKeyboardLayout(KeyboardLayout.GODAN);

      if (test.expectedKeyboardMode == null) {
        assertEquals(test.toString(), KeyboardMode.KANA, model.getKeyboardMode());
      } else {
        assertEquals(test.toString(), test.expectedKeyboardMode, model.getKeyboardMode());
      }
    }

  }

  public void testInputTypeScenario() {
    JapaneseSoftwareKeyboardModel model = new JapaneseSoftwareKeyboardModel();
    model.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
    model.setKeyboardMode(KeyboardMode.KANA);
    model.setInputType(InputType.TYPE_CLASS_NUMBER);
    assertEquals(KeyboardMode.NUMBER, model.getKeyboardMode());
    model.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
    assertEquals(KeyboardMode.ALPHABET, model.getKeyboardMode());
    model.setInputType(InputType.TYPE_NULL);
    // The initial state should be remembered.
    assertEquals(KeyboardMode.KANA, model.getKeyboardMode());

    model.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
    assertEquals(KeyboardMode.ALPHABET, model.getKeyboardMode());
    model.setKeyboardMode(KeyboardMode.SYMBOL_NUMBER);
    assertEquals(KeyboardMode.SYMBOL_NUMBER, model.getKeyboardMode());
    // Even after the keyboard mode overwriting, the keyboard mode should be revereted before
    // input-type-setting.
    model.setInputType(InputType.TYPE_NULL);
    assertEquals(KeyboardMode.KANA, model.getKeyboardMode());
  }
}
