public MatchInfo match(CharSequence text) {
        int idx = 0;
        int idxCodepoint = 0;
        int textLength = text.length();
        int[] codepoints = new int[Character.codePointCount(text, 0, textLength)];
        while (idx < textLength) {
            int codepoint = Character.codePointAt(text, idx);
            codepoints[idxCodepoint] = codepoint;
            idx += Character.charCount(codepoint);
            idxCodepoint += 1;
        }
        return match(codepoints);
    }
@Test
    public void testReusedMatchInfoScore() {
        StringNormalizer.Result queryNormalized = StringNormalizer.normalizeWithResult("Bob", false);
        StringNormalizer.Result testStringNormalized1 = StringNormalizer.normalizeWithResult("Bob", false);
        StringNormalizer.Result testStringNormalized2 = StringNormalizer.normalizeWithResult("Alice", false);

        // Test full match standalone
        assertThat(doFuzzy(queryNormalized.codePoints, testStringNormalized1.codePoints), equalTo(separator_bonus + adjacency_bonus + adjacency_bonus + full_word_bonus));
        // Test no match standalone: this must result in appropriate penalty
        assertThat(doFuzzy(queryNormalized.codePoints, testStringNormalized2.codePoints), equalTo(unmatched_letter_penalty * 5));

        // create fuzzy score that is reused as in KISS providers
        FuzzyScore fuzzyScore = createFuzzyScore(queryNormalized.codePoints);

        // Test full match
        FuzzyScore.MatchInfo match1  = fuzzyScore.match(testStringNormalized1.codePoints);
        assertThat(match1.score, equalTo(separator_bonus + adjacency_bonus + adjacency_bonus + full_word_bonus));
        // Test no match: this must result in appropriate penalty, independent of previous match
        FuzzyScore.MatchInfo match2  = fuzzyScore.match(testStringNormalized2.codePoints);
        assertThat(match2.score, equalTo(unmatched_letter_penalty * 5));
    }