diff --git a/python/CMDTEST_example.py b/python/CMDTEST_example.py index 6d9ab06..38819ed 100644 --- a/python/CMDTEST_example.py +++ b/python/CMDTEST_example.py @@ -125,6 +125,15 @@ class TC_example(TestCase): ], encoding='utf-16') self.transcode_file('abc.txt', 'xxx.txt', src_encoding='utf-16', tgt_encoding='utf-32') + def test_10_compare_files(self): + lines = ["line %d" % i for i in range(100)] + self.create_file("aaa.txt", lines) + lines[20:25] = ['aaa', 'bbb'] + self.create_file("bbb.txt", lines) + + with self.cmd(None) as c: + c.files_equal('aaa.txt', 'bbb.txt') + def xxx_test_bool(self): with self.cmd("true") as c: c.exit_status(0) diff --git a/python/cmdtest.py b/python/cmdtest.py index b6948b9..3c4ba77 100755 --- a/python/cmdtest.py +++ b/python/cmdtest.py @@ -27,6 +27,7 @@ import copy import glob import hashlib import io +from itertools import zip_longest, dropwhile import os import re import shutil @@ -99,7 +100,7 @@ def error_show(name, what, arg): try: msg = arg.error_msg(what) except: - if re.match(r'(stdout|stderr|file)_', name): + if re.match(r'(stdout|stderr|file|files)_', name): print(what) if len(arg) == 0: print(" <>") @@ -281,6 +282,29 @@ class Result: expect = ExpectFile(self, content, encoding) expect.check("file_equal %s" % fname, File(fname)) + def files_equal(self, fname1, fname2, encoding='utf-8'): + with open(fname1, "r", encoding=encoding) as f: lines1 = list(f) + with open(fname2, "r", encoding=encoding) as f: lines2 = list(f) + if lines1 != lines2: + both = list(zip_longest(lines1, lines2)) + n1 = len(both) + rest = list(dropwhile(lambda x: x[0] == x[1], both)) + n2 = len(rest) + nequal = n1 - n2 + self._error("files_equal", + actual=[ + "<%d equal lines>" % nequal, + both[nequal][0].rstrip("\n"), + "<...>", + ], + expect=[ + "<%d equal lines>" % nequal, + both[nequal][1].rstrip("\n"), + "<...>", + ]) + + + TESTS = { "created_files" : (lambda before,after: not before and after, {"created"}), @@ -377,7 +401,10 @@ class TestCase: self.__statistics.commands += 1 print("### cmdline:", cmdline) with open(stdout_log, "w") as stdout, open(stderr_log, "w") as stderr: - err = subprocess.call(cmdline, stdout=stdout, stderr=stderr, shell=True) + if cmdline: + err = subprocess.call(cmdline, stdout=stdout, stderr=stderr, shell=True) + else: + err = 0 after = tmpdir.snapshot() return Result(err, before, after,