182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir/*
282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Copyright (C) 2017 The Android Open Source Project
382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir *
482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License");
582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * you may not use this file except in compliance with the License.
682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * You may obtain a copy of the License at
782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir *
882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir *      http://www.apache.org/licenses/LICENSE-2.0
982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir *
1082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Unless required by applicable law or agreed to in writing, software
1182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS,
1282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * See the License for the specific language governing permissions and
1482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * limitations under the License.
1582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir */
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.emoji.util;
1782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
1882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport java.util.ArrayList;
1982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport java.util.List;
2082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
2182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir/**
2282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Utility class used to create strings with emojis during tests.
2382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir */
2482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpublic class TestString {
2582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
2682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private static final List<Integer> EMPTY_LIST = new ArrayList<>();
2782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
2882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private static final String EXTRA = "ab";
2982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private final List<Integer> mCodePoints;
3082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private String mString;
3182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private final String mValue;
3282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private boolean mHasSuffix;
3382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private boolean mHasPrefix;
3482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
3582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public TestString(int... codePoints) {
3682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        if (codePoints.length == 0) {
3782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            mCodePoints = EMPTY_LIST;
3882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        } else {
3982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            mCodePoints = new ArrayList<>();
4082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            append(codePoints);
4182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        }
4282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        mValue = null;
4382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
4482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
4582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public TestString(Emoji.EmojiMapping emojiMapping) {
4682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        this(emojiMapping.codepoints());
4782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
4882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
4982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public TestString(String string) {
5082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        mCodePoints = EMPTY_LIST;
5182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        mValue = string;
5282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
5382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
5482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public TestString append(int... codePoints) {
5582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        for (int i = 0; i < codePoints.length; i++) {
5682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            mCodePoints.add(codePoints[i]);
5782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        }
5882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        return this;
5982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
6082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
617f51b0e4448c80ef32a8c41d90f8bc91c55ed3d4Siyamed Sinir    public TestString prepend(int... codePoints) {
627f51b0e4448c80ef32a8c41d90f8bc91c55ed3d4Siyamed Sinir        for (int i = codePoints.length - 1; i >= 0; i--) {
637f51b0e4448c80ef32a8c41d90f8bc91c55ed3d4Siyamed Sinir            mCodePoints.add(0, codePoints[i]);
647f51b0e4448c80ef32a8c41d90f8bc91c55ed3d4Siyamed Sinir        }
657f51b0e4448c80ef32a8c41d90f8bc91c55ed3d4Siyamed Sinir        return this;
667f51b0e4448c80ef32a8c41d90f8bc91c55ed3d4Siyamed Sinir    }
677f51b0e4448c80ef32a8c41d90f8bc91c55ed3d4Siyamed Sinir
6882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public TestString append(Emoji.EmojiMapping emojiMapping) {
6982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        return append(emojiMapping.codepoints());
7082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
7182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
7282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public TestString withSuffix() {
7382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        mHasSuffix = true;
7482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        return this;
7582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
7682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
7782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public TestString withPrefix() {
7882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        mHasPrefix = true;
7982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        return this;
8082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
8182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
8282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @SuppressWarnings("ForLoopReplaceableByForEach")
8382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Override
8482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public String toString() {
8582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        StringBuilder builder = new StringBuilder();
8682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        if (mHasPrefix) {
8782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            builder.append(EXTRA);
8882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        }
8982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        for (int index = 0; index < mCodePoints.size(); index++) {
9182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            builder.append(Character.toChars(mCodePoints.get(index)));
9282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        }
9382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        if (mValue != null) {
9582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            builder.append(mValue);
9682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        }
9782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        if (mHasSuffix) {
9982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            builder.append(EXTRA);
10082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        }
10182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        mString = builder.toString();
10282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        return mString;
10382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
10482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
10582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public int emojiStartIndex() {
10682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        if (mHasPrefix) return EXTRA.length();
10782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        return 0;
10882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
10982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
11082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public int emojiEndIndex() {
11182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        if (mHasSuffix) return mString.lastIndexOf(EXTRA);
11282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        return mString.length();
11382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
11482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir}
115