From d7720d8cdea499dfb831d1e82f61c915cb700a59 Mon Sep 17 00:00:00 2001 From: Nathan McRae Date: Sat, 9 Mar 2024 09:58:25 -0800 Subject: [PATCH] Flesh out tests --- SaneTsvTest/Program.cs | 411 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 411 insertions(+) diff --git a/SaneTsvTest/Program.cs b/SaneTsvTest/Program.cs index 33aae0a..98ac12b 100644 --- a/SaneTsvTest/Program.cs +++ b/SaneTsvTest/Program.cs @@ -1,4 +1,5 @@ using NathanMcRae; +using System.Reflection; using System.Text; internal class Program : SaneTsv @@ -80,6 +81,18 @@ internal class Program : SaneTsv public string Column3 { get; set; } } + public class BoolTestRecord3 : SaneTsv.CommentedTsvRecord + { + [SaneTsv.TsvColumn("column1")] + public string Column1 { get; set; } + + [SaneTsv.TsvColumn] + public string column2 { get; set; } + + [SaneTsv.TsvColumn("columnthree\nyep")] + public string Column3 { get; set; } + } + public class SerdeTestRecord : SaneTsv.CommentedTsvRecord { [SaneTsv.TypedTsvColumn("column1")] @@ -348,6 +361,404 @@ internal class Program : SaneTsv Console.WriteLine($"Unspecced parse time: {unspeccedParseTime}"); } + { + string testName = "With and without file comment"; + + 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"; + + string testString2 = "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"; + + CommentedTsv parsed = SaneTsv.ParseCommentedTsv(Encoding.UTF8.GetBytes(testString1)); + CommentedTsv parsed2 = SaneTsv.ParseCommentedTsv(Encoding.UTF8.GetBytes(testString2)); + + if (parsed.FileComment == "This is a file comment\nOne more file comment line" && parsed2.FileComment == null) + { + Console.WriteLine($"Passed {testName}"); + } + else + { + Console.WriteLine($"Failed {testName}"); + } + } + + { + string testName = "With and without types"; + + string testString1 = "column1:type:boolean\tcolumn2:binary\tcolumnthree\\nyep:string" + + "\nTRUE\tvalue\\\\twoo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther"; + + try + { + Tsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Passed {testName} 1A"); + } + catch (Exception e) + { + Console.WriteLine($"Failed {testName} 1A"); + } + + try + { + Tsv parsed2 = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1B"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1B"); + } + + try + { + (string[] columns, string[][] data) = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1C"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1C"); + } + + string testString2 = "column1\tcolumn2\tcolumnthree\\nyep" + + "\nTRUE\tvalue\\\\twoo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther"; + + try + { + Tsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString2)); + Console.WriteLine($"Failed {testName} 2A"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 2A"); + } + + try + { + Tsv parsed2 = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 2B"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 2B"); + } + + try + { + (string[] columns, string[][] data) = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 2C"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 2C"); + } + } + + { + string testName = "With and without line comment"; + + string testString1 = "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"; + + try + { + CommentedTsv parsed = SaneTsv.ParseCommentedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Passed {testName} 1A"); + } + catch (Exception e) + { + Console.WriteLine($"Failed {testName} 1A"); + } + + try + { + Tsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1B"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1B"); + } + + try + { + Tsv parsed2 = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1C"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1C"); + } + + try + { + (string[] columns, string[][] data) = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1D"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1D"); + } + } + + { + string testName = "End of file comment"; + + string testString1 = "column1:type:boolean\tcolumn2:binary\tcolumnthree\\nyep:string" + + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther" + + "\n# Hey, you're not supposed to have comments at the end of the tsv!"; + + try + { + CommentedTsv parsed = SaneTsv.ParseCommentedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1A"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1A"); + } + + try + { + Tsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1B"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1B"); + } + + string testString2 = "column1\tcolumn2\tcolumnthree\\nyep" + + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther" + + "\n# Hey, you're not supposed to have comments at the end of the tsv!"; + + try + { + Tsv parsed3 = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString2)); + Console.WriteLine($"Failed {testName} 1C"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1C"); + } + + try + { + (string[] columns, string[][] data) = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString2)); + Console.WriteLine($"Failed {testName} 1D"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1D"); + } + } + + { + string testName = "Partial parsing"; + + string line1 = "column1\tcolumn2\tcolumnthree\\nyep"; + string line2 = "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee"; + string line3 = "\nFALSE\tnother\tno\\ther"; + + byte[] inputBuffer = Encoding.UTF8.GetBytes(line1 + line2 + line3); + + var headerTypes = new List(); + var headerNames = new List(); + var headerPropertyInfos = new List(); + int columnCount = 0; + + foreach (PropertyInfo property in typeof(BoolTestRecord3).GetProperties()) + { + TsvColumnAttribute attribute = (TsvColumnAttribute)Attribute.GetCustomAttribute(property, typeof(TsvColumnAttribute)); + if (attribute == null) + { + continue; + } + + headerNames.Add(attribute.ColumnName ?? property.Name); + headerTypes.Add(attribute.ColumnType ?? GetColumnFromType(property.PropertyType)); + headerPropertyInfos.Add(property); + // TODO: Check that the property type and given column type are compatible + columnCount++; + } + + BoolTestRecord3[] records = SaneTsv.Parse(inputBuffer, + FormatType.SIMPLE_TSV, + headerPropertyInfos.ToArray(), + headerTypes.ToArray(), + line1.Length + line2.Length + 1, + inputBuffer.Length); + + if (records.Length == 0 ) + { + Console.WriteLine($"Passed {testName} 1"); + } + else + { + Console.WriteLine($"Failed {testName} 1"); + } + + BoolTestRecord3[] records2 = SaneTsv.Parse(inputBuffer, + FormatType.SIMPLE_TSV, + headerPropertyInfos.ToArray(), + headerTypes.ToArray(), + line1.Length, + line1.Length + 3); + + if (records2[0].Column3 == "valuetrhee") + { + Console.WriteLine($"Passed {testName} 2"); + } + else + { + Console.WriteLine($"Failed {testName} 2"); + } + + string[][] data = SaneTsv.ParseSimpleTsv(inputBuffer, 3, line1.Length + line2.Length + 1, inputBuffer.Length); + + if (data[0][1] == "nother") + { + Console.WriteLine($"Passed {testName} 3"); + } + else + { + Console.WriteLine($"Failed {testName} 3"); + } + + string[][] data2 = SaneTsv.ParseSimpleTsv(inputBuffer, 3, line1.Length, line1.Length + 3); + + if (data2.Length == 0) + { + Console.WriteLine($"Passed {testName} 4"); + } + else + { + Console.WriteLine($"Failed {testName} 4"); + } + } + + { + string testName = "End of file \\n"; + + string testString1 = "column1:type:boolean\tcolumn2:binary\tcolumnthree\\nyep:string" + + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther" + + "\n"; + + try + { + CommentedTsv parsed = SaneTsv.ParseCommentedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1A"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1A"); + } + + try + { + Tsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1B"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1B"); + } + + string testString2 = "column1\tcolumn2\tcolumnthree\\nyep" + + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther" + + "\n"; + + try + { + Tsv parsed3 = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString2)); + Console.WriteLine($"Failed {testName} 1C"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1C"); + } + + try + { + (string[] columns, string[][] data) = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString2)); + Console.WriteLine($"Failed {testName} 1D"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1D"); + } + } + + { + string testName = "End of file partial record"; + + string testString1 = "column1:type:boolean\tcolumn2:binary\tcolumnthree\\nyep:string" + + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther" + + "\nTRUE\t"; + + try + { + CommentedTsv parsed = SaneTsv.ParseCommentedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1A"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1A"); + } + + try + { + Tsv parsed = SaneTsv.ParseTypedTsv(Encoding.UTF8.GetBytes(testString1)); + Console.WriteLine($"Failed {testName} 1B"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1B"); + } + + string testString2 = "column1\tcolumn2\tcolumnthree\\nyep" + + "\nTRUE\tvalue\\\\t\0woo\tvaluetrhee" + + "\nFALSE\tnother\tno\\ther" + + "\nTRUE\t"; + + try + { + Tsv parsed3 = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString2)); + Console.WriteLine($"Failed {testName} 1C"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1C"); + } + + try + { + (string[] columns, string[][] data) = SaneTsv.ParseSimpleTsv(Encoding.UTF8.GetBytes(testString2)); + Console.WriteLine($"Failed {testName} 1D"); + } + catch (Exception e) + { + Console.WriteLine($"Passed {testName} 1D"); + } + } + Console.WriteLine("Done with tests"); } }