1111# memoryview tests is now in this module.
1212#
1313
14+ import contextlib
1415import unittest
1516from test import support
1617from itertools import permutations , product
@@ -2825,6 +2826,13 @@ def test_memoryview_sequence(self):
28252826 m = memoryview (ex )
28262827 self .assertRaises (TypeError , eval , "9.0 in m" , locals ())
28272828
2829+ @contextlib .contextmanager
2830+ def assert_out_of_bounds_error (self , dim ):
2831+ with self .assertRaises (IndexError ) as cm :
2832+ yield
2833+ self .assertEqual (str (cm .exception ),
2834+ "index out of bounds on dimension %d" % (dim ,))
2835+
28282836 def test_memoryview_index (self ):
28292837
28302838 # ndim = 0
@@ -2851,12 +2859,31 @@ def test_memoryview_index(self):
28512859 self .assertRaises (IndexError , m .__getitem__ , - 8 )
28522860 self .assertRaises (IndexError , m .__getitem__ , 8 )
28532861
2854- # Not implemented: multidimensional sub-views
2862+ # multi-dimensional
28552863 ex = ndarray (list (range (12 )), shape = [3 ,4 ], flags = ND_WRITABLE )
28562864 m = memoryview (ex )
28572865
2858- self .assertRaises (NotImplementedError , m .__getitem__ , 0 )
2859- self .assertRaises (NotImplementedError , m .__setitem__ , 0 , 9 )
2866+ self .assertEqual (m [0 , 0 ], 0 )
2867+ self .assertEqual (m [2 , 0 ], 8 )
2868+ self .assertEqual (m [2 , 3 ], 11 )
2869+ self .assertEqual (m [- 1 , - 1 ], 11 )
2870+ self .assertEqual (m [- 3 , - 4 ], 0 )
2871+
2872+ # out of bounds
2873+ for index in (3 , - 4 ):
2874+ with self .assert_out_of_bounds_error (dim = 1 ):
2875+ m [index , 0 ]
2876+ for index in (4 , - 5 ):
2877+ with self .assert_out_of_bounds_error (dim = 2 ):
2878+ m [0 , index ]
2879+ self .assertRaises (IndexError , m .__getitem__ , (2 ** 64 , 0 ))
2880+ self .assertRaises (IndexError , m .__getitem__ , (0 , 2 ** 64 ))
2881+
2882+ self .assertRaises (TypeError , m .__getitem__ , (0 , 0 , 0 ))
2883+ self .assertRaises (TypeError , m .__getitem__ , (0.0 , 0.0 ))
2884+
2885+ # Not implemented: multidimensional sub-views
2886+ self .assertRaises (NotImplementedError , m .__getitem__ , ())
28602887 self .assertRaises (NotImplementedError , m .__getitem__ , 0 )
28612888
28622889 def test_memoryview_assign (self ):
@@ -2945,10 +2972,27 @@ def test_memoryview_assign(self):
29452972 m = memoryview (ex )
29462973 self .assertRaises (NotImplementedError , m .__setitem__ , 0 , 1 )
29472974
2948- # Not implemented: multidimensional sub-views
2975+ # multi-dimensional
29492976 ex = ndarray (list (range (12 )), shape = [3 ,4 ], flags = ND_WRITABLE )
29502977 m = memoryview (ex )
2978+ m [0 ,1 ] = 42
2979+ self .assertEqual (ex [0 ][1 ], 42 )
2980+ m [- 1 ,- 1 ] = 43
2981+ self .assertEqual (ex [2 ][3 ], 43 )
2982+ # errors
2983+ for index in (3 , - 4 ):
2984+ with self .assert_out_of_bounds_error (dim = 1 ):
2985+ m [index , 0 ] = 0
2986+ for index in (4 , - 5 ):
2987+ with self .assert_out_of_bounds_error (dim = 2 ):
2988+ m [0 , index ] = 0
2989+ self .assertRaises (IndexError , m .__setitem__ , (2 ** 64 , 0 ), 0 )
2990+ self .assertRaises (IndexError , m .__setitem__ , (0 , 2 ** 64 ), 0 )
2991+
2992+ self .assertRaises (TypeError , m .__setitem__ , (0 , 0 , 0 ), 0 )
2993+ self .assertRaises (TypeError , m .__setitem__ , (0.0 , 0.0 ), 0 )
29512994
2995+ # Not implemented: multidimensional sub-views
29522996 self .assertRaises (NotImplementedError , m .__setitem__ , 0 , [2 , 3 ])
29532997
29542998 def test_memoryview_slice (self ):
@@ -2961,8 +3005,8 @@ def test_memoryview_slice(self):
29613005 self .assertRaises (ValueError , m .__setitem__ , slice (0 ,2 ,0 ),
29623006 bytearray ([1 ,2 ]))
29633007
2964- # invalid slice key
2965- self .assertRaises (TypeError , m .__getitem__ , ())
3008+ # 0-dim slicing (identity function)
3009+ self .assertRaises (NotImplementedError , m .__getitem__ , ())
29663010
29673011 # multidimensional slices
29683012 ex = ndarray (list (range (12 )), shape = [12 ], flags = ND_WRITABLE )
0 commit comments