private void MostrarInforme(UnidadDafny dfy, InformeDafny inf) { // Sería interesante poner milisegundos pero no tiene tanta fidelidad Console.Write(String.Format("{0,-30} ({1,2}s): ", dfy.Nombre.Length > 30 ? dfy.Nombre.Substring(0, 27) + "..." : dfy.Nombre, inf.Tiempo.TotalSeconds)); ConsoleColor color = ConsoleColor.White; if (inf.Resultado == InformeDafny.Result.EVERIFICACION) { color = ConsoleColor.Magenta; } else if (inf.Resultado != InformeDafny.Result.CORRECTO) { color = ConsoleColor.Red; } Console.ForegroundColor = color; Console.WriteLine(inf.Resultado.Desc()); Console.ResetColor(); }
public void Insertar(string id, InformeDafny inf) { var ent = new EntradaCaché(); ent.inf = inf; ent.fmod = File.GetLastWriteTimeUtc(id); entradas [id] = ent; }
public void ejecutar(Caché caché, Explorador expl, Dictionary <string, List <string> > args) { // Crea una instancia de Dafny Dafny dafny = new Dafny(args["dafnyexe"][0]); if (!dafny.Accesible) { AyudanteConsola.imprimirError("no se encuentra el ejecutable «" + args["dafnyexe"][0] + "»"); return; } // Verifica los archivos int correctos = 0; int erroneos = 0; foreach (UnidadDafny dfy in expl.Unidades) { InformeDafny informe = null; bool yaMostrado = false; if (!caché.Consulta(dfy.Uri, out informe)) { Console.WriteLine("Verificando " + dfy.Uri + "..."); informe = dafny.Verificar(dfy.Uri); caché [dfy.Uri] = informe; MostrarInforme(dfy, informe); yaMostrado = true; } if (informe.Resultado == InformeDafny.Result.CORRECTO) { correctos++; } else { erroneos++; if (!yaMostrado) { MostrarInforme(dfy, informe); } } } Console.WriteLine(); Console.WriteLine("{0} verificados correctamente, {1} erróneos.", correctos, erroneos); }
public bool Consulta(string id, out InformeDafny inf) { EntradaCaché ent; entradas.TryGetValue(id, out ent); if (ent.fmod < File.GetLastWriteTimeUtc(id)) { inf = default(InformeDafny); return(false); } inf = ent.inf; return(true); }
private void Imprimir(UnidadDafny dfy) { // Busca información de ejecución en la caché InformeDafny informe = null; bool está = caché.Consulta(dfy.Uri, out informe); string desc = está ? informe.Resultado.Desc() : "no hay datos"; string color = está ? (informe.Resultado.EsError() ? "red" : "green") : "blue"; // Escribe el título del archivo tex.Write(String.Format(Título, EscaparLaTeX(dfy.Nombre), color, desc )); // Escribe un enlace para el pdf tex.Write(String.Format("\t\\pdfbookmark[{2}]{{{0}}}{{l{1}}}\n", EscaparLaTeX(dfy.Nombre), nord, Math.Min(nivel + 1, 3) )); // Añade el archivo en un entorno listing tex.Write(String.Format("\t\\lstinputlisting{{{0}}}\n", Path.GetFullPath(dfy.Uri))); // Imprime la salida de error en caso de error if (está && informe.Resultado.EsError()) { tex.Write(String.Format("\\medskip \\begin{{center}}Salida de Dafny ({0}s):\\end{{center}}", informe.Tiempo.TotalSeconds)); tex.Write(String.Format("{{\\footnotesize \\begin{{verbatim}}{0}\\end{{verbatim}}}}", informe.Salida)); } // Cada archivo en una página tex.Write(@"\eject"); nord++; }
private void Enumerar(UnidadDafny dfy, StreamWriter sw) { sw.WriteLine("<tr><td> " + "<a href=\"ver/" + dfy.Uri + "\">" + dfy.Nombre + "</a></td>"); InformeDafny informe = null; if (DCaché.Consulta(dfy.Uri, out informe)) { sw.WriteLine(@"<td style=""text-align: center;"">" + informe.Tiempo.TotalSeconds + "s</td>"); string color = "greenyellow"; if (informe.Resultado.EsError()) { color = "red"; } sw.WriteLine(@"<td style=""background-color: " + color + @";"">" + informe.Resultado.Desc() + "</td>"); } sw.WriteLine("</tr>"); }
// Responde con la vista de un archivo public void ResponderVer(HttpListenerContext ctx, string archivo) { if (DCaché == null || DExplorador == null) { Responder404(ctx); return; } StreamWriter wout = new StreamWriter(ctx.Response.OutputStream); ctx.Response.StatusCode = 200; wout.WriteLine(String.Format(Encabezado, "Archivo - " + archivo)); // Color para indicar si es error string color = "blue"; // Busca el informe en la caché InformeDafny informe = null; bool está = DCaché.Consulta(archivo, out informe); if (está) { if (informe.Resultado.EsError()) { color = "red"; } else { color = "greenyellow"; } } wout.WriteLine(String.Format(@"<header style=""background-color: {0};"">{1}</header>", color, archivo )); if (está && informe.Resultado.EsError()) { var salida = Lincol.Replace(informe.Salida, @"dfy<a href=""#l$1"">($1, $2)</a>:"); wout.WriteLine(@"<pre style=""background-color: #faff5c;"">" + salida + "</pre>"); wout.WriteLine("<br />"); } // Muy ineficiente var unis = DExplorador.Unidades.ToList(); var elem = unis.Where(nodo => nodo.Uri == archivo).ToList()[0]; var arch = File.OpenText(elem.Uri); int nlinea = 1; string lineas = ""; wout.Write("<style>.numlin { color: #999999; text-decoration: none; }</style>"); wout.WriteLine("\t<pre style=\"float: left; text-align: right; margin-right: 2ex;\">"); // Recorre las líneas pintando números de línea while (arch.Peek() >= 0) { string line = arch.ReadLine(); wout.WriteLine(String.Format(@"<a class=""numlin"" id=""l{0}"">{0}</a>", nlinea++)); lineas += line + "\n"; } wout.WriteLine("</pre>"); wout.WriteLine("\t<pre class=\"codi\">"); wout.WriteLine(lineas); //arch.CopyTo (wout.BaseStream); wout.WriteLine("\t</pre></body></html>"); wout.Flush(); ctx.Response.Close(); }