/*
 * Copyright (C) 2008 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 android.widget;

import android.app.Activity;
import android.content.Intent;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.GetChars;
import android.text.Selection;
import android.text.Spannable;

/**
 * TextViewTest tests {@link TextView}.
 */
public class TextViewTest extends AndroidTestCase {

    @SmallTest
    public void testArray() throws Exception {
        TextView tv = new TextView(mContext);

        char[] c = new char[] { 'H', 'e', 'l', 'l', 'o', ' ',
                                'W', 'o', 'r', 'l', 'd', '!' };

        tv.setText(c, 1, 4);
        CharSequence oldText = tv.getText();

        tv.setText(c, 4, 5);
        CharSequence newText = tv.getText();

        assertTrue(newText == oldText);

        assertEquals(5, newText.length());
        assertEquals('o', newText.charAt(0));
        assertEquals("o Wor", newText.toString());

        assertEquals(" Wo", newText.subSequence(1, 4));

        char[] c2 = new char[7];
        ((GetChars) newText).getChars(1, 4, c2, 2);
        assertEquals('\0', c2[1]);
        assertEquals(' ', c2[2]);
        assertEquals('W', c2[3]);
        assertEquals('o', c2[4]);
        assertEquals('\0', c2[5]);
    }

    public void testProcessTextActivityResultNonEditable() {
        TextView tv = new TextView(mContext);
        CharSequence originalText = "This is some text.";
        tv.setText(originalText, TextView.BufferType.SPANNABLE);
        assertEquals(originalText, tv.getText().toString());
        tv.setTextIsSelectable(true);
        Selection.setSelection((Spannable) tv.getText(), 0, tv.getText().length());

        CharSequence newText = "Text is replaced.";
        Intent data = new Intent();
        data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText);
        tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data);

        // This is a TextView, which can't be modified. Hence no change should have been made.
        assertEquals(originalText, tv.getText().toString());
    }

    public void testProcessTextActivityResultEditable() {
        EditText tv = new EditText(mContext);
        CharSequence originalText = "This is some text.";
        tv.setText(originalText, TextView.BufferType.SPANNABLE);
        assertEquals(originalText, tv.getText().toString());
        tv.setTextIsSelectable(true);
        Selection.setSelection(tv.getText(), 0, tv.getText().length());

        CharSequence newText = "Text is replaced.";
        Intent data = new Intent();
        data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText);
        tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data);

        assertEquals(newText, tv.getText().toString());
    }

    public void testProcessTextActivityResultCancel() {
        EditText tv = new EditText(mContext);
        CharSequence originalText = "This is some text.";
        tv.setText(originalText, TextView.BufferType.SPANNABLE);
        assertEquals(originalText, tv.getText().toString());
        tv.setTextIsSelectable(true);
        Selection.setSelection(tv.getText(), 0, tv.getText().length());

        CharSequence newText = "Text is replaced.";
        Intent data = new Intent();
        data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText);
        tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_CANCELED, data);

        assertEquals(originalText, tv.getText().toString());
    }

    public void testProcessTextActivityNoData() {
        EditText tv = new EditText(mContext);
        CharSequence originalText = "This is some text.";
        tv.setText(originalText, TextView.BufferType.SPANNABLE);
        assertEquals(originalText, tv.getText().toString());
        tv.setTextIsSelectable(true);
        Selection.setSelection(tv.getText(), 0, tv.getText().length());

        tv.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, null);

        assertEquals(originalText, tv.getText().toString());
    }
}
