示例#1
0
        public void 未サポート旗()
        {
            Span <int> indexes = stackalloc int[1];

            // 未サポート旗、黒旗だけの絵文字に fallback するように作った。
            var(len, indexWritten) = RgiTable.Find("\U0001F3F4", indexes);
            var fallbackIndex = indexes[0];

            // gbsct 🏴󠁧󠁢󠁳󠁣󠁴󠁿
            // iOS とかではちゃんとスコットランド旗が出る。
            // Windows でも Twitter とかにコピペするとスコットランド旗画像に指し変わる。
            var supported = "\U0001F3F4\U000E0067\U000E0062\U000E0073\U000E0063\U000E0074\U000E007F";

            // この場合は普通に対応するインデックスが取れる。
            (len, indexWritten) = RgiTable.Find(supported, indexes);
            Assert.Equal(1, indexWritten);
            Assert.Equal(supported.Length, len);
            Assert.NotEqual(fallbackIndex, indexes[0]);

            // jp13 (東京都) 🏴󠁪󠁰󠀱󠀳󠁿
            // Emoji tag sequence の仕様上、1F3F4 (黒旗)の後ろに ISO 3166-2 (行政区画コード)に相当するタグ文字が並んでるとその区の旗という扱いになる。
            // 原理的にいくらでもサポートできる旗を増やせるというだけで RGI に入ってるのは gbeng, gbsct, gbwls だけ。
            // (でも、Emojipedia には並んでたりする。 https://emojipedia.org/flag-for-tokyo-jp13/)
            var unsupported = "\U0001F3F4\U000E006A\U000E0070\U000E0031\U000E0033\U000E007F";

            (len, indexWritten) = RgiTable.Find(unsupported, indexes);
            Assert.Equal(1, indexWritten);
            Assert.Equal(unsupported.Length, len);
            Assert.Equal(fallbackIndex, indexes[0]);
        }
        public void Rgi絵文字シーケンスの前後にASCII文字挟んでみる()
        {
            Span <int> indexes = stackalloc int[1];

            var data = Data.RgiEmojiSequenceList;

            for (int i = 0; i < data.Length; i++)
            {
                var s  = data[i];
                var s2 = "a" + s + "a";

                var(len, indexWritten) = RgiTable.Find(s2, indexes);

                Assert.Equal(1, len);
                Assert.Equal(0, indexWritten);

                (len, indexWritten) = RgiTable.Find(s2.AsSpan(1), indexes);

                Assert.Equal(1, indexWritten);
                Assert.Equal(s.Length, len);
                Assert.Equal(i, indexes[0]);

                (len, indexWritten) = RgiTable.Find(s2.AsSpan(1 + len), indexes);

                Assert.Equal(1, len);
                Assert.Equal(0, indexWritten);
            }
        }
        public void Rgi絵文字シーケンス自体のインデックスは必ず見つかる()
        {
            Span <int> indexes = stackalloc int[1];

            var data = Data.RgiEmojiSequenceList;

            for (int i = 0; i < data.Length; i++)
            {
                var s = data[i];
                var(len, indexWritten) = RgiTable.Find(s, indexes);

                Assert.Equal(1, indexWritten);
                Assert.Equal(s.Length, len);
                Assert.Equal(i, indexes[0]);
            }
        }
        public void 全RGI絵文字をConcat()
        {
            // 間に何も挟まずに Concat するバージョンも欲しいものの… 肌色セレクターが邪魔。
            // 1F3FB~1F3FF は単体で RgiTable.Find に含まれているものの、GraphemeBreak 的には1個前の絵文字にくっついちゃう。
            Span <int> indexes = stackalloc int[1];

            var data = Data.RgiEmojiSequenceList;
            var sb   = new StringBuilder();

            foreach (var s in data)
            {
                sb.Append(s);
                sb.Append('a');
            }

            var cat = sb.ToString().AsSpan();

            var odd = false;
            var i   = 0;

            while (true)
            {
                if (cat.Length == 0)
                {
                    break;
                }

                var(len, _) = RgiTable.Find(cat, indexes);

                if (odd)
                {
                    odd = false;
                    Assert.Equal(1, len);
                    Assert.Equal('a', cat[0]);
                }
                else
                {
                    odd = true;
                    Assert.True(data[i].AsSpan().SequenceEqual(cat[..len]));
示例#5
0
        [InlineData("🐈")] // 1F408, Cat
        public void 末尾FE0Fを削る(string emoji)
        {
            Span <int> indexes = stackalloc int[1];

            // 単独で RGI になってるものをあえて選んでるはずなのを一応確認。
            var(len, indexWritten) = RgiTable.Find(emoji, indexes);

            Assert.Equal(1, indexWritten);
            Assert.Equal(emoji.Length, len);

            // 元データと照会。
            var indexFromData = Data.RgiEmojiSequenceList.TakeWhile(x => x != emoji).Count();

            Assert.Equal(indexFromData, indexes[0]);

            // FE0F 足してみる。
            var fe0fAdded = emoji + "\uFE0F";

            (len, indexWritten) = RgiTable.Find(fe0fAdded, indexes);

            Assert.Equal(1, indexWritten);
            Assert.Equal(fe0fAdded.Length, len);
            Assert.Equal(indexFromData, indexes[0]);
        }