The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use utf8;
use open qw( :encoding(UTF-8) :std );
use Test::More tests => 26;
use Unicode::Util qw( grapheme_index );

# Simple - with just a single char

is grapheme_index('Hello World', 'H'),  0, 'One char, at beginning';
is grapheme_index('Hello World', 'l'),  2, 'One char, in the middle';
is grapheme_index('Hello World', 'd'), 10, 'One char, in the end';
is grapheme_index('Hello World', 'x'), -1, 'One char, no match';

is grapheme_index('Hello World', 'l',  0),  2, 'One char, find first match, pos = 0';
is grapheme_index('Hello World', 'l',  2),  2, '- 1. match again, pos @ match';
is grapheme_index('Hello World', 'l',  3),  3, '- 2. match';
is grapheme_index('Hello World', 'l',  4),  9, '- 3. match';
is grapheme_index('Hello World', 'l', 10), -1, '- no more matches';

# Simple - with a string

is grapheme_index('Hello World', 'Hello'),       0, 'Substr, at beginning';
is grapheme_index('Hello World', 'o W'),         4, 'Substr, in the middle';
is grapheme_index('Hello World', 'World'),       6, 'Substr, at the end';
is grapheme_index('Hello World', 'low'),        -1, 'Substr, no match';
is grapheme_index('Hello World', 'Hello World'), 0, 'Substr eq Str';

# Empty strings

is grapheme_index('Hello World', ''),       0, 'Substr is empty';
is grapheme_index('',            ''),       0, 'Both strings are empty';
is grapheme_index('',            'Hello'), -1, 'Only main-string is empty';

is grapheme_index('Hello', '',   3),  3, 'Substr is empty, pos within str';
is grapheme_index('Hello', '',   5),  5, 'Substr is empty, pos at end of str';
is grapheme_index('Hello', '', 999),  5, 'Substr is empty, pos > length of str';

# More difficult strings

is grapheme_index('ababcabcd', 'abcd'), 5, 'Start-of-substr matches several times';
is grapheme_index('uuúuúuùù',  'úuù'),  4, 'Accented chars';
is grapheme_index('Ümlaut',    'Ü'),    0, 'Umlaut';

is grapheme_index(1234, 3),   2, 'index on non-strings';
is grapheme_index(1023, '0'), 1, 'grapheme_index($str, "0") works';
is grapheme_index(1023, 0),   1, 'grapheme_index($str, 0) works';