17db96d56Sopenharmony_ciimport math
27db96d56Sopenharmony_ciimport unittest
37db96d56Sopenharmony_ciimport os
47db96d56Sopenharmony_cifrom asyncio import iscoroutinefunction
57db96d56Sopenharmony_cifrom unittest.mock import AsyncMock, Mock, MagicMock, _magics
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciclass TestMockingMagicMethods(unittest.TestCase):
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci    def test_deleting_magic_methods(self):
127db96d56Sopenharmony_ci        mock = Mock()
137db96d56Sopenharmony_ci        self.assertFalse(hasattr(mock, '__getitem__'))
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci        mock.__getitem__ = Mock()
167db96d56Sopenharmony_ci        self.assertTrue(hasattr(mock, '__getitem__'))
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci        del mock.__getitem__
197db96d56Sopenharmony_ci        self.assertFalse(hasattr(mock, '__getitem__'))
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci    def test_magicmock_del(self):
237db96d56Sopenharmony_ci        mock = MagicMock()
247db96d56Sopenharmony_ci        # before using getitem
257db96d56Sopenharmony_ci        del mock.__getitem__
267db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: mock['foo'])
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci        mock = MagicMock()
297db96d56Sopenharmony_ci        # this time use it first
307db96d56Sopenharmony_ci        mock['foo']
317db96d56Sopenharmony_ci        del mock.__getitem__
327db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: mock['foo'])
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci    def test_magic_method_wrapping(self):
367db96d56Sopenharmony_ci        mock = Mock()
377db96d56Sopenharmony_ci        def f(self, name):
387db96d56Sopenharmony_ci            return self, 'fish'
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci        mock.__getitem__ = f
417db96d56Sopenharmony_ci        self.assertIsNot(mock.__getitem__, f)
427db96d56Sopenharmony_ci        self.assertEqual(mock['foo'], (mock, 'fish'))
437db96d56Sopenharmony_ci        self.assertEqual(mock.__getitem__('foo'), (mock, 'fish'))
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci        mock.__getitem__ = mock
467db96d56Sopenharmony_ci        self.assertIs(mock.__getitem__, mock)
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci    def test_magic_methods_isolated_between_mocks(self):
507db96d56Sopenharmony_ci        mock1 = Mock()
517db96d56Sopenharmony_ci        mock2 = Mock()
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci        mock1.__iter__ = Mock(return_value=iter([]))
547db96d56Sopenharmony_ci        self.assertEqual(list(mock1), [])
557db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: list(mock2))
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def test_repr(self):
597db96d56Sopenharmony_ci        mock = Mock()
607db96d56Sopenharmony_ci        self.assertEqual(repr(mock), "<Mock id='%s'>" % id(mock))
617db96d56Sopenharmony_ci        mock.__repr__ = lambda s: 'foo'
627db96d56Sopenharmony_ci        self.assertEqual(repr(mock), 'foo')
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci    def test_str(self):
667db96d56Sopenharmony_ci        mock = Mock()
677db96d56Sopenharmony_ci        self.assertEqual(str(mock), object.__str__(mock))
687db96d56Sopenharmony_ci        mock.__str__ = lambda s: 'foo'
697db96d56Sopenharmony_ci        self.assertEqual(str(mock), 'foo')
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def test_dict_methods(self):
737db96d56Sopenharmony_ci        mock = Mock()
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: mock['foo'])
767db96d56Sopenharmony_ci        def _del():
777db96d56Sopenharmony_ci            del mock['foo']
787db96d56Sopenharmony_ci        def _set():
797db96d56Sopenharmony_ci            mock['foo'] = 3
807db96d56Sopenharmony_ci        self.assertRaises(TypeError, _del)
817db96d56Sopenharmony_ci        self.assertRaises(TypeError, _set)
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci        _dict = {}
847db96d56Sopenharmony_ci        def getitem(s, name):
857db96d56Sopenharmony_ci            return _dict[name]
867db96d56Sopenharmony_ci        def setitem(s, name, value):
877db96d56Sopenharmony_ci            _dict[name] = value
887db96d56Sopenharmony_ci        def delitem(s, name):
897db96d56Sopenharmony_ci            del _dict[name]
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci        mock.__setitem__ = setitem
927db96d56Sopenharmony_ci        mock.__getitem__ = getitem
937db96d56Sopenharmony_ci        mock.__delitem__ = delitem
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci        self.assertRaises(KeyError, lambda: mock['foo'])
967db96d56Sopenharmony_ci        mock['foo'] = 'bar'
977db96d56Sopenharmony_ci        self.assertEqual(_dict, {'foo': 'bar'})
987db96d56Sopenharmony_ci        self.assertEqual(mock['foo'], 'bar')
997db96d56Sopenharmony_ci        del mock['foo']
1007db96d56Sopenharmony_ci        self.assertEqual(_dict, {})
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci    def test_numeric(self):
1047db96d56Sopenharmony_ci        original = mock = Mock()
1057db96d56Sopenharmony_ci        mock.value = 0
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: mock + 3)
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci        def add(self, other):
1107db96d56Sopenharmony_ci            mock.value += other
1117db96d56Sopenharmony_ci            return self
1127db96d56Sopenharmony_ci        mock.__add__ = add
1137db96d56Sopenharmony_ci        self.assertEqual(mock + 3, mock)
1147db96d56Sopenharmony_ci        self.assertEqual(mock.value, 3)
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci        del mock.__add__
1177db96d56Sopenharmony_ci        def iadd(mock):
1187db96d56Sopenharmony_ci            mock += 3
1197db96d56Sopenharmony_ci        self.assertRaises(TypeError, iadd, mock)
1207db96d56Sopenharmony_ci        mock.__iadd__ = add
1217db96d56Sopenharmony_ci        mock += 6
1227db96d56Sopenharmony_ci        self.assertEqual(mock, original)
1237db96d56Sopenharmony_ci        self.assertEqual(mock.value, 9)
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: 3 + mock)
1267db96d56Sopenharmony_ci        mock.__radd__ = add
1277db96d56Sopenharmony_ci        self.assertEqual(7 + mock, mock)
1287db96d56Sopenharmony_ci        self.assertEqual(mock.value, 16)
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci    def test_division(self):
1317db96d56Sopenharmony_ci        original = mock = Mock()
1327db96d56Sopenharmony_ci        mock.value = 32
1337db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: mock / 2)
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci        def truediv(self, other):
1367db96d56Sopenharmony_ci            mock.value /= other
1377db96d56Sopenharmony_ci            return self
1387db96d56Sopenharmony_ci        mock.__truediv__ = truediv
1397db96d56Sopenharmony_ci        self.assertEqual(mock / 2, mock)
1407db96d56Sopenharmony_ci        self.assertEqual(mock.value, 16)
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci        del mock.__truediv__
1437db96d56Sopenharmony_ci        def itruediv(mock):
1447db96d56Sopenharmony_ci            mock /= 4
1457db96d56Sopenharmony_ci        self.assertRaises(TypeError, itruediv, mock)
1467db96d56Sopenharmony_ci        mock.__itruediv__ = truediv
1477db96d56Sopenharmony_ci        mock /= 8
1487db96d56Sopenharmony_ci        self.assertEqual(mock, original)
1497db96d56Sopenharmony_ci        self.assertEqual(mock.value, 2)
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: 8 / mock)
1527db96d56Sopenharmony_ci        mock.__rtruediv__ = truediv
1537db96d56Sopenharmony_ci        self.assertEqual(0.5 / mock, mock)
1547db96d56Sopenharmony_ci        self.assertEqual(mock.value, 4)
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci    def test_hash(self):
1577db96d56Sopenharmony_ci        mock = Mock()
1587db96d56Sopenharmony_ci        # test delegation
1597db96d56Sopenharmony_ci        self.assertEqual(hash(mock), Mock.__hash__(mock))
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci        def _hash(s):
1627db96d56Sopenharmony_ci            return 3
1637db96d56Sopenharmony_ci        mock.__hash__ = _hash
1647db96d56Sopenharmony_ci        self.assertEqual(hash(mock), 3)
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci    def test_nonzero(self):
1687db96d56Sopenharmony_ci        m = Mock()
1697db96d56Sopenharmony_ci        self.assertTrue(bool(m))
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci        m.__bool__ = lambda s: False
1727db96d56Sopenharmony_ci        self.assertFalse(bool(m))
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci    def test_comparison(self):
1767db96d56Sopenharmony_ci        mock = Mock()
1777db96d56Sopenharmony_ci        def comp(s, o):
1787db96d56Sopenharmony_ci            return True
1797db96d56Sopenharmony_ci        mock.__lt__ = mock.__gt__ = mock.__le__ = mock.__ge__ = comp
1807db96d56Sopenharmony_ci        self. assertTrue(mock < 3)
1817db96d56Sopenharmony_ci        self. assertTrue(mock > 3)
1827db96d56Sopenharmony_ci        self. assertTrue(mock <= 3)
1837db96d56Sopenharmony_ci        self. assertTrue(mock >= 3)
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() < object())
1867db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: object() < MagicMock())
1877db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() < MagicMock())
1887db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() > object())
1897db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: object() > MagicMock())
1907db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() > MagicMock())
1917db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() <= object())
1927db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: object() <= MagicMock())
1937db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() <= MagicMock())
1947db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() >= object())
1957db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: object() >= MagicMock())
1967db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: MagicMock() >= MagicMock())
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci    def test_equality(self):
2007db96d56Sopenharmony_ci        for mock in Mock(), MagicMock():
2017db96d56Sopenharmony_ci            self.assertEqual(mock == mock, True)
2027db96d56Sopenharmony_ci            self.assertIsInstance(mock == mock, bool)
2037db96d56Sopenharmony_ci            self.assertEqual(mock != mock, False)
2047db96d56Sopenharmony_ci            self.assertIsInstance(mock != mock, bool)
2057db96d56Sopenharmony_ci            self.assertEqual(mock == object(), False)
2067db96d56Sopenharmony_ci            self.assertEqual(mock != object(), True)
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci            def eq(self, other):
2097db96d56Sopenharmony_ci                return other == 3
2107db96d56Sopenharmony_ci            mock.__eq__ = eq
2117db96d56Sopenharmony_ci            self.assertTrue(mock == 3)
2127db96d56Sopenharmony_ci            self.assertFalse(mock == 4)
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci            def ne(self, other):
2157db96d56Sopenharmony_ci                return other == 3
2167db96d56Sopenharmony_ci            mock.__ne__ = ne
2177db96d56Sopenharmony_ci            self.assertTrue(mock != 3)
2187db96d56Sopenharmony_ci            self.assertFalse(mock != 4)
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci        mock = MagicMock()
2217db96d56Sopenharmony_ci        mock.__eq__.return_value = True
2227db96d56Sopenharmony_ci        self.assertIsInstance(mock == 3, bool)
2237db96d56Sopenharmony_ci        self.assertEqual(mock == 3, True)
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci        mock.__ne__.return_value = False
2267db96d56Sopenharmony_ci        self.assertIsInstance(mock != 3, bool)
2277db96d56Sopenharmony_ci        self.assertEqual(mock != 3, False)
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    def test_len_contains_iter(self):
2317db96d56Sopenharmony_ci        mock = Mock()
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci        self.assertRaises(TypeError, len, mock)
2347db96d56Sopenharmony_ci        self.assertRaises(TypeError, iter, mock)
2357db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: 'foo' in mock)
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci        mock.__len__ = lambda s: 6
2387db96d56Sopenharmony_ci        self.assertEqual(len(mock), 6)
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci        mock.__contains__ = lambda s, o: o == 3
2417db96d56Sopenharmony_ci        self.assertIn(3, mock)
2427db96d56Sopenharmony_ci        self.assertNotIn(6, mock)
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci        mock.__iter__ = lambda s: iter('foobarbaz')
2457db96d56Sopenharmony_ci        self.assertEqual(list(mock), list('foobarbaz'))
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci    def test_magicmock(self):
2497db96d56Sopenharmony_ci        mock = MagicMock()
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci        mock.__iter__.return_value = iter([1, 2, 3])
2527db96d56Sopenharmony_ci        self.assertEqual(list(mock), [1, 2, 3])
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci        getattr(mock, '__bool__').return_value = False
2557db96d56Sopenharmony_ci        self.assertFalse(hasattr(mock, '__nonzero__'))
2567db96d56Sopenharmony_ci        self.assertFalse(bool(mock))
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci        for entry in _magics:
2597db96d56Sopenharmony_ci            self.assertTrue(hasattr(mock, entry))
2607db96d56Sopenharmony_ci        self.assertFalse(hasattr(mock, '__imaginary__'))
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci    def test_magic_mock_equality(self):
2647db96d56Sopenharmony_ci        mock = MagicMock()
2657db96d56Sopenharmony_ci        self.assertIsInstance(mock == object(), bool)
2667db96d56Sopenharmony_ci        self.assertIsInstance(mock != object(), bool)
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci        self.assertEqual(mock == object(), False)
2697db96d56Sopenharmony_ci        self.assertEqual(mock != object(), True)
2707db96d56Sopenharmony_ci        self.assertEqual(mock == mock, True)
2717db96d56Sopenharmony_ci        self.assertEqual(mock != mock, False)
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci    def test_asyncmock_defaults(self):
2747db96d56Sopenharmony_ci        mock = AsyncMock()
2757db96d56Sopenharmony_ci        self.assertEqual(int(mock), 1)
2767db96d56Sopenharmony_ci        self.assertEqual(complex(mock), 1j)
2777db96d56Sopenharmony_ci        self.assertEqual(float(mock), 1.0)
2787db96d56Sopenharmony_ci        self.assertNotIn(object(), mock)
2797db96d56Sopenharmony_ci        self.assertEqual(len(mock), 0)
2807db96d56Sopenharmony_ci        self.assertEqual(list(mock), [])
2817db96d56Sopenharmony_ci        self.assertEqual(hash(mock), object.__hash__(mock))
2827db96d56Sopenharmony_ci        self.assertEqual(str(mock), object.__str__(mock))
2837db96d56Sopenharmony_ci        self.assertTrue(bool(mock))
2847db96d56Sopenharmony_ci        self.assertEqual(round(mock), mock.__round__())
2857db96d56Sopenharmony_ci        self.assertEqual(math.trunc(mock), mock.__trunc__())
2867db96d56Sopenharmony_ci        self.assertEqual(math.floor(mock), mock.__floor__())
2877db96d56Sopenharmony_ci        self.assertEqual(math.ceil(mock), mock.__ceil__())
2887db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock.__aexit__))
2897db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock.__aenter__))
2907db96d56Sopenharmony_ci        self.assertIsInstance(mock.__aenter__, AsyncMock)
2917db96d56Sopenharmony_ci        self.assertIsInstance(mock.__aexit__, AsyncMock)
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci        # in Python 3 oct and hex use __index__
2947db96d56Sopenharmony_ci        # so these tests are for __index__ in py3k
2957db96d56Sopenharmony_ci        self.assertEqual(oct(mock), '0o1')
2967db96d56Sopenharmony_ci        self.assertEqual(hex(mock), '0x1')
2977db96d56Sopenharmony_ci        # how to test __sizeof__ ?
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    def test_magicmock_defaults(self):
3007db96d56Sopenharmony_ci        mock = MagicMock()
3017db96d56Sopenharmony_ci        self.assertEqual(int(mock), 1)
3027db96d56Sopenharmony_ci        self.assertEqual(complex(mock), 1j)
3037db96d56Sopenharmony_ci        self.assertEqual(float(mock), 1.0)
3047db96d56Sopenharmony_ci        self.assertNotIn(object(), mock)
3057db96d56Sopenharmony_ci        self.assertEqual(len(mock), 0)
3067db96d56Sopenharmony_ci        self.assertEqual(list(mock), [])
3077db96d56Sopenharmony_ci        self.assertEqual(hash(mock), object.__hash__(mock))
3087db96d56Sopenharmony_ci        self.assertEqual(str(mock), object.__str__(mock))
3097db96d56Sopenharmony_ci        self.assertTrue(bool(mock))
3107db96d56Sopenharmony_ci        self.assertEqual(round(mock), mock.__round__())
3117db96d56Sopenharmony_ci        self.assertEqual(math.trunc(mock), mock.__trunc__())
3127db96d56Sopenharmony_ci        self.assertEqual(math.floor(mock), mock.__floor__())
3137db96d56Sopenharmony_ci        self.assertEqual(math.ceil(mock), mock.__ceil__())
3147db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock.__aexit__))
3157db96d56Sopenharmony_ci        self.assertTrue(iscoroutinefunction(mock.__aenter__))
3167db96d56Sopenharmony_ci        self.assertIsInstance(mock.__aenter__, AsyncMock)
3177db96d56Sopenharmony_ci        self.assertIsInstance(mock.__aexit__, AsyncMock)
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci        # in Python 3 oct and hex use __index__
3207db96d56Sopenharmony_ci        # so these tests are for __index__ in py3k
3217db96d56Sopenharmony_ci        self.assertEqual(oct(mock), '0o1')
3227db96d56Sopenharmony_ci        self.assertEqual(hex(mock), '0x1')
3237db96d56Sopenharmony_ci        # how to test __sizeof__ ?
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci    def test_magic_methods_fspath(self):
3277db96d56Sopenharmony_ci        mock = MagicMock()
3287db96d56Sopenharmony_ci        expected_path = mock.__fspath__()
3297db96d56Sopenharmony_ci        mock.reset_mock()
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci        self.assertEqual(os.fspath(mock), expected_path)
3327db96d56Sopenharmony_ci        mock.__fspath__.assert_called_once()
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci    def test_magic_methods_and_spec(self):
3367db96d56Sopenharmony_ci        class Iterable(object):
3377db96d56Sopenharmony_ci            def __iter__(self): pass
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci        mock = Mock(spec=Iterable)
3407db96d56Sopenharmony_ci        self.assertRaises(AttributeError, lambda: mock.__iter__)
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci        mock.__iter__ = Mock(return_value=iter([]))
3437db96d56Sopenharmony_ci        self.assertEqual(list(mock), [])
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci        class NonIterable(object):
3467db96d56Sopenharmony_ci            pass
3477db96d56Sopenharmony_ci        mock = Mock(spec=NonIterable)
3487db96d56Sopenharmony_ci        self.assertRaises(AttributeError, lambda: mock.__iter__)
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci        def set_int():
3517db96d56Sopenharmony_ci            mock.__int__ = Mock(return_value=iter([]))
3527db96d56Sopenharmony_ci        self.assertRaises(AttributeError, set_int)
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci        mock = MagicMock(spec=Iterable)
3557db96d56Sopenharmony_ci        self.assertEqual(list(mock), [])
3567db96d56Sopenharmony_ci        self.assertRaises(AttributeError, set_int)
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci    def test_magic_methods_and_spec_set(self):
3607db96d56Sopenharmony_ci        class Iterable(object):
3617db96d56Sopenharmony_ci            def __iter__(self): pass
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci        mock = Mock(spec_set=Iterable)
3647db96d56Sopenharmony_ci        self.assertRaises(AttributeError, lambda: mock.__iter__)
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci        mock.__iter__ = Mock(return_value=iter([]))
3677db96d56Sopenharmony_ci        self.assertEqual(list(mock), [])
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci        class NonIterable(object):
3707db96d56Sopenharmony_ci            pass
3717db96d56Sopenharmony_ci        mock = Mock(spec_set=NonIterable)
3727db96d56Sopenharmony_ci        self.assertRaises(AttributeError, lambda: mock.__iter__)
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci        def set_int():
3757db96d56Sopenharmony_ci            mock.__int__ = Mock(return_value=iter([]))
3767db96d56Sopenharmony_ci        self.assertRaises(AttributeError, set_int)
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci        mock = MagicMock(spec_set=Iterable)
3797db96d56Sopenharmony_ci        self.assertEqual(list(mock), [])
3807db96d56Sopenharmony_ci        self.assertRaises(AttributeError, set_int)
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci    def test_setting_unsupported_magic_method(self):
3847db96d56Sopenharmony_ci        mock = MagicMock()
3857db96d56Sopenharmony_ci        def set_setattr():
3867db96d56Sopenharmony_ci            mock.__setattr__ = lambda self, name: None
3877db96d56Sopenharmony_ci        self.assertRaisesRegex(AttributeError,
3887db96d56Sopenharmony_ci            "Attempting to set unsupported magic method '__setattr__'.",
3897db96d56Sopenharmony_ci            set_setattr
3907db96d56Sopenharmony_ci        )
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci    def test_attributes_and_return_value(self):
3947db96d56Sopenharmony_ci        mock = MagicMock()
3957db96d56Sopenharmony_ci        attr = mock.foo
3967db96d56Sopenharmony_ci        def _get_type(obj):
3977db96d56Sopenharmony_ci            # the type of every mock (or magicmock) is a custom subclass
3987db96d56Sopenharmony_ci            # so the real type is the second in the mro
3997db96d56Sopenharmony_ci            return type(obj).__mro__[1]
4007db96d56Sopenharmony_ci        self.assertEqual(_get_type(attr), MagicMock)
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci        returned = mock()
4037db96d56Sopenharmony_ci        self.assertEqual(_get_type(returned), MagicMock)
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci    def test_magic_methods_are_magic_mocks(self):
4077db96d56Sopenharmony_ci        mock = MagicMock()
4087db96d56Sopenharmony_ci        self.assertIsInstance(mock.__getitem__, MagicMock)
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci        mock[1][2].__getitem__.return_value = 3
4117db96d56Sopenharmony_ci        self.assertEqual(mock[1][2][3], 3)
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ci    def test_magic_method_reset_mock(self):
4157db96d56Sopenharmony_ci        mock = MagicMock()
4167db96d56Sopenharmony_ci        str(mock)
4177db96d56Sopenharmony_ci        self.assertTrue(mock.__str__.called)
4187db96d56Sopenharmony_ci        mock.reset_mock()
4197db96d56Sopenharmony_ci        self.assertFalse(mock.__str__.called)
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci    def test_dir(self):
4237db96d56Sopenharmony_ci        # overriding the default implementation
4247db96d56Sopenharmony_ci        for mock in Mock(), MagicMock():
4257db96d56Sopenharmony_ci            def _dir(self):
4267db96d56Sopenharmony_ci                return ['foo']
4277db96d56Sopenharmony_ci            mock.__dir__ = _dir
4287db96d56Sopenharmony_ci            self.assertEqual(dir(mock), ['foo'])
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci    def test_bound_methods(self):
4327db96d56Sopenharmony_ci        m = Mock()
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci        # XXXX should this be an expected failure instead?
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci        # this seems like it should work, but is hard to do without introducing
4377db96d56Sopenharmony_ci        # other api inconsistencies. Failure message could be better though.
4387db96d56Sopenharmony_ci        m.__iter__ = [3].__iter__
4397db96d56Sopenharmony_ci        self.assertRaises(TypeError, iter, m)
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci    def test_magic_method_type(self):
4437db96d56Sopenharmony_ci        class Foo(MagicMock):
4447db96d56Sopenharmony_ci            pass
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci        foo = Foo()
4477db96d56Sopenharmony_ci        self.assertIsInstance(foo.__int__, Foo)
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci
4507db96d56Sopenharmony_ci    def test_descriptor_from_class(self):
4517db96d56Sopenharmony_ci        m = MagicMock()
4527db96d56Sopenharmony_ci        type(m).__str__.return_value = 'foo'
4537db96d56Sopenharmony_ci        self.assertEqual(str(m), 'foo')
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci    def test_iterable_as_iter_return_value(self):
4577db96d56Sopenharmony_ci        m = MagicMock()
4587db96d56Sopenharmony_ci        m.__iter__.return_value = [1, 2, 3]
4597db96d56Sopenharmony_ci        self.assertEqual(list(m), [1, 2, 3])
4607db96d56Sopenharmony_ci        self.assertEqual(list(m), [1, 2, 3])
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci        m.__iter__.return_value = iter([4, 5, 6])
4637db96d56Sopenharmony_ci        self.assertEqual(list(m), [4, 5, 6])
4647db96d56Sopenharmony_ci        self.assertEqual(list(m), [])
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci    def test_matmul(self):
4687db96d56Sopenharmony_ci        m = MagicMock()
4697db96d56Sopenharmony_ci        self.assertIsInstance(m @ 1, MagicMock)
4707db96d56Sopenharmony_ci        m.__matmul__.return_value = 42
4717db96d56Sopenharmony_ci        m.__rmatmul__.return_value = 666
4727db96d56Sopenharmony_ci        m.__imatmul__.return_value = 24
4737db96d56Sopenharmony_ci        self.assertEqual(m @ 1, 42)
4747db96d56Sopenharmony_ci        self.assertEqual(1 @ m, 666)
4757db96d56Sopenharmony_ci        m @= 24
4767db96d56Sopenharmony_ci        self.assertEqual(m, 24)
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci    def test_divmod_and_rdivmod(self):
4797db96d56Sopenharmony_ci        m = MagicMock()
4807db96d56Sopenharmony_ci        self.assertIsInstance(divmod(5, m), MagicMock)
4817db96d56Sopenharmony_ci        m.__divmod__.return_value = (2, 1)
4827db96d56Sopenharmony_ci        self.assertEqual(divmod(m, 2), (2, 1))
4837db96d56Sopenharmony_ci        m = MagicMock()
4847db96d56Sopenharmony_ci        foo = divmod(2, m)
4857db96d56Sopenharmony_ci        self.assertIsInstance(foo, MagicMock)
4867db96d56Sopenharmony_ci        foo_direct = m.__divmod__(2)
4877db96d56Sopenharmony_ci        self.assertIsInstance(foo_direct, MagicMock)
4887db96d56Sopenharmony_ci        bar = divmod(m, 2)
4897db96d56Sopenharmony_ci        self.assertIsInstance(bar, MagicMock)
4907db96d56Sopenharmony_ci        bar_direct = m.__rdivmod__(2)
4917db96d56Sopenharmony_ci        self.assertIsInstance(bar_direct, MagicMock)
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci    # http://bugs.python.org/issue23310
4947db96d56Sopenharmony_ci    # Check if you can change behaviour of magic methods in MagicMock init
4957db96d56Sopenharmony_ci    def test_magic_in_initialization(self):
4967db96d56Sopenharmony_ci        m = MagicMock(**{'__str__.return_value': "12"})
4977db96d56Sopenharmony_ci        self.assertEqual(str(m), "12")
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci    def test_changing_magic_set_in_initialization(self):
5007db96d56Sopenharmony_ci        m = MagicMock(**{'__str__.return_value': "12"})
5017db96d56Sopenharmony_ci        m.__str__.return_value = "13"
5027db96d56Sopenharmony_ci        self.assertEqual(str(m), "13")
5037db96d56Sopenharmony_ci        m = MagicMock(**{'__str__.return_value': "12"})
5047db96d56Sopenharmony_ci        m.configure_mock(**{'__str__.return_value': "14"})
5057db96d56Sopenharmony_ci        self.assertEqual(str(m), "14")
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ciif __name__ == '__main__':
5097db96d56Sopenharmony_ci    unittest.main()
510