/*
 * Copyright (C) 2013 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.latin.utils;

import static org.junit.Assert.assertEquals;

import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.inputmethod.latin.common.Constants;

import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Locale;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class RecapitalizeStatusTests {
    private static final int[] SPACE = { Constants.CODE_SPACE };

    @Test
    public void testTrim() {
        final RecapitalizeStatus status = new RecapitalizeStatus();
        status.start(30, 40, "abcdefghij", Locale.ENGLISH, SPACE);
        status.trim();
        assertEquals("abcdefghij", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(40, status.getNewCursorEnd());

        status.start(30, 44, "    abcdefghij", Locale.ENGLISH, SPACE);
        status.trim();
        assertEquals("abcdefghij", status.getRecapitalizedString());
        assertEquals(34, status.getNewCursorStart());
        assertEquals(44, status.getNewCursorEnd());

        status.start(30, 40, "abcdefgh  ", Locale.ENGLISH, SPACE);
        status.trim();
        assertEquals("abcdefgh", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(38, status.getNewCursorEnd());

        status.start(30, 45, "   abcdefghij  ", Locale.ENGLISH, SPACE);
        status.trim();
        assertEquals("abcdefghij", status.getRecapitalizedString());
        assertEquals(33, status.getNewCursorStart());
        assertEquals(43, status.getNewCursorEnd());
    }

    @Test
    public void testRotate() {
        final RecapitalizeStatus status = new RecapitalizeStatus();
        status.start(29, 40, "abcd efghij", Locale.ENGLISH, SPACE);
        status.rotate();
        assertEquals("Abcd Efghij", status.getRecapitalizedString());
        assertEquals(29, status.getNewCursorStart());
        assertEquals(40, status.getNewCursorEnd());
        status.rotate();
        assertEquals("ABCD EFGHIJ", status.getRecapitalizedString());
        status.rotate();
        assertEquals("abcd efghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("Abcd Efghij", status.getRecapitalizedString());

        status.start(29, 40, "Abcd Efghij", Locale.ENGLISH, SPACE);
        status.rotate();
        assertEquals("ABCD EFGHIJ", status.getRecapitalizedString());
        assertEquals(29, status.getNewCursorStart());
        assertEquals(40, status.getNewCursorEnd());
        status.rotate();
        assertEquals("abcd efghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("Abcd Efghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("ABCD EFGHIJ", status.getRecapitalizedString());

        status.start(29, 40, "ABCD EFGHIJ", Locale.ENGLISH, SPACE);
        status.rotate();
        assertEquals("abcd efghij", status.getRecapitalizedString());
        assertEquals(29, status.getNewCursorStart());
        assertEquals(40, status.getNewCursorEnd());
        status.rotate();
        assertEquals("Abcd Efghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("ABCD EFGHIJ", status.getRecapitalizedString());
        status.rotate();
        assertEquals("abcd efghij", status.getRecapitalizedString());

        status.start(29, 39, "AbCDefghij", Locale.ENGLISH, SPACE);
        status.rotate();
        assertEquals("abcdefghij", status.getRecapitalizedString());
        assertEquals(29, status.getNewCursorStart());
        assertEquals(39, status.getNewCursorEnd());
        status.rotate();
        assertEquals("Abcdefghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("ABCDEFGHIJ", status.getRecapitalizedString());
        status.rotate();
        assertEquals("AbCDefghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("abcdefghij", status.getRecapitalizedString());

        status.start(29, 40, "Abcd efghij", Locale.ENGLISH, SPACE);
        status.rotate();
        assertEquals("abcd efghij", status.getRecapitalizedString());
        assertEquals(29, status.getNewCursorStart());
        assertEquals(40, status.getNewCursorEnd());
        status.rotate();
        assertEquals("Abcd Efghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("ABCD EFGHIJ", status.getRecapitalizedString());
        status.rotate();
        assertEquals("Abcd efghij", status.getRecapitalizedString());
        status.rotate();
        assertEquals("abcd efghij", status.getRecapitalizedString());

        status.start(30, 34, "gr眉脽", Locale.GERMAN, SPACE);
        status.rotate();
        assertEquals("Gr眉脽", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(34, status.getNewCursorEnd());
        status.rotate();
        assertEquals("GR脺SS", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(35, status.getNewCursorEnd());
        status.rotate();
        assertEquals("gr眉脽", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(34, status.getNewCursorEnd());
        status.rotate();
        assertEquals("Gr眉脽", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(34, status.getNewCursorEnd());

        status.start(30, 33, "艙uf", Locale.FRENCH, SPACE);
        status.rotate();
        assertEquals("艗uf", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());
        status.rotate();
        assertEquals("艗UF", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());
        status.rotate();
        assertEquals("艙uf", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());
        status.rotate();
        assertEquals("艗uf", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());

        status.start(30, 33, "艙Uf", Locale.FRENCH, SPACE);
        status.rotate();
        assertEquals("艙uf", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());
        status.rotate();
        assertEquals("艗uf", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());
        status.rotate();
        assertEquals("艗UF", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());
        status.rotate();
        assertEquals("艙Uf", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());
        status.rotate();
        assertEquals("艙uf", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(33, status.getNewCursorEnd());

        status.start(30, 35, "茅cole", Locale.FRENCH, SPACE);
        status.rotate();
        assertEquals("脡cole", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(35, status.getNewCursorEnd());
        status.rotate();
        assertEquals("脡COLE", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(35, status.getNewCursorEnd());
        status.rotate();
        assertEquals("茅cole", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(35, status.getNewCursorEnd());
        status.rotate();
        assertEquals("脡cole", status.getRecapitalizedString());
        assertEquals(30, status.getNewCursorStart());
        assertEquals(35, status.getNewCursorEnd());
    }
}