// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
package com.ibm.icu.dev.test.rbbi;

import java.text.CharacterIterator;

import org.junit.Before;
import org.junit.Test;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.text.BreakIterator;

/**
 * @author sgill
 *
 */
public class AbstractBreakIteratorTests extends TestFmwk {

    private class AbstractBreakIterator extends BreakIterator {
        private int position = 0;
        private static final int LIMIT = 100;

        private int set(int n) {
            position = n;
            if (position > LIMIT) {
                position = LIMIT;
                return DONE;
            }
            if (position < 0) {
                position = 0;
                return DONE;
            }
            return position;
        }

        @Override
        public int first() {
            return set(0);
        }

        @Override
        public int last() {
            return set(LIMIT);
        }

        @Override
        public int next(int n) {
            return set(position + n);
        }

        @Override
        public int next() {
            return next(1);
        }

        @Override
        public int previous() {
            return next(-1);
        }

        @Override
        public int following(int offset) {
            return set(offset + 1);
        }

        @Override
        public int current() {
            return position;
        }

        @Override
        public CharacterIterator getText() {
            return null;
        }

        @Override
        public void setText(CharacterIterator newText) {
        }

    }

    private BreakIterator bi;

    @Before
    public void createBreakIterator() {
        bi = new AbstractBreakIterator();
    }

    @Test
    public void testPreceding() {
        int pos = bi.preceding(0);
        TestFmwk.assertEquals("BreakIterator preceding position not correct", BreakIterator.DONE, pos);

        pos = bi.preceding(5);
        TestFmwk.assertEquals("BreakIterator preceding position not correct", 4, pos);
    }

    @Test
    public void testIsBoundary() {
        boolean b = bi.isBoundary(0);
        TestFmwk.assertTrue("BreakIterator is boundary not correct", b);

        b = bi.isBoundary(5);
        TestFmwk.assertTrue("BreakIterator is boundary not correct", b);
    }

}
