diff --git a/tests/src/com/android/inputmethod/keyboard/layout/AlphabetShifted.java b/tests/src/com/android/inputmethod/keyboard/layout/AlphabetShifted.java
new file mode 100644
index 0000000..be3ed12
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/AlphabetShifted.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2014 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.layout;
+
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.expected.LayoutBase;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+/**
+ * The generic upper case alphabet keyboard layout.
+ */
+public final class AlphabetShifted extends LayoutBase {
+    public static ExpectedKey[][] getAlphabet(final ExpectedKey[][] lowerCaseKeyboard,
+            final Locale locale) {
+        final ExpectedKey[][] upperCaseKeyboard = ExpectedKeyboardBuilder.toUpperCase(
+                lowerCaseKeyboard, locale);
+        return new ExpectedKeyboardBuilder(upperCaseKeyboard)
+                .replaceKeyOfAll(SHIFT_KEY, SHIFTED_SHIFT_KEY)
+                .build();
+    }
+
+    // Icon id.
+    private static final int ICON_SHIFTED_SHIFT = KeyboardIconsSet.getIconId("shift_key_shifted");
+
+    // Functional key.
+    private static final ExpectedKey SHIFTED_SHIFT_KEY = key(
+            ICON_SHIFTED_SHIFT, Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY);
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
new file mode 100644
index 0000000..f7179b7
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2014 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.layout;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.expected.LayoutBase;
+
+/**
+ * The QWERTY alphabet keyboard.
+ */
+public final class Qwerty extends LayoutBase {
+    public static ExpectedKey[][] getAlphabet(final boolean isPhone) {
+        return toCommonAlphabet(ALPHABET_COMMON, isPhone);
+    }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder(10, 9, 7, 3)
+            .setLabelsOfRow(1, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p")
+            .setMoreKeysOf("q", "1")
+            .setMoreKeysOf("w", "2")
+            .setMoreKeysOf("e", "3")
+            .setMoreKeysOf("r", "4")
+            .setMoreKeysOf("t", "5")
+            .setMoreKeysOf("y", "6")
+            .setMoreKeysOf("u", "7")
+            .setMoreKeysOf("i", "8")
+            .setMoreKeysOf("o", "9")
+            .setMoreKeysOf("p", "0")
+            .setLabelsOfRow(2, "a", "s", "d", "f", "g", "h", "j", "k", "l")
+            .setLabelsOfRow(3, "z", "x", "c", "v", "b", "n", "m")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
new file mode 100644
index 0000000..03d7f07
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2014 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.layout;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.expected.LayoutBase;
+import com.android.inputmethod.latin.Constants;
+
+/**
+ * The symbols keyboard layout.
+ */
+public final class Symbols extends LayoutBase {
+    public static ExpectedKey[][] getSymbols(final boolean isPhone) {
+        return isPhone ? toPhoneSymbol(SYMBOLS_COMMON) : toTabletSymbols(SYMBOLS_COMMON);
+    }
+
+    // Functional keys.
+    public static final ExpectedKey ALPHABET_KEY = key("ABC", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    public static final ExpectedKey SYMBOLS_SHIFT_KEY = key("= \\ <", Constants.CODE_SHIFT);
+    public static final ExpectedKey TABLET_SYMBOLS_SHIFT_KEY = key("~ [ <", Constants.CODE_SHIFT);
+
+    // Common symbols keyboard layout.
+    public static final ExpectedKey[][] SYMBOLS_COMMON = new ExpectedKeyboardBuilder(10, 9, 7, 5)
+            .setLabelsOfRow(1, "1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
+            // U+00B9: "¹" SUPERSCRIPT ONE
+            // U+00BD: "½" VULGAR FRACTION ONE HALF
+            // U+2153: "⅓" VULGAR FRACTION ONE THIRD
+            // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
+            // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
+            .setMoreKeysOf("1", "\u00B9", "\u00BD", "\u2153", "\u00BC", "\u215B")
+            // U+00B2: "²" SUPERSCRIPT TWO
+            // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
+            .setMoreKeysOf("2", "\u00B2", "\u2154")
+            // U+00B3: "³" SUPERSCRIPT THREE
+            // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
+            // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
+            .setMoreKeysOf("3", "\u00B3", "\u00BE", "\u215C")
+            // U+2074: "⁴" SUPERSCRIPT FOUR
+            .setMoreKeysOf("4", "\u2074")
+            // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
+            .setMoreKeysOf("5", "\u215D")
+            // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
+            .setMoreKeysOf("7", "\u215E")
+            // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
+            // U+2205: "∅" EMPTY SET
+            .setMoreKeysOf("0", "\u207F", "\u2205")
+            .setLabelsOfRow(2, "@", "#", "$", "%", "&", "-", "+", "(", ")")
+            // U+00A2: "¢" CENT SIGN
+            // U+00A3: "£" POUND SIGN
+            // U+20AC: "€" EURO SIGN
+            // U+00A5: "¥" YEN SIGN
+            // U+20B1: "₱" PESO SIGN
+            .setMoreKeysOf("$", "\u00A2", "\u00A3", "\u20AC", "\u00A5", "\u20B1")
+            // U+2030: "‰" PER MILLE SIGN
+            .setMoreKeysOf("%", "\u2030")
+            // U+2013: "–" EN DASH
+            // U+2014: "—" EM DASH
+            // U+00B7: "·" MIDDLE DOT
+            .setMoreKeysOf("-", "_", "\u2013", "\u2014", "\u00B7")
+            // U+00B1: "±" PLUS-MINUS SIGN
+            .setMoreKeysOf("+", "\u00B1")
+            .setMoreKeysOf("(", "<", "{", "[")
+            .setMoreKeysOf(")", ">", "}", "]")
+            .setLabelsOfRow(3, "*", "\"", "'", ":", ";", "!", "?")
+            // U+2020: "†" DAGGER
+            // U+2021: "‡" DOUBLE DAGGER
+            // U+2605: "★" BLACK STAR
+            .setMoreKeysOf("*", "\u2020", "\u2021", "\u2605")
+            // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+            // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+            // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+            // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+            // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+            .setMoreKeysOf("\"", "\u201E", "\u201C", "\u201D", "\u00AB", "\u00BB")
+            // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+            // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+            // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+            // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+            // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+            .setMoreKeysOf("'", "\u201A", "\u2018", "\u2019", "\u2039", "\u203A")
+            // U+00A1: "¡" INVERTED EXCLAMATION MARK
+            .setMoreKeysOf("!", "\u00A1")
+            // U+00BF: "¿" INVERTED QUESTION MARK
+            .setMoreKeysOf("?", "\u00BF")
+            .setLabelsOfRow(4, "_", "/", " ", ",", ".")
+            // U+2026: "…" HORIZONTAL ELLIPSIS
+            .setMoreKeysOf(".", "\u2026")
+            .build();
+
+    private static ExpectedKey[][] toPhoneSymbol(final ExpectedKey[][] common) {
+        return new ExpectedKeyboardBuilder(common)
+                .addKeysOnTheLeftOfRow(3, Symbols.SYMBOLS_SHIFT_KEY)
+                .addKeysOnTheRightOfRow(3, DELETE_KEY)
+                .addKeysOnTheLeftOfRow(4, Symbols.ALPHABET_KEY)
+                .addKeysOnTheRightOfRow(4, key(ENTER_KEY, EMOJI_KEY))
+                .build();
+    }
+
+    private static ExpectedKey[][] toTabletSymbols(final ExpectedKey[][] common) {
+        return new ExpectedKeyboardBuilder(common)
+                .addKeysOnTheLeftOfRow(3,
+                        key("\\"), key("="))
+                .addKeysOnTheRightOfRow(1, DELETE_KEY)
+                .addKeysOnTheRightOfRow(2, ENTER_KEY)
+                .addKeysOnTheLeftOfRow(3, Symbols.TABLET_SYMBOLS_SHIFT_KEY)
+                .addKeysOnTheRightOfRow(3, Symbols.TABLET_SYMBOLS_SHIFT_KEY)
+                .addKeysOnTheLeftOfRow(4, Symbols.ALPHABET_KEY)
+                .addKeysOnTheRightOfRow(4, EMOJI_KEY)
+                .build();
+    }
+
+    // Helper method to add currency symbols for Euro.
+    public static ExpectedKeyboardBuilder euro(final ExpectedKeyboardBuilder builder) {
+        return builder
+                // U+20AC: "€" EURO SIGN
+                // U+00A2: "¢" CENT SIGN
+                // U+00A3: "£" POUND SIGN
+                // U+00A5: "¥" YEN SIGN
+                // U+20B1: "₱" PESO SIGN
+                .replaceKeyOfLabel("$", key("\u20AC",
+                        moreKey("\u00A2"), moreKey("\u00A3"), moreKey("$"),
+                        moreKey("\u00A5"), moreKey("\u20B1")));
+    }
+
+    // Helper method to add single quotes "more keys".
+    // "9LLR" means "9-low/Left quotation marks, Left/Right-pointing angle quotation marks".
+    public static ExpectedKeyboardBuilder singleQuotes9LLR(final ExpectedKeyboardBuilder builder) {
+        return builder
+                // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+                // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+                // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+                // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+                // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+                .setMoreKeysOf("'", "\u2019", "\u201A", "\u2018", "\u2039", "\u203A");
+    }
+
+    // Helper method to add single quotes "more keys".
+    // "9LLR" means "9-low/Left quotation marks, Right/Left-pointing angle quotation marks".
+    public static ExpectedKeyboardBuilder singleQuotes9LRL(final ExpectedKeyboardBuilder builder) {
+        return builder
+                // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+                // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+                // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+                // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+                // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+                .setMoreKeysOf("'", "\u2019", "\u201A", "\u2018", "\u203A", "\u2039");
+    }
+
+    // Helper method to add double quotes "more keys".
+    // "9LLR" means "9-low/Left quotation marks, Left/Right-pointing angle quotation marks".
+    public static ExpectedKeyboardBuilder doubleQuotes9LLR(final ExpectedKeyboardBuilder builder) {
+        return builder
+                // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+                // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+                // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+                // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+                // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+                .setMoreKeysOf("\"", "\u201D", "\u201E", "\u201C", "\u00AB", "\u00BB");
+    }
+
+    // Helper method to add double quotes "more keys".
+    // "9LLR" means "9-low/Left quotation marks, Right/Left-pointing angle quotation marks".
+    public static ExpectedKeyboardBuilder doubleQuotes9LRL(final ExpectedKeyboardBuilder builder) {
+        return builder
+                // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+                // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+                // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+                // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+                // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+                .setMoreKeysOf("\"", "\u201D", "\u201E", "\u201C", "\u00BB", "\u00AB");
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
new file mode 100644
index 0000000..368f9db
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2014 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.layout;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.expected.LayoutBase;
+import com.android.inputmethod.latin.Constants;
+
+/**
+ * The symbols shifted keyboard layout.
+ */
+public final class SymbolsShifted extends LayoutBase {
+    public static ExpectedKey[][] getSymbolsShifted(final boolean isPhone) {
+        return isPhone ? toPhoneSymbolsShifted(SYMBOLS_SHIFTED_COMMON)
+                : toTabletSymbolsShifted(SYMBOLS_SHIFTED_COMMON);
+    }
+
+    // Functional key.
+    public static final ExpectedKey BACK_TO_SYMBOLS_KEY = key("?123", Constants.CODE_SHIFT);
+
+    // Common symbols shifted keyboard layout.
+    public static final ExpectedKey[][] SYMBOLS_SHIFTED_COMMON =
+            new ExpectedKeyboardBuilder(10, 9, 7, 5)
+            // U+0060: "`" GRAVE ACCENT
+            // U+2022: "•" BULLET
+            // U+221A: "√" SQUARE ROOT
+            // U+03C0: "π" GREEK SMALL LETTER PI
+            // U+00F7: "÷" DIVISION SIGN
+            // U+00D7: "×" MULTIPLICATION SIGN
+            // U+00B6: "¶" PILCROW SIGN
+            // U+2206: "∆" INCREMENT
+            .setLabelsOfRow(1,
+                    "~", "\u0060", "|", "\u2022", "\u221A",
+                    "\u03C0", "\u00F7", "\u00D7", "\u00B6", "\u2206")
+            // U+2022: "•" BULLET
+            // U+266A: "♪" EIGHTH NOTE
+            // U+2665: "♥" BLACK HEART SUIT
+            // U+2660: "♠" BLACK SPADE SUIT
+            // U+2666: "♦" BLACK DIAMOND SUIT
+            // U+2663: "♣" BLACK CLUB SUIT
+            .setMoreKeysOf("\u2022", "\u266A", "\u2665", "\u2660", "\u2666", "\u2663")
+            // U+03C0: "π" GREEK SMALL LETTER PI
+            // U+03A0: "Π" GREEK CAPITAL LETTER PI
+            .setMoreKeysOf("\u03C0", "\u03A0")
+            // U+00B6: "¶" PILCROW SIGN
+            // U+00A7: "§" SECTION SIGN
+            .setMoreKeysOf("\u00B6", "\u00A7")
+            // U+00A3: "£" POUND SIGN
+            // U+00A2: "¢" CENT SIGN
+            // U+20AC: "€" EURO SIGN
+            // U+00A5: "¥" YEN SIGN
+            // U+00B0: "°" DEGREE SIGN
+            .setLabelsOfRow(2,
+                    "\u00A3", "\u00A2", "\u20AC", "\u00A5", "^",
+                    "\u00B0", "=", "{", "}")
+            // U+2191: "↑" UPWARDS ARROW
+            // U+2193: "↓" DOWNWARDS ARROW
+            // U+2190: "←" LEFTWARDS ARROW
+            // U+2192: "→" RIGHTWARDS ARROW
+            .setMoreKeysOf("^", "\u2191", "\u2193", "\u2190", "\u2192")
+            // U+00B0: "°" DEGREE SIGN
+            // U+2032: "′" PRIME
+            // U+2033: "″" DOUBLE PRIME
+            .setMoreKeysOf("\u00B0", "\u2032", "\u2033")
+            // U+2260: "≠" NOT EQUAL TO
+            // U+2248: "≈" ALMOST EQUAL TO
+            // U+221E: "∞" INFINITY
+            .setMoreKeysOf("=", "\u2260", "\u2248", "\u221E")
+            // U+00A9: "©" COPYRIGHT SIGN
+            // U+00AE: "®" REGISTERED SIGN
+            // U+2122: "™" TRADE MARK SIGN
+            // U+2105: "℅" CARE OF
+            .setLabelsOfRow(3,
+                    "\\", "\u00A9", "\u00AE", "\u2122", "\u2105",
+                    "[", "]")
+            .setLabelsOfRow(4,
+                    "<", ">", " ", ",", ".")
+            // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+            // U+2264: "≤" LESS-THAN OR EQUAL TO
+            // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+            .setMoreKeysOf("<", "\u2039", "\u2264", "\u00AB")
+            // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+            // U+2265: "≥" GREATER-THAN EQUAL TO
+            // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+            .setMoreKeysOf(">", "\u203A", "\u2265", "\u00BB")
+            // U+2026: "…" HORIZONTAL ELLIPSIS
+            .setMoreKeysOf(".", "\u2026")
+            .build();
+
+    private static ExpectedKey[][] toPhoneSymbolsShifted(final ExpectedKey[][] common) {
+        return new ExpectedKeyboardBuilder(common)
+                .addKeysOnTheLeftOfRow(3, BACK_TO_SYMBOLS_KEY)
+                .addKeysOnTheRightOfRow(3, DELETE_KEY)
+                .addKeysOnTheLeftOfRow(4, Symbols.ALPHABET_KEY)
+                .addKeysOnTheRightOfRow(4, key(ENTER_KEY, EMOJI_KEY))
+                .build();
+    }
+
+    private static ExpectedKey[][] toTabletSymbolsShifted(final ExpectedKey[][] common) {
+        return new ExpectedKeyboardBuilder(common)
+                // U+00BF: "¿" INVERTED QUESTION MARK
+                // U+00A1: "¡" INVERTED EXCLAMATION MARK
+                .addKeysOnTheRightOfRow(3,
+                        key("\u00A1"), key("\u00BF"))
+                .addKeysOnTheRightOfRow(1, DELETE_KEY)
+                .addKeysOnTheRightOfRow(2, ENTER_KEY)
+                .addKeysOnTheLeftOfRow(3, BACK_TO_SYMBOLS_KEY)
+                .addKeysOnTheRightOfRow(3, BACK_TO_SYMBOLS_KEY)
+                .addKeysOnTheLeftOfRow(4, Symbols.ALPHABET_KEY)
+                .addKeysOnTheRightOfRow(4, EMOJI_KEY)
+                .build();
+    }
+
+    // Helper method to add currency symbols for Euro.
+    public static ExpectedKeyboardBuilder euro(final ExpectedKeyboardBuilder builder) {
+        return builder
+                // U+00A5: "¥" YEN SIGN
+                // U+00A2: "¢" CENT SIGN
+                .replaceKeyOfLabel("\u00A5", key("\u00A2"))
+                // U+20AC: "€" EURO SIGN
+                // U+00A2: "¢" CENT SIGN
+                .replaceKeyOfLabel("\u20AC", key("$", moreKey("\u00A2")))
+                // U+00A2: "¢" CENT SIGN
+                // U+00A5: "¥" YEN SIGN
+                .replaceKeyOfLabel("\u00A2", key("\u00A5"));
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/LayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/LayoutBase.java
new file mode 100644
index 0000000..1aeb8c0
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/LayoutBase.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2014 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.layout.expected;
+
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.latin.Constants;
+
+/**
+ * Base class to create an expected keyboard for unit test.
+ */
+public class LayoutBase {
+    // Those helper methods have a lower case name to be readable when defining expected keyboard
+    // layouts.
+
+    // Helper method to create {@link ExpectedKey} object that has the label.
+    public static ExpectedKey key(final String label, final ExpectedKey ... moreKeys) {
+        return ExpectedKey.newInstance(label, moreKeys);
+    }
+
+    // Helper method to create {@link ExpectedKey} object that has the label and the output text.
+    public static ExpectedKey key(final String label, final String outputText,
+            final ExpectedKey ... moreKeys) {
+        return ExpectedKey.newInstance(label, outputText, moreKeys);
+    }
+
+    // Helper method to create {@link ExpectedKey} object that has the label and the output code.
+    public static ExpectedKey key(final String label, final int code,
+            final ExpectedKey ... moreKeys) {
+        return ExpectedKey.newInstance(label, code, moreKeys);
+    }
+
+    // Helper method to create {@link ExpectedKey} object that has the icon and the output code.
+    public static ExpectedKey key(final int iconId, final int code,
+            final ExpectedKey ... moreKeys) {
+        return ExpectedKey.newInstance(iconId, code, moreKeys);
+    }
+
+    // Helper method to create {@link ExpectedKey} object that has new "more keys".
+    public static ExpectedKey key(final ExpectedKey key, final ExpectedKey ... moreKeys) {
+        return ExpectedKey.newInstance(key.getVisual(), key.getOutput(), moreKeys);
+    }
+
+    // Helper method to create {@link ExpectedKey} object for "more key" that has the label.
+    public static ExpectedKey moreKey(final String label) {
+        return ExpectedKey.newInstance(label);
+    }
+
+    // Helper method to create {@link ExpectedKey} object for "more key" that has the label and the
+    // output text.
+    public static ExpectedKey moreKey(final String label, final String outputText) {
+        return ExpectedKey.newInstance(label, outputText);
+    }
+
+    // Helper method to create {@link ExpectedKey} object for "more key" that has the label and the
+    // output code.
+    public static ExpectedKey moreKey(final String label, final int code) {
+        return ExpectedKey.newInstance(label, code);
+    }
+
+    // Icon ids.
+    private static final int ICON_SHIFT = KeyboardIconsSet.getIconId("shift_key");
+    private static final int ICON_DELETE = KeyboardIconsSet.getIconId("delete_key");
+    private static final int ICON_SETTINGS = KeyboardIconsSet.getIconId("settings_key");
+    private static final int ICON_ENTER = KeyboardIconsSet.getIconId("enter_key");
+    private static final int ICON_EMOJI = KeyboardIconsSet.getIconId("emoji_key");
+
+    // Functional keys.
+    public static final ExpectedKey CAPSLOCK_MORE_KEY = key(" ", Constants.CODE_CAPSLOCK);
+    public static final ExpectedKey SHIFT_KEY = key(ICON_SHIFT, Constants.CODE_SHIFT);
+    public static final ExpectedKey DELETE_KEY = key(ICON_DELETE, Constants.CODE_DELETE);
+    public static final ExpectedKey SYMBOLS_KEY = key("?123", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    public static final ExpectedKey SETTINGS_KEY = key(ICON_SETTINGS, Constants.CODE_SETTINGS);
+    public static final ExpectedKey ENTER_KEY = key(ICON_ENTER, Constants.CODE_ENTER);
+    public static final ExpectedKey EMOJI_KEY = key(ICON_EMOJI, Constants.CODE_EMOJI);
+
+    // Punctuation more keys for phone form factor.
+    public static final String[] PHONE_PUNCTUATION_MORE_KEYS = {
+            ";", "/", "(", ")", "#", "!", ",", "?",
+            "&", "%", "+", "\"", "-", ":", "'", "@"
+    };
+
+    // Punctuation more keys for tablet form factor.
+    public static final String[] TABLET_PUNCTUATION_MORE_KEYS = {
+            ";", "/", "(", ")", "#", "'", ",",
+            "&", "%", "+", "\"", "-", ":", "@"
+    };
+
+    private static ExpectedKeyboardBuilder toPhoneAlphabet(final ExpectedKeyboardBuilder builder) {
+        return builder
+                .addKeysOnTheLeftOfRow(3, key(SHIFT_KEY, CAPSLOCK_MORE_KEY))
+                .addKeysOnTheRightOfRow(3, DELETE_KEY)
+                .setLabelsOfRow(4, ",", " ", ".")
+                .setMoreKeysOf(",", SETTINGS_KEY)
+                .setMoreKeysOf(".", PHONE_PUNCTUATION_MORE_KEYS)
+                .addKeysOnTheLeftOfRow(4, SYMBOLS_KEY)
+                .addKeysOnTheRightOfRow(4, key(ENTER_KEY, EMOJI_KEY));
+    }
+
+    // Helper method to create alphabet layout for tablet by adding special function keys except
+    // shift key.
+    public static ExpectedKeyboardBuilder toTabletAlphabetWithoutShiftKeys(
+            final ExpectedKeyboardBuilder builder) {
+        return builder
+                // U+00BF: "¿" INVERTED QUESTION MARK
+                // U+00A1: "¡" INVERTED EXCLAMATION MARK
+                .addKeysOnTheRightOfRow(3,
+                        key("!", moreKey("\u00A1")), key("?", moreKey("\u00BF")))
+                .addKeysOnTheRightOfRow(1, DELETE_KEY)
+                .addKeysOnTheRightOfRow(2, ENTER_KEY)
+                .setLabelsOfRow(4, "/", " ", ",", ".")
+                .setMoreKeysOf(".", TABLET_PUNCTUATION_MORE_KEYS)
+                .addKeysOnTheLeftOfRow(4, SYMBOLS_KEY, SETTINGS_KEY)
+                .addKeysOnTheRightOfRow(4, EMOJI_KEY);
+    }
+
+    // Helper method to create alphabet layout by adding special function keys.
+    public static ExpectedKey[][] toCommonAlphabet(final ExpectedKey[][] common,
+            final boolean isPhone) {
+        final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(common);
+        if (isPhone) {
+            toPhoneAlphabet(builder);
+        } else {
+            toTabletAlphabetWithoutShiftKeys(builder);
+            builder.addKeysOnTheLeftOfRow(3, key(SHIFT_KEY, CAPSLOCK_MORE_KEY))
+                    .addKeysOnTheRightOfRow(3, key(SHIFT_KEY, CAPSLOCK_MORE_KEY));
+        }
+        return builder.build();
+    }
+}
