private void CheckParseHexFloat64(NativeStringList str_native_big, NativeStringList str_native_lit)
        {
            // double hex
            double[] double_list = new double[]
            {
                0.0, 128.0, 512.0, 12345.67, -12345678,
                -9223372036854775808d, 9223372036854775807d,
                -3.40281e+38, 3.40281E+38,
                -1.797693134862e+308, 1.797693134862E+308
            };

            str_native_big.Clear();
            str_native_lit.Clear();

            for (int i = 0; i < double_list.Length; i++)
            {
                double double_v = double_list[i];
                byte[] bytes    = BitConverter.GetBytes(double_v);
                string str      = BitConverter.ToString(bytes).Replace("-", ""); // BitConverter returns little endian code on x86.
                string str_0x   = "0x" + str;

                str_native_lit.Add(str);
                str_native_lit.Add(str_0x);
                str_native_big.Add(this.ConvertEndian(str));
                str_native_big.Add(this.ConvertEndian(str_0x));
            }
            for (int i = 0; i < str_native_lit.Length; i++)
            {
                double value_ref             = double_list[i / 2];
                ReadOnlyStringEntity str_lit = str_native_lit[i];
                ReadOnlyStringEntity str_big = str_native_big[i];

                bool success_lit = str_lit.TryParseHex(out double value_lit);
                bool success_big = str_big.TryParseHex(out double value_big, Endian.Big);

                Debug.Log("parse str[big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                          + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                          + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");

                Assert.IsTrue(success_lit);
                Assert.IsTrue(success_big);
                Assert.AreEqual(value_ref, value_lit);
                Assert.AreEqual(value_ref, value_big);
                // must be bit-complete convertion in hex data format
                if ((value_ref != value_lit || value_ref != value_big) || !success_lit || !success_big)
                {
                    Debug.LogError("failed to parse. i = " + i.ToString()
                                   + " string [big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                                   + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                                   + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");
                }
            }
        }
        private void CheckParseHexFloat32(NativeStringList str_native_big, NativeStringList str_native_lit)
        {
            // float hex
            float[] float_list = new float[] { 0.0f, 128.0f, 512.0f, 12345.67f, -12345678f, -3.40281e+38f, 3.40281E+38f };

            str_native_big.Clear();
            str_native_lit.Clear();

            for (int i = 0; i < float_list.Length; i++)
            {
                float  float_v = float_list[i];
                byte[] bytes   = BitConverter.GetBytes(float_v);
                string str     = BitConverter.ToString(bytes).Replace("-", ""); // BitConverter returns little endian code on x86.
                string str_0x  = "0x" + str;

                str_native_lit.Add(str);
                str_native_lit.Add(str_0x);
                str_native_big.Add(this.ConvertEndian(str));
                str_native_big.Add(this.ConvertEndian(str_0x));
            }
            for (int i = 0; i < str_native_lit.Length; i++)
            {
                float value_ref = float_list[i / 2];
                ReadOnlyStringEntity str_lit = str_native_lit[i];
                ReadOnlyStringEntity str_big = str_native_big[i];

                bool success_lit = str_lit.TryParseHex(out float value_lit);
                bool success_big = str_big.TryParseHex(out float value_big, Endian.Big);

                Debug.Log("parse str[big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                          + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                          + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");

                Assert.IsTrue(success_lit);
                Assert.IsTrue(success_big);
                Assert.AreEqual(value_ref, value_lit);
                Assert.AreEqual(value_ref, value_big);
                // must be bit-complete convertion in hex data format
                if ((value_ref != value_lit || value_ref != value_big) || !success_lit || !success_big)
                {
                    Debug.LogError("failed to parse. i = " + i.ToString()
                                   + " string [big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                                   + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                                   + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");
                }
            }
        }
        private void CheckParseHexInt32(NativeStringList str_native_big, NativeStringList str_native_lit)
        {
            // int hex
            int[] int_list = new int[] { 0, 128, 512, 10000, -12345678, -2147483648, 2147483647 };

            str_native_big.Clear();
            str_native_lit.Clear();

            for (int i = 0; i < int_list.Length; i++)
            {
                int    int_v  = int_list[i];
                byte[] bytes  = BitConverter.GetBytes(int_v);
                string str    = BitConverter.ToString(bytes).Replace("-", ""); // BitConverter returns little endian code on x86.
                string str_0x = "0x" + str;

                str_native_lit.Add(str);
                str_native_lit.Add(str_0x);
                str_native_big.Add(this.ConvertEndian(str));
                str_native_big.Add(this.ConvertEndian(str_0x));
            }
            for (int i = 0; i < str_native_lit.Length; i++)
            {
                int value_ref = int_list[i / 2];  // stored 2x elems as [hex data] and 0x[hex data]
                ReadOnlyStringEntity str_lit = str_native_lit[i];
                ReadOnlyStringEntity str_big = str_native_big[i];

                bool success_lit = str_lit.TryParseHex(out int value_lit);
                bool success_big = str_big.TryParseHex(out int value_big, Endian.Big);

                Debug.Log("parse str[big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                          + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                          + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");

                Assert.IsTrue(success_lit);
                Assert.IsTrue(success_big);
                Assert.AreEqual(value_ref, value_lit);
                Assert.AreEqual(value_ref, value_big);
                if ((value_ref != value_lit || value_ref != value_big) || !success_lit || !success_big)
                {
                    Debug.LogError("failed to parse. i = " + i.ToString()
                                   + " string [big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                                   + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                                   + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");
                }
            }
        }
        private void CheckParseHexInt64(NativeStringList str_native_big, NativeStringList str_native_lit)
        {
            // long hex
            long[] long_list = new long[] { 0, 128, 512, 10000, -12345678, -9223372036854775808, 9223372036854775807 };

            str_native_big.Clear();
            str_native_lit.Clear();

            for (int i = 0; i < long_list.Length; i++)
            {
                long   long_v = long_list[i];
                byte[] bytes  = BitConverter.GetBytes(long_v);
                string str    = BitConverter.ToString(bytes).Replace("-", ""); // BitConverter returns little endian code on x86.
                string str_0x = "0x" + str;

                str_native_lit.Add(str);
                str_native_lit.Add(str_0x);
                str_native_big.Add(this.ConvertEndian(str));
                str_native_big.Add(this.ConvertEndian(str_0x));
            }
            for (int i = 0; i < str_native_lit.Length; i++)
            {
                long value_ref = long_list[i / 2];
                ReadOnlyStringEntity str_lit = str_native_lit[i];
                ReadOnlyStringEntity str_big = str_native_big[i];

                bool success_lit = str_lit.TryParseHex(out long value_lit);
                bool success_big = str_big.TryParseHex(out long value_big, Endian.Big);

                Debug.Log("parse str[big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                          + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                          + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");

                Assert.IsTrue(success_lit);
                Assert.IsTrue(success_big);
                Assert.AreEqual(value_ref, value_lit);
                Assert.AreEqual(value_ref, value_big);
                if ((value_ref != value_lit || value_ref != value_big) || !success_lit || !success_big)
                {
                    Debug.LogError("failed to parse. i = " + i.ToString()
                                   + " string [big/little] = [" + str_big.ToString() + "/" + str_lit.ToString()
                                   + "], try[big/little] = [" + success_big.ToString() + "/" + success_lit.ToString()
                                   + "], value[ref/big/little] = [" + value_ref.ToString() + "/" + value_big.ToString() + "/" + value_lit.ToString() + "]");
                }
            }
        }
        public void CheckParseInt64_Boundary()
        {
            // boundary value check
            str_native.Clear();
            str_list.Clear();

            string in_range_lo  = "-9223372036854775808";
            string in_range_hi  = "9223372036854775807";
            string out_range_lo = "-9223372036854775809";
            string out_range_hi = "9223372036854775808";

            str_list.Add(in_range_lo.ToString());
            str_list.Add(in_range_hi.ToString());
            str_list.Add(out_range_lo.ToString());
            str_list.Add(out_range_hi.ToString());

            for (int i = 0; i < str_list.Count; i++)
            {
                str_native.Add(str_list[i]);
            }

            for (int i = 0; i < str_native.Length; i++)
            {
                var str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                bool success   = long.TryParse(str, out long value);
                bool success_e = str_e.TryParse(out long value_e);

                Assert.AreEqual(success, success_e);
                Assert.AreEqual(value, value_e);

                if (success != success_e || value != value_e)
                {
                    Debug.LogError("failed to parse. string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "]");
                }
            }
        }
        public void CheckParseInt32_Boundary()
        {
            // boundary value check
            str_native.Clear();
            str_list.Clear();

            string in_range_lo  = "-2147483648";
            string in_range_hi  = "2147483647";
            string out_range_lo = "-2147483649";
            string out_range_hi = "2147483648";
            string out_sp_1     = "4400000000"; // overflow to plus region

            str_list.Add(in_range_lo.ToString());
            str_list.Add(in_range_hi.ToString());
            str_list.Add(out_range_lo.ToString());
            str_list.Add(out_range_hi.ToString());
            str_list.Add(out_sp_1.ToString());

            for (int i = 0; i < str_list.Count; i++)
            {
                str_native.Add(str_list[i]);
            }

            for (int i = 0; i < str_native.Length; i++)
            {
                var str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                bool success   = int.TryParse(str, out int value);
                bool success_e = str_e.TryParse(out int value_e);

                Assert.AreEqual(success, success_e);
                Assert.AreEqual(value, value_e);

                if (success != success_e || value != value_e)
                {
                    Debug.LogError("failed to parse. string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "]");
                }
            }
        }
        public void CheckParseFloat64(int n_numeric_string)
        {
            this.GenerateRandomFloatStrings(n_numeric_string, 2, 18, 309, 64);

            double max_rel_err = 0.0;
            int    max_err_id  = 0;

            int double_count = 0;

            for (int i = 0; i < n_numeric_string; i++)
            {
                string str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                bool success   = double.TryParse(str, out double value);
                bool success_e = str_e.TryParse(out double value_e);

                //Debug.Log($"@ parse target: {str_e}");

                Assert.AreEqual(success, success_e);

                bool check_value = this.EqualsDouble(value, value_e, 1.0e-14, out double rel_diff);
                if (!check_value || success != success_e)
                {
                    Debug.LogError("failed to parse i = " + i.ToString() + " string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "], rel_diff = " + rel_diff.ToString());
                }
                Assert.IsTrue(check_value);

                if (success)
                {
                    double_count++;
                }

                if (max_rel_err < rel_diff)
                {
                    max_rel_err = rel_diff;
                    max_err_id  = i;
                }
            }
            Debug.Log("parsed double count = " + double_count.ToString() + " / " + n_numeric_string.ToString());
            Debug.Log("max relative error = " + max_rel_err.ToString() + " at " + str_list[max_err_id]);
        }
        public void CheckParseFloat32(int n_numeric_string)
        {
            this.GenerateRandomFloatStrings(n_numeric_string, 3, 8, 39, 64);

            int fail_count = 0;

            float max_rel_err = 0.0f;
            int   max_err_id  = 0;

            int float_count = 0;

            for (int i = 0; i < n_numeric_string; i++)
            {
                string str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                bool success   = float.TryParse(str, out float value);
                bool success_e = str_e.TryParse(out float value_e);

                Assert.AreEqual(success, success_e);

                bool check_value = this.EqualsFloat(value, value_e, 1.0e-5f, out float rel_diff);
                if (!check_value || success != success_e)
                {
                    fail_count++;
                    Debug.LogError("failed to parse i = " + i.ToString() + " string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "], rel_diff = " + rel_diff.ToString());
                }
                Assert.IsTrue(check_value);

                if (success)
                {
                    float_count++;
                }

                if (max_rel_err < rel_diff)
                {
                    max_rel_err = rel_diff;
                    max_err_id  = i;
                }
            }
            Debug.Log("parsed float count = " + float_count.ToString() + " / " + n_numeric_string.ToString());
            Debug.Log("max relative error = " + max_rel_err.ToString() + " at " + str_list[max_err_id]);
        }
        public void CheckParseInt64(int n_numeric_string)
        {
            // random value check
            this.GenerateRandomIntStrings(n_numeric_string, 9, 19, 128);

            int long_count = 0;

            for (int i = 0; i < n_numeric_string; i++)
            {
                string str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                bool success   = long.TryParse(str, out long value);
                bool success_e = str_e.TryParse(out long value_e);

                Assert.AreEqual(success, success_e);
                Assert.AreEqual(value, value_e);

                if (success != success_e || value != value_e)
                {
                    Debug.LogError("failed to parse. string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "]");
                }
                if (success)
                {
                    long_count++;
                }
            }
            Debug.Log("parsed long count = " + long_count.ToString() + " / " + n_numeric_string.ToString());
        }
        public void CheckParseFloat64_Boundary()
        {
            // boundary value check
            str_native.Clear();
            str_list.Clear();

            string in_range_lo  = "-1.797693134862e+308";
            string in_range_hi  = "1.797693134862E+308";
            string out_range_lo = "-1.797693134863e+308";
            string out_range_hi = "1.797693134863E+308";

            str_list.Add(in_range_lo.ToString());
            str_list.Add(in_range_hi.ToString());
            str_list.Add(out_range_lo.ToString());
            str_list.Add(out_range_hi.ToString());

            // this implementation don't aim perfect accuracy for IEEE754 convertion.
            //   Epsilon = 4.94065645841247e-324
            str_list.Add("1e-323");
            str_list.Add("-1e-323");
            str_list.Add("1e-325");
            str_list.Add("-1e-325");

            str_list.Add("00924731130.63782E+299");

            for (int i = 0; i < str_list.Count; i++)
            {
                str_native.Add(str_list[i]);
            }

            for (int i = 0; i < str_native.Length; i++)
            {
                var str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                bool success   = double.TryParse(str, out double value);
                bool success_e = str_e.TryParse(out double value_e);

                Assert.AreEqual(success, success_e);

                bool check_value = this.EqualsDouble(value, value_e, 1.0e-14, out double rel_diff);
                if (!check_value || success != success_e)
                {
                    Debug.LogError("failed to parse. i = " + i.ToString() + " string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "], rel_diff = " + rel_diff.ToString());
                }
                Assert.IsTrue(check_value);
            }
        }
        public void CheckParseFloat32_Typical()
        {
            // typical format sample
            str_native.Clear();
            str_list.Clear();

            str_list.Add("12345678987654321");
            str_list.Add("-12345678987654321");
            str_list.Add("123456789.87654321");
            str_list.Add("-123456789.87654321");
            str_list.Add("12345678987654321e-5");
            str_list.Add("-12345678987654321E-5");
            str_list.Add("123456789.87654321e-5");
            str_list.Add("-123456789.87654321E-5");
            str_list.Add("000.00123456789e-5");
            str_list.Add("-000.00123456789E-5");

            str_list.Add("1.11111111e-60");
            str_list.Add("-1.11111111e-60");

            str_list.Add("4E+08");
            str_list.Add("3E+08");
            str_list.Add("0E+0");
            str_list.Add("000E-00");
            str_list.Add("321.98e22");

            str_list.Add("123E+00000000000000000000221");
            str_list.Add("123E-00000000000000000000221");
            str_list.Add("123E+00000000000000000000221777");
            str_list.Add("123E-00000000000000000000221777");


            str_list.Add("e");
            str_list.Add(".01234e+2");
            str_list.Add("6633.11e+");
            str_list.Add("6633.11e-+-4");
            str_list.Add("123E+0000000000Kg00000000022");

            for (int i = 0; i < str_list.Count; i++)
            {
                str_native.Add(str_list[i]);
            }

            for (int i = 0; i < str_native.Length; i++)
            {
                var str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                //Debug.Log($"@ parse target: {str_e}");

                bool success   = float.TryParse(str, out float value);
                bool success_e = str_e.TryParse(out float value_e);

                Assert.AreEqual(success, success_e);

                bool check_value = this.EqualsFloat(value, value_e, 1.0e-5f, out float rel_diff);
                if (!check_value || success != success_e)
                {
                    Debug.LogError("failed to parse. i = " + i.ToString() + " string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "], rel_diff = " + rel_diff.ToString());
                }
                Assert.IsTrue(check_value);
            }
        }
        public void CheckParseFloat32_Boundary()
        {
            // boundary value check
            str_native.Clear();
            str_list.Clear();

            string in_range_lo  = "-3.40281e+38";
            string in_range_hi  = "3.40281E+38";
            string out_range_lo = "-3.40283e+38";
            string out_range_hi = "3.40283E+38";

            str_list.Add(in_range_lo.ToString());
            str_list.Add(in_range_hi.ToString());
            str_list.Add(out_range_lo.ToString());
            str_list.Add(out_range_hi.ToString());

            str_list.Add("1.401298e-45");  // float.Elipson
            str_list.Add("-1.401298e-45");

            str_list.Add("1.401297e-45");
            str_list.Add("-1.401297e-45");

            for (int i = 0; i < str_list.Count; i++)
            {
                str_native.Add(str_list[i]);
            }

            for (int i = 0; i < str_native.Length; i++)
            {
                var str = str_list[i];
                ReadOnlyStringEntity str_e = str_native[i];

                //Debug.Log($"@ parse target: {str_e}");

                bool success   = float.TryParse(str, out float value);
                bool success_e = str_e.TryParse(out float value_e);

                Assert.AreEqual(success, success_e);

                bool check_value = this.EqualsFloat(value, value_e, 1.0e-5f, out float rel_diff);
                if (!check_value || success != success_e)
                {
                    Debug.LogError("failed to parse. i = " + i.ToString() + " string [str/entity] = [" + str + "/" + str_e.ToString() + "]"
                                   + "bool [str/entity] = [" + success.ToString() + "/" + success_e.ToString() + "], "
                                   + "value [str/entity] = [" + value.ToString() + "/" + value_e.ToString() + "], rel_diff = " + rel_diff.ToString());
                }
                Assert.IsTrue(check_value);
            }
        }