/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.gecko.tests.helpers;

import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertEquals;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;

/**
 * Provides helper functions for accessing the InputConnection interface
 */
public final class TextInputHelper {

    private TextInputHelper() { /* To disallow instantiation. */ }

    private static ExtractedText getExtractedText(final InputConnection ic) {
        ExtractedTextRequest req = new ExtractedTextRequest();
        ExtractedText extract = ic.getExtractedText(req, 0);
        return extract;
    }

    public static String getText(final InputConnection ic) {
        return getExtractedText(ic).text.toString();
    }

    public static void assertText(final String message,
                                  final InputConnection ic,
                                  final String text) {
        fAssertEquals(message, text, getText(ic));
    }

    public static void assertSelection(final String message,
                                       final InputConnection ic,
                                       final int start,
                                       final int end) {
        ExtractedText extract = getExtractedText(ic);
        fAssertEquals(message, start, extract.selectionStart);
        fAssertEquals(message, end, extract.selectionEnd);
    }

    public static void assertSelectionAt(final String message,
                                         final InputConnection ic,
                                         final int value) {
        assertSelection(message, ic, value, value);
    }

    public static void assertTextAndSelection(final String message,
                                              final InputConnection ic,
                                              final String text,
                                              final int start,
                                              final int end) {
        ExtractedText extract = getExtractedText(ic);
        fAssertEquals(message, text, extract.text);
        fAssertEquals(message, start, extract.selectionStart);
        fAssertEquals(message, end, extract.selectionEnd);
    }

    public static void assertTextAndSelectionAt(final String message,
                                                final InputConnection ic,
                                                final String text,
                                                final int selection) {
        assertTextAndSelection(message, ic, text, selection, selection);
    }
}
