public void TestDefaultEncoder()
        {
            TestEncode(CSharpStringLiteralEncoder.GetEncoder(false),
                       null,
                       string.Empty,
                       "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
                       "\u2028\u2029", // Special whitespace
                       "abcdef123456@~!#$%^&*()\"\a\b\f\n\r\t\v中文",
                       "" + (char)0 + (char)1 + (char)25 + (char)30 + (char)31 + (char)32 +
                       (char)33 + (char)126 + (char)127 + (char)128,
                       new string(Enumerable.Range(0, 128).Select(i => (char)i).ToArray()), // ASCII,
                       "𤭢"                                                                  // 𤭢
                       );

            TestEncode(CSharpStringLiteralEncoder.GetEncoder(true),
                       null,
                       string.Empty,
                       "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", // Letters/Digits
                       "\u2028\u2029",                                                   // Special whitespace
                       "abcdef123456@~!#$%^&*()\"\a\b\f\n\r\t\v中文",
                       "" + (char)1 + (char)25 + (char)30 + (char)31 + (char)32 +
                       (char)33 + (char)126 + (char)127 + (char)128,
                       new string(Enumerable.Range(1, 128).Reverse().Select(i => (char)i).ToArray()), // ASCII,
                       "123456789𤭢1256"                                                               // 𤭢
                       );
        }
        private static void TestEncode(CSharpStringLiteralEncoder encoder, params string[] inputs)
        {
            // Outputs
            var literals = inputs.Select(s => encoder.Encode(s)).ToArray();

            //
            // Treat the encoded strings as string literals and put them in a simple C# source code,
            // (Static class field, e.g: public static readonly string field_0 = *literal*).
            //
            string className;

            string[] fieldNames;
            var      source = GenerateTestSource(literals, out className, out fieldNames);
            //
            // Then compile the source into a .NET assembly on-the-fly.
            //
            var testClassType = CompileAssembly(source).GetType(className);

            //
            // If the encoder works as expected, the value of each field
            // should be equal to the corresponding input.
            //
            for (var i = 0; i < fieldNames.Length; i++)
            {
                var fieldName  = fieldNames[i];
                var fieldValue = (string)testClassType.GetField(fieldName,
                                                                BindingFlags.Static | BindingFlags.Public).GetValue(null);

                Assert.AreEqual(inputs[i], fieldValue);
            }
        }
        public void TestGetEncoder()
        {
            var encoder = CSharpStringLiteralEncoder.GetEncoder(false);

            Assert.IsFalse(encoder.Verbatim);
            Assert.IsFalse(encoder.IsWrappingEnabled);
            Assert.IsTrue(encoder.WrapChars <= 0);
            Assert.AreEqual(encoder.Indent, 0);
            Assert.AreEqual(encoder.IndentationChar, CSharpStringLiteralEncoder.DefaultIndentationChar);

            encoder = CSharpStringLiteralEncoder.GetEncoder(false, 80);
            Assert.IsFalse(encoder.Verbatim);
            Assert.IsTrue(encoder.IsWrappingEnabled);
            Assert.AreEqual(encoder.WrapChars, 80);
            Assert.AreEqual(encoder.Indent, 0);
            Assert.AreEqual(encoder.IndentationChar, CSharpStringLiteralEncoder.DefaultIndentationChar);

            encoder = CSharpStringLiteralEncoder.GetEncoder(false, 80, 4);
            Assert.IsFalse(encoder.Verbatim);
            Assert.IsTrue(encoder.IsWrappingEnabled);
            Assert.AreEqual(encoder.WrapChars, 80);
            Assert.AreEqual(encoder.Indent, 4);
            Assert.AreEqual(encoder.IndentationChar, CSharpStringLiteralEncoder.DefaultIndentationChar);

            encoder = CSharpStringLiteralEncoder.GetEncoder(false, 80, 4, '\t');
            Assert.IsFalse(encoder.Verbatim);
            Assert.IsTrue(encoder.IsWrappingEnabled);
            Assert.AreEqual(encoder.WrapChars, 80);
            Assert.AreEqual(encoder.Indent, 4);
            Assert.AreEqual(encoder.IndentationChar, '\t');

            encoder = CSharpStringLiteralEncoder.GetEncoder(true);
            Assert.IsTrue(encoder.Verbatim);
            Assert.IsFalse(encoder.IsWrappingEnabled);
            Assert.IsTrue(encoder.WrapChars <= 0);
            Assert.AreEqual(encoder.Indent, 0);
            Assert.AreEqual(encoder.IndentationChar, CSharpStringLiteralEncoder.DefaultIndentationChar);

            encoder = CSharpStringLiteralEncoder.GetEncoder(true, 80);
            Assert.IsTrue(encoder.Verbatim);
            Assert.IsTrue(encoder.IsWrappingEnabled);
            Assert.AreEqual(encoder.WrapChars, 80);
            Assert.AreEqual(encoder.Indent, 0);
            Assert.AreEqual(encoder.IndentationChar, CSharpStringLiteralEncoder.DefaultIndentationChar);

            encoder = CSharpStringLiteralEncoder.GetEncoder(true, 80, 4);
            Assert.IsTrue(encoder.Verbatim);
            Assert.IsTrue(encoder.IsWrappingEnabled);
            Assert.AreEqual(encoder.WrapChars, 80);
            Assert.AreEqual(encoder.Indent, 4);
            Assert.AreEqual(encoder.IndentationChar, CSharpStringLiteralEncoder.DefaultIndentationChar);

            encoder = CSharpStringLiteralEncoder.GetEncoder(true, 80, 4, '\t');
            Assert.IsTrue(encoder.Verbatim);
            Assert.IsTrue(encoder.IsWrappingEnabled);
            Assert.AreEqual(encoder.WrapChars, 80);
            Assert.AreEqual(encoder.Indent, 4);
            Assert.AreEqual(encoder.IndentationChar, '\t');
        }
        public void TestWrappingEncoder()
        {
            TestEncode(CSharpStringLiteralEncoder.GetEncoder().EnableWrapping(10, 6),
                       null,
                       string.Empty,
                       "1",
                       "123456",
                       "123456789",             // 9 characters
                       "0123456789",            // 10 characters
                       "0123456789a",           // 11 characters
                       "0123456789abcdefghij",  // 20 characters
                       "0123456789abcdefghijk", // 21 characters,
                       "𤭢",
                       "12345678𤭢",
                       "123456789𤭢45",
                       "1234567890𤭢1231",
                       "𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢",
                       "请在此处@~!#$%^&*()\"\a\b\f\n\r\t\v输入\u2028\u2029中文"
                       );

            TestEncode(CSharpStringLiteralEncoder.GetEncoder().EnableWrapping(10, 6).UseVerbatimForm(),
                       null,
                       string.Empty,
                       "1",
                       "123456",
                       "123456789",             // 9 characters
                       "0123456789",            // 10 characters
                       "0123456789a",           // 11 characters
                       "0123456789abcdefghij",  // 20 characters
                       "0123456789abcdefghijk", // 21 characters,
                       "𤭢",
                       "12345678𤭢",
                       "123456789𤭢45",
                       "1234567890𤭢1231",
                       "𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢𤭢",
                       "请在此处@~!#$%^&*()\"\a\b\f\n\r\t\v输入\u2028\u2029中文"
                       );
        }