static void Main(string[] args) { Console.WriteLine("JSON parser tester"); Console.WriteLine("------------------\n"); Console.WriteLine("Test source: http://seriot.ch/parsing_json.php"); Console.WriteLine(" https://github.com/nst/JSONTestSuite\n"); // Check existence of 'tests' directory if (!Directory.Exists("tests")) { Console.WriteLine("Critical: The 'tests'-directory doesn't exist."); Environment.Exit(1); } // Load the test files and validate them Console.WriteLine("[Loading tests, please wait.]"); foreach (var Filename in Directory.GetFiles("tests")) { var Name = Path.GetFileNameWithoutExtension(Filename); if (!Name.StartsWith("y_") && !Name.StartsWith("n_") && !Name.StartsWith("i_")) { Console.WriteLine("Warning: The filename of '" + Name + "' doesn't follow the naming guide."); continue; } var Content = ""; try { Content = File.ReadAllText(Filename); } catch (Exception) { Console.WriteLine("Critical: The content of '" + Name + "' couldn't be read."); Environment.Exit(1); } if (Name.StartsWith("i_")) { IrrelevantTests++; } else { RelevantTests++; } Tests.Add(new ParserTest( Name.Remove(0, 2), Name.StartsWith("y_") ? ValidationResult.Pass : (Name.StartsWith("n_") ? ValidationResult.Failure : ValidationResult.Irrelevant), Content )); } // Dump counts Console.WriteLine("\n+====================================+"); Console.WriteLine(" Relevant tests found: " + RelevantTests.ToString()); Console.WriteLine(" Irrelevant tests found: " + IrrelevantTests.ToString()); Console.WriteLine("+====================================+\n"); // Validate and store result Console.WriteLine("[Testing parser, please wait.]"); foreach (var Test in Tests) { Test.Output = Validator.Validate(Test.Content); } // Prepare and the table Console.WriteLine("[Displaying table.]\n"); var Table = new TextTable(new string[] { "Name", "Expected", "Result", "Message", "Content" }, true); ValidationResult?LastResult = null; foreach (var Test in Tests) { // Sort by expected result if (LastResult != null) { if (LastResult != Test.Expected) { Table.AddBreak(); LastResult = Test.Expected; } } else { LastResult = Test.Expected; } if (Test.Expected == ValidationResult.Irrelevant && Test.Output.Result == ValidationResult.Pass) { PassedIrrelevantTest++; } else if (Test.Expected != ValidationResult.Irrelevant && Test.Expected == Test.Output.Result) { PassedRelevantTest++; } // Add the next row data Table.AddRow(new object[] { Test.Name, Test.Expected, Test.Output.Result, Test.Output.Message, // Sanitize the content (we don't want beeps and newlines) (Test.Content.Length > 15) ? ( TextTable.Pad(Sanitize(Test.Content), 12) + "..." ) : ( TextTable.Pad(Sanitize(Test.Content), 15) ) }); } // Render and output the table Console.WriteLine(Table.GetString(true)); // Dump pass-count Console.WriteLine("\n+====================================+"); Console.WriteLine(" Passed " + PassedRelevantTest.ToString() + " of " + RelevantTests.ToString() + " relevant tests."); Console.WriteLine(" Passed " + PassedIrrelevantTest.ToString() + " of " + IrrelevantTests.ToString() + " irrelevant tests."); Console.WriteLine("+====================================+"); // RFC notice when everything relevant passed. if (PassedRelevantTest == RelevantTests) { Console.WriteLine("\n=> All relevant tests passed, the parser is *most likely* RFC 8259 compliant."); } }