Utf8StringTest.cs 5.92 KB
using NUnit.Framework;
using System.Linq;


namespace UniJSON
{
    public class Utf8StringTests
    {
        [Test]
        public void Utf8StringTest()
        {
            var abc = Utf8String.From("abc");
            var ab = Utf8String.From("ab");
            var bc = Utf8String.From("bc");

            Assert.True(abc.StartsWith(ab));
            Assert.False(ab.StartsWith(abc));

            Assert.True(abc.EndsWith(bc));
            Assert.False(bc.EndsWith(abc));

            Assert.AreEqual(Utf8String.From("abbc"), ab.Concat(bc));

            Assert.AreEqual(2, abc.IndexOf((byte)'c'));

            int pos;
            abc.TrySearchAscii((byte)'c', 0, out pos);
            Assert.AreEqual(2, pos);

            abc.TrySearchAscii((byte)'c', 1, out pos);
            Assert.AreEqual(2, pos);
        }

        [Test]
        public void ShortUtf8Test()
        {
            var a0 = Utf8String4.Create("a");
            Assert.AreEqual("a", a0);
            var a1 = Utf8String4.Create(new byte[] { (byte)'a', 0x00 });
            Assert.AreEqual(a0, a1);
            var a2 = Utf8String4.Create("5");
            Assert.AreEqual(3, a2.ByteLength);
        }

        [Test]
        public void QuoteTest()
        {
            {
                var value = Utf8String.From("ho5日本語ge");
                var quoted = Utf8String.From("\"ho5日本語ge\"");
                Assert.AreEqual(quoted, JsonString.Quote(value));
                Assert.AreEqual(value, JsonString.Unquote(quoted));
            }

            {
                var value = Utf8String.From("fuga\n  ho5日本語ge");
                var quoted = Utf8String.From("\"fuga\\n  ho5日本語ge\"");
                Assert.AreEqual(quoted, JsonString.Quote(value));
                Assert.AreEqual(value, JsonString.Unquote(quoted));
            }
        }

        [Test]
        public void SplitTest()
        {
            {
                var value = Utf8String.From("a/5/c");
                var splited = value.Split((byte)'/').ToArray();
                Assert.AreEqual(3, splited.Length);
                Assert.AreEqual(splited[0], Utf8String.From("a"));
                Assert.AreEqual(splited[1], Utf8String.From("5"));
                Assert.AreEqual(splited[2], Utf8String.From("c"));
            }
            {
                var value = Utf8String.From("/a/5/c/");
                var splited = value.Split((byte)'/').ToArray();
                Assert.AreEqual(4, splited.Length);
                Assert.AreEqual(splited[0], Utf8String.From(""));
                Assert.AreEqual(splited[1], Utf8String.From("a"));
                Assert.AreEqual(splited[2], Utf8String.From("5"));
                Assert.AreEqual(splited[3], Utf8String.From("c"));
            }
        }

        [Test]
        public void SplitIntegerTest()
        {
            Assert.AreEqual("1", Utf8String.From("1 ").SplitInteger().ToString());
            Assert.AreEqual("123", Utf8String.From("123").SplitInteger().ToString());
            Assert.Catch(() => Utf8String.From(" 1").SplitInteger());
            Assert.AreEqual("+12", Utf8String.From("+12\n").SplitInteger().ToString());
            Assert.AreEqual("-123", Utf8String.From("-123\n").SplitInteger().ToString());
        }

        [Test]
        public void AtoiTest()
        {
            Assert.AreEqual(1234, Utf8String.From("1234").ToInt32());
        }

        [Test]
        public void ToCharTest()
        {
            {
                // 1byte
                var c = 'A';
                Assert.AreEqual(1, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char);
            }
            {
                // 2byte
                var c = '¢';
                Assert.AreEqual(2, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char);
            }
            {
                // 3byte
                var c = '5';
                Assert.AreEqual(3, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char);
            }
            {
                var c = '仡';
                Assert.AreEqual(3, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode);
                Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char);
            }
            {
                // emoji
                var s = "😃";
                Assert.AreEqual(4, Utf8String.From(s).GetFirst().CurrentByteLength);
                Assert.AreEqual(0x1F603, Utf8String.From(s).GetFirst().Unicode);
                Assert.Catch(() =>
                {
                    var a = Utf8String.From(s).GetFirst().Char;
                });
            }
        }

        [Test]
        public void FromStringTest()
        {
            var buffer = new byte[12];

            {
                var src = "abc";
                var utf8 = Utf8String.From(src, buffer);
                Assert.AreEqual(3, utf8.ByteLength);
                Assert.AreEqual(src, utf8.ToString());
            }
            {
                var src = "¢";
                var utf8 = Utf8String.From(src, buffer);
                Assert.AreEqual(2, utf8.ByteLength);
                Assert.AreEqual(src, utf8.ToString());
            }
            {
                var src = "5";
                var utf8 = Utf8String.From(src, buffer);
                Assert.AreEqual(3, utf8.ByteLength);
                Assert.AreEqual(src, utf8.ToString());
            }
        }
    }
}