示例#1
0
class BaseTestAsync(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.app = start_app()

    @classmethod
    def tearDownClass(cls):
        pass
        # cls.app.quit() # useless
        # stop_app() # NameError: name 'QGISAPP' is not defined
        # cls.app.exitQgis() # crash when run unittest (all module)
        # del cls.app
    def setUp(self):
        if isinstance(super(), BaseTestAsync) and hasattr(
                super(), self._testMethodName):
            self.skipTest("duplicated test")

        # self.loop = self.app
        self.loop = QEventLoop()
        self._output = list()
        self._idx = 0
        self._lst_error = list()
        self.startTime = time.time()

        self._log_debug("Test start. ###################")

    def tearDown(self):
        self._stop_async()  # useless ?
        self._log_debug("Test ended. ################### \n")
        self._log_info("%s: %.3fs" %
                       (self._id(), time.time() - self.startTime))

    def _add_output(self, output):
        self._output.append(output)

    def output(self, idx=None):
        if idx is None:
            idx = self._idx
            self._idx = min(idx + 1, len(self._output))
        return self._output[idx] if idx < len(self._output) else None

    def _stop_async(self):
        self.loop.quit()
        self._log_debug("Stop Async. ###################")

    def _handle_error(self, e):
        pretty_print_error(e)
        self._stop_async()
        self._lst_error.append(e)
        # raise ErrorDuringTest(e)

    def _process_async(self):
        self.loop.processEvents()

    def _wait_async(self):
        t0 = time.time()
        self.loop.exec_()

        self._log_info("%s: wait_async end: %.3fs" %
                       (self._id(), time.time() - t0))
        if self._lst_error:
            raise AllErrorsDuringTest(self._lst_error)

    def _make_async_fun(self, fun):
        return AsyncFun(fun)

    def _log_error(self, *a, **kw):
        print(*a, file=sys.stderr, **kw)

    def _log_info(self, *a, **kw):
        log_truncate(*a, **kw)

    def _log_debug(self, *a, **kw):
        fn_name = "{}:".format(self._id())
        # fn_name = sys._getframe(1).f_code.co_name
        log_truncate(fn_name, *a, **kw)

    def _id(self):
        return self._subtest.id() if self._subtest else self.id()

    def assertMultiInput(self, expected, lst_input, msg="multi input"):
        for i, actual in enumerate(lst_input):
            self.assertEqual(expected, actual, "{} [{}]".format(msg, i))

    #unused
    def assertPairEqual(self, *a):
        pairs = [a[i:i + 2] for i in range(0, len(a), 2)]
        return self.assertEqual(*zip(*pairs))