[tools 1/2] winetest/build-patterns: Use color gradients for the failures.
Francois Gouget
fgouget at codeweavers.com
Wed Apr 28 04:25:30 CDT 2021
This makes it possible to identify when the failure count changes, such
as when a patch adds two new failures to a test that already had five,
or when the failure count depending on the test configuration.
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
The pattern page will automatically be updated when the next report
arrives.
Maybe there's a way to tweak the gradients to get more contrasting
colors. In particular the blue / green yellow are sometimes hard to
distinguish. But I'm not much of a color guy so I'll leave that to
someone else. Of course another approach is to have fewer failure modes
;-)
---
winetest/build-patterns | 116 +++++++++++++++++++++++++++++++---------
winetest/report.css | 4 +-
2 files changed, 93 insertions(+), 27 deletions(-)
diff --git a/winetest/build-patterns b/winetest/build-patterns
index f470c266f..9dc25816f 100755
--- a/winetest/build-patterns
+++ b/winetest/build-patterns
@@ -247,6 +247,9 @@ my %reports;
# - name
# The uniquely identifying test name in the form 'module:unit'.
#
+# - colors
+# A hashtable of colors indexed by failure count.
+#
# - testreports
# A hashtable mapping report directory names to objects storing the results
# for that test and report combination. Each testreport object has the
@@ -421,44 +424,101 @@ foreach my $testname (keys %tests)
}
+#
+# Compute color gradients
+#
+
+sub color2html($)
+{
+ my ($c) = @_;
+ return sprintf "#%02x%02x%02x", $c->[0], $c->[1], $c->[2];
+}
+
+sub blend($$$)
+{
+ my ($p, $start, $end) = @_;
+ my $r = [int($start->[0] * (1 - $p) + $end->[0] * $p + 0.5),
+ int($start->[1] * (1 - $p) + $end->[1] * $p + 0.5),
+ int($start->[2] * (1 - $p) + $end->[2] * $p + 0.5)];
+ return $r;
+}
+
+my @keycolors = ([0, 255, 255], # cyan
+ [0, 255, 0], # green
+ [255, 255, 0], # yellow
+ [255, 0, 0], # red
+);
+
+# Use colors to differentiate the set values. Each unique value is assigned
+# a color (in HTML format) picked along a series of gradients passing by the
+# colors defined in @keycolors.
+sub compute_set_colors($)
+{
+ my ($set) = @_;
+ my @values = sort { $a <=> $b } keys %$set;
+ my $count = @values;
+ if ($count == 1)
+ {
+ $set->{$values[0]} = color2html($keycolors[0]);
+ }
+ else
+ {
+ my $k = 0;
+ my ($start, $end) = (-1, 0);
+ for (0..$count-1)
+ {
+ while (!$end or $_ > $end)
+ {
+ $k++;
+ $start = $end;
+ $end = ($count-1) * $k / (@keycolors-1);
+ }
+ $set->{$values[$_]} = color2html(blend(($_-$start)/($end-$start),
+ $keycolors[$k-1],
+ $keycolors[$k]));
+ }
+ }
+}
+
+
#
# Write the failure patterns page for the given set of reports
#
my %status2html = (
# Dll information status values
- # <status> => [ <symbol>, <class-char>, <title>, <link> ]
- "missing" => ["n", "n", "not run for an unknown reason", "report"],
- "missingdll" => ["m", "m", "missing dll", "version"],
- "missingentrypoint" => ["e", "e", "missing entry point", "version"],
- "missingordinal" => ["o", "o", "missing ordinal", "version"],
- "missingsxs" => ["v", "v", "missing side-by-side dll version", "version"],
- "stub" => ["u", "u", "stub Windows dll", "version"],
- "native" => ["N", "N", "native Windows dll", "version"],
- "loaderror258" => ["I", "I", "timed out while getting the test list", "version"],
+ # <status> => [ <symbol>, <class-char>, <title>, <link>, <attrs> ]
+ "missing" => ["n", "n", "not run for an unknown reason", "report", ""],
+ "missingdll" => ["m", "m", "missing dll", "version", ""],
+ "missingentrypoint" => ["e", "e", "missing entry point", "version", ""],
+ "missingordinal" => ["o", "o", "missing ordinal", "version", ""],
+ "missingsxs" => ["v", "v", "missing side-by-side dll version", "version", ""],
+ "stub" => ["u", "u", "stub Windows dll", "version", ""],
+ "native" => ["N", "N", "native Windows dll", "version", ""],
+ "loaderror258" => ["I", "I", "timed out while getting the test list", "version", ""],
# Other status values
- "skipped" => ["-", "s", "skipped by user request", ""],
- "crash" => ["C", "C", "crash", "t"],
- "258" => ["T", "T", "timeout", "t"],
+ "skipped" => ["-", "s", "skipped by user request", "", ""],
+ "crash" => ["C", "C", "crash", "t", ""],
+ "258" => ["T", "T", "timeout", "t", ""],
);
-# Returns a tuple containing the symbol, CSS class, title and link type
-# for the specified status.
-sub get_status_html($)
+# Returns a tuple containing the symbol, CSS class, title, link type and
+# HTML attributes for the specified status.
+sub get_status_html($$)
{
- my ($status) = @_;
+ my ($status, $failcolors) = @_;
return @{$status2html{$status}} if ($status2html{$status});
if ($status =~ /^[0-9]+$/)
{
- return ("F", "F", "$status failures", "t");
+ return ("F", "F", "$status failures", "t", " style='background-color: $failcolors->{$status}'");
}
if ($status =~ /^loaderror(.*)$/)
{
- return ("L", "L", "got error $1 while getting the test list", "version");
+ return ("L", "L", "got error $1 while getting the test list", "version", "");
}
- return ("?", "", "unknown status $status", "report");
+ return ("?", "", "unknown status $status", "report", "");
}
sub write_patterns_list($$)
@@ -481,6 +541,8 @@ sub write_patterns_list($$)
print $html "</div></div>\n";
+ compute_set_colors($test->{colors});
+
print $html "<div class='test'>\n";
foreach my $reportdir (@sortedreports)
{
@@ -519,7 +581,7 @@ sub write_patterns_list($$)
}
else
{
- ($symbol, $class, $title, my $link) = get_status_html($status);
+ ($symbol, $class, $title, my $link, $attrs) = get_status_html($status, $test->{colors});
if ($link eq "t")
{
$tag = "a";
@@ -606,17 +668,23 @@ EOF
# Build a list of test units that will appear on this page so we can
# link them to each other.
my $testnames = [];
- unit: foreach my $testname (sort keys %tests)
+ foreach my $testname (sort keys %tests)
{
my $test = $tests{$testname};
+ my $addtest;
foreach my $testreport (values %{$test->{testreports}})
{
- if ($testreport->{failed})
+ next if (!$testreport->{failed});
+ $addtest = 1;
+
+ foreach my $status (values %{$testreport->{status}})
{
- push @$testnames, $testname;
- next unit;
+ next if ($status !~ /^[0-9]+$/);
+ next if ($status eq "258"); # timeouts have their own color
+ $test->{colors}->{$status} = undef;
}
}
+ push @$testnames, $testname if ($addtest);
}
print $html "<h2>$title</h2>\n";
diff --git a/winetest/report.css b/winetest/report.css
index cca1ba986..2cc466304 100644
--- a/winetest/report.css
+++ b/winetest/report.css
@@ -89,9 +89,7 @@ div.pattern :hover { color: black; text-decoration: underline; }
.patC { /* crash */
background-color: #ff5555;
}
-.patF { /* failure(s) */
- background-color: #ff0000;
-}
+/* .patF failure(s) */
/* .patn not run for an unknown reason */
/* .patm missing dll */
.pate { /* missing entrypoint */
--
2.20.1
More information about the wine-devel
mailing list