Beispiel #1
0
    async def test_coroutine(self):
        aenter = MagicMock()
        aexit = MagicMock()

        class Reader:
            readline = iter([b"test", b""])

            def __aiter__(self):
                return self

            async def __anext__(self):
                val = next(self.readline)
                if val == b"":
                    raise StopAsyncIteration
                return val

            async def __aenter__(self):
                aenter()
                return self

            async def __aexit__(self, exc_type, exc_val, exc_tb):
                aexit()

        reader = lazy(Reader)
        self.assertEqual([b"test"], [v async for v in reader])

        async with reader:
            pass
        aenter.assert_called_once()
        aexit.assert_called_once()
Beispiel #2
0
    def test_lazy_load_operations_math(self):
        call_mock = MagicMock()

        def get() -> int:
            call_mock()
            return 2

        number = lazy(get)

        self.assertEqual(2, number)
        self.assertNotEqual(3, number)

        self.assertEqual(3, number + 1)
        self.assertEqual(3, 1 + number)

        self.assertEqual(-1, 1 - number)
        self.assertEqual(1, number - 1)

        self.assertEqual(2, number * 1)
        self.assertEqual(2, 1 * number)

        self.assertEqual(2, number / 1)
        self.assertEqual(0.5, 1.0 / number)

        self.assertEqual(2.0, number // 1)
        self.assertEqual(0.0, 1.0 // number)

        self.assertEqual(0, number % 2)
        self.assertEqual(0, 2 % number)
Beispiel #3
0
 def test_lazy_load(self):
     data = {}
     lazy_data = lazy(lambda: data)
     lazy_data["test"] = 1
     self.assertEqual(dir(data), dir(lazy_data))
     self.assertEqual(repr(data), repr(lazy_data))
     self.assertEqual(repr(data), repr(lazy_data))
     self.assertEqual(bool(data), bool(lazy_data))
     del lazy_data["test"]
     self.assertNotIn("test", lazy_data)
     with self.assertRaises(AttributeError):
         lazy_data.attr
Beispiel #4
0
    def test_lazy_none(self):
        call_mock = MagicMock()

        def option() -> Optional[int]:
            call_mock()
            return None

        op = lazy(option)

        self.assertFalse(bool(op))
        self.assertFalse(bool(op))
        self.assertFalse(bool(op))
        self.assertEqual(1, call_mock.call_count)
Beispiel #5
0
    def test_reset_lazy(self):
        call_mock = MagicMock()

        def get() -> int:
            call_mock()
            return 1

        number = lazy(get)

        self.assertEqual(1 + 1, number + 1)
        self.assertEqual(1, call_mock.call_count)
        reset_lazy(number)
        self.assertEqual(1 + 1, number + 1)
        self.assertEqual(2, call_mock.call_count)
Beispiel #6
0
    def test_lazy_load_copy(self):
        class Foo:
            def __copy__(self):
                return self

            def __deepcopy__(self, memo):
                return self

        foo = Foo()
        lazy_foo = lazy(lambda: foo)
        foo.a = 1
        self.assertEqual(foo.__dict__, lazy_foo.__dict__)
        self.assertIs(foo, copy.copy(lazy_foo))
        self.assertIs(foo, copy.deepcopy(lazy_foo))
Beispiel #7
0
    def test_lazy_load_load_once(self):
        call_mock = MagicMock()

        def get() -> int:
            time.sleep(0.1)
            call_mock()
            return 1

        number = lazy(get)

        def task(num):
            self.assertEqual(num + 1, number + num)

        with ThreadPoolExecutor(max_workers=4) as worker:
            for _ in worker.map(task, range(4)):
                _

        self.assertEqual(1, call_mock.call_count)