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