From e427c1aa383545474490412526538648939cb8fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Wed, 13 Apr 2016 22:23:42 +0000 Subject: [PATCH] Update test harness --- autotest/autotest.py | 71 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/autotest/autotest.py b/autotest/autotest.py index 27129efd..7cd0239c 100755 --- a/autotest/autotest.py +++ b/autotest/autotest.py @@ -1,6 +1,10 @@ #!/usr/bin/env python +import os import re +import signal +import subprocess +import time def print_snippet(snippet): print(78*'-') @@ -12,6 +16,7 @@ class Snippet(object): def __init__(self, slide, content): self.slide = slide self.content = content + self.actions = [] def __str__(self): return self.content @@ -48,10 +53,13 @@ class Slide(object): def __str__(self): text = self.content for snippet in self.snippets: - text = text.replace(snippet.content, "\x1b[7m{}\x1b[0m".format(snippet.content)) + text = text.replace(snippet.content, ansi("7")(snippet.content)) return text +def ansi(code): + return lambda s: "\x1b[{}m{}\x1b[0m".format(code, s) + slides = [] with open("index.html") as f: content = f.read() @@ -95,10 +103,71 @@ for slide in slides: print_snippet(content) continue print("_ "+content) + snippet.actions.append((highlight, content)) elif highlight == "edit": print(". "+content) + snippet.actions.append((highlight, content)) elif highlight == "meta": print("^ "+content) + snippet.actions.append((highlight, content)) else: print("! Unknown highlight {!r} on slide {}.".format(highlight, slide.number)) +if placeholders: + print("! Remaining placeholder values: {}".format(placeholders)) + +actions = sum([snippet.actions for snippet in sum([slide.snippets for slide in slides], [])], []) + +# Strip ^{ ... ^} for now +def strip_curly_braces(actions, in_braces=False): + if actions == []: + return [] + elif actions[0] == ("meta", "^{"): + return strip_curly_braces(actions[1:], True) + elif actions[0] == ("meta", "^}"): + return strip_curly_braces(actions[1:], False) + elif in_braces: + return strip_curly_braces(actions[1:], True) + else: + return [actions[0]] + strip_curly_braces(actions[1:], False) + +actions = strip_curly_braces(actions) + +background = [] +cwd = os.path.expanduser("~") +for current_action, next_action in zip(actions, actions[1:]+[("bash", "true")]): + if current_action[0] == "meta": + continue + print(ansi(7)(">>> {}".format(current_action[1]))) + time.sleep(1) + proc = subprocess.Popen(current_action[1], shell=True, cwd=cwd, stdin=subprocess.PIPE, preexec_fn=os.setpgrp) + proc.cmd = current_action[1] + if next_action[0] == "meta": + print(">>> {}".format(next_action[1])) + time.sleep(3) + if next_action[1] == "^C": + os.killpg(proc.pid, signal.SIGINT) + proc.wait() + elif next_action[1] == "^Z": + # Let the process run + background.append(proc) + elif next_action[1] == "^D": + proc.communicate() + proc.wait() + else: + print("! Unknown meta action {} after snippet:".format(next_action[1])) + print_snippet(next_action[1]) + print(ansi(7)("<<< {}".format(current_action[1]))) + else: + proc.wait() + print(ansi(7)("<<< {} >>> {}".format(proc.returncode, current_action[1]))) + if proc.returncode != 0: + print("Got non-zero status code; aborting.") + break + if current_action[1].startswith("cd "): + cwd = os.path.expanduser(current_action[1][3:]) +for proc in background: + print("Terminating background process:") + print_snippet(proc.cmd) + proc.terminate() + proc.wait()