示例#1
0
        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();
        }
示例#2
0
        public void Insertar(string id, InformeDafny inf)
        {
            var ent = new EntradaCaché();

            ent.inf  = inf;
            ent.fmod = File.GetLastWriteTimeUtc(id);

            entradas [id] = ent;
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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++;
        }
示例#6
0
        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>");
        }
示例#7
0
        // 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();
        }