aboutsummaryrefslogtreecommitdiff
path: root/src/test/result.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/result.py')
-rw-r--r--src/test/result.py101
1 files changed, 66 insertions, 35 deletions
diff --git a/src/test/result.py b/src/test/result.py
index 5e7c2e9..30ce31e 100644
--- a/src/test/result.py
+++ b/src/test/result.py
@@ -6,11 +6,12 @@
# By: charles <me@cacharle.xyz> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2020/09/11 12:17:34 by charles #+# #+# #
-# Updated: 2020/10/06 16:56:30 by cacharle ### ########.fr #
+# Updated: 2020/10/07 18:53:27 by cacharle ### ########.fr #
# #
# ############################################################################ #
import sys
+import re
import config
from test.captured import Captured
@@ -23,50 +24,51 @@ class Result:
BOLD_CHARS = "\033[1m"
CLOSE_CHARS = "\033[0m"
- def __init__(self, cmd: str, file_names: [str], expected: Captured, actual: Captured):
+ def __init__(
+ self,
+ cmd: str,
+ file_names: [str],
+ expected: Captured,
+ actual: Captured,
+ leak_output: str = None
+ ):
"""Result class
- cmd: runned command
- file_names: names of watched files
- expected: expected capture
- actual: actual capture
+ cmd: runned command
+ file_names: names of watched files
+ expected: expected capture
+ actual: actual capture
+ leak_output: output of valgrind in check leak mode
"""
self.cmd = cmd
self.file_names = file_names
self.expected = expected
self.actual = actual
self.colored = True
+ self.leak_output = leak_output
self.set_colors()
- def set_colors(self):
- """Set colors strings on or off based on self.colored"""
- if self.colored:
- self.color_red = self.RED_CHARS
- self.color_green = self.GREEN_CHARS
- self.color_blue = self.BLUE_CHARS
- self.color_bold = self.BOLD_CHARS
- self.color_close = self.CLOSE_CHARS
- else:
- self.color_red = ""
- self.color_green = ""
- self.color_blue = ""
- self.color_bold = ""
- self.color_close = ""
+ @staticmethod
+ def leak(cmd: str, leak_output: str = None):
+ return Result(cmd, None, None, None, leak_output)
- def green(self, s):
- return self.color_green + s + self.color_close
-
- def red(self, s):
- return self.color_red + s + self.color_close
-
- def blue(self, s):
- return self.color_blue + s + self.color_close
-
- def bold(self, s):
- return self.color_bold + s + self.color_close
+ @property
+ def lost_bytes(self):
+ m = re.search(
+ r"definitely lost: (?P<bytes>[0-9,]+) bytes in [0-9,]+ blocks",
+ self.leak_output
+ )
+ if m is None:
+ raise RuntimeError(
+ "valgrind output parsing failed for `{}`:\n{}"
+ .format(self.cmd, self.leak_output)
+ )
+ return int(m.group("bytes"))
@property
def passed(self):
"""Check if the result passed"""
+ if self.leak_output is not None:
+ return self.lost_bytes == 0
return self.actual == self.expected
@property
@@ -153,10 +155,12 @@ class Result:
def full_diff(self) -> str:
"""Concat all difference reports"""
- return (self.indicator("WITH {}".format(self.escaped_cmd), "|>") + '\n'
- + self.output_diff()
- + self.files_diff()
- + "=" * 80 + '\n')
+ rest = ""
+ if self.leak_output is not None:
+ rest = self.leak_output
+ else:
+ rest = (self.output_diff() + self.files_diff() + "=" * 80 + '\n')
+ return (self.indicator("WITH {}".format(self.escaped_cmd), "|>") + '\n' + rest)
def cat_e(self, s: str) -> str:
"""Pass a string through a cat -e like output"""
@@ -176,3 +180,30 @@ class Result:
.replace("\v", "\\v")
.replace("\r", "\\r")
.replace("\f", "\\f"))
+
+ def set_colors(self):
+ """Set colors strings on or off based on self.colored"""
+ if self.colored:
+ self.color_red = self.RED_CHARS
+ self.color_green = self.GREEN_CHARS
+ self.color_blue = self.BLUE_CHARS
+ self.color_bold = self.BOLD_CHARS
+ self.color_close = self.CLOSE_CHARS
+ else:
+ self.color_red = ""
+ self.color_green = ""
+ self.color_blue = ""
+ self.color_bold = ""
+ self.color_close = ""
+
+ def green(self, s):
+ return self.color_green + s + self.color_close
+
+ def red(self, s):
+ return self.color_red + s + self.color_close
+
+ def blue(self, s):
+ return self.color_blue + s + self.color_close
+
+ def bold(self, s):
+ return self.color_bold + s + self.color_close