Automatically layout mini keyboard

Bug: 2214959

Change-Id: I06370e1c9e0683666ad19454a2fb501008af95c0
diff --git a/tests/src/com/android/inputmethod/keyboard/MiniKeyboardBuilderTests.java b/tests/src/com/android/inputmethod/keyboard/MiniKeyboardBuilderTests.java
new file mode 100644
index 0000000..7e3106d
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/MiniKeyboardBuilderTests.java
@@ -0,0 +1,312 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard;
+
+import com.android.inputmethod.keyboard.MiniKeyboardBuilder.MiniKeyboardLayoutParams;
+
+import android.test.AndroidTestCase;
+
+public class MiniKeyboardBuilderTests extends AndroidTestCase {
+    private static final int MAX_COLUMNS = 5;
+    private static final int WIDTH = 10;
+    private static final int HEIGHT = 10;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testLayoutError() {
+        MiniKeyboardLayoutParams params = null;
+        try {
+            params = new MiniKeyboardLayoutParams(
+                    10, MAX_COLUMNS + 1, WIDTH, HEIGHT,
+                    WIDTH * 2, WIDTH * MAX_COLUMNS);
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // Too small keyboard to hold mini keyboard.
+        }
+        assertNull("Too small keyboard to hold mini keyboard", params);
+    }
+
+    // Mini keyboard layout test.
+    // "[n]" represents n-th key position in mini keyboard.
+    // "[1]" is the default key.
+
+    // [1]
+    public void testLayout1Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                1, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("1 key columns", 1, params.mNumColumns);
+        assertEquals("1 key rows", 1, params.mNumRows);
+        assertEquals("1 key left", 0, params.mLeftKeys);
+        assertEquals("1 key right", 1, params.mRightKeys);
+        assertEquals("1 key [1]", 0, params.getColumnPos(0));
+        assertEquals("1 key centering", false, params.mTopRowNeedsCentering);
+        assertEquals("1 key default", 0, params.getDefaultKeyCoordX());
+    }
+
+    // [1] [2]
+    public void testLayout2Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                2, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("2 key columns", 2, params.mNumColumns);
+        assertEquals("2 key rows", 1, params.mNumRows);
+        assertEquals("2 key left", 0, params.mLeftKeys);
+        assertEquals("2 key right", 2, params.mRightKeys);
+        assertEquals("2 key [1]", 0, params.getColumnPos(0));
+        assertEquals("2 key [2]", 1, params.getColumnPos(1));
+        assertEquals("2 key centering", false, params.mTopRowNeedsCentering);
+        assertEquals("2 key default", 0, params.getDefaultKeyCoordX());
+    }
+
+    // [3] [1] [2]
+    public void testLayout3Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                3, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("3 key columns", 3, params.mNumColumns);
+        assertEquals("3 key rows", 1, params.mNumRows);
+        assertEquals("3 key left", 1, params.mLeftKeys);
+        assertEquals("3 key right", 2, params.mRightKeys);
+        assertEquals("3 key [1]", 0, params.getColumnPos(0));
+        assertEquals("3 key [2]", 1, params.getColumnPos(1));
+        assertEquals("3 key [3]", -1, params.getColumnPos(2));
+        assertEquals("3 key centering", false, params.mTopRowNeedsCentering);
+        assertEquals("3 key default", WIDTH, params.getDefaultKeyCoordX());
+    }
+
+    // [3] [1] [2] [4]
+    public void testLayout4Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                4, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("4 key columns", 4, params.mNumColumns);
+        assertEquals("4 key rows", 1, params.mNumRows);
+        assertEquals("4 key left", 1, params.mLeftKeys);
+        assertEquals("4 key right", 3, params.mRightKeys);
+        assertEquals("4 key [1]", 0, params.getColumnPos(0));
+        assertEquals("4 key [2]", 1, params.getColumnPos(1));
+        assertEquals("4 key [3]", -1, params.getColumnPos(2));
+        assertEquals("4 key [4]", 2, params.getColumnPos(3));
+        assertEquals("4 key centering", false, params.mTopRowNeedsCentering);
+        assertEquals("4 key default", WIDTH, params.getDefaultKeyCoordX());
+    }
+
+    // [5] [3] [1] [2] [4]
+    public void testLayout5Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                5, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("5 key columns", 5, params.mNumColumns);
+        assertEquals("5 key rows", 1, params.mNumRows);
+        assertEquals("5 key left", 2, params.mLeftKeys);
+        assertEquals("5 key right", 3, params.mRightKeys);
+        assertEquals("5 key [1]", 0, params.getColumnPos(0));
+        assertEquals("5 key [2]", 1, params.getColumnPos(1));
+        assertEquals("5 key [3]", -1, params.getColumnPos(2));
+        assertEquals("5 key [4]", 2, params.getColumnPos(3));
+        assertEquals("5 key [5]", -2, params.getColumnPos(4));
+        assertEquals("5 key centering", false, params.mTopRowNeedsCentering);
+        assertEquals("5 key default", WIDTH * 2, params.getDefaultKeyCoordX());
+    }
+
+    //         [6]
+    // [5] [3] [1] [2] [4]
+    public void testLayout6Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                6, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("6 key columns", 5, params.mNumColumns);
+        assertEquals("6 key rows", 2, params.mNumRows);
+        assertEquals("6 key left", 2, params.mLeftKeys);
+        assertEquals("6 key right", 3, params.mRightKeys);
+        assertEquals("6 key [1]", 0, params.getColumnPos(0));
+        assertEquals("6 key [2]", 1, params.getColumnPos(1));
+        assertEquals("6 key [3]", -1, params.getColumnPos(2));
+        assertEquals("6 key [4]", 2, params.getColumnPos(3));
+        assertEquals("6 key [5]", -2, params.getColumnPos(4));
+        assertEquals("6 key [6]", 0, params.getColumnPos(5));
+        assertEquals("6 key centering", false, params.mTopRowNeedsCentering);
+        assertEquals("6 key default", WIDTH * 2, params.getDefaultKeyCoordX());
+    }
+
+    //       [6] [7]
+    // [5] [3] [1] [2] [4]
+    public void testLayout7Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                7, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("7 key columns", 5, params.mNumColumns);
+        assertEquals("7 key rows", 2, params.mNumRows);
+        assertEquals("7 key left", 2, params.mLeftKeys);
+        assertEquals("7 key right", 3, params.mRightKeys);
+        assertEquals("7 key [1]", 0, params.getColumnPos(0));
+        assertEquals("7 key [2]", 1, params.getColumnPos(1));
+        assertEquals("7 key [3]", -1, params.getColumnPos(2));
+        assertEquals("7 key [4]", 2, params.getColumnPos(3));
+        assertEquals("7 key [5]", -2, params.getColumnPos(4));
+        assertEquals("7 key [6]", 0, params.getColumnPos(5));
+        assertEquals("7 key [7]", 1, params.getColumnPos(6));
+        assertEquals("7 key centering", true, params.mTopRowNeedsCentering);
+        assertEquals("7 key default", WIDTH * 2, params.getDefaultKeyCoordX());
+    }
+
+    //     [8] [6] [7]
+    // [5] [3] [1] [2] [4]
+    public void testLayout8Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                8, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("8 key columns", 5, params.mNumColumns);
+        assertEquals("8 key rows", 2, params.mNumRows);
+        assertEquals("8 key left", 2, params.mLeftKeys);
+        assertEquals("8 key right", 3, params.mRightKeys);
+        assertEquals("8 key [1]", 0, params.getColumnPos(0));
+        assertEquals("8 key [2]", 1, params.getColumnPos(1));
+        assertEquals("8 key [3]", -1, params.getColumnPos(2));
+        assertEquals("8 key [4]", 2, params.getColumnPos(3));
+        assertEquals("8 key [5]", -2, params.getColumnPos(4));
+        assertEquals("8 key [6]", 0, params.getColumnPos(5));
+        assertEquals("8 key [7]", 1, params.getColumnPos(6));
+        assertEquals("8 key [8]", -1, params.getColumnPos(7));
+        assertEquals("8 key centering", false, params.mTopRowNeedsCentering);
+        assertEquals("8 key default", WIDTH * 2, params.getDefaultKeyCoordX());
+    }
+
+    //   [8] [6] [7] [9]
+    // [5] [3] [1] [2] [4]
+    public void testLayout9Key() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                9, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 5, WIDTH * 10);
+        assertEquals("9 key columns", 5, params.mNumColumns);
+        assertEquals("9 key rows", 2, params.mNumRows);
+        assertEquals("9 key left", 2, params.mLeftKeys);
+        assertEquals("9 key right", 3, params.mRightKeys);
+        assertEquals("9 key [1]", 0, params.getColumnPos(0));
+        assertEquals("9 key [2]", 1, params.getColumnPos(1));
+        assertEquals("9 key [3]", -1, params.getColumnPos(2));
+        assertEquals("9 key [4]", 2, params.getColumnPos(3));
+        assertEquals("9 key [5]", -2, params.getColumnPos(4));
+        assertEquals("9 key [6]", 0, params.getColumnPos(5));
+        assertEquals("9 key [7]", 1, params.getColumnPos(6));
+        assertEquals("9 key [8]", -1, params.getColumnPos(7));
+        assertEquals("9 key [9]", 2, params.getColumnPos(8));
+        assertEquals("9 key centering", true, params.mTopRowNeedsCentering);
+        assertEquals("9 key default", WIDTH * 2, params.getDefaultKeyCoordX());
+    }
+
+    // Nine keys test.  There is no key space for mini keyboard at left of the parent key.
+    //   [6] [7] [8] [9]
+    // [1] [2] [3] [4] [5]
+    public void testLayout9KeyLeft() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                9, MAX_COLUMNS, WIDTH, HEIGHT,
+                0, WIDTH * 10);
+        assertEquals("9 key left columns", 5, params.mNumColumns);
+        assertEquals("9 key left rows", 2, params.mNumRows);
+        assertEquals("9 key left left", 0, params.mLeftKeys);
+        assertEquals("9 key left right", 5, params.mRightKeys);
+        assertEquals("9 key left [1]", 0, params.getColumnPos(0));
+        assertEquals("9 key left [2]", 1, params.getColumnPos(1));
+        assertEquals("9 key left [3]", 2, params.getColumnPos(2));
+        assertEquals("9 key left [4]", 3, params.getColumnPos(3));
+        assertEquals("9 key left [5]", 4, params.getColumnPos(4));
+        assertEquals("9 key left [6]", 0, params.getColumnPos(5));
+        assertEquals("9 key left [7]", 1, params.getColumnPos(6));
+        assertEquals("9 key left [8]", 2, params.getColumnPos(7));
+        assertEquals("9 key left [9]", 3, params.getColumnPos(8));
+        assertEquals("9 key left centering", true, params.mTopRowNeedsCentering);
+        assertEquals("9 key left default", 0, params.getDefaultKeyCoordX());
+    }
+
+    // Nine keys test.  There is only one key space for mini keyboard at left of the parent key.
+    //   [8] [6] [7] [9]
+    // [3] [1] [2] [4] [5]
+    public void testLayout9KeyNearLeft() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                9, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH, WIDTH * 10);
+        assertEquals("9 key near left columns", 5, params.mNumColumns);
+        assertEquals("9 key near left rows", 2, params.mNumRows);
+        assertEquals("9 key near left left", 1, params.mLeftKeys);
+        assertEquals("9 key near left right", 4, params.mRightKeys);
+        assertEquals("9 key near left [1]", 0, params.getColumnPos(0));
+        assertEquals("9 key near left [2]", 1, params.getColumnPos(1));
+        assertEquals("9 key near left [3]", -1, params.getColumnPos(2));
+        assertEquals("9 key near left [4]", 2, params.getColumnPos(3));
+        assertEquals("9 key near left [5]", 3, params.getColumnPos(4));
+        assertEquals("9 key near left [6]", 0, params.getColumnPos(5));
+        assertEquals("9 key near left [7]", 1, params.getColumnPos(6));
+        assertEquals("9 key near left [8]", -1, params.getColumnPos(7));
+        assertEquals("9 key near left [9]", 2, params.getColumnPos(8));
+        assertEquals("9 key near left centering", true, params.mTopRowNeedsCentering);
+        assertEquals("9 key near left default", WIDTH, params.getDefaultKeyCoordX());
+    }
+
+
+    // Nine keys test.  There is no key space for mini keyboard at right of the parent key.
+    //   [9] [8] [7] [6]
+    // [5] [4] [3] [2] [1]
+    public void testLayout9KeyRight() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                9, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 9, WIDTH * 10);
+        assertEquals("9 key right columns", 5, params.mNumColumns);
+        assertEquals("9 key right rows", 2, params.mNumRows);
+        assertEquals("9 key right left", 4, params.mLeftKeys);
+        assertEquals("9 key right right", 1, params.mRightKeys);
+        assertEquals("9 key right [1]", 0, params.getColumnPos(0));
+        assertEquals("9 key right [2]", -1, params.getColumnPos(1));
+        assertEquals("9 key right [3]", -2, params.getColumnPos(2));
+        assertEquals("9 key right [4]", -3, params.getColumnPos(3));
+        assertEquals("9 key right [5]", -4, params.getColumnPos(4));
+        assertEquals("9 key right [6]", 0, params.getColumnPos(5));
+        assertEquals("9 key right [7]", -1, params.getColumnPos(6));
+        assertEquals("9 key right [8]", -2, params.getColumnPos(7));
+        assertEquals("9 key right [9]", -3, params.getColumnPos(8));
+        assertEquals("9 key right centering", true, params.mTopRowNeedsCentering);
+        assertEquals("9 key right default", WIDTH * 4, params.getDefaultKeyCoordX());
+    }
+
+    // Nine keys test.  There is only one key space for mini keyboard at right of the parent key.
+    //   [9] [8] [6] [7]
+    // [5] [4] [3] [1] [2]
+    public void testLayout9KeyNearRight() {
+        MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
+                9, MAX_COLUMNS, WIDTH, HEIGHT,
+                WIDTH * 8, WIDTH * 10);
+        assertEquals("9 key near right columns", 5, params.mNumColumns);
+        assertEquals("9 key near right rows", 2, params.mNumRows);
+        assertEquals("9 key near right left", 3, params.mLeftKeys);
+        assertEquals("9 key near right right", 2, params.mRightKeys);
+        assertEquals("9 key near right [1]", 0, params.getColumnPos(0));
+        assertEquals("9 key near right [2]", 1, params.getColumnPos(1));
+        assertEquals("9 key near right [3]", -1, params.getColumnPos(2));
+        assertEquals("9 key near right [4]", -2, params.getColumnPos(3));
+        assertEquals("9 key near right [5]", -3, params.getColumnPos(4));
+        assertEquals("9 key near right [6]", 0, params.getColumnPos(5));
+        assertEquals("9 key near right [7]", 1, params.getColumnPos(6));
+        assertEquals("9 key near right [8]", -1, params.getColumnPos(7));
+        assertEquals("9 key near right [9]", -2, params.getColumnPos(8));
+        assertEquals("9 key near right centering", true, params.mTopRowNeedsCentering);
+        assertEquals("9 key near right default", WIDTH * 3, params.getDefaultKeyCoordX());
+    }
+}