summaryrefslogtreecommitdiff
path: root/tools/test_util.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/test_util.py')
-rw-r--r--tools/test_util.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/tools/test_util.py b/tools/test_util.py
new file mode 100644
index 000000000..cec181ac0
--- /dev/null
+++ b/tools/test_util.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Runs the full test suite.
+# Usage: ./tools/test.py out/Debug
+import argparse
+import os
+import sys
+import unittest
+
+from util import (enable_ansi_colors, build_path, RESET, FG_RED, FG_GREEN,
+ executable_suffix, run, run_output, rmtree, tests_path)
+
+
+class DenoTestCase(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ args = parse_test_args()
+
+ cls.build_dir = args.build_dir
+ cls.deno_exe = args.executable
+
+
+# overload the test result class
+class ColorTextTestResult(unittest.TextTestResult):
+ def getDescription(self, test):
+ name = str(test)
+ if name.startswith("test_"):
+ name = name[5:]
+ return name
+
+ def addSuccess(self, test):
+ if self.showAll:
+ self.stream.write(FG_GREEN)
+ super(ColorTextTestResult, self).addSuccess(test)
+ if self.showAll:
+ self.stream.write(RESET)
+
+ def addError(self, test, err):
+ if self.showAll:
+ self.stream.write(FG_RED)
+ super(ColorTextTestResult, self).addError(test, err)
+ if self.showAll:
+ self.stream.write(RESET)
+
+ def addFailure(self, test, err):
+ if self.showAll:
+ self.stream.write(FG_RED)
+ super(ColorTextTestResult, self).addFailure(test, err)
+ if self.showAll:
+ self.stream.write(RESET)
+
+
+class ColorTextTestRunner(unittest.TextTestRunner):
+ resultclass = ColorTextTestResult
+
+
+def create_test_arg_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ '--failfast', '-f', action='store_true', help='Stop on first failure')
+ parser.add_argument(
+ '--verbose', '-v', action='store_true', help='Verbose output')
+ parser.add_argument("--executable", help="Use external executable of Deno")
+ parser.add_argument(
+ '--release',
+ action='store_true',
+ help='Test against release executable')
+ parser.add_argument(
+ '--pattern', '-p', help='Run tests that match provided pattern')
+ parser.add_argument(
+ '--build-dir', dest="build_dir", help='Deno build directory')
+ return parser
+
+
+TestArgParser = create_test_arg_parser()
+
+
+def parse_test_args(argv=None):
+ if argv is None:
+ argv = sys.argv[1:]
+
+ args = TestArgParser.parse_args(argv)
+
+ if args.executable and args.release:
+ raise argparse.ArgumentError(
+ None, "Path to executable is inferred from "
+ "--release, cannot provide both.")
+
+ if not args.build_dir:
+ args.build_dir = build_path()
+
+ if not args.executable:
+ args.executable = os.path.join(args.build_dir,
+ "deno" + executable_suffix)
+
+ if not os.path.isfile(args.executable):
+ raise argparse.ArgumentError(
+ None, "deno executable not found at {}".format(args.executable))
+
+ return args
+
+
+def filter_test_suite(suite, pattern):
+ filtered_tests = []
+
+ for test_case in suite:
+ if isinstance(test_case, unittest.TestSuite):
+ filtered_tests += filter_test_suite(test_case, pattern)
+ else:
+ if pattern in str(test_case):
+ filtered_tests.append(test_case)
+
+ return filtered_tests
+
+
+def run_tests(test_cases=None):
+ args = parse_test_args()
+
+ loader = unittest.TestLoader()
+
+ # if suite was not explicitly passed load test
+ # cases from calling module
+ if test_cases is None:
+ import __main__
+ suite = loader.loadTestsFromModule(__main__)
+ else:
+ suite = unittest.TestSuite()
+ for test_case in test_cases:
+ suite.addTests(loader.loadTestsFromTestCase(test_case))
+
+ if args.pattern:
+ filtered_tests = filter_test_suite(suite, args.pattern)
+ suite = unittest.TestSuite(filtered_tests)
+
+ runner = ColorTextTestRunner(
+ verbosity=args.verbose + 1, failfast=args.failfast)
+
+ result = runner.run(suite)
+ if not result.wasSuccessful():
+ sys.exit(1)