using System; using System.Diagnostics; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace agree { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public unsafe partial class TypeMgr { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// Regression test /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public void RegressionTest(TextWriter tw, String file, bool f_marks) { if (!g.f_expanded_all) throw new Exception(); String f_gold = String.Format("regression-trees-{0}{1}.txt", f_marks ? "-marks-" : "", file); String f_this = String.Format("regression-trees-latest-{0}{1}.txt", f_marks ? "-marks-" : "", file); long h = 0; if (Debugger.IsAttached) { foreach (Type t in AllTypes) { Interlocked.Add(ref h, t.Definition.TfsHash()); if (t.IsExpanded && t.Expanded != t.Definition) Interlocked.Add(ref h, t.Expanded.TfsHash()); } } else { Parallel.ForEach(AllTypes, t => { Interlocked.Add(ref h, t.Definition.TfsHash()); if (t.IsExpanded && t.Expanded != t.Definition) Interlocked.Add(ref h, t.Expanded.TfsHash()); }); } if (File.Exists(f_gold)) { long hh; using (StreamReader gf = new StreamReader(f_gold)) hh = (long)ulong.Parse(gf.ReadLine(), System.Globalization.NumberStyles.HexNumber); if (h == hh) { tw.WriteLine("Regression test succeeded. (based on hash: {0:X16})", h); return; } else { tw.WriteLine("Regression hash failed (hash current={0:X16}, expected={1:X16}). Generating full comparison...", h, hh); } } StringBuilder sb = new StringBuilder(); sb.AppendLine(h.ToString("X16")); foreach (agree.Type t in AllTypes) { sb.Append(t.Definition.ToPathList("definition: " + t.Name, f_marks)); } foreach (agree.Type t in AllTypes) { if (t.IsExpanded && t.Expanded != t.Definition) sb.Append(t.Expanded.ToPathList("expanded: " + t.Name, f_marks)); } if (!File.Exists(f_gold)) { File.WriteAllText(f_gold, sb.ToString()); tw.WriteLine("Wrote new regression trees (hash {0:X16})", h); } else { File.WriteAllText(f_this, sb.ToString()); tw.WriteLine("done."); throw new RegressionTestFailedException("Regression test failed"); } } public class RegressionTestFailedException : Exception { public RegressionTestFailedException(String msg) : base(msg) { } }; }; public partial class Grammar : ISysObj { public String GarbageReport(HashSet<TfsFeatMark> hspm = null) { using (StringWriter sw = new StringWriter()) { sw.WriteLine("TfsFeatMark Garbage Report:"); int c = 0; foreach (Instance t in tm.AllInstances) { if (t.Definition != null) { c += t.Definition.GarbageReport(sw); if (t.IsExpanded && t.Expanded != t.Definition) c += t.Expanded.GarbageReport(sw); } } sw.WriteLine("{0}", c); return sw.ToString(); } } }; }