using NathanMcRae; using System.Text; { string testName = "Bool test"; string testString1 = "column1:ty\\#pe:boolean\tcolumn2:binary\tcolumnthree\\nyep:string" + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + "\nFALSE\tnother\tno\\ther"; SaneTsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString1)); if (parsed.Records[0]["column1:ty#pe"] is bool result && result) { Console.WriteLine($"Passed {testName}"); } else { Console.WriteLine($"Failed {testName}"); } } { string testName = "Bad bool test"; try { string testString1 = "column1:type:boolean\tcolumn2:binary\tcolumnthree\\nyep:string" + "\nTUE\tvalue\\\\t\0woo\tvaluetrhee" + "\nFALSE\tnother\tno\\ther"; SaneTsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString1)); Console.WriteLine($"Failed {testName}"); } catch (Exception) { Console.WriteLine($"Passed {testName}"); } } { string testName = "Comment test"; string testString1 = "#This is a file comment\n" + "#One more file comment line\n" + "column1:type:boolean\tcolumn2:binary\tcolumnthree\\nyep:string" + "\n#This is a comment" + "\n#Another comment line" + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + "\nFALSE\tnother\tno\\ther"; SaneTsv parsed = SaneTsv.ParseCommentedTsv(Encoding.UTF8.GetBytes(testString1)); } { string testName = "Serde test"; string testString1 = "column1\tcolumn2\tcolumnthree\\nyep" + "\nTRUE\tvalue\\\\twoo\tvaluetrhee" + "\nFALSE\tnother\tno\\ther"; SaneTsv parsed = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString1)); string serialized = Encoding.UTF8.GetString(SaneTsv.SerializeSimpleTsv(parsed.ColumnNames, parsed.Records.Select(r => r.Fields.Select(f => f.ToString()).ToArray()).ToArray())); if (testString1 == serialized) { Console.WriteLine($"Passed {testName}"); } else { Console.WriteLine($"Failed {testName}"); } } { string testName = "Float binary test"; var bytes = new List(); bytes.AddRange(Encoding.UTF8.GetBytes("somefloat:float64\tbinfloat:float64-le" + "\n1.5\t")); bytes.AddRange(BitConverter.GetBytes(1.5)); bytes.AddRange(Encoding.UTF8.GetBytes("\n-8.0000005E-14\t")); bytes.AddRange(BitConverter.GetBytes(-8.0000005E-14)); SaneTsv parsed = SaneTsv.ParseTypedTsv(bytes.ToArray()); if ((double)parsed.Records[0]["binfloat"] == (double)parsed.Records[0]["somefloat"]) { Console.WriteLine($"Passed {testName}"); } else { Console.WriteLine($"Failed {testName}"); } } Console.WriteLine("Done with tests"); { string testName = "Serde test"; string[] headerNames = { "string-test", "bool-test", "float32-test", "float32-le-test", "float64-test", "float64-le-test", "uint32-test", "uint64-test", "int32-test", "int64-test", "binary-test", }; Type[] headerTypes = { typeof(SaneTsv.StringType), typeof(SaneTsv.BooleanType), typeof(SaneTsv.Float32Type), typeof(SaneTsv.Float32LEType), typeof(SaneTsv.Float64Type), typeof(SaneTsv.Float64LEType), typeof(SaneTsv.UInt32Type), typeof(SaneTsv.UInt64Type), typeof(SaneTsv.Int32Type), typeof(SaneTsv.Int64Type), typeof(SaneTsv.BinaryType), }; object[][] data = { new object[] { "test", true, 44.5f, 44.5f, -88e-3, -88e-3, 7773, 88888888, -7773, -88888888, new byte[] { 0, 1, 2, 3 } }, new object[] { "test2", false, 44.5000005f, 44.5000005f, -88e-30, -88e-30, 7773, 88888888, -7773, -88888888, new byte[] { 0, 1, 2, 3, 4 } }, new object[] { "test2", false, float.NaN, float.NaN, double.NaN, double.NaN, 7773, 88888888, -7773, -88888888, new byte[] { 0, 1, 2, 3, 4 } }, new object[] { "test2", false, float.NegativeInfinity, float.NegativeInfinity, double.NegativeInfinity, double.NegativeInfinity, 7773, 88888888, -7773, -88888888, new byte[] { 0, 1, 2, 3, 4 } }, new object[] { "test2", false, float.PositiveInfinity, float.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity, 7773, 88888888, -7773, -88888888, new byte[] { 0, 1, 2, 3, 4 } }, }; byte[] serialized = SaneTsv.SerializeTypedTsv(headerTypes, headerNames, data); SaneTsv parsed = SaneTsv.ParseTypedTsv(serialized); if ((float)parsed.Records[1]["float32-test"] == 44.5000005) { Console.WriteLine($"Passed {testName}"); } else { Console.WriteLine($"Failed {testName}"); } } // TODO: Check qNaN, sNaN, +inf, -inf values for float types