[tools 1/2] winetest/build-patterns: Allow hiding some reports on the patterns page.

Francois Gouget fgouget at codeweavers.com
Fri Aug 6 06:09:43 CDT 2021


This allows zooming on the results of a specific machine or test
configuration.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 winetest/build-patterns |  31 ++++++++++++-
 winetest/patterns.js    | 100 ++++++++++++++++++++++++++++++++++++++++
 winetest/report.css     |   6 +++
 3 files changed, 135 insertions(+), 2 deletions(-)
 create mode 100644 winetest/patterns.js

diff --git a/winetest/build-patterns b/winetest/build-patterns
index d530ad2f8..fc6f7edbe 100755
--- a/winetest/build-patterns
+++ b/winetest/build-patterns
@@ -20,6 +20,7 @@ use strict;
 use warnings;
 use open ':utf8';
 use CGI qw(:standard);
+use POSIX; # ceil()
 
 use Text::CSV::Encoded;
 use Time::Piece;
@@ -980,7 +981,7 @@ sub write_pattern_line($$$)
     my ($html, $test, $reportdir) = @_;
     my $testreport = $test->{testreports}->{$reportdir};
 
-    print $html "<div class='pattern'>";
+    print $html "<div class='patline' data-id='$reportdir'><div class='pattern'>";
 
     my $has_newmode;
     my ($range_symbol, $range_count) = ("", 0);
@@ -1086,7 +1087,7 @@ sub write_pattern_line($$$)
     }
     my $label = $reportdir;
     $label = "<b>$label</b>" if ($has_newmode);
-    print $html "</div> $label\n";
+    print $html "</div> $label\n</div>";
 }
 
 sub index2symbol($)
@@ -1288,6 +1289,7 @@ sub write_patterns_page($$$)
 <head>
   <title>$title</title>
   <link rel="stylesheet" href="/report.css" type="text/css">
+  <script type="text/javascript" defer="true" src="/patterns.js"></script>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>
 <body>
@@ -1462,6 +1464,31 @@ EOF
     $tests{0}->{desc} .= "</ul>";
     if (!$nolist)
     {
+        my @table = ("<details><summary>Page cutomization</summary>
+<div class='detailsbox'><p>Uncheck the reports you do not want to see on this page.</p>
+<table width='100%'>");
+        my @reportmap;
+        for (my $i = 0; $i < @sortedreports; $i++)
+        {
+            my $reportdir = $sortedreports[$i];
+            push @reportmap, $i if ($pagereports->{$reportdir});
+        }
+        my $count = @reportmap;
+        for (my $i = 0; $i < ceil($count/4); $i++)
+        {
+            push @table, "<tr>";
+            for (my $c = 0; $c < $count; $c += ceil($count/4))
+            {
+                my $reportindex = $reportmap[$i + $c];
+                last if (!defined $reportindex);
+                my $reportdir = $sortedreports[$reportindex] || "";
+                push @table, "<td><label><input class='reportcb' type='checkbox' id='$reportdir' checked> $reportdir</label></td>";
+            }
+            push @table, "</tr>";
+        }
+        push @table, "</div></table></details>";
+        $tests{0}->{desc} .= join("", @table);
+
         $tests{0}->{desc} .= "<p>Unlike the other patterns on this page, the one below shows the number of failed test units for each configuration.</p>";
     }
 
diff --git a/winetest/patterns.js b/winetest/patterns.js
new file mode 100644
index 000000000..a70df079e
--- /dev/null
+++ b/winetest/patterns.js
@@ -0,0 +1,100 @@
+/* Hide / show reports on the patterns page
+ *
+ * Copyright 2021 Francois Gouget
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ *Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+"use strict";
+
+var cbs;
+
+function refreshPage(changes)
+{
+    for (let key in changes)
+    {
+        const cb = cbs[key];
+        if (cb.checked == changes[key]) continue;
+
+        if (changes[key])
+        {
+            cb.patlines.forEach(patline => {
+                patline.dom.style.display = patline.display;
+                const test = patline.test;
+                if (++test.linecount == 1 && test.id != "summary")
+                    test.dom.style.display = test.display;
+            });
+        }
+        else
+        {
+            cb.patlines.forEach(patline => {
+                patline.dom.style.display = "none";
+                const test = patline.test;
+                if (--test.linecount == 0 && test.id != "summary")
+                    test.dom.style.display = "none";
+            });
+        }
+
+        cb.checked = changes[key];
+    }
+}
+
+function toggledReportCB(e)
+{
+    const cb = e.target;
+    const changes = {};
+    changes[cb.id] = cb.checked;
+    refreshPage(changes);
+}
+
+function init()
+{
+    const changes = {};
+    cbs = {};
+    document.querySelectorAll("input.reportcb").forEach(domcb => {
+        cbs[domcb.id] = { checked: true, /* all reports are shown by default */
+                          display: domcb.style.display,
+                          patlines: []
+                        };
+        changes[domcb.id] = domcb.checked;
+        domcb.addEventListener('click', toggledReportCB);
+    });
+
+    document.querySelectorAll("div.testfile").forEach(domtest => {
+        const test = { id: domtest.id,
+                       dom: domtest,
+                       display: domtest.style.display,
+                       linecount: 0
+                     };
+
+        domtest.querySelectorAll("div.patline").forEach(domline => {
+            const cb = cbs[domline.getAttribute("data-id")];
+            if (cb)
+            {
+                cb.patlines.push({ dom: domline,
+                                   display: domline.style.display,
+                                   test: test
+                                 });
+                if (cb.checked) test.linecount++;
+            }
+        });
+    });
+
+    /* When reloading a page the browser may preserve the checkbox state
+     * so reapply them to the rest of the page.
+     */
+    refreshPage(changes);
+}
+
+window.addEventListener('load', init);
diff --git a/winetest/report.css b/winetest/report.css
index 4594c5d49..f193bc3be 100644
--- a/winetest/report.css
+++ b/winetest/report.css
@@ -70,6 +70,12 @@ table.output td {
     float: right;
 }
 
+.detailsbox {
+    margin: 5px 1em 0 1em;
+    padding: 0 5px 5px;
+    border: 1px solid #601919;
+}
+
 .pattern {
     display: inline-block;
     font-family: monospace;
-- 
2.20.1




More information about the wine-devel mailing list