Index: third_party/typ/typ/test_case.py |
diff --git a/third_party/typ/typ/test_case.py b/third_party/typ/typ/test_case.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2bf995b05e9d640217845c7c7a9dc4441dc3c9b6 |
--- /dev/null |
+++ b/third_party/typ/typ/test_case.py |
@@ -0,0 +1,115 @@ |
+# Copyright 2014 Google Inc. All rights reserved. |
+# |
+# Licensed under the Apache License, Version 2.0 (the "License"); |
+# you may not use this file except in compliance with the License. |
+# You may obtain a copy of the License at |
+# |
+# http://www.apache.org/licenses/LICENSE-2.0 |
+# |
+# Unless required by applicable law or agreed to in writing, software |
+# distributed under the License is distributed on an "AS IS" BASIS, |
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+# See the License for the specific language governing permissions and |
+# limitations under the License. |
+ |
+import shlex |
+import unittest |
+ |
+ |
+def convert_newlines(msg): |
+ """A routine that mimics Python's universal_newlines conversion.""" |
+ return msg.replace('\r\n', '\n').replace('\r', '\n') |
+ |
+ |
+class TestCase(unittest.TestCase): |
+ child = None |
+ context = None |
+ maxDiff = 80 * 66 |
+ |
+ |
+class MainTestCase(TestCase): |
+ prog = None |
+ |
+ def _write_files(self, host, files): |
+ for path, contents in list(files.items()): |
+ dirname = host.dirname(path) |
+ if dirname: |
+ host.maybe_mkdir(dirname) |
+ host.write_text_file(path, contents) |
+ |
+ def _read_files(self, host, tmpdir): |
+ out_files = {} |
+ for f in host.files_under(tmpdir): |
+ key = f.replace(host.sep, '/') |
+ out_files[key] = host.read_text_file(tmpdir, f) |
+ return out_files |
+ |
+ def assert_files(self, expected_files, actual_files, files_to_ignore=None): |
+ files_to_ignore = files_to_ignore or [] |
+ for k, v in expected_files.items(): |
+ self.assertMultiLineEqual(expected_files[k], v) |
+ interesting_files = set(actual_files.keys()).difference( |
+ files_to_ignore) |
+ self.assertEqual(interesting_files, set(expected_files.keys())) |
+ |
+ def make_host(self): |
+ # If we are ever called by unittest directly, and not through typ, |
+ # this will probably fail. |
+ assert(self.child) |
+ |
+ return self.child.host |
+ |
+ def call(self, host, argv, stdin, env): |
+ return host.call(argv, stdin=stdin, env=env) |
+ |
+ def check(self, cmd=None, stdin=None, env=None, aenv=None, files=None, |
+ prog=None, cwd=None, host=None, |
+ ret=None, out=None, rout=None, err=None, rerr=None, |
+ exp_files=None, |
+ files_to_ignore=None, universal_newlines=True): |
+ # Too many arguments pylint: disable=R0913 |
+ prog = prog or self.prog or [] |
+ host = host or self.make_host() |
+ argv = shlex.split(cmd) if isinstance(cmd, str) else cmd or [] |
+ |
+ tmpdir = None |
+ orig_wd = host.getcwd() |
+ try: |
+ tmpdir = host.mkdtemp() |
+ host.chdir(tmpdir) |
+ if files: |
+ self._write_files(host, files) |
+ if cwd: |
+ host.chdir(cwd) |
+ if aenv: |
+ env = host.env.copy() |
+ env.update(aenv) |
+ |
+ result = self.call(host, prog + argv, stdin=stdin, env=env) |
+ |
+ actual_ret, actual_out, actual_err = result |
+ actual_files = self._read_files(host, tmpdir) |
+ finally: |
+ if tmpdir: |
+ host.rmtree(tmpdir) |
+ host.chdir(orig_wd) |
+ |
+ if universal_newlines: |
+ actual_out = convert_newlines(actual_out) |
+ if universal_newlines: |
+ actual_err = convert_newlines(actual_err) |
+ |
+ if ret is not None: |
+ self.assertEqual(ret, actual_ret) |
+ if out is not None: |
+ self.assertMultiLineEqual(out, actual_out) |
+ if rout is not None: |
+ self.assertRegexpMatches(actual_out, rout) |
+ if err is not None: |
+ self.assertMultiLineEqual(err, actual_err) |
+ if rerr is not None: |
+ self.assertRegexpMatches(actual_err, rerr) |
+ if exp_files: |
+ self.assert_files(exp_files, actual_files, files_to_ignore) |
+ |
+ return actual_ret, actual_out, actual_err, actual_files |