17db96d56Sopenharmony_ci# 27db96d56Sopenharmony_ci# The ndarray object from _testbuffer.c is a complete implementation of 37db96d56Sopenharmony_ci# a PEP-3118 buffer provider. It is independent from NumPy's ndarray 47db96d56Sopenharmony_ci# and the tests don't require NumPy. 57db96d56Sopenharmony_ci# 67db96d56Sopenharmony_ci# If NumPy is present, some tests check both ndarray implementations 77db96d56Sopenharmony_ci# against each other. 87db96d56Sopenharmony_ci# 97db96d56Sopenharmony_ci# Most ndarray tests also check that memoryview(ndarray) behaves in 107db96d56Sopenharmony_ci# the same way as the original. Thus, a substantial part of the 117db96d56Sopenharmony_ci# memoryview tests is now in this module. 127db96d56Sopenharmony_ci# 137db96d56Sopenharmony_ci# Written and designed by Stefan Krah for Python 3.3. 147db96d56Sopenharmony_ci# 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ciimport contextlib 177db96d56Sopenharmony_ciimport unittest 187db96d56Sopenharmony_cifrom test import support 197db96d56Sopenharmony_cifrom test.support import os_helper 207db96d56Sopenharmony_cifrom itertools import permutations, product 217db96d56Sopenharmony_cifrom random import randrange, sample, choice 227db96d56Sopenharmony_ciimport warnings 237db96d56Sopenharmony_ciimport sys, array, io, os 247db96d56Sopenharmony_cifrom decimal import Decimal 257db96d56Sopenharmony_cifrom fractions import Fraction 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_citry: 287db96d56Sopenharmony_ci from _testbuffer import * 297db96d56Sopenharmony_ciexcept ImportError: 307db96d56Sopenharmony_ci ndarray = None 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_citry: 337db96d56Sopenharmony_ci import struct 347db96d56Sopenharmony_ciexcept ImportError: 357db96d56Sopenharmony_ci struct = None 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_citry: 387db96d56Sopenharmony_ci import ctypes 397db96d56Sopenharmony_ciexcept ImportError: 407db96d56Sopenharmony_ci ctypes = None 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_citry: 437db96d56Sopenharmony_ci with os_helper.EnvironmentVarGuard() as os.environ, \ 447db96d56Sopenharmony_ci warnings.catch_warnings(): 457db96d56Sopenharmony_ci from numpy import ndarray as numpy_array 467db96d56Sopenharmony_ciexcept ImportError: 477db96d56Sopenharmony_ci numpy_array = None 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_citry: 507db96d56Sopenharmony_ci import _testcapi 517db96d56Sopenharmony_ciexcept ImportError: 527db96d56Sopenharmony_ci _testcapi = None 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ciSHORT_TEST = True 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci# ====================================================================== 597db96d56Sopenharmony_ci# Random lists by format specifier 607db96d56Sopenharmony_ci# ====================================================================== 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci# Native format chars and their ranges. 637db96d56Sopenharmony_ciNATIVE = { 647db96d56Sopenharmony_ci '?':0, 'c':0, 'b':0, 'B':0, 657db96d56Sopenharmony_ci 'h':0, 'H':0, 'i':0, 'I':0, 667db96d56Sopenharmony_ci 'l':0, 'L':0, 'n':0, 'N':0, 677db96d56Sopenharmony_ci 'f':0, 'd':0, 'P':0 687db96d56Sopenharmony_ci} 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci# NumPy does not have 'n' or 'N': 717db96d56Sopenharmony_ciif numpy_array: 727db96d56Sopenharmony_ci del NATIVE['n'] 737db96d56Sopenharmony_ci del NATIVE['N'] 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ciif struct: 767db96d56Sopenharmony_ci try: 777db96d56Sopenharmony_ci # Add "qQ" if present in native mode. 787db96d56Sopenharmony_ci struct.pack('Q', 2**64-1) 797db96d56Sopenharmony_ci NATIVE['q'] = 0 807db96d56Sopenharmony_ci NATIVE['Q'] = 0 817db96d56Sopenharmony_ci except struct.error: 827db96d56Sopenharmony_ci pass 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci# Standard format chars and their ranges. 857db96d56Sopenharmony_ciSTANDARD = { 867db96d56Sopenharmony_ci '?':(0, 2), 'c':(0, 1<<8), 877db96d56Sopenharmony_ci 'b':(-(1<<7), 1<<7), 'B':(0, 1<<8), 887db96d56Sopenharmony_ci 'h':(-(1<<15), 1<<15), 'H':(0, 1<<16), 897db96d56Sopenharmony_ci 'i':(-(1<<31), 1<<31), 'I':(0, 1<<32), 907db96d56Sopenharmony_ci 'l':(-(1<<31), 1<<31), 'L':(0, 1<<32), 917db96d56Sopenharmony_ci 'q':(-(1<<63), 1<<63), 'Q':(0, 1<<64), 927db96d56Sopenharmony_ci 'f':(-(1<<63), 1<<63), 'd':(-(1<<1023), 1<<1023) 937db96d56Sopenharmony_ci} 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_cidef native_type_range(fmt): 967db96d56Sopenharmony_ci """Return range of a native type.""" 977db96d56Sopenharmony_ci if fmt == 'c': 987db96d56Sopenharmony_ci lh = (0, 256) 997db96d56Sopenharmony_ci elif fmt == '?': 1007db96d56Sopenharmony_ci lh = (0, 2) 1017db96d56Sopenharmony_ci elif fmt == 'f': 1027db96d56Sopenharmony_ci lh = (-(1<<63), 1<<63) 1037db96d56Sopenharmony_ci elif fmt == 'd': 1047db96d56Sopenharmony_ci lh = (-(1<<1023), 1<<1023) 1057db96d56Sopenharmony_ci else: 1067db96d56Sopenharmony_ci for exp in (128, 127, 64, 63, 32, 31, 16, 15, 8, 7): 1077db96d56Sopenharmony_ci try: 1087db96d56Sopenharmony_ci struct.pack(fmt, (1<<exp)-1) 1097db96d56Sopenharmony_ci break 1107db96d56Sopenharmony_ci except struct.error: 1117db96d56Sopenharmony_ci pass 1127db96d56Sopenharmony_ci lh = (-(1<<exp), 1<<exp) if exp & 1 else (0, 1<<exp) 1137db96d56Sopenharmony_ci return lh 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_cifmtdict = { 1167db96d56Sopenharmony_ci '':NATIVE, 1177db96d56Sopenharmony_ci '@':NATIVE, 1187db96d56Sopenharmony_ci '<':STANDARD, 1197db96d56Sopenharmony_ci '>':STANDARD, 1207db96d56Sopenharmony_ci '=':STANDARD, 1217db96d56Sopenharmony_ci '!':STANDARD 1227db96d56Sopenharmony_ci} 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ciif struct: 1257db96d56Sopenharmony_ci for fmt in fmtdict['@']: 1267db96d56Sopenharmony_ci fmtdict['@'][fmt] = native_type_range(fmt) 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ciMEMORYVIEW = NATIVE.copy() 1297db96d56Sopenharmony_ciARRAY = NATIVE.copy() 1307db96d56Sopenharmony_cifor k in NATIVE: 1317db96d56Sopenharmony_ci if not k in "bBhHiIlLfd": 1327db96d56Sopenharmony_ci del ARRAY[k] 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ciBYTEFMT = NATIVE.copy() 1357db96d56Sopenharmony_cifor k in NATIVE: 1367db96d56Sopenharmony_ci if not k in "Bbc": 1377db96d56Sopenharmony_ci del BYTEFMT[k] 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_cifmtdict['m'] = MEMORYVIEW 1407db96d56Sopenharmony_cifmtdict['@m'] = MEMORYVIEW 1417db96d56Sopenharmony_cifmtdict['a'] = ARRAY 1427db96d56Sopenharmony_cifmtdict['b'] = BYTEFMT 1437db96d56Sopenharmony_cifmtdict['@b'] = BYTEFMT 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ci# Capabilities of the test objects: 1467db96d56Sopenharmony_ciMODE = 0 1477db96d56Sopenharmony_ciMULT = 1 1487db96d56Sopenharmony_cicap = { # format chars # multiplier 1497db96d56Sopenharmony_ci 'ndarray': (['', '@', '<', '>', '=', '!'], ['', '1', '2', '3']), 1507db96d56Sopenharmony_ci 'array': (['a'], ['']), 1517db96d56Sopenharmony_ci 'numpy': ([''], ['']), 1527db96d56Sopenharmony_ci 'memoryview': (['@m', 'm'], ['']), 1537db96d56Sopenharmony_ci 'bytefmt': (['@b', 'b'], ['']), 1547db96d56Sopenharmony_ci} 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_cidef randrange_fmt(mode, char, obj): 1577db96d56Sopenharmony_ci """Return random item for a type specified by a mode and a single 1587db96d56Sopenharmony_ci format character.""" 1597db96d56Sopenharmony_ci x = randrange(*fmtdict[mode][char]) 1607db96d56Sopenharmony_ci if char == 'c': 1617db96d56Sopenharmony_ci x = bytes([x]) 1627db96d56Sopenharmony_ci if obj == 'numpy' and x == b'\x00': 1637db96d56Sopenharmony_ci # http://projects.scipy.org/numpy/ticket/1925 1647db96d56Sopenharmony_ci x = b'\x01' 1657db96d56Sopenharmony_ci if char == '?': 1667db96d56Sopenharmony_ci x = bool(x) 1677db96d56Sopenharmony_ci if char == 'f' or char == 'd': 1687db96d56Sopenharmony_ci x = struct.pack(char, x) 1697db96d56Sopenharmony_ci x = struct.unpack(char, x)[0] 1707db96d56Sopenharmony_ci return x 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_cidef gen_item(fmt, obj): 1737db96d56Sopenharmony_ci """Return single random item.""" 1747db96d56Sopenharmony_ci mode, chars = fmt.split('#') 1757db96d56Sopenharmony_ci x = [] 1767db96d56Sopenharmony_ci for c in chars: 1777db96d56Sopenharmony_ci x.append(randrange_fmt(mode, c, obj)) 1787db96d56Sopenharmony_ci return x[0] if len(x) == 1 else tuple(x) 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_cidef gen_items(n, fmt, obj): 1817db96d56Sopenharmony_ci """Return a list of random items (or a scalar).""" 1827db96d56Sopenharmony_ci if n == 0: 1837db96d56Sopenharmony_ci return gen_item(fmt, obj) 1847db96d56Sopenharmony_ci lst = [0] * n 1857db96d56Sopenharmony_ci for i in range(n): 1867db96d56Sopenharmony_ci lst[i] = gen_item(fmt, obj) 1877db96d56Sopenharmony_ci return lst 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_cidef struct_items(n, obj): 1907db96d56Sopenharmony_ci mode = choice(cap[obj][MODE]) 1917db96d56Sopenharmony_ci xfmt = mode + '#' 1927db96d56Sopenharmony_ci fmt = mode.strip('amb') 1937db96d56Sopenharmony_ci nmemb = randrange(2, 10) # number of struct members 1947db96d56Sopenharmony_ci for _ in range(nmemb): 1957db96d56Sopenharmony_ci char = choice(tuple(fmtdict[mode])) 1967db96d56Sopenharmony_ci multiplier = choice(cap[obj][MULT]) 1977db96d56Sopenharmony_ci xfmt += (char * int(multiplier if multiplier else 1)) 1987db96d56Sopenharmony_ci fmt += (multiplier + char) 1997db96d56Sopenharmony_ci items = gen_items(n, xfmt, obj) 2007db96d56Sopenharmony_ci item = gen_item(xfmt, obj) 2017db96d56Sopenharmony_ci return fmt, items, item 2027db96d56Sopenharmony_ci 2037db96d56Sopenharmony_cidef randitems(n, obj='ndarray', mode=None, char=None): 2047db96d56Sopenharmony_ci """Return random format, items, item.""" 2057db96d56Sopenharmony_ci if mode is None: 2067db96d56Sopenharmony_ci mode = choice(cap[obj][MODE]) 2077db96d56Sopenharmony_ci if char is None: 2087db96d56Sopenharmony_ci char = choice(tuple(fmtdict[mode])) 2097db96d56Sopenharmony_ci multiplier = choice(cap[obj][MULT]) 2107db96d56Sopenharmony_ci fmt = mode + '#' + char * int(multiplier if multiplier else 1) 2117db96d56Sopenharmony_ci items = gen_items(n, fmt, obj) 2127db96d56Sopenharmony_ci item = gen_item(fmt, obj) 2137db96d56Sopenharmony_ci fmt = mode.strip('amb') + multiplier + char 2147db96d56Sopenharmony_ci return fmt, items, item 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_cidef iter_mode(n, obj='ndarray'): 2177db96d56Sopenharmony_ci """Iterate through supported mode/char combinations.""" 2187db96d56Sopenharmony_ci for mode in cap[obj][MODE]: 2197db96d56Sopenharmony_ci for char in fmtdict[mode]: 2207db96d56Sopenharmony_ci yield randitems(n, obj, mode, char) 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_cidef iter_format(nitems, testobj='ndarray'): 2237db96d56Sopenharmony_ci """Yield (format, items, item) for all possible modes and format 2247db96d56Sopenharmony_ci characters plus one random compound format string.""" 2257db96d56Sopenharmony_ci for t in iter_mode(nitems, testobj): 2267db96d56Sopenharmony_ci yield t 2277db96d56Sopenharmony_ci if testobj != 'ndarray': 2287db96d56Sopenharmony_ci return 2297db96d56Sopenharmony_ci yield struct_items(nitems, testobj) 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_cidef is_byte_format(fmt): 2337db96d56Sopenharmony_ci return 'c' in fmt or 'b' in fmt or 'B' in fmt 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_cidef is_memoryview_format(fmt): 2367db96d56Sopenharmony_ci """format suitable for memoryview""" 2377db96d56Sopenharmony_ci x = len(fmt) 2387db96d56Sopenharmony_ci return ((x == 1 or (x == 2 and fmt[0] == '@')) and 2397db96d56Sopenharmony_ci fmt[x-1] in MEMORYVIEW) 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ciNON_BYTE_FORMAT = [c for c in fmtdict['@'] if not is_byte_format(c)] 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci# ====================================================================== 2457db96d56Sopenharmony_ci# Multi-dimensional tolist(), slicing and slice assignments 2467db96d56Sopenharmony_ci# ====================================================================== 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_cidef atomp(lst): 2497db96d56Sopenharmony_ci """Tuple items (representing structs) are regarded as atoms.""" 2507db96d56Sopenharmony_ci return not isinstance(lst, list) 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_cidef listp(lst): 2537db96d56Sopenharmony_ci return isinstance(lst, list) 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_cidef prod(lst): 2567db96d56Sopenharmony_ci """Product of list elements.""" 2577db96d56Sopenharmony_ci if len(lst) == 0: 2587db96d56Sopenharmony_ci return 0 2597db96d56Sopenharmony_ci x = lst[0] 2607db96d56Sopenharmony_ci for v in lst[1:]: 2617db96d56Sopenharmony_ci x *= v 2627db96d56Sopenharmony_ci return x 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_cidef strides_from_shape(ndim, shape, itemsize, layout): 2657db96d56Sopenharmony_ci """Calculate strides of a contiguous array. Layout is 'C' or 2667db96d56Sopenharmony_ci 'F' (Fortran).""" 2677db96d56Sopenharmony_ci if ndim == 0: 2687db96d56Sopenharmony_ci return () 2697db96d56Sopenharmony_ci if layout == 'C': 2707db96d56Sopenharmony_ci strides = list(shape[1:]) + [itemsize] 2717db96d56Sopenharmony_ci for i in range(ndim-2, -1, -1): 2727db96d56Sopenharmony_ci strides[i] *= strides[i+1] 2737db96d56Sopenharmony_ci else: 2747db96d56Sopenharmony_ci strides = [itemsize] + list(shape[:-1]) 2757db96d56Sopenharmony_ci for i in range(1, ndim): 2767db96d56Sopenharmony_ci strides[i] *= strides[i-1] 2777db96d56Sopenharmony_ci return strides 2787db96d56Sopenharmony_ci 2797db96d56Sopenharmony_cidef _ca(items, s): 2807db96d56Sopenharmony_ci """Convert flat item list to the nested list representation of a 2817db96d56Sopenharmony_ci multidimensional C array with shape 's'.""" 2827db96d56Sopenharmony_ci if atomp(items): 2837db96d56Sopenharmony_ci return items 2847db96d56Sopenharmony_ci if len(s) == 0: 2857db96d56Sopenharmony_ci return items[0] 2867db96d56Sopenharmony_ci lst = [0] * s[0] 2877db96d56Sopenharmony_ci stride = len(items) // s[0] if s[0] else 0 2887db96d56Sopenharmony_ci for i in range(s[0]): 2897db96d56Sopenharmony_ci start = i*stride 2907db96d56Sopenharmony_ci lst[i] = _ca(items[start:start+stride], s[1:]) 2917db96d56Sopenharmony_ci return lst 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_cidef _fa(items, s): 2947db96d56Sopenharmony_ci """Convert flat item list to the nested list representation of a 2957db96d56Sopenharmony_ci multidimensional Fortran array with shape 's'.""" 2967db96d56Sopenharmony_ci if atomp(items): 2977db96d56Sopenharmony_ci return items 2987db96d56Sopenharmony_ci if len(s) == 0: 2997db96d56Sopenharmony_ci return items[0] 3007db96d56Sopenharmony_ci lst = [0] * s[0] 3017db96d56Sopenharmony_ci stride = s[0] 3027db96d56Sopenharmony_ci for i in range(s[0]): 3037db96d56Sopenharmony_ci lst[i] = _fa(items[i::stride], s[1:]) 3047db96d56Sopenharmony_ci return lst 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_cidef carray(items, shape): 3077db96d56Sopenharmony_ci if listp(items) and not 0 in shape and prod(shape) != len(items): 3087db96d56Sopenharmony_ci raise ValueError("prod(shape) != len(items)") 3097db96d56Sopenharmony_ci return _ca(items, shape) 3107db96d56Sopenharmony_ci 3117db96d56Sopenharmony_cidef farray(items, shape): 3127db96d56Sopenharmony_ci if listp(items) and not 0 in shape and prod(shape) != len(items): 3137db96d56Sopenharmony_ci raise ValueError("prod(shape) != len(items)") 3147db96d56Sopenharmony_ci return _fa(items, shape) 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_cidef indices(shape): 3177db96d56Sopenharmony_ci """Generate all possible tuples of indices.""" 3187db96d56Sopenharmony_ci iterables = [range(v) for v in shape] 3197db96d56Sopenharmony_ci return product(*iterables) 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_cidef getindex(ndim, ind, strides): 3227db96d56Sopenharmony_ci """Convert multi-dimensional index to the position in the flat list.""" 3237db96d56Sopenharmony_ci ret = 0 3247db96d56Sopenharmony_ci for i in range(ndim): 3257db96d56Sopenharmony_ci ret += strides[i] * ind[i] 3267db96d56Sopenharmony_ci return ret 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_cidef transpose(src, shape): 3297db96d56Sopenharmony_ci """Transpose flat item list that is regarded as a multi-dimensional 3307db96d56Sopenharmony_ci matrix defined by shape: dest...[k][j][i] = src[i][j][k]... """ 3317db96d56Sopenharmony_ci if not shape: 3327db96d56Sopenharmony_ci return src 3337db96d56Sopenharmony_ci ndim = len(shape) 3347db96d56Sopenharmony_ci sstrides = strides_from_shape(ndim, shape, 1, 'C') 3357db96d56Sopenharmony_ci dstrides = strides_from_shape(ndim, shape[::-1], 1, 'C') 3367db96d56Sopenharmony_ci dest = [0] * len(src) 3377db96d56Sopenharmony_ci for ind in indices(shape): 3387db96d56Sopenharmony_ci fr = getindex(ndim, ind, sstrides) 3397db96d56Sopenharmony_ci to = getindex(ndim, ind[::-1], dstrides) 3407db96d56Sopenharmony_ci dest[to] = src[fr] 3417db96d56Sopenharmony_ci return dest 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_cidef _flatten(lst): 3447db96d56Sopenharmony_ci """flatten list""" 3457db96d56Sopenharmony_ci if lst == []: 3467db96d56Sopenharmony_ci return lst 3477db96d56Sopenharmony_ci if atomp(lst): 3487db96d56Sopenharmony_ci return [lst] 3497db96d56Sopenharmony_ci return _flatten(lst[0]) + _flatten(lst[1:]) 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_cidef flatten(lst): 3527db96d56Sopenharmony_ci """flatten list or return scalar""" 3537db96d56Sopenharmony_ci if atomp(lst): # scalar 3547db96d56Sopenharmony_ci return lst 3557db96d56Sopenharmony_ci return _flatten(lst) 3567db96d56Sopenharmony_ci 3577db96d56Sopenharmony_cidef slice_shape(lst, slices): 3587db96d56Sopenharmony_ci """Get the shape of lst after slicing: slices is a list of slice 3597db96d56Sopenharmony_ci objects.""" 3607db96d56Sopenharmony_ci if atomp(lst): 3617db96d56Sopenharmony_ci return [] 3627db96d56Sopenharmony_ci return [len(lst[slices[0]])] + slice_shape(lst[0], slices[1:]) 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_cidef multislice(lst, slices): 3657db96d56Sopenharmony_ci """Multi-dimensional slicing: slices is a list of slice objects.""" 3667db96d56Sopenharmony_ci if atomp(lst): 3677db96d56Sopenharmony_ci return lst 3687db96d56Sopenharmony_ci return [multislice(sublst, slices[1:]) for sublst in lst[slices[0]]] 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_cidef m_assign(llst, rlst, lslices, rslices): 3717db96d56Sopenharmony_ci """Multi-dimensional slice assignment: llst and rlst are the operands, 3727db96d56Sopenharmony_ci lslices and rslices are lists of slice objects. llst and rlst must 3737db96d56Sopenharmony_ci have the same structure. 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci For a two-dimensional example, this is not implemented in Python: 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci llst[0:3:2, 0:3:2] = rlst[1:3:1, 1:3:1] 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ci Instead we write: 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci lslices = [slice(0,3,2), slice(0,3,2)] 3827db96d56Sopenharmony_ci rslices = [slice(1,3,1), slice(1,3,1)] 3837db96d56Sopenharmony_ci multislice_assign(llst, rlst, lslices, rslices) 3847db96d56Sopenharmony_ci """ 3857db96d56Sopenharmony_ci if atomp(rlst): 3867db96d56Sopenharmony_ci return rlst 3877db96d56Sopenharmony_ci rlst = [m_assign(l, r, lslices[1:], rslices[1:]) 3887db96d56Sopenharmony_ci for l, r in zip(llst[lslices[0]], rlst[rslices[0]])] 3897db96d56Sopenharmony_ci llst[lslices[0]] = rlst 3907db96d56Sopenharmony_ci return llst 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_cidef cmp_structure(llst, rlst, lslices, rslices): 3937db96d56Sopenharmony_ci """Compare the structure of llst[lslices] and rlst[rslices].""" 3947db96d56Sopenharmony_ci lshape = slice_shape(llst, lslices) 3957db96d56Sopenharmony_ci rshape = slice_shape(rlst, rslices) 3967db96d56Sopenharmony_ci if (len(lshape) != len(rshape)): 3977db96d56Sopenharmony_ci return -1 3987db96d56Sopenharmony_ci for i in range(len(lshape)): 3997db96d56Sopenharmony_ci if lshape[i] != rshape[i]: 4007db96d56Sopenharmony_ci return -1 4017db96d56Sopenharmony_ci if lshape[i] == 0: 4027db96d56Sopenharmony_ci return 0 4037db96d56Sopenharmony_ci return 0 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_cidef multislice_assign(llst, rlst, lslices, rslices): 4067db96d56Sopenharmony_ci """Return llst after assigning: llst[lslices] = rlst[rslices]""" 4077db96d56Sopenharmony_ci if cmp_structure(llst, rlst, lslices, rslices) < 0: 4087db96d56Sopenharmony_ci raise ValueError("lvalue and rvalue have different structures") 4097db96d56Sopenharmony_ci return m_assign(llst, rlst, lslices, rslices) 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci 4127db96d56Sopenharmony_ci# ====================================================================== 4137db96d56Sopenharmony_ci# Random structures 4147db96d56Sopenharmony_ci# ====================================================================== 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ci# 4177db96d56Sopenharmony_ci# PEP-3118 is very permissive with respect to the contents of a 4187db96d56Sopenharmony_ci# Py_buffer. In particular: 4197db96d56Sopenharmony_ci# 4207db96d56Sopenharmony_ci# - shape can be zero 4217db96d56Sopenharmony_ci# - strides can be any integer, including zero 4227db96d56Sopenharmony_ci# - offset can point to any location in the underlying 4237db96d56Sopenharmony_ci# memory block, provided that it is a multiple of 4247db96d56Sopenharmony_ci# itemsize. 4257db96d56Sopenharmony_ci# 4267db96d56Sopenharmony_ci# The functions in this section test and verify random structures 4277db96d56Sopenharmony_ci# in full generality. A structure is valid iff it fits in the 4287db96d56Sopenharmony_ci# underlying memory block. 4297db96d56Sopenharmony_ci# 4307db96d56Sopenharmony_ci# The structure 't' (short for 'tuple') is fully defined by: 4317db96d56Sopenharmony_ci# 4327db96d56Sopenharmony_ci# t = (memlen, itemsize, ndim, shape, strides, offset) 4337db96d56Sopenharmony_ci# 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_cidef verify_structure(memlen, itemsize, ndim, shape, strides, offset): 4367db96d56Sopenharmony_ci """Verify that the parameters represent a valid array within 4377db96d56Sopenharmony_ci the bounds of the allocated memory: 4387db96d56Sopenharmony_ci char *mem: start of the physical memory block 4397db96d56Sopenharmony_ci memlen: length of the physical memory block 4407db96d56Sopenharmony_ci offset: (char *)buf - mem 4417db96d56Sopenharmony_ci """ 4427db96d56Sopenharmony_ci if offset % itemsize: 4437db96d56Sopenharmony_ci return False 4447db96d56Sopenharmony_ci if offset < 0 or offset+itemsize > memlen: 4457db96d56Sopenharmony_ci return False 4467db96d56Sopenharmony_ci if any(v % itemsize for v in strides): 4477db96d56Sopenharmony_ci return False 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci if ndim <= 0: 4507db96d56Sopenharmony_ci return ndim == 0 and not shape and not strides 4517db96d56Sopenharmony_ci if 0 in shape: 4527db96d56Sopenharmony_ci return True 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ci imin = sum(strides[j]*(shape[j]-1) for j in range(ndim) 4557db96d56Sopenharmony_ci if strides[j] <= 0) 4567db96d56Sopenharmony_ci imax = sum(strides[j]*(shape[j]-1) for j in range(ndim) 4577db96d56Sopenharmony_ci if strides[j] > 0) 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci return 0 <= offset+imin and offset+imax+itemsize <= memlen 4607db96d56Sopenharmony_ci 4617db96d56Sopenharmony_cidef get_item(lst, indices): 4627db96d56Sopenharmony_ci for i in indices: 4637db96d56Sopenharmony_ci lst = lst[i] 4647db96d56Sopenharmony_ci return lst 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_cidef memory_index(indices, t): 4677db96d56Sopenharmony_ci """Location of an item in the underlying memory.""" 4687db96d56Sopenharmony_ci memlen, itemsize, ndim, shape, strides, offset = t 4697db96d56Sopenharmony_ci p = offset 4707db96d56Sopenharmony_ci for i in range(ndim): 4717db96d56Sopenharmony_ci p += strides[i]*indices[i] 4727db96d56Sopenharmony_ci return p 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_cidef is_overlapping(t): 4757db96d56Sopenharmony_ci """The structure 't' is overlapping if at least one memory location 4767db96d56Sopenharmony_ci is visited twice while iterating through all possible tuples of 4777db96d56Sopenharmony_ci indices.""" 4787db96d56Sopenharmony_ci memlen, itemsize, ndim, shape, strides, offset = t 4797db96d56Sopenharmony_ci visited = 1<<memlen 4807db96d56Sopenharmony_ci for ind in indices(shape): 4817db96d56Sopenharmony_ci i = memory_index(ind, t) 4827db96d56Sopenharmony_ci bit = 1<<i 4837db96d56Sopenharmony_ci if visited & bit: 4847db96d56Sopenharmony_ci return True 4857db96d56Sopenharmony_ci visited |= bit 4867db96d56Sopenharmony_ci return False 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_cidef rand_structure(itemsize, valid, maxdim=5, maxshape=16, shape=()): 4897db96d56Sopenharmony_ci """Return random structure: 4907db96d56Sopenharmony_ci (memlen, itemsize, ndim, shape, strides, offset) 4917db96d56Sopenharmony_ci If 'valid' is true, the returned structure is valid, otherwise invalid. 4927db96d56Sopenharmony_ci If 'shape' is given, use that instead of creating a random shape. 4937db96d56Sopenharmony_ci """ 4947db96d56Sopenharmony_ci if not shape: 4957db96d56Sopenharmony_ci ndim = randrange(maxdim+1) 4967db96d56Sopenharmony_ci if (ndim == 0): 4977db96d56Sopenharmony_ci if valid: 4987db96d56Sopenharmony_ci return itemsize, itemsize, ndim, (), (), 0 4997db96d56Sopenharmony_ci else: 5007db96d56Sopenharmony_ci nitems = randrange(1, 16+1) 5017db96d56Sopenharmony_ci memlen = nitems * itemsize 5027db96d56Sopenharmony_ci offset = -itemsize if randrange(2) == 0 else memlen 5037db96d56Sopenharmony_ci return memlen, itemsize, ndim, (), (), offset 5047db96d56Sopenharmony_ci 5057db96d56Sopenharmony_ci minshape = 2 5067db96d56Sopenharmony_ci n = randrange(100) 5077db96d56Sopenharmony_ci if n >= 95 and valid: 5087db96d56Sopenharmony_ci minshape = 0 5097db96d56Sopenharmony_ci elif n >= 90: 5107db96d56Sopenharmony_ci minshape = 1 5117db96d56Sopenharmony_ci shape = [0] * ndim 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_ci for i in range(ndim): 5147db96d56Sopenharmony_ci shape[i] = randrange(minshape, maxshape+1) 5157db96d56Sopenharmony_ci else: 5167db96d56Sopenharmony_ci ndim = len(shape) 5177db96d56Sopenharmony_ci 5187db96d56Sopenharmony_ci maxstride = 5 5197db96d56Sopenharmony_ci n = randrange(100) 5207db96d56Sopenharmony_ci zero_stride = True if n >= 95 and n & 1 else False 5217db96d56Sopenharmony_ci 5227db96d56Sopenharmony_ci strides = [0] * ndim 5237db96d56Sopenharmony_ci strides[ndim-1] = itemsize * randrange(-maxstride, maxstride+1) 5247db96d56Sopenharmony_ci if not zero_stride and strides[ndim-1] == 0: 5257db96d56Sopenharmony_ci strides[ndim-1] = itemsize 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ci for i in range(ndim-2, -1, -1): 5287db96d56Sopenharmony_ci maxstride *= shape[i+1] if shape[i+1] else 1 5297db96d56Sopenharmony_ci if zero_stride: 5307db96d56Sopenharmony_ci strides[i] = itemsize * randrange(-maxstride, maxstride+1) 5317db96d56Sopenharmony_ci else: 5327db96d56Sopenharmony_ci strides[i] = ((1,-1)[randrange(2)] * 5337db96d56Sopenharmony_ci itemsize * randrange(1, maxstride+1)) 5347db96d56Sopenharmony_ci 5357db96d56Sopenharmony_ci imin = imax = 0 5367db96d56Sopenharmony_ci if not 0 in shape: 5377db96d56Sopenharmony_ci imin = sum(strides[j]*(shape[j]-1) for j in range(ndim) 5387db96d56Sopenharmony_ci if strides[j] <= 0) 5397db96d56Sopenharmony_ci imax = sum(strides[j]*(shape[j]-1) for j in range(ndim) 5407db96d56Sopenharmony_ci if strides[j] > 0) 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci nitems = imax - imin 5437db96d56Sopenharmony_ci if valid: 5447db96d56Sopenharmony_ci offset = -imin * itemsize 5457db96d56Sopenharmony_ci memlen = offset + (imax+1) * itemsize 5467db96d56Sopenharmony_ci else: 5477db96d56Sopenharmony_ci memlen = (-imin + imax) * itemsize 5487db96d56Sopenharmony_ci offset = -imin-itemsize if randrange(2) == 0 else memlen 5497db96d56Sopenharmony_ci return memlen, itemsize, ndim, shape, strides, offset 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_cidef randslice_from_slicelen(slicelen, listlen): 5527db96d56Sopenharmony_ci """Create a random slice of len slicelen that fits into listlen.""" 5537db96d56Sopenharmony_ci maxstart = listlen - slicelen 5547db96d56Sopenharmony_ci start = randrange(maxstart+1) 5557db96d56Sopenharmony_ci maxstep = (listlen - start) // slicelen if slicelen else 1 5567db96d56Sopenharmony_ci step = randrange(1, maxstep+1) 5577db96d56Sopenharmony_ci stop = start + slicelen * step 5587db96d56Sopenharmony_ci s = slice(start, stop, step) 5597db96d56Sopenharmony_ci _, _, _, control = slice_indices(s, listlen) 5607db96d56Sopenharmony_ci if control != slicelen: 5617db96d56Sopenharmony_ci raise RuntimeError 5627db96d56Sopenharmony_ci return s 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_cidef randslice_from_shape(ndim, shape): 5657db96d56Sopenharmony_ci """Create two sets of slices for an array x with shape 'shape' 5667db96d56Sopenharmony_ci such that shapeof(x[lslices]) == shapeof(x[rslices]).""" 5677db96d56Sopenharmony_ci lslices = [0] * ndim 5687db96d56Sopenharmony_ci rslices = [0] * ndim 5697db96d56Sopenharmony_ci for n in range(ndim): 5707db96d56Sopenharmony_ci l = shape[n] 5717db96d56Sopenharmony_ci slicelen = randrange(1, l+1) if l > 0 else 0 5727db96d56Sopenharmony_ci lslices[n] = randslice_from_slicelen(slicelen, l) 5737db96d56Sopenharmony_ci rslices[n] = randslice_from_slicelen(slicelen, l) 5747db96d56Sopenharmony_ci return tuple(lslices), tuple(rslices) 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_cidef rand_aligned_slices(maxdim=5, maxshape=16): 5777db96d56Sopenharmony_ci """Create (lshape, rshape, tuple(lslices), tuple(rslices)) such that 5787db96d56Sopenharmony_ci shapeof(x[lslices]) == shapeof(y[rslices]), where x is an array 5797db96d56Sopenharmony_ci with shape 'lshape' and y is an array with shape 'rshape'.""" 5807db96d56Sopenharmony_ci ndim = randrange(1, maxdim+1) 5817db96d56Sopenharmony_ci minshape = 2 5827db96d56Sopenharmony_ci n = randrange(100) 5837db96d56Sopenharmony_ci if n >= 95: 5847db96d56Sopenharmony_ci minshape = 0 5857db96d56Sopenharmony_ci elif n >= 90: 5867db96d56Sopenharmony_ci minshape = 1 5877db96d56Sopenharmony_ci all_random = True if randrange(100) >= 80 else False 5887db96d56Sopenharmony_ci lshape = [0]*ndim; rshape = [0]*ndim 5897db96d56Sopenharmony_ci lslices = [0]*ndim; rslices = [0]*ndim 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_ci for n in range(ndim): 5927db96d56Sopenharmony_ci small = randrange(minshape, maxshape+1) 5937db96d56Sopenharmony_ci big = randrange(minshape, maxshape+1) 5947db96d56Sopenharmony_ci if big < small: 5957db96d56Sopenharmony_ci big, small = small, big 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ci # Create a slice that fits the smaller value. 5987db96d56Sopenharmony_ci if all_random: 5997db96d56Sopenharmony_ci start = randrange(-small, small+1) 6007db96d56Sopenharmony_ci stop = randrange(-small, small+1) 6017db96d56Sopenharmony_ci step = (1,-1)[randrange(2)] * randrange(1, small+2) 6027db96d56Sopenharmony_ci s_small = slice(start, stop, step) 6037db96d56Sopenharmony_ci _, _, _, slicelen = slice_indices(s_small, small) 6047db96d56Sopenharmony_ci else: 6057db96d56Sopenharmony_ci slicelen = randrange(1, small+1) if small > 0 else 0 6067db96d56Sopenharmony_ci s_small = randslice_from_slicelen(slicelen, small) 6077db96d56Sopenharmony_ci 6087db96d56Sopenharmony_ci # Create a slice of the same length for the bigger value. 6097db96d56Sopenharmony_ci s_big = randslice_from_slicelen(slicelen, big) 6107db96d56Sopenharmony_ci if randrange(2) == 0: 6117db96d56Sopenharmony_ci rshape[n], lshape[n] = big, small 6127db96d56Sopenharmony_ci rslices[n], lslices[n] = s_big, s_small 6137db96d56Sopenharmony_ci else: 6147db96d56Sopenharmony_ci rshape[n], lshape[n] = small, big 6157db96d56Sopenharmony_ci rslices[n], lslices[n] = s_small, s_big 6167db96d56Sopenharmony_ci 6177db96d56Sopenharmony_ci return lshape, rshape, tuple(lslices), tuple(rslices) 6187db96d56Sopenharmony_ci 6197db96d56Sopenharmony_cidef randitems_from_structure(fmt, t): 6207db96d56Sopenharmony_ci """Return a list of random items for structure 't' with format 6217db96d56Sopenharmony_ci 'fmtchar'.""" 6227db96d56Sopenharmony_ci memlen, itemsize, _, _, _, _ = t 6237db96d56Sopenharmony_ci return gen_items(memlen//itemsize, '#'+fmt, 'numpy') 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_cidef ndarray_from_structure(items, fmt, t, flags=0): 6267db96d56Sopenharmony_ci """Return ndarray from the tuple returned by rand_structure()""" 6277db96d56Sopenharmony_ci memlen, itemsize, ndim, shape, strides, offset = t 6287db96d56Sopenharmony_ci return ndarray(items, shape=shape, strides=strides, format=fmt, 6297db96d56Sopenharmony_ci offset=offset, flags=ND_WRITABLE|flags) 6307db96d56Sopenharmony_ci 6317db96d56Sopenharmony_cidef numpy_array_from_structure(items, fmt, t): 6327db96d56Sopenharmony_ci """Return numpy_array from the tuple returned by rand_structure()""" 6337db96d56Sopenharmony_ci memlen, itemsize, ndim, shape, strides, offset = t 6347db96d56Sopenharmony_ci buf = bytearray(memlen) 6357db96d56Sopenharmony_ci for j, v in enumerate(items): 6367db96d56Sopenharmony_ci struct.pack_into(fmt, buf, j*itemsize, v) 6377db96d56Sopenharmony_ci return numpy_array(buffer=buf, shape=shape, strides=strides, 6387db96d56Sopenharmony_ci dtype=fmt, offset=offset) 6397db96d56Sopenharmony_ci 6407db96d56Sopenharmony_ci 6417db96d56Sopenharmony_ci# ====================================================================== 6427db96d56Sopenharmony_ci# memoryview casts 6437db96d56Sopenharmony_ci# ====================================================================== 6447db96d56Sopenharmony_ci 6457db96d56Sopenharmony_cidef cast_items(exporter, fmt, itemsize, shape=None): 6467db96d56Sopenharmony_ci """Interpret the raw memory of 'exporter' as a list of items with 6477db96d56Sopenharmony_ci size 'itemsize'. If shape=None, the new structure is assumed to 6487db96d56Sopenharmony_ci be 1-D with n * itemsize = bytelen. If shape is given, the usual 6497db96d56Sopenharmony_ci constraint for contiguous arrays prod(shape) * itemsize = bytelen 6507db96d56Sopenharmony_ci applies. On success, return (items, shape). If the constraints 6517db96d56Sopenharmony_ci cannot be met, return (None, None). If a chunk of bytes is interpreted 6527db96d56Sopenharmony_ci as NaN as a result of float conversion, return ('nan', None).""" 6537db96d56Sopenharmony_ci bytelen = exporter.nbytes 6547db96d56Sopenharmony_ci if shape: 6557db96d56Sopenharmony_ci if prod(shape) * itemsize != bytelen: 6567db96d56Sopenharmony_ci return None, shape 6577db96d56Sopenharmony_ci elif shape == []: 6587db96d56Sopenharmony_ci if exporter.ndim == 0 or itemsize != bytelen: 6597db96d56Sopenharmony_ci return None, shape 6607db96d56Sopenharmony_ci else: 6617db96d56Sopenharmony_ci n, r = divmod(bytelen, itemsize) 6627db96d56Sopenharmony_ci shape = [n] 6637db96d56Sopenharmony_ci if r != 0: 6647db96d56Sopenharmony_ci return None, shape 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ci mem = exporter.tobytes() 6677db96d56Sopenharmony_ci byteitems = [mem[i:i+itemsize] for i in range(0, len(mem), itemsize)] 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ci items = [] 6707db96d56Sopenharmony_ci for v in byteitems: 6717db96d56Sopenharmony_ci item = struct.unpack(fmt, v)[0] 6727db96d56Sopenharmony_ci if item != item: 6737db96d56Sopenharmony_ci return 'nan', shape 6747db96d56Sopenharmony_ci items.append(item) 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci return (items, shape) if shape != [] else (items[0], shape) 6777db96d56Sopenharmony_ci 6787db96d56Sopenharmony_cidef gencastshapes(): 6797db96d56Sopenharmony_ci """Generate shapes to test casting.""" 6807db96d56Sopenharmony_ci for n in range(32): 6817db96d56Sopenharmony_ci yield [n] 6827db96d56Sopenharmony_ci ndim = randrange(4, 6) 6837db96d56Sopenharmony_ci minshape = 1 if randrange(100) > 80 else 2 6847db96d56Sopenharmony_ci yield [randrange(minshape, 5) for _ in range(ndim)] 6857db96d56Sopenharmony_ci ndim = randrange(2, 4) 6867db96d56Sopenharmony_ci minshape = 1 if randrange(100) > 80 else 2 6877db96d56Sopenharmony_ci yield [randrange(minshape, 5) for _ in range(ndim)] 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci 6907db96d56Sopenharmony_ci# ====================================================================== 6917db96d56Sopenharmony_ci# Actual tests 6927db96d56Sopenharmony_ci# ====================================================================== 6937db96d56Sopenharmony_ci 6947db96d56Sopenharmony_cidef genslices(n): 6957db96d56Sopenharmony_ci """Generate all possible slices for a single dimension.""" 6967db96d56Sopenharmony_ci return product(range(-n, n+1), range(-n, n+1), range(-n, n+1)) 6977db96d56Sopenharmony_ci 6987db96d56Sopenharmony_cidef genslices_ndim(ndim, shape): 6997db96d56Sopenharmony_ci """Generate all possible slice tuples for 'shape'.""" 7007db96d56Sopenharmony_ci iterables = [genslices(shape[n]) for n in range(ndim)] 7017db96d56Sopenharmony_ci return product(*iterables) 7027db96d56Sopenharmony_ci 7037db96d56Sopenharmony_cidef rslice(n, allow_empty=False): 7047db96d56Sopenharmony_ci """Generate random slice for a single dimension of length n. 7057db96d56Sopenharmony_ci If zero=True, the slices may be empty, otherwise they will 7067db96d56Sopenharmony_ci be non-empty.""" 7077db96d56Sopenharmony_ci minlen = 0 if allow_empty or n == 0 else 1 7087db96d56Sopenharmony_ci slicelen = randrange(minlen, n+1) 7097db96d56Sopenharmony_ci return randslice_from_slicelen(slicelen, n) 7107db96d56Sopenharmony_ci 7117db96d56Sopenharmony_cidef rslices(n, allow_empty=False): 7127db96d56Sopenharmony_ci """Generate random slices for a single dimension.""" 7137db96d56Sopenharmony_ci for _ in range(5): 7147db96d56Sopenharmony_ci yield rslice(n, allow_empty) 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_cidef rslices_ndim(ndim, shape, iterations=5): 7177db96d56Sopenharmony_ci """Generate random slice tuples for 'shape'.""" 7187db96d56Sopenharmony_ci # non-empty slices 7197db96d56Sopenharmony_ci for _ in range(iterations): 7207db96d56Sopenharmony_ci yield tuple(rslice(shape[n]) for n in range(ndim)) 7217db96d56Sopenharmony_ci # possibly empty slices 7227db96d56Sopenharmony_ci for _ in range(iterations): 7237db96d56Sopenharmony_ci yield tuple(rslice(shape[n], allow_empty=True) for n in range(ndim)) 7247db96d56Sopenharmony_ci # invalid slices 7257db96d56Sopenharmony_ci yield tuple(slice(0,1,0) for _ in range(ndim)) 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_cidef rpermutation(iterable, r=None): 7287db96d56Sopenharmony_ci pool = tuple(iterable) 7297db96d56Sopenharmony_ci r = len(pool) if r is None else r 7307db96d56Sopenharmony_ci yield tuple(sample(pool, r)) 7317db96d56Sopenharmony_ci 7327db96d56Sopenharmony_cidef ndarray_print(nd): 7337db96d56Sopenharmony_ci """Print ndarray for debugging.""" 7347db96d56Sopenharmony_ci try: 7357db96d56Sopenharmony_ci x = nd.tolist() 7367db96d56Sopenharmony_ci except (TypeError, NotImplementedError): 7377db96d56Sopenharmony_ci x = nd.tobytes() 7387db96d56Sopenharmony_ci if isinstance(nd, ndarray): 7397db96d56Sopenharmony_ci offset = nd.offset 7407db96d56Sopenharmony_ci flags = nd.flags 7417db96d56Sopenharmony_ci else: 7427db96d56Sopenharmony_ci offset = 'unknown' 7437db96d56Sopenharmony_ci flags = 'unknown' 7447db96d56Sopenharmony_ci print("ndarray(%s, shape=%s, strides=%s, suboffsets=%s, offset=%s, " 7457db96d56Sopenharmony_ci "format='%s', itemsize=%s, flags=%s)" % 7467db96d56Sopenharmony_ci (x, nd.shape, nd.strides, nd.suboffsets, offset, 7477db96d56Sopenharmony_ci nd.format, nd.itemsize, flags)) 7487db96d56Sopenharmony_ci sys.stdout.flush() 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_ci 7517db96d56Sopenharmony_ciITERATIONS = 100 7527db96d56Sopenharmony_ciMAXDIM = 5 7537db96d56Sopenharmony_ciMAXSHAPE = 10 7547db96d56Sopenharmony_ci 7557db96d56Sopenharmony_ciif SHORT_TEST: 7567db96d56Sopenharmony_ci ITERATIONS = 10 7577db96d56Sopenharmony_ci MAXDIM = 3 7587db96d56Sopenharmony_ci MAXSHAPE = 4 7597db96d56Sopenharmony_ci genslices = rslices 7607db96d56Sopenharmony_ci genslices_ndim = rslices_ndim 7617db96d56Sopenharmony_ci permutations = rpermutation 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_ci@unittest.skipUnless(struct, 'struct module required for this test.') 7657db96d56Sopenharmony_ci@unittest.skipUnless(ndarray, 'ndarray object required for this test') 7667db96d56Sopenharmony_ciclass TestBufferProtocol(unittest.TestCase): 7677db96d56Sopenharmony_ci 7687db96d56Sopenharmony_ci def setUp(self): 7697db96d56Sopenharmony_ci # The suboffsets tests need sizeof(void *). 7707db96d56Sopenharmony_ci self.sizeof_void_p = get_sizeof_void_p() 7717db96d56Sopenharmony_ci 7727db96d56Sopenharmony_ci def verify(self, result, *, obj, 7737db96d56Sopenharmony_ci itemsize, fmt, readonly, 7747db96d56Sopenharmony_ci ndim, shape, strides, 7757db96d56Sopenharmony_ci lst, sliced=False, cast=False): 7767db96d56Sopenharmony_ci # Verify buffer contents against expected values. 7777db96d56Sopenharmony_ci if shape: 7787db96d56Sopenharmony_ci expected_len = prod(shape)*itemsize 7797db96d56Sopenharmony_ci else: 7807db96d56Sopenharmony_ci if not fmt: # array has been implicitly cast to unsigned bytes 7817db96d56Sopenharmony_ci expected_len = len(lst) 7827db96d56Sopenharmony_ci else: # ndim = 0 7837db96d56Sopenharmony_ci expected_len = itemsize 7847db96d56Sopenharmony_ci 7857db96d56Sopenharmony_ci # Reconstruct suboffsets from strides. Support for slicing 7867db96d56Sopenharmony_ci # could be added, but is currently only needed for test_getbuf(). 7877db96d56Sopenharmony_ci suboffsets = () 7887db96d56Sopenharmony_ci if result.suboffsets: 7897db96d56Sopenharmony_ci self.assertGreater(ndim, 0) 7907db96d56Sopenharmony_ci 7917db96d56Sopenharmony_ci suboffset0 = 0 7927db96d56Sopenharmony_ci for n in range(1, ndim): 7937db96d56Sopenharmony_ci if shape[n] == 0: 7947db96d56Sopenharmony_ci break 7957db96d56Sopenharmony_ci if strides[n] <= 0: 7967db96d56Sopenharmony_ci suboffset0 += -strides[n] * (shape[n]-1) 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_ci suboffsets = [suboffset0] + [-1 for v in range(ndim-1)] 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci # Not correct if slicing has occurred in the first dimension. 8017db96d56Sopenharmony_ci stride0 = self.sizeof_void_p 8027db96d56Sopenharmony_ci if strides[0] < 0: 8037db96d56Sopenharmony_ci stride0 = -stride0 8047db96d56Sopenharmony_ci strides = [stride0] + list(strides[1:]) 8057db96d56Sopenharmony_ci 8067db96d56Sopenharmony_ci self.assertIs(result.obj, obj) 8077db96d56Sopenharmony_ci self.assertEqual(result.nbytes, expected_len) 8087db96d56Sopenharmony_ci self.assertEqual(result.itemsize, itemsize) 8097db96d56Sopenharmony_ci self.assertEqual(result.format, fmt) 8107db96d56Sopenharmony_ci self.assertIs(result.readonly, readonly) 8117db96d56Sopenharmony_ci self.assertEqual(result.ndim, ndim) 8127db96d56Sopenharmony_ci self.assertEqual(result.shape, tuple(shape)) 8137db96d56Sopenharmony_ci if not (sliced and suboffsets): 8147db96d56Sopenharmony_ci self.assertEqual(result.strides, tuple(strides)) 8157db96d56Sopenharmony_ci self.assertEqual(result.suboffsets, tuple(suboffsets)) 8167db96d56Sopenharmony_ci 8177db96d56Sopenharmony_ci if isinstance(result, ndarray) or is_memoryview_format(fmt): 8187db96d56Sopenharmony_ci rep = result.tolist() if fmt else result.tobytes() 8197db96d56Sopenharmony_ci self.assertEqual(rep, lst) 8207db96d56Sopenharmony_ci 8217db96d56Sopenharmony_ci if not fmt: # array has been cast to unsigned bytes, 8227db96d56Sopenharmony_ci return # the remaining tests won't work. 8237db96d56Sopenharmony_ci 8247db96d56Sopenharmony_ci # PyBuffer_GetPointer() is the definition how to access an item. 8257db96d56Sopenharmony_ci # If PyBuffer_GetPointer(indices) is correct for all possible 8267db96d56Sopenharmony_ci # combinations of indices, the buffer is correct. 8277db96d56Sopenharmony_ci # 8287db96d56Sopenharmony_ci # Also test tobytes() against the flattened 'lst', with all items 8297db96d56Sopenharmony_ci # packed to bytes. 8307db96d56Sopenharmony_ci if not cast: # casts chop up 'lst' in different ways 8317db96d56Sopenharmony_ci b = bytearray() 8327db96d56Sopenharmony_ci buf_err = None 8337db96d56Sopenharmony_ci for ind in indices(shape): 8347db96d56Sopenharmony_ci try: 8357db96d56Sopenharmony_ci item1 = get_pointer(result, ind) 8367db96d56Sopenharmony_ci item2 = get_item(lst, ind) 8377db96d56Sopenharmony_ci if isinstance(item2, tuple): 8387db96d56Sopenharmony_ci x = struct.pack(fmt, *item2) 8397db96d56Sopenharmony_ci else: 8407db96d56Sopenharmony_ci x = struct.pack(fmt, item2) 8417db96d56Sopenharmony_ci b.extend(x) 8427db96d56Sopenharmony_ci except BufferError: 8437db96d56Sopenharmony_ci buf_err = True # re-exporter does not provide full buffer 8447db96d56Sopenharmony_ci break 8457db96d56Sopenharmony_ci self.assertEqual(item1, item2) 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_ci if not buf_err: 8487db96d56Sopenharmony_ci # test tobytes() 8497db96d56Sopenharmony_ci self.assertEqual(result.tobytes(), b) 8507db96d56Sopenharmony_ci 8517db96d56Sopenharmony_ci # test hex() 8527db96d56Sopenharmony_ci m = memoryview(result) 8537db96d56Sopenharmony_ci h = "".join("%02x" % c for c in b) 8547db96d56Sopenharmony_ci self.assertEqual(m.hex(), h) 8557db96d56Sopenharmony_ci 8567db96d56Sopenharmony_ci # lst := expected multi-dimensional logical representation 8577db96d56Sopenharmony_ci # flatten(lst) := elements in C-order 8587db96d56Sopenharmony_ci ff = fmt if fmt else 'B' 8597db96d56Sopenharmony_ci flattened = flatten(lst) 8607db96d56Sopenharmony_ci 8617db96d56Sopenharmony_ci # Rules for 'A': if the array is already contiguous, return 8627db96d56Sopenharmony_ci # the array unaltered. Otherwise, return a contiguous 'C' 8637db96d56Sopenharmony_ci # representation. 8647db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 8657db96d56Sopenharmony_ci expected = result 8667db96d56Sopenharmony_ci if order == 'F': 8677db96d56Sopenharmony_ci if not is_contiguous(result, 'A') or \ 8687db96d56Sopenharmony_ci is_contiguous(result, 'C'): 8697db96d56Sopenharmony_ci # For constructing the ndarray, convert the 8707db96d56Sopenharmony_ci # flattened logical representation to Fortran order. 8717db96d56Sopenharmony_ci trans = transpose(flattened, shape) 8727db96d56Sopenharmony_ci expected = ndarray(trans, shape=shape, format=ff, 8737db96d56Sopenharmony_ci flags=ND_FORTRAN) 8747db96d56Sopenharmony_ci else: # 'C', 'A' 8757db96d56Sopenharmony_ci if not is_contiguous(result, 'A') or \ 8767db96d56Sopenharmony_ci is_contiguous(result, 'F') and order == 'C': 8777db96d56Sopenharmony_ci # The flattened list is already in C-order. 8787db96d56Sopenharmony_ci expected = ndarray(flattened, shape=shape, format=ff) 8797db96d56Sopenharmony_ci 8807db96d56Sopenharmony_ci contig = get_contiguous(result, PyBUF_READ, order) 8817db96d56Sopenharmony_ci self.assertEqual(contig.tobytes(), b) 8827db96d56Sopenharmony_ci self.assertTrue(cmp_contig(contig, expected)) 8837db96d56Sopenharmony_ci 8847db96d56Sopenharmony_ci if ndim == 0: 8857db96d56Sopenharmony_ci continue 8867db96d56Sopenharmony_ci 8877db96d56Sopenharmony_ci nmemb = len(flattened) 8887db96d56Sopenharmony_ci ro = 0 if readonly else ND_WRITABLE 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ci ### See comment in test_py_buffer_to_contiguous for an 8917db96d56Sopenharmony_ci ### explanation why these tests are valid. 8927db96d56Sopenharmony_ci 8937db96d56Sopenharmony_ci # To 'C' 8947db96d56Sopenharmony_ci contig = py_buffer_to_contiguous(result, 'C', PyBUF_FULL_RO) 8957db96d56Sopenharmony_ci self.assertEqual(len(contig), nmemb * itemsize) 8967db96d56Sopenharmony_ci initlst = [struct.unpack_from(fmt, contig, n*itemsize) 8977db96d56Sopenharmony_ci for n in range(nmemb)] 8987db96d56Sopenharmony_ci if len(initlst[0]) == 1: 8997db96d56Sopenharmony_ci initlst = [v[0] for v in initlst] 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ci y = ndarray(initlst, shape=shape, flags=ro, format=fmt) 9027db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(result)) 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci contig_bytes = memoryview(result).tobytes() 9057db96d56Sopenharmony_ci self.assertEqual(contig_bytes, contig) 9067db96d56Sopenharmony_ci 9077db96d56Sopenharmony_ci contig_bytes = memoryview(result).tobytes(order=None) 9087db96d56Sopenharmony_ci self.assertEqual(contig_bytes, contig) 9097db96d56Sopenharmony_ci 9107db96d56Sopenharmony_ci contig_bytes = memoryview(result).tobytes(order='C') 9117db96d56Sopenharmony_ci self.assertEqual(contig_bytes, contig) 9127db96d56Sopenharmony_ci 9137db96d56Sopenharmony_ci # To 'F' 9147db96d56Sopenharmony_ci contig = py_buffer_to_contiguous(result, 'F', PyBUF_FULL_RO) 9157db96d56Sopenharmony_ci self.assertEqual(len(contig), nmemb * itemsize) 9167db96d56Sopenharmony_ci initlst = [struct.unpack_from(fmt, contig, n*itemsize) 9177db96d56Sopenharmony_ci for n in range(nmemb)] 9187db96d56Sopenharmony_ci if len(initlst[0]) == 1: 9197db96d56Sopenharmony_ci initlst = [v[0] for v in initlst] 9207db96d56Sopenharmony_ci 9217db96d56Sopenharmony_ci y = ndarray(initlst, shape=shape, flags=ro|ND_FORTRAN, 9227db96d56Sopenharmony_ci format=fmt) 9237db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(result)) 9247db96d56Sopenharmony_ci 9257db96d56Sopenharmony_ci contig_bytes = memoryview(result).tobytes(order='F') 9267db96d56Sopenharmony_ci self.assertEqual(contig_bytes, contig) 9277db96d56Sopenharmony_ci 9287db96d56Sopenharmony_ci # To 'A' 9297db96d56Sopenharmony_ci contig = py_buffer_to_contiguous(result, 'A', PyBUF_FULL_RO) 9307db96d56Sopenharmony_ci self.assertEqual(len(contig), nmemb * itemsize) 9317db96d56Sopenharmony_ci initlst = [struct.unpack_from(fmt, contig, n*itemsize) 9327db96d56Sopenharmony_ci for n in range(nmemb)] 9337db96d56Sopenharmony_ci if len(initlst[0]) == 1: 9347db96d56Sopenharmony_ci initlst = [v[0] for v in initlst] 9357db96d56Sopenharmony_ci 9367db96d56Sopenharmony_ci f = ND_FORTRAN if is_contiguous(result, 'F') else 0 9377db96d56Sopenharmony_ci y = ndarray(initlst, shape=shape, flags=f|ro, format=fmt) 9387db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(result)) 9397db96d56Sopenharmony_ci 9407db96d56Sopenharmony_ci contig_bytes = memoryview(result).tobytes(order='A') 9417db96d56Sopenharmony_ci self.assertEqual(contig_bytes, contig) 9427db96d56Sopenharmony_ci 9437db96d56Sopenharmony_ci if is_memoryview_format(fmt): 9447db96d56Sopenharmony_ci try: 9457db96d56Sopenharmony_ci m = memoryview(result) 9467db96d56Sopenharmony_ci except BufferError: # re-exporter does not provide full information 9477db96d56Sopenharmony_ci return 9487db96d56Sopenharmony_ci ex = result.obj if isinstance(result, memoryview) else result 9497db96d56Sopenharmony_ci 9507db96d56Sopenharmony_ci def check_memoryview(m, expected_readonly=readonly): 9517db96d56Sopenharmony_ci self.assertIs(m.obj, ex) 9527db96d56Sopenharmony_ci self.assertEqual(m.nbytes, expected_len) 9537db96d56Sopenharmony_ci self.assertEqual(m.itemsize, itemsize) 9547db96d56Sopenharmony_ci self.assertEqual(m.format, fmt) 9557db96d56Sopenharmony_ci self.assertEqual(m.readonly, expected_readonly) 9567db96d56Sopenharmony_ci self.assertEqual(m.ndim, ndim) 9577db96d56Sopenharmony_ci self.assertEqual(m.shape, tuple(shape)) 9587db96d56Sopenharmony_ci if not (sliced and suboffsets): 9597db96d56Sopenharmony_ci self.assertEqual(m.strides, tuple(strides)) 9607db96d56Sopenharmony_ci self.assertEqual(m.suboffsets, tuple(suboffsets)) 9617db96d56Sopenharmony_ci 9627db96d56Sopenharmony_ci n = 1 if ndim == 0 else len(lst) 9637db96d56Sopenharmony_ci self.assertEqual(len(m), n) 9647db96d56Sopenharmony_ci 9657db96d56Sopenharmony_ci rep = result.tolist() if fmt else result.tobytes() 9667db96d56Sopenharmony_ci self.assertEqual(rep, lst) 9677db96d56Sopenharmony_ci self.assertEqual(m, result) 9687db96d56Sopenharmony_ci 9697db96d56Sopenharmony_ci check_memoryview(m) 9707db96d56Sopenharmony_ci with m.toreadonly() as mm: 9717db96d56Sopenharmony_ci check_memoryview(mm, expected_readonly=True) 9727db96d56Sopenharmony_ci m.tobytes() # Releasing mm didn't release m 9737db96d56Sopenharmony_ci 9747db96d56Sopenharmony_ci def verify_getbuf(self, orig_ex, ex, req, sliced=False): 9757db96d56Sopenharmony_ci def match(req, flag): 9767db96d56Sopenharmony_ci return ((req&flag) == flag) 9777db96d56Sopenharmony_ci 9787db96d56Sopenharmony_ci if (# writable request to read-only exporter 9797db96d56Sopenharmony_ci (ex.readonly and match(req, PyBUF_WRITABLE)) or 9807db96d56Sopenharmony_ci # cannot match explicit contiguity request 9817db96d56Sopenharmony_ci (match(req, PyBUF_C_CONTIGUOUS) and not ex.c_contiguous) or 9827db96d56Sopenharmony_ci (match(req, PyBUF_F_CONTIGUOUS) and not ex.f_contiguous) or 9837db96d56Sopenharmony_ci (match(req, PyBUF_ANY_CONTIGUOUS) and not ex.contiguous) or 9847db96d56Sopenharmony_ci # buffer needs suboffsets 9857db96d56Sopenharmony_ci (not match(req, PyBUF_INDIRECT) and ex.suboffsets) or 9867db96d56Sopenharmony_ci # buffer without strides must be C-contiguous 9877db96d56Sopenharmony_ci (not match(req, PyBUF_STRIDES) and not ex.c_contiguous) or 9887db96d56Sopenharmony_ci # PyBUF_SIMPLE|PyBUF_FORMAT and PyBUF_WRITABLE|PyBUF_FORMAT 9897db96d56Sopenharmony_ci (not match(req, PyBUF_ND) and match(req, PyBUF_FORMAT))): 9907db96d56Sopenharmony_ci 9917db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex, getbuf=req) 9927db96d56Sopenharmony_ci return 9937db96d56Sopenharmony_ci 9947db96d56Sopenharmony_ci if isinstance(ex, ndarray) or is_memoryview_format(ex.format): 9957db96d56Sopenharmony_ci lst = ex.tolist() 9967db96d56Sopenharmony_ci else: 9977db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_FULL_RO) 9987db96d56Sopenharmony_ci lst = nd.tolist() 9997db96d56Sopenharmony_ci 10007db96d56Sopenharmony_ci # The consumer may have requested default values or a NULL format. 10017db96d56Sopenharmony_ci ro = False if match(req, PyBUF_WRITABLE) else ex.readonly 10027db96d56Sopenharmony_ci fmt = ex.format 10037db96d56Sopenharmony_ci itemsize = ex.itemsize 10047db96d56Sopenharmony_ci ndim = ex.ndim 10057db96d56Sopenharmony_ci if not match(req, PyBUF_FORMAT): 10067db96d56Sopenharmony_ci # itemsize refers to the original itemsize before the cast. 10077db96d56Sopenharmony_ci # The equality product(shape) * itemsize = len still holds. 10087db96d56Sopenharmony_ci # The equality calcsize(format) = itemsize does _not_ hold. 10097db96d56Sopenharmony_ci fmt = '' 10107db96d56Sopenharmony_ci lst = orig_ex.tobytes() # Issue 12834 10117db96d56Sopenharmony_ci if not match(req, PyBUF_ND): 10127db96d56Sopenharmony_ci ndim = 1 10137db96d56Sopenharmony_ci shape = orig_ex.shape if match(req, PyBUF_ND) else () 10147db96d56Sopenharmony_ci strides = orig_ex.strides if match(req, PyBUF_STRIDES) else () 10157db96d56Sopenharmony_ci 10167db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=req) 10177db96d56Sopenharmony_ci self.verify(nd, obj=ex, 10187db96d56Sopenharmony_ci itemsize=itemsize, fmt=fmt, readonly=ro, 10197db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 10207db96d56Sopenharmony_ci lst=lst, sliced=sliced) 10217db96d56Sopenharmony_ci 10227db96d56Sopenharmony_ci def test_ndarray_getbuf(self): 10237db96d56Sopenharmony_ci requests = ( 10247db96d56Sopenharmony_ci # distinct flags 10257db96d56Sopenharmony_ci PyBUF_INDIRECT, PyBUF_STRIDES, PyBUF_ND, PyBUF_SIMPLE, 10267db96d56Sopenharmony_ci PyBUF_C_CONTIGUOUS, PyBUF_F_CONTIGUOUS, PyBUF_ANY_CONTIGUOUS, 10277db96d56Sopenharmony_ci # compound requests 10287db96d56Sopenharmony_ci PyBUF_FULL, PyBUF_FULL_RO, 10297db96d56Sopenharmony_ci PyBUF_RECORDS, PyBUF_RECORDS_RO, 10307db96d56Sopenharmony_ci PyBUF_STRIDED, PyBUF_STRIDED_RO, 10317db96d56Sopenharmony_ci PyBUF_CONTIG, PyBUF_CONTIG_RO, 10327db96d56Sopenharmony_ci ) 10337db96d56Sopenharmony_ci # items and format 10347db96d56Sopenharmony_ci items_fmt = ( 10357db96d56Sopenharmony_ci ([True if x % 2 else False for x in range(12)], '?'), 10367db96d56Sopenharmony_ci ([1,2,3,4,5,6,7,8,9,10,11,12], 'b'), 10377db96d56Sopenharmony_ci ([1,2,3,4,5,6,7,8,9,10,11,12], 'B'), 10387db96d56Sopenharmony_ci ([(2**31-x) if x % 2 else (-2**31+x) for x in range(12)], 'l') 10397db96d56Sopenharmony_ci ) 10407db96d56Sopenharmony_ci # shape, strides, offset 10417db96d56Sopenharmony_ci structure = ( 10427db96d56Sopenharmony_ci ([], [], 0), 10437db96d56Sopenharmony_ci ([1,3,1], [], 0), 10447db96d56Sopenharmony_ci ([12], [], 0), 10457db96d56Sopenharmony_ci ([12], [-1], 11), 10467db96d56Sopenharmony_ci ([6], [2], 0), 10477db96d56Sopenharmony_ci ([6], [-2], 11), 10487db96d56Sopenharmony_ci ([3, 4], [], 0), 10497db96d56Sopenharmony_ci ([3, 4], [-4, -1], 11), 10507db96d56Sopenharmony_ci ([2, 2], [4, 1], 4), 10517db96d56Sopenharmony_ci ([2, 2], [-4, -1], 8) 10527db96d56Sopenharmony_ci ) 10537db96d56Sopenharmony_ci # ndarray creation flags 10547db96d56Sopenharmony_ci ndflags = ( 10557db96d56Sopenharmony_ci 0, ND_WRITABLE, ND_FORTRAN, ND_FORTRAN|ND_WRITABLE, 10567db96d56Sopenharmony_ci ND_PIL, ND_PIL|ND_WRITABLE 10577db96d56Sopenharmony_ci ) 10587db96d56Sopenharmony_ci # flags that can actually be used as flags 10597db96d56Sopenharmony_ci real_flags = (0, PyBUF_WRITABLE, PyBUF_FORMAT, 10607db96d56Sopenharmony_ci PyBUF_WRITABLE|PyBUF_FORMAT) 10617db96d56Sopenharmony_ci 10627db96d56Sopenharmony_ci for items, fmt in items_fmt: 10637db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 10647db96d56Sopenharmony_ci for shape, strides, offset in structure: 10657db96d56Sopenharmony_ci strides = [v * itemsize for v in strides] 10667db96d56Sopenharmony_ci offset *= itemsize 10677db96d56Sopenharmony_ci for flags in ndflags: 10687db96d56Sopenharmony_ci 10697db96d56Sopenharmony_ci if strides and (flags&ND_FORTRAN): 10707db96d56Sopenharmony_ci continue 10717db96d56Sopenharmony_ci if not shape and (flags&ND_PIL): 10727db96d56Sopenharmony_ci continue 10737db96d56Sopenharmony_ci 10747db96d56Sopenharmony_ci _items = items if shape else items[0] 10757db96d56Sopenharmony_ci ex1 = ndarray(_items, format=fmt, flags=flags, 10767db96d56Sopenharmony_ci shape=shape, strides=strides, offset=offset) 10777db96d56Sopenharmony_ci ex2 = ex1[::-2] if shape else None 10787db96d56Sopenharmony_ci 10797db96d56Sopenharmony_ci m1 = memoryview(ex1) 10807db96d56Sopenharmony_ci if ex2: 10817db96d56Sopenharmony_ci m2 = memoryview(ex2) 10827db96d56Sopenharmony_ci if ex1.ndim == 0 or (ex1.ndim == 1 and shape and strides): 10837db96d56Sopenharmony_ci self.assertEqual(m1, ex1) 10847db96d56Sopenharmony_ci if ex2 and ex2.ndim == 1 and shape and strides: 10857db96d56Sopenharmony_ci self.assertEqual(m2, ex2) 10867db96d56Sopenharmony_ci 10877db96d56Sopenharmony_ci for req in requests: 10887db96d56Sopenharmony_ci for bits in real_flags: 10897db96d56Sopenharmony_ci self.verify_getbuf(ex1, ex1, req|bits) 10907db96d56Sopenharmony_ci self.verify_getbuf(ex1, m1, req|bits) 10917db96d56Sopenharmony_ci if ex2: 10927db96d56Sopenharmony_ci self.verify_getbuf(ex2, ex2, req|bits, 10937db96d56Sopenharmony_ci sliced=True) 10947db96d56Sopenharmony_ci self.verify_getbuf(ex2, m2, req|bits, 10957db96d56Sopenharmony_ci sliced=True) 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci items = [1,2,3,4,5,6,7,8,9,10,11,12] 10987db96d56Sopenharmony_ci 10997db96d56Sopenharmony_ci # ND_GETBUF_FAIL 11007db96d56Sopenharmony_ci ex = ndarray(items, shape=[12], flags=ND_GETBUF_FAIL) 11017db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex) 11027db96d56Sopenharmony_ci 11037db96d56Sopenharmony_ci # Request complex structure from a simple exporter. In this 11047db96d56Sopenharmony_ci # particular case the test object is not PEP-3118 compliant. 11057db96d56Sopenharmony_ci base = ndarray([9], [1]) 11067db96d56Sopenharmony_ci ex = ndarray(base, getbuf=PyBUF_SIMPLE) 11077db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_WRITABLE) 11087db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_ND) 11097db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_STRIDES) 11107db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_C_CONTIGUOUS) 11117db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_F_CONTIGUOUS) 11127db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_ANY_CONTIGUOUS) 11137db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_SIMPLE) 11147db96d56Sopenharmony_ci 11157db96d56Sopenharmony_ci # Issue #22445: New precise contiguity definition. 11167db96d56Sopenharmony_ci for shape in [1,12,1], [7,0,7]: 11177db96d56Sopenharmony_ci for order in 0, ND_FORTRAN: 11187db96d56Sopenharmony_ci ex = ndarray(items, shape=shape, flags=order|ND_WRITABLE) 11197db96d56Sopenharmony_ci self.assertTrue(is_contiguous(ex, 'F')) 11207db96d56Sopenharmony_ci self.assertTrue(is_contiguous(ex, 'C')) 11217db96d56Sopenharmony_ci 11227db96d56Sopenharmony_ci for flags in requests: 11237db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=flags) 11247db96d56Sopenharmony_ci self.assertTrue(is_contiguous(nd, 'F')) 11257db96d56Sopenharmony_ci self.assertTrue(is_contiguous(nd, 'C')) 11267db96d56Sopenharmony_ci 11277db96d56Sopenharmony_ci def test_ndarray_exceptions(self): 11287db96d56Sopenharmony_ci nd = ndarray([9], [1]) 11297db96d56Sopenharmony_ci ndm = ndarray([9], [1], flags=ND_VAREXPORT) 11307db96d56Sopenharmony_ci 11317db96d56Sopenharmony_ci # Initialization of a new ndarray or mutation of an existing array. 11327db96d56Sopenharmony_ci for c in (ndarray, nd.push, ndm.push): 11337db96d56Sopenharmony_ci # Invalid types. 11347db96d56Sopenharmony_ci self.assertRaises(TypeError, c, {1,2,3}) 11357db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1,2,'3']) 11367db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1,2,(3,4)]) 11377db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1,2,3], shape={3}) 11387db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1,2,3], shape=[3], strides={1}) 11397db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1,2,3], shape=[3], offset=[]) 11407db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1], shape=[1], format={}) 11417db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1], shape=[1], flags={}) 11427db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1], shape=[1], getbuf={}) 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci # ND_FORTRAN flag is only valid without strides. 11457db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1], shape=[1], strides=[1], 11467db96d56Sopenharmony_ci flags=ND_FORTRAN) 11477db96d56Sopenharmony_ci 11487db96d56Sopenharmony_ci # ND_PIL flag is only valid with ndim > 0. 11497db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1], shape=[], flags=ND_PIL) 11507db96d56Sopenharmony_ci 11517db96d56Sopenharmony_ci # Invalid items. 11527db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [], shape=[1]) 11537db96d56Sopenharmony_ci self.assertRaises(ValueError, c, ['XXX'], shape=[1], format="L") 11547db96d56Sopenharmony_ci # Invalid combination of items and format. 11557db96d56Sopenharmony_ci self.assertRaises(struct.error, c, [1000], shape=[1], format="B") 11567db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,(2,3)], shape=[2], format="B") 11577db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3], shape=[3], format="QL") 11587db96d56Sopenharmony_ci 11597db96d56Sopenharmony_ci # Invalid ndim. 11607db96d56Sopenharmony_ci n = ND_MAX_NDIM+1 11617db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1]*n, shape=[1]*n) 11627db96d56Sopenharmony_ci 11637db96d56Sopenharmony_ci # Invalid shape. 11647db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1], shape=[-1]) 11657db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3], shape=['3']) 11667db96d56Sopenharmony_ci self.assertRaises(OverflowError, c, [1], shape=[2**128]) 11677db96d56Sopenharmony_ci # prod(shape) * itemsize != len(items) 11687db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3,4,5], shape=[2,2], offset=3) 11697db96d56Sopenharmony_ci 11707db96d56Sopenharmony_ci # Invalid strides. 11717db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3], shape=[3], strides=['1']) 11727db96d56Sopenharmony_ci self.assertRaises(OverflowError, c, [1], shape=[1], 11737db96d56Sopenharmony_ci strides=[2**128]) 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ci # Invalid combination of strides and shape. 11767db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2], shape=[2,1], strides=[1]) 11777db96d56Sopenharmony_ci # Invalid combination of strides and format. 11787db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3,4], shape=[2], strides=[3], 11797db96d56Sopenharmony_ci format="L") 11807db96d56Sopenharmony_ci 11817db96d56Sopenharmony_ci # Invalid offset. 11827db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3], shape=[3], offset=4) 11837db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3], shape=[1], offset=3, 11847db96d56Sopenharmony_ci format="L") 11857db96d56Sopenharmony_ci 11867db96d56Sopenharmony_ci # Invalid format. 11877db96d56Sopenharmony_ci self.assertRaises(ValueError, c, [1,2,3], shape=[3], format="") 11887db96d56Sopenharmony_ci self.assertRaises(struct.error, c, [(1,2,3)], shape=[1], 11897db96d56Sopenharmony_ci format="@#$") 11907db96d56Sopenharmony_ci 11917db96d56Sopenharmony_ci # Striding out of the memory bounds. 11927db96d56Sopenharmony_ci items = [1,2,3,4,5,6,7,8,9,10] 11937db96d56Sopenharmony_ci self.assertRaises(ValueError, c, items, shape=[2,3], 11947db96d56Sopenharmony_ci strides=[-3, -2], offset=5) 11957db96d56Sopenharmony_ci 11967db96d56Sopenharmony_ci # Constructing consumer: format argument invalid. 11977db96d56Sopenharmony_ci self.assertRaises(TypeError, c, bytearray(), format="Q") 11987db96d56Sopenharmony_ci 11997db96d56Sopenharmony_ci # Constructing original base object: getbuf argument invalid. 12007db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1], shape=[1], getbuf=PyBUF_FULL) 12017db96d56Sopenharmony_ci 12027db96d56Sopenharmony_ci # Shape argument is mandatory for original base objects. 12037db96d56Sopenharmony_ci self.assertRaises(TypeError, c, [1]) 12047db96d56Sopenharmony_ci 12057db96d56Sopenharmony_ci 12067db96d56Sopenharmony_ci # PyBUF_WRITABLE request to read-only provider. 12077db96d56Sopenharmony_ci self.assertRaises(BufferError, ndarray, b'123', getbuf=PyBUF_WRITABLE) 12087db96d56Sopenharmony_ci 12097db96d56Sopenharmony_ci # ND_VAREXPORT can only be specified during construction. 12107db96d56Sopenharmony_ci nd = ndarray([9], [1], flags=ND_VAREXPORT) 12117db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.push, [1], [1], flags=ND_VAREXPORT) 12127db96d56Sopenharmony_ci 12137db96d56Sopenharmony_ci # Invalid operation for consumers: push/pop 12147db96d56Sopenharmony_ci nd = ndarray(b'123') 12157db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.push, [1], [1]) 12167db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.pop) 12177db96d56Sopenharmony_ci 12187db96d56Sopenharmony_ci # ND_VAREXPORT not set: push/pop fail with exported buffers 12197db96d56Sopenharmony_ci nd = ndarray([9], [1]) 12207db96d56Sopenharmony_ci nd.push([1], [1]) 12217db96d56Sopenharmony_ci m = memoryview(nd) 12227db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.push, [1], [1]) 12237db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.pop) 12247db96d56Sopenharmony_ci m.release() 12257db96d56Sopenharmony_ci nd.pop() 12267db96d56Sopenharmony_ci 12277db96d56Sopenharmony_ci # Single remaining buffer: pop fails 12287db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.pop) 12297db96d56Sopenharmony_ci del nd 12307db96d56Sopenharmony_ci 12317db96d56Sopenharmony_ci # get_pointer() 12327db96d56Sopenharmony_ci self.assertRaises(TypeError, get_pointer, {}, [1,2,3]) 12337db96d56Sopenharmony_ci self.assertRaises(TypeError, get_pointer, b'123', {}) 12347db96d56Sopenharmony_ci 12357db96d56Sopenharmony_ci nd = ndarray(list(range(100)), shape=[1]*100) 12367db96d56Sopenharmony_ci self.assertRaises(ValueError, get_pointer, nd, [5]) 12377db96d56Sopenharmony_ci 12387db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3,4]) 12397db96d56Sopenharmony_ci self.assertRaises(ValueError, get_pointer, nd, [2,3,4]) 12407db96d56Sopenharmony_ci self.assertRaises(ValueError, get_pointer, nd, [3,3]) 12417db96d56Sopenharmony_ci self.assertRaises(ValueError, get_pointer, nd, [-3,3]) 12427db96d56Sopenharmony_ci self.assertRaises(OverflowError, get_pointer, nd, [1<<64,3]) 12437db96d56Sopenharmony_ci 12447db96d56Sopenharmony_ci # tolist() needs format 12457db96d56Sopenharmony_ci ex = ndarray([1,2,3], shape=[3], format='L') 12467db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_SIMPLE) 12477db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.tolist) 12487db96d56Sopenharmony_ci 12497db96d56Sopenharmony_ci # memoryview_from_buffer() 12507db96d56Sopenharmony_ci ex1 = ndarray([1,2,3], shape=[3], format='L') 12517db96d56Sopenharmony_ci ex2 = ndarray(ex1) 12527db96d56Sopenharmony_ci nd = ndarray(ex2) 12537db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.memoryview_from_buffer) 12547db96d56Sopenharmony_ci 12557db96d56Sopenharmony_ci nd = ndarray([(1,)*200], shape=[1], format='L'*200) 12567db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.memoryview_from_buffer) 12577db96d56Sopenharmony_ci 12587db96d56Sopenharmony_ci n = ND_MAX_NDIM 12597db96d56Sopenharmony_ci nd = ndarray(list(range(n)), shape=[1]*n) 12607db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.memoryview_from_buffer) 12617db96d56Sopenharmony_ci 12627db96d56Sopenharmony_ci # get_contiguous() 12637db96d56Sopenharmony_ci nd = ndarray([1], shape=[1]) 12647db96d56Sopenharmony_ci self.assertRaises(TypeError, get_contiguous, 1, 2, 3, 4, 5) 12657db96d56Sopenharmony_ci self.assertRaises(TypeError, get_contiguous, nd, "xyz", 'C') 12667db96d56Sopenharmony_ci self.assertRaises(OverflowError, get_contiguous, nd, 2**64, 'C') 12677db96d56Sopenharmony_ci self.assertRaises(TypeError, get_contiguous, nd, PyBUF_READ, 961) 12687db96d56Sopenharmony_ci self.assertRaises(UnicodeEncodeError, get_contiguous, nd, PyBUF_READ, 12697db96d56Sopenharmony_ci '\u2007') 12707db96d56Sopenharmony_ci self.assertRaises(ValueError, get_contiguous, nd, PyBUF_READ, 'Z') 12717db96d56Sopenharmony_ci self.assertRaises(ValueError, get_contiguous, nd, 255, 'A') 12727db96d56Sopenharmony_ci 12737db96d56Sopenharmony_ci # cmp_contig() 12747db96d56Sopenharmony_ci nd = ndarray([1], shape=[1]) 12757db96d56Sopenharmony_ci self.assertRaises(TypeError, cmp_contig, 1, 2, 3, 4, 5) 12767db96d56Sopenharmony_ci self.assertRaises(TypeError, cmp_contig, {}, nd) 12777db96d56Sopenharmony_ci self.assertRaises(TypeError, cmp_contig, nd, {}) 12787db96d56Sopenharmony_ci 12797db96d56Sopenharmony_ci # is_contiguous() 12807db96d56Sopenharmony_ci nd = ndarray([1], shape=[1]) 12817db96d56Sopenharmony_ci self.assertRaises(TypeError, is_contiguous, 1, 2, 3, 4, 5) 12827db96d56Sopenharmony_ci self.assertRaises(TypeError, is_contiguous, {}, 'A') 12837db96d56Sopenharmony_ci self.assertRaises(TypeError, is_contiguous, nd, 201) 12847db96d56Sopenharmony_ci 12857db96d56Sopenharmony_ci def test_ndarray_linked_list(self): 12867db96d56Sopenharmony_ci for perm in permutations(range(5)): 12877db96d56Sopenharmony_ci m = [0]*5 12887db96d56Sopenharmony_ci nd = ndarray([1,2,3], shape=[3], flags=ND_VAREXPORT) 12897db96d56Sopenharmony_ci m[0] = memoryview(nd) 12907db96d56Sopenharmony_ci 12917db96d56Sopenharmony_ci for i in range(1, 5): 12927db96d56Sopenharmony_ci nd.push([1,2,3], shape=[3]) 12937db96d56Sopenharmony_ci m[i] = memoryview(nd) 12947db96d56Sopenharmony_ci 12957db96d56Sopenharmony_ci for i in range(5): 12967db96d56Sopenharmony_ci m[perm[i]].release() 12977db96d56Sopenharmony_ci 12987db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.pop) 12997db96d56Sopenharmony_ci del nd 13007db96d56Sopenharmony_ci 13017db96d56Sopenharmony_ci def test_ndarray_format_scalar(self): 13027db96d56Sopenharmony_ci # ndim = 0: scalar 13037db96d56Sopenharmony_ci for fmt, scalar, _ in iter_format(0): 13047db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 13057db96d56Sopenharmony_ci nd = ndarray(scalar, shape=(), format=fmt) 13067db96d56Sopenharmony_ci self.verify(nd, obj=None, 13077db96d56Sopenharmony_ci itemsize=itemsize, fmt=fmt, readonly=True, 13087db96d56Sopenharmony_ci ndim=0, shape=(), strides=(), 13097db96d56Sopenharmony_ci lst=scalar) 13107db96d56Sopenharmony_ci 13117db96d56Sopenharmony_ci def test_ndarray_format_shape(self): 13127db96d56Sopenharmony_ci # ndim = 1, shape = [n] 13137db96d56Sopenharmony_ci nitems = randrange(1, 10) 13147db96d56Sopenharmony_ci for fmt, items, _ in iter_format(nitems): 13157db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 13167db96d56Sopenharmony_ci for flags in (0, ND_PIL): 13177db96d56Sopenharmony_ci nd = ndarray(items, shape=[nitems], format=fmt, flags=flags) 13187db96d56Sopenharmony_ci self.verify(nd, obj=None, 13197db96d56Sopenharmony_ci itemsize=itemsize, fmt=fmt, readonly=True, 13207db96d56Sopenharmony_ci ndim=1, shape=(nitems,), strides=(itemsize,), 13217db96d56Sopenharmony_ci lst=items) 13227db96d56Sopenharmony_ci 13237db96d56Sopenharmony_ci def test_ndarray_format_strides(self): 13247db96d56Sopenharmony_ci # ndim = 1, strides 13257db96d56Sopenharmony_ci nitems = randrange(1, 30) 13267db96d56Sopenharmony_ci for fmt, items, _ in iter_format(nitems): 13277db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 13287db96d56Sopenharmony_ci for step in range(-5, 5): 13297db96d56Sopenharmony_ci if step == 0: 13307db96d56Sopenharmony_ci continue 13317db96d56Sopenharmony_ci 13327db96d56Sopenharmony_ci shape = [len(items[::step])] 13337db96d56Sopenharmony_ci strides = [step*itemsize] 13347db96d56Sopenharmony_ci offset = itemsize*(nitems-1) if step < 0 else 0 13357db96d56Sopenharmony_ci 13367db96d56Sopenharmony_ci for flags in (0, ND_PIL): 13377db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, strides=strides, 13387db96d56Sopenharmony_ci format=fmt, offset=offset, flags=flags) 13397db96d56Sopenharmony_ci self.verify(nd, obj=None, 13407db96d56Sopenharmony_ci itemsize=itemsize, fmt=fmt, readonly=True, 13417db96d56Sopenharmony_ci ndim=1, shape=shape, strides=strides, 13427db96d56Sopenharmony_ci lst=items[::step]) 13437db96d56Sopenharmony_ci 13447db96d56Sopenharmony_ci def test_ndarray_fortran(self): 13457db96d56Sopenharmony_ci items = [1,2,3,4,5,6,7,8,9,10,11,12] 13467db96d56Sopenharmony_ci ex = ndarray(items, shape=(3, 4), strides=(1, 3)) 13477db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_F_CONTIGUOUS|PyBUF_FORMAT) 13487db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), farray(items, (3, 4))) 13497db96d56Sopenharmony_ci 13507db96d56Sopenharmony_ci def test_ndarray_multidim(self): 13517db96d56Sopenharmony_ci for ndim in range(5): 13527db96d56Sopenharmony_ci shape_t = [randrange(2, 10) for _ in range(ndim)] 13537db96d56Sopenharmony_ci nitems = prod(shape_t) 13547db96d56Sopenharmony_ci for shape in permutations(shape_t): 13557db96d56Sopenharmony_ci 13567db96d56Sopenharmony_ci fmt, items, _ = randitems(nitems) 13577db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 13587db96d56Sopenharmony_ci 13597db96d56Sopenharmony_ci for flags in (0, ND_PIL): 13607db96d56Sopenharmony_ci if ndim == 0 and flags == ND_PIL: 13617db96d56Sopenharmony_ci continue 13627db96d56Sopenharmony_ci 13637db96d56Sopenharmony_ci # C array 13647db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, format=fmt, flags=flags) 13657db96d56Sopenharmony_ci 13667db96d56Sopenharmony_ci strides = strides_from_shape(ndim, shape, itemsize, 'C') 13677db96d56Sopenharmony_ci lst = carray(items, shape) 13687db96d56Sopenharmony_ci self.verify(nd, obj=None, 13697db96d56Sopenharmony_ci itemsize=itemsize, fmt=fmt, readonly=True, 13707db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 13717db96d56Sopenharmony_ci lst=lst) 13727db96d56Sopenharmony_ci 13737db96d56Sopenharmony_ci if is_memoryview_format(fmt): 13747db96d56Sopenharmony_ci # memoryview: reconstruct strides 13757db96d56Sopenharmony_ci ex = ndarray(items, shape=shape, format=fmt) 13767db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO|PyBUF_FORMAT) 13777db96d56Sopenharmony_ci self.assertTrue(nd.strides == ()) 13787db96d56Sopenharmony_ci mv = nd.memoryview_from_buffer() 13797db96d56Sopenharmony_ci self.verify(mv, obj=None, 13807db96d56Sopenharmony_ci itemsize=itemsize, fmt=fmt, readonly=True, 13817db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 13827db96d56Sopenharmony_ci lst=lst) 13837db96d56Sopenharmony_ci 13847db96d56Sopenharmony_ci # Fortran array 13857db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, format=fmt, 13867db96d56Sopenharmony_ci flags=flags|ND_FORTRAN) 13877db96d56Sopenharmony_ci 13887db96d56Sopenharmony_ci strides = strides_from_shape(ndim, shape, itemsize, 'F') 13897db96d56Sopenharmony_ci lst = farray(items, shape) 13907db96d56Sopenharmony_ci self.verify(nd, obj=None, 13917db96d56Sopenharmony_ci itemsize=itemsize, fmt=fmt, readonly=True, 13927db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 13937db96d56Sopenharmony_ci lst=lst) 13947db96d56Sopenharmony_ci 13957db96d56Sopenharmony_ci def test_ndarray_index_invalid(self): 13967db96d56Sopenharmony_ci # not writable 13977db96d56Sopenharmony_ci nd = ndarray([1], shape=[1]) 13987db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.__setitem__, 1, 8) 13997db96d56Sopenharmony_ci mv = memoryview(nd) 14007db96d56Sopenharmony_ci self.assertEqual(mv, nd) 14017db96d56Sopenharmony_ci self.assertRaises(TypeError, mv.__setitem__, 1, 8) 14027db96d56Sopenharmony_ci 14037db96d56Sopenharmony_ci # cannot be deleted 14047db96d56Sopenharmony_ci nd = ndarray([1], shape=[1], flags=ND_WRITABLE) 14057db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.__delitem__, 1) 14067db96d56Sopenharmony_ci mv = memoryview(nd) 14077db96d56Sopenharmony_ci self.assertEqual(mv, nd) 14087db96d56Sopenharmony_ci self.assertRaises(TypeError, mv.__delitem__, 1) 14097db96d56Sopenharmony_ci 14107db96d56Sopenharmony_ci # overflow 14117db96d56Sopenharmony_ci nd = ndarray([1], shape=[1], flags=ND_WRITABLE) 14127db96d56Sopenharmony_ci self.assertRaises(OverflowError, nd.__getitem__, 1<<64) 14137db96d56Sopenharmony_ci self.assertRaises(OverflowError, nd.__setitem__, 1<<64, 8) 14147db96d56Sopenharmony_ci mv = memoryview(nd) 14157db96d56Sopenharmony_ci self.assertEqual(mv, nd) 14167db96d56Sopenharmony_ci self.assertRaises(IndexError, mv.__getitem__, 1<<64) 14177db96d56Sopenharmony_ci self.assertRaises(IndexError, mv.__setitem__, 1<<64, 8) 14187db96d56Sopenharmony_ci 14197db96d56Sopenharmony_ci # format 14207db96d56Sopenharmony_ci items = [1,2,3,4,5,6,7,8] 14217db96d56Sopenharmony_ci nd = ndarray(items, shape=[len(items)], format="B", flags=ND_WRITABLE) 14227db96d56Sopenharmony_ci self.assertRaises(struct.error, nd.__setitem__, 2, 300) 14237db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.__setitem__, 1, (100, 200)) 14247db96d56Sopenharmony_ci mv = memoryview(nd) 14257db96d56Sopenharmony_ci self.assertEqual(mv, nd) 14267db96d56Sopenharmony_ci self.assertRaises(ValueError, mv.__setitem__, 2, 300) 14277db96d56Sopenharmony_ci self.assertRaises(TypeError, mv.__setitem__, 1, (100, 200)) 14287db96d56Sopenharmony_ci 14297db96d56Sopenharmony_ci items = [(1,2), (3,4), (5,6)] 14307db96d56Sopenharmony_ci nd = ndarray(items, shape=[len(items)], format="LQ", flags=ND_WRITABLE) 14317db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.__setitem__, 2, 300) 14327db96d56Sopenharmony_ci self.assertRaises(struct.error, nd.__setitem__, 1, (b'\x001', 200)) 14337db96d56Sopenharmony_ci 14347db96d56Sopenharmony_ci def test_ndarray_index_scalar(self): 14357db96d56Sopenharmony_ci # scalar 14367db96d56Sopenharmony_ci nd = ndarray(1, shape=(), flags=ND_WRITABLE) 14377db96d56Sopenharmony_ci mv = memoryview(nd) 14387db96d56Sopenharmony_ci self.assertEqual(mv, nd) 14397db96d56Sopenharmony_ci 14407db96d56Sopenharmony_ci x = nd[()]; self.assertEqual(x, 1) 14417db96d56Sopenharmony_ci x = nd[...]; self.assertEqual(x.tolist(), nd.tolist()) 14427db96d56Sopenharmony_ci 14437db96d56Sopenharmony_ci x = mv[()]; self.assertEqual(x, 1) 14447db96d56Sopenharmony_ci x = mv[...]; self.assertEqual(x.tolist(), nd.tolist()) 14457db96d56Sopenharmony_ci 14467db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.__getitem__, 0) 14477db96d56Sopenharmony_ci self.assertRaises(TypeError, mv.__getitem__, 0) 14487db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.__setitem__, 0, 8) 14497db96d56Sopenharmony_ci self.assertRaises(TypeError, mv.__setitem__, 0, 8) 14507db96d56Sopenharmony_ci 14517db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), 1) 14527db96d56Sopenharmony_ci self.assertEqual(mv.tolist(), 1) 14537db96d56Sopenharmony_ci 14547db96d56Sopenharmony_ci nd[()] = 9; self.assertEqual(nd.tolist(), 9) 14557db96d56Sopenharmony_ci mv[()] = 9; self.assertEqual(mv.tolist(), 9) 14567db96d56Sopenharmony_ci 14577db96d56Sopenharmony_ci nd[...] = 5; self.assertEqual(nd.tolist(), 5) 14587db96d56Sopenharmony_ci mv[...] = 5; self.assertEqual(mv.tolist(), 5) 14597db96d56Sopenharmony_ci 14607db96d56Sopenharmony_ci def test_ndarray_index_null_strides(self): 14617db96d56Sopenharmony_ci ex = ndarray(list(range(2*4)), shape=[2, 4], flags=ND_WRITABLE) 14627db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_CONTIG) 14637db96d56Sopenharmony_ci 14647db96d56Sopenharmony_ci # Sub-views are only possible for full exporters. 14657db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.__getitem__, 1) 14667db96d56Sopenharmony_ci # Same for slices. 14677db96d56Sopenharmony_ci self.assertRaises(BufferError, nd.__getitem__, slice(3,5,1)) 14687db96d56Sopenharmony_ci 14697db96d56Sopenharmony_ci def test_ndarray_index_getitem_single(self): 14707db96d56Sopenharmony_ci # getitem 14717db96d56Sopenharmony_ci for fmt, items, _ in iter_format(5): 14727db96d56Sopenharmony_ci nd = ndarray(items, shape=[5], format=fmt) 14737db96d56Sopenharmony_ci for i in range(-5, 5): 14747db96d56Sopenharmony_ci self.assertEqual(nd[i], items[i]) 14757db96d56Sopenharmony_ci 14767db96d56Sopenharmony_ci self.assertRaises(IndexError, nd.__getitem__, -6) 14777db96d56Sopenharmony_ci self.assertRaises(IndexError, nd.__getitem__, 5) 14787db96d56Sopenharmony_ci 14797db96d56Sopenharmony_ci if is_memoryview_format(fmt): 14807db96d56Sopenharmony_ci mv = memoryview(nd) 14817db96d56Sopenharmony_ci self.assertEqual(mv, nd) 14827db96d56Sopenharmony_ci for i in range(-5, 5): 14837db96d56Sopenharmony_ci self.assertEqual(mv[i], items[i]) 14847db96d56Sopenharmony_ci 14857db96d56Sopenharmony_ci self.assertRaises(IndexError, mv.__getitem__, -6) 14867db96d56Sopenharmony_ci self.assertRaises(IndexError, mv.__getitem__, 5) 14877db96d56Sopenharmony_ci 14887db96d56Sopenharmony_ci # getitem with null strides 14897db96d56Sopenharmony_ci for fmt, items, _ in iter_format(5): 14907db96d56Sopenharmony_ci ex = ndarray(items, shape=[5], flags=ND_WRITABLE, format=fmt) 14917db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_CONTIG|PyBUF_FORMAT) 14927db96d56Sopenharmony_ci 14937db96d56Sopenharmony_ci for i in range(-5, 5): 14947db96d56Sopenharmony_ci self.assertEqual(nd[i], items[i]) 14957db96d56Sopenharmony_ci 14967db96d56Sopenharmony_ci if is_memoryview_format(fmt): 14977db96d56Sopenharmony_ci mv = nd.memoryview_from_buffer() 14987db96d56Sopenharmony_ci self.assertIs(mv.__eq__(nd), NotImplemented) 14997db96d56Sopenharmony_ci for i in range(-5, 5): 15007db96d56Sopenharmony_ci self.assertEqual(mv[i], items[i]) 15017db96d56Sopenharmony_ci 15027db96d56Sopenharmony_ci # getitem with null format 15037db96d56Sopenharmony_ci items = [1,2,3,4,5] 15047db96d56Sopenharmony_ci ex = ndarray(items, shape=[5]) 15057db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO) 15067db96d56Sopenharmony_ci for i in range(-5, 5): 15077db96d56Sopenharmony_ci self.assertEqual(nd[i], items[i]) 15087db96d56Sopenharmony_ci 15097db96d56Sopenharmony_ci # getitem with null shape/strides/format 15107db96d56Sopenharmony_ci items = [1,2,3,4,5] 15117db96d56Sopenharmony_ci ex = ndarray(items, shape=[5]) 15127db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_SIMPLE) 15137db96d56Sopenharmony_ci 15147db96d56Sopenharmony_ci for i in range(-5, 5): 15157db96d56Sopenharmony_ci self.assertEqual(nd[i], items[i]) 15167db96d56Sopenharmony_ci 15177db96d56Sopenharmony_ci def test_ndarray_index_setitem_single(self): 15187db96d56Sopenharmony_ci # assign single value 15197db96d56Sopenharmony_ci for fmt, items, single_item in iter_format(5): 15207db96d56Sopenharmony_ci nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE) 15217db96d56Sopenharmony_ci for i in range(5): 15227db96d56Sopenharmony_ci items[i] = single_item 15237db96d56Sopenharmony_ci nd[i] = single_item 15247db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), items) 15257db96d56Sopenharmony_ci 15267db96d56Sopenharmony_ci self.assertRaises(IndexError, nd.__setitem__, -6, single_item) 15277db96d56Sopenharmony_ci self.assertRaises(IndexError, nd.__setitem__, 5, single_item) 15287db96d56Sopenharmony_ci 15297db96d56Sopenharmony_ci if not is_memoryview_format(fmt): 15307db96d56Sopenharmony_ci continue 15317db96d56Sopenharmony_ci 15327db96d56Sopenharmony_ci nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE) 15337db96d56Sopenharmony_ci mv = memoryview(nd) 15347db96d56Sopenharmony_ci self.assertEqual(mv, nd) 15357db96d56Sopenharmony_ci for i in range(5): 15367db96d56Sopenharmony_ci items[i] = single_item 15377db96d56Sopenharmony_ci mv[i] = single_item 15387db96d56Sopenharmony_ci self.assertEqual(mv.tolist(), items) 15397db96d56Sopenharmony_ci 15407db96d56Sopenharmony_ci self.assertRaises(IndexError, mv.__setitem__, -6, single_item) 15417db96d56Sopenharmony_ci self.assertRaises(IndexError, mv.__setitem__, 5, single_item) 15427db96d56Sopenharmony_ci 15437db96d56Sopenharmony_ci 15447db96d56Sopenharmony_ci # assign single value: lobject = robject 15457db96d56Sopenharmony_ci for fmt, items, single_item in iter_format(5): 15467db96d56Sopenharmony_ci nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE) 15477db96d56Sopenharmony_ci for i in range(-5, 4): 15487db96d56Sopenharmony_ci items[i] = items[i+1] 15497db96d56Sopenharmony_ci nd[i] = nd[i+1] 15507db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), items) 15517db96d56Sopenharmony_ci 15527db96d56Sopenharmony_ci if not is_memoryview_format(fmt): 15537db96d56Sopenharmony_ci continue 15547db96d56Sopenharmony_ci 15557db96d56Sopenharmony_ci nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE) 15567db96d56Sopenharmony_ci mv = memoryview(nd) 15577db96d56Sopenharmony_ci self.assertEqual(mv, nd) 15587db96d56Sopenharmony_ci for i in range(-5, 4): 15597db96d56Sopenharmony_ci items[i] = items[i+1] 15607db96d56Sopenharmony_ci mv[i] = mv[i+1] 15617db96d56Sopenharmony_ci self.assertEqual(mv.tolist(), items) 15627db96d56Sopenharmony_ci 15637db96d56Sopenharmony_ci def test_ndarray_index_getitem_multidim(self): 15647db96d56Sopenharmony_ci shape_t = (2, 3, 5) 15657db96d56Sopenharmony_ci nitems = prod(shape_t) 15667db96d56Sopenharmony_ci for shape in permutations(shape_t): 15677db96d56Sopenharmony_ci 15687db96d56Sopenharmony_ci fmt, items, _ = randitems(nitems) 15697db96d56Sopenharmony_ci 15707db96d56Sopenharmony_ci for flags in (0, ND_PIL): 15717db96d56Sopenharmony_ci # C array 15727db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, format=fmt, flags=flags) 15737db96d56Sopenharmony_ci lst = carray(items, shape) 15747db96d56Sopenharmony_ci 15757db96d56Sopenharmony_ci for i in range(-shape[0], shape[0]): 15767db96d56Sopenharmony_ci self.assertEqual(lst[i], nd[i].tolist()) 15777db96d56Sopenharmony_ci for j in range(-shape[1], shape[1]): 15787db96d56Sopenharmony_ci self.assertEqual(lst[i][j], nd[i][j].tolist()) 15797db96d56Sopenharmony_ci for k in range(-shape[2], shape[2]): 15807db96d56Sopenharmony_ci self.assertEqual(lst[i][j][k], nd[i][j][k]) 15817db96d56Sopenharmony_ci 15827db96d56Sopenharmony_ci # Fortran array 15837db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, format=fmt, 15847db96d56Sopenharmony_ci flags=flags|ND_FORTRAN) 15857db96d56Sopenharmony_ci lst = farray(items, shape) 15867db96d56Sopenharmony_ci 15877db96d56Sopenharmony_ci for i in range(-shape[0], shape[0]): 15887db96d56Sopenharmony_ci self.assertEqual(lst[i], nd[i].tolist()) 15897db96d56Sopenharmony_ci for j in range(-shape[1], shape[1]): 15907db96d56Sopenharmony_ci self.assertEqual(lst[i][j], nd[i][j].tolist()) 15917db96d56Sopenharmony_ci for k in range(shape[2], shape[2]): 15927db96d56Sopenharmony_ci self.assertEqual(lst[i][j][k], nd[i][j][k]) 15937db96d56Sopenharmony_ci 15947db96d56Sopenharmony_ci def test_ndarray_sequence(self): 15957db96d56Sopenharmony_ci nd = ndarray(1, shape=()) 15967db96d56Sopenharmony_ci self.assertRaises(TypeError, eval, "1 in nd", locals()) 15977db96d56Sopenharmony_ci mv = memoryview(nd) 15987db96d56Sopenharmony_ci self.assertEqual(mv, nd) 15997db96d56Sopenharmony_ci self.assertRaises(TypeError, eval, "1 in mv", locals()) 16007db96d56Sopenharmony_ci 16017db96d56Sopenharmony_ci for fmt, items, _ in iter_format(5): 16027db96d56Sopenharmony_ci nd = ndarray(items, shape=[5], format=fmt) 16037db96d56Sopenharmony_ci for i, v in enumerate(nd): 16047db96d56Sopenharmony_ci self.assertEqual(v, items[i]) 16057db96d56Sopenharmony_ci self.assertTrue(v in nd) 16067db96d56Sopenharmony_ci 16077db96d56Sopenharmony_ci if is_memoryview_format(fmt): 16087db96d56Sopenharmony_ci mv = memoryview(nd) 16097db96d56Sopenharmony_ci for i, v in enumerate(mv): 16107db96d56Sopenharmony_ci self.assertEqual(v, items[i]) 16117db96d56Sopenharmony_ci self.assertTrue(v in mv) 16127db96d56Sopenharmony_ci 16137db96d56Sopenharmony_ci def test_ndarray_slice_invalid(self): 16147db96d56Sopenharmony_ci items = [1,2,3,4,5,6,7,8] 16157db96d56Sopenharmony_ci 16167db96d56Sopenharmony_ci # rvalue is not an exporter 16177db96d56Sopenharmony_ci xl = ndarray(items, shape=[8], flags=ND_WRITABLE) 16187db96d56Sopenharmony_ci ml = memoryview(xl) 16197db96d56Sopenharmony_ci self.assertRaises(TypeError, xl.__setitem__, slice(0,8,1), items) 16207db96d56Sopenharmony_ci self.assertRaises(TypeError, ml.__setitem__, slice(0,8,1), items) 16217db96d56Sopenharmony_ci 16227db96d56Sopenharmony_ci # rvalue is not a full exporter 16237db96d56Sopenharmony_ci xl = ndarray(items, shape=[8], flags=ND_WRITABLE) 16247db96d56Sopenharmony_ci ex = ndarray(items, shape=[8], flags=ND_WRITABLE) 16257db96d56Sopenharmony_ci xr = ndarray(ex, getbuf=PyBUF_ND) 16267db96d56Sopenharmony_ci self.assertRaises(BufferError, xl.__setitem__, slice(0,8,1), xr) 16277db96d56Sopenharmony_ci 16287db96d56Sopenharmony_ci # zero step 16297db96d56Sopenharmony_ci nd = ndarray(items, shape=[8], format="L", flags=ND_WRITABLE) 16307db96d56Sopenharmony_ci mv = memoryview(nd) 16317db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.__getitem__, slice(0,1,0)) 16327db96d56Sopenharmony_ci self.assertRaises(ValueError, mv.__getitem__, slice(0,1,0)) 16337db96d56Sopenharmony_ci 16347db96d56Sopenharmony_ci nd = ndarray(items, shape=[2,4], format="L", flags=ND_WRITABLE) 16357db96d56Sopenharmony_ci mv = memoryview(nd) 16367db96d56Sopenharmony_ci 16377db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.__getitem__, 16387db96d56Sopenharmony_ci (slice(0,1,1), slice(0,1,0))) 16397db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.__getitem__, 16407db96d56Sopenharmony_ci (slice(0,1,0), slice(0,1,1))) 16417db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.__getitem__, "@%$") 16427db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.__getitem__, ("@%$", slice(0,1,1))) 16437db96d56Sopenharmony_ci self.assertRaises(TypeError, nd.__getitem__, (slice(0,1,1), {})) 16447db96d56Sopenharmony_ci 16457db96d56Sopenharmony_ci # memoryview: not implemented 16467db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, mv.__getitem__, 16477db96d56Sopenharmony_ci (slice(0,1,1), slice(0,1,0))) 16487db96d56Sopenharmony_ci self.assertRaises(TypeError, mv.__getitem__, "@%$") 16497db96d56Sopenharmony_ci 16507db96d56Sopenharmony_ci # differing format 16517db96d56Sopenharmony_ci xl = ndarray(items, shape=[8], format="B", flags=ND_WRITABLE) 16527db96d56Sopenharmony_ci xr = ndarray(items, shape=[8], format="b") 16537db96d56Sopenharmony_ci ml = memoryview(xl) 16547db96d56Sopenharmony_ci mr = memoryview(xr) 16557db96d56Sopenharmony_ci self.assertRaises(ValueError, xl.__setitem__, slice(0,1,1), xr[7:8]) 16567db96d56Sopenharmony_ci self.assertEqual(xl.tolist(), items) 16577db96d56Sopenharmony_ci self.assertRaises(ValueError, ml.__setitem__, slice(0,1,1), mr[7:8]) 16587db96d56Sopenharmony_ci self.assertEqual(ml.tolist(), items) 16597db96d56Sopenharmony_ci 16607db96d56Sopenharmony_ci # differing itemsize 16617db96d56Sopenharmony_ci xl = ndarray(items, shape=[8], format="B", flags=ND_WRITABLE) 16627db96d56Sopenharmony_ci yr = ndarray(items, shape=[8], format="L") 16637db96d56Sopenharmony_ci ml = memoryview(xl) 16647db96d56Sopenharmony_ci mr = memoryview(xr) 16657db96d56Sopenharmony_ci self.assertRaises(ValueError, xl.__setitem__, slice(0,1,1), xr[7:8]) 16667db96d56Sopenharmony_ci self.assertEqual(xl.tolist(), items) 16677db96d56Sopenharmony_ci self.assertRaises(ValueError, ml.__setitem__, slice(0,1,1), mr[7:8]) 16687db96d56Sopenharmony_ci self.assertEqual(ml.tolist(), items) 16697db96d56Sopenharmony_ci 16707db96d56Sopenharmony_ci # differing ndim 16717db96d56Sopenharmony_ci xl = ndarray(items, shape=[2, 4], format="b", flags=ND_WRITABLE) 16727db96d56Sopenharmony_ci xr = ndarray(items, shape=[8], format="b") 16737db96d56Sopenharmony_ci ml = memoryview(xl) 16747db96d56Sopenharmony_ci mr = memoryview(xr) 16757db96d56Sopenharmony_ci self.assertRaises(ValueError, xl.__setitem__, slice(0,1,1), xr[7:8]) 16767db96d56Sopenharmony_ci self.assertEqual(xl.tolist(), [[1,2,3,4], [5,6,7,8]]) 16777db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, ml.__setitem__, slice(0,1,1), 16787db96d56Sopenharmony_ci mr[7:8]) 16797db96d56Sopenharmony_ci 16807db96d56Sopenharmony_ci # differing shape 16817db96d56Sopenharmony_ci xl = ndarray(items, shape=[8], format="b", flags=ND_WRITABLE) 16827db96d56Sopenharmony_ci xr = ndarray(items, shape=[8], format="b") 16837db96d56Sopenharmony_ci ml = memoryview(xl) 16847db96d56Sopenharmony_ci mr = memoryview(xr) 16857db96d56Sopenharmony_ci self.assertRaises(ValueError, xl.__setitem__, slice(0,2,1), xr[7:8]) 16867db96d56Sopenharmony_ci self.assertEqual(xl.tolist(), items) 16877db96d56Sopenharmony_ci self.assertRaises(ValueError, ml.__setitem__, slice(0,2,1), mr[7:8]) 16887db96d56Sopenharmony_ci self.assertEqual(ml.tolist(), items) 16897db96d56Sopenharmony_ci 16907db96d56Sopenharmony_ci # _testbuffer.c module functions 16917db96d56Sopenharmony_ci self.assertRaises(TypeError, slice_indices, slice(0,1,2), {}) 16927db96d56Sopenharmony_ci self.assertRaises(TypeError, slice_indices, "###########", 1) 16937db96d56Sopenharmony_ci self.assertRaises(ValueError, slice_indices, slice(0,1,0), 4) 16947db96d56Sopenharmony_ci 16957db96d56Sopenharmony_ci x = ndarray(items, shape=[8], format="b", flags=ND_PIL) 16967db96d56Sopenharmony_ci self.assertRaises(TypeError, x.add_suboffsets) 16977db96d56Sopenharmony_ci 16987db96d56Sopenharmony_ci ex = ndarray(items, shape=[8], format="B") 16997db96d56Sopenharmony_ci x = ndarray(ex, getbuf=PyBUF_SIMPLE) 17007db96d56Sopenharmony_ci self.assertRaises(TypeError, x.add_suboffsets) 17017db96d56Sopenharmony_ci 17027db96d56Sopenharmony_ci def test_ndarray_slice_zero_shape(self): 17037db96d56Sopenharmony_ci items = [1,2,3,4,5,6,7,8,9,10,11,12] 17047db96d56Sopenharmony_ci 17057db96d56Sopenharmony_ci x = ndarray(items, shape=[12], format="L", flags=ND_WRITABLE) 17067db96d56Sopenharmony_ci y = ndarray(items, shape=[12], format="L") 17077db96d56Sopenharmony_ci x[4:4] = y[9:9] 17087db96d56Sopenharmony_ci self.assertEqual(x.tolist(), items) 17097db96d56Sopenharmony_ci 17107db96d56Sopenharmony_ci ml = memoryview(x) 17117db96d56Sopenharmony_ci mr = memoryview(y) 17127db96d56Sopenharmony_ci self.assertEqual(ml, x) 17137db96d56Sopenharmony_ci self.assertEqual(ml, y) 17147db96d56Sopenharmony_ci ml[4:4] = mr[9:9] 17157db96d56Sopenharmony_ci self.assertEqual(ml.tolist(), items) 17167db96d56Sopenharmony_ci 17177db96d56Sopenharmony_ci x = ndarray(items, shape=[3, 4], format="L", flags=ND_WRITABLE) 17187db96d56Sopenharmony_ci y = ndarray(items, shape=[4, 3], format="L") 17197db96d56Sopenharmony_ci x[1:2, 2:2] = y[1:2, 3:3] 17207db96d56Sopenharmony_ci self.assertEqual(x.tolist(), carray(items, [3, 4])) 17217db96d56Sopenharmony_ci 17227db96d56Sopenharmony_ci def test_ndarray_slice_multidim(self): 17237db96d56Sopenharmony_ci shape_t = (2, 3, 5) 17247db96d56Sopenharmony_ci ndim = len(shape_t) 17257db96d56Sopenharmony_ci nitems = prod(shape_t) 17267db96d56Sopenharmony_ci for shape in permutations(shape_t): 17277db96d56Sopenharmony_ci 17287db96d56Sopenharmony_ci fmt, items, _ = randitems(nitems) 17297db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 17307db96d56Sopenharmony_ci 17317db96d56Sopenharmony_ci for flags in (0, ND_PIL): 17327db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, format=fmt, flags=flags) 17337db96d56Sopenharmony_ci lst = carray(items, shape) 17347db96d56Sopenharmony_ci 17357db96d56Sopenharmony_ci for slices in rslices_ndim(ndim, shape): 17367db96d56Sopenharmony_ci 17377db96d56Sopenharmony_ci listerr = None 17387db96d56Sopenharmony_ci try: 17397db96d56Sopenharmony_ci sliced = multislice(lst, slices) 17407db96d56Sopenharmony_ci except Exception as e: 17417db96d56Sopenharmony_ci listerr = e.__class__ 17427db96d56Sopenharmony_ci 17437db96d56Sopenharmony_ci nderr = None 17447db96d56Sopenharmony_ci try: 17457db96d56Sopenharmony_ci ndsliced = nd[slices] 17467db96d56Sopenharmony_ci except Exception as e: 17477db96d56Sopenharmony_ci nderr = e.__class__ 17487db96d56Sopenharmony_ci 17497db96d56Sopenharmony_ci if nderr or listerr: 17507db96d56Sopenharmony_ci self.assertIs(nderr, listerr) 17517db96d56Sopenharmony_ci else: 17527db96d56Sopenharmony_ci self.assertEqual(ndsliced.tolist(), sliced) 17537db96d56Sopenharmony_ci 17547db96d56Sopenharmony_ci def test_ndarray_slice_redundant_suboffsets(self): 17557db96d56Sopenharmony_ci shape_t = (2, 3, 5, 2) 17567db96d56Sopenharmony_ci ndim = len(shape_t) 17577db96d56Sopenharmony_ci nitems = prod(shape_t) 17587db96d56Sopenharmony_ci for shape in permutations(shape_t): 17597db96d56Sopenharmony_ci 17607db96d56Sopenharmony_ci fmt, items, _ = randitems(nitems) 17617db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 17627db96d56Sopenharmony_ci 17637db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, format=fmt) 17647db96d56Sopenharmony_ci nd.add_suboffsets() 17657db96d56Sopenharmony_ci ex = ndarray(items, shape=shape, format=fmt) 17667db96d56Sopenharmony_ci ex.add_suboffsets() 17677db96d56Sopenharmony_ci mv = memoryview(ex) 17687db96d56Sopenharmony_ci lst = carray(items, shape) 17697db96d56Sopenharmony_ci 17707db96d56Sopenharmony_ci for slices in rslices_ndim(ndim, shape): 17717db96d56Sopenharmony_ci 17727db96d56Sopenharmony_ci listerr = None 17737db96d56Sopenharmony_ci try: 17747db96d56Sopenharmony_ci sliced = multislice(lst, slices) 17757db96d56Sopenharmony_ci except Exception as e: 17767db96d56Sopenharmony_ci listerr = e.__class__ 17777db96d56Sopenharmony_ci 17787db96d56Sopenharmony_ci nderr = None 17797db96d56Sopenharmony_ci try: 17807db96d56Sopenharmony_ci ndsliced = nd[slices] 17817db96d56Sopenharmony_ci except Exception as e: 17827db96d56Sopenharmony_ci nderr = e.__class__ 17837db96d56Sopenharmony_ci 17847db96d56Sopenharmony_ci if nderr or listerr: 17857db96d56Sopenharmony_ci self.assertIs(nderr, listerr) 17867db96d56Sopenharmony_ci else: 17877db96d56Sopenharmony_ci self.assertEqual(ndsliced.tolist(), sliced) 17887db96d56Sopenharmony_ci 17897db96d56Sopenharmony_ci def test_ndarray_slice_assign_single(self): 17907db96d56Sopenharmony_ci for fmt, items, _ in iter_format(5): 17917db96d56Sopenharmony_ci for lslice in genslices(5): 17927db96d56Sopenharmony_ci for rslice in genslices(5): 17937db96d56Sopenharmony_ci for flags in (0, ND_PIL): 17947db96d56Sopenharmony_ci 17957db96d56Sopenharmony_ci f = flags|ND_WRITABLE 17967db96d56Sopenharmony_ci nd = ndarray(items, shape=[5], format=fmt, flags=f) 17977db96d56Sopenharmony_ci ex = ndarray(items, shape=[5], format=fmt, flags=f) 17987db96d56Sopenharmony_ci mv = memoryview(ex) 17997db96d56Sopenharmony_ci 18007db96d56Sopenharmony_ci lsterr = None 18017db96d56Sopenharmony_ci diff_structure = None 18027db96d56Sopenharmony_ci lst = items[:] 18037db96d56Sopenharmony_ci try: 18047db96d56Sopenharmony_ci lval = lst[lslice] 18057db96d56Sopenharmony_ci rval = lst[rslice] 18067db96d56Sopenharmony_ci lst[lslice] = lst[rslice] 18077db96d56Sopenharmony_ci diff_structure = len(lval) != len(rval) 18087db96d56Sopenharmony_ci except Exception as e: 18097db96d56Sopenharmony_ci lsterr = e.__class__ 18107db96d56Sopenharmony_ci 18117db96d56Sopenharmony_ci nderr = None 18127db96d56Sopenharmony_ci try: 18137db96d56Sopenharmony_ci nd[lslice] = nd[rslice] 18147db96d56Sopenharmony_ci except Exception as e: 18157db96d56Sopenharmony_ci nderr = e.__class__ 18167db96d56Sopenharmony_ci 18177db96d56Sopenharmony_ci if diff_structure: # ndarray cannot change shape 18187db96d56Sopenharmony_ci self.assertIs(nderr, ValueError) 18197db96d56Sopenharmony_ci else: 18207db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), lst) 18217db96d56Sopenharmony_ci self.assertIs(nderr, lsterr) 18227db96d56Sopenharmony_ci 18237db96d56Sopenharmony_ci if not is_memoryview_format(fmt): 18247db96d56Sopenharmony_ci continue 18257db96d56Sopenharmony_ci 18267db96d56Sopenharmony_ci mverr = None 18277db96d56Sopenharmony_ci try: 18287db96d56Sopenharmony_ci mv[lslice] = mv[rslice] 18297db96d56Sopenharmony_ci except Exception as e: 18307db96d56Sopenharmony_ci mverr = e.__class__ 18317db96d56Sopenharmony_ci 18327db96d56Sopenharmony_ci if diff_structure: # memoryview cannot change shape 18337db96d56Sopenharmony_ci self.assertIs(mverr, ValueError) 18347db96d56Sopenharmony_ci else: 18357db96d56Sopenharmony_ci self.assertEqual(mv.tolist(), lst) 18367db96d56Sopenharmony_ci self.assertEqual(mv, nd) 18377db96d56Sopenharmony_ci self.assertIs(mverr, lsterr) 18387db96d56Sopenharmony_ci self.verify(mv, obj=ex, 18397db96d56Sopenharmony_ci itemsize=nd.itemsize, fmt=fmt, readonly=False, 18407db96d56Sopenharmony_ci ndim=nd.ndim, shape=nd.shape, strides=nd.strides, 18417db96d56Sopenharmony_ci lst=nd.tolist()) 18427db96d56Sopenharmony_ci 18437db96d56Sopenharmony_ci def test_ndarray_slice_assign_multidim(self): 18447db96d56Sopenharmony_ci shape_t = (2, 3, 5) 18457db96d56Sopenharmony_ci ndim = len(shape_t) 18467db96d56Sopenharmony_ci nitems = prod(shape_t) 18477db96d56Sopenharmony_ci for shape in permutations(shape_t): 18487db96d56Sopenharmony_ci 18497db96d56Sopenharmony_ci fmt, items, _ = randitems(nitems) 18507db96d56Sopenharmony_ci 18517db96d56Sopenharmony_ci for flags in (0, ND_PIL): 18527db96d56Sopenharmony_ci for _ in range(ITERATIONS): 18537db96d56Sopenharmony_ci lslices, rslices = randslice_from_shape(ndim, shape) 18547db96d56Sopenharmony_ci 18557db96d56Sopenharmony_ci nd = ndarray(items, shape=shape, format=fmt, 18567db96d56Sopenharmony_ci flags=flags|ND_WRITABLE) 18577db96d56Sopenharmony_ci lst = carray(items, shape) 18587db96d56Sopenharmony_ci 18597db96d56Sopenharmony_ci listerr = None 18607db96d56Sopenharmony_ci try: 18617db96d56Sopenharmony_ci result = multislice_assign(lst, lst, lslices, rslices) 18627db96d56Sopenharmony_ci except Exception as e: 18637db96d56Sopenharmony_ci listerr = e.__class__ 18647db96d56Sopenharmony_ci 18657db96d56Sopenharmony_ci nderr = None 18667db96d56Sopenharmony_ci try: 18677db96d56Sopenharmony_ci nd[lslices] = nd[rslices] 18687db96d56Sopenharmony_ci except Exception as e: 18697db96d56Sopenharmony_ci nderr = e.__class__ 18707db96d56Sopenharmony_ci 18717db96d56Sopenharmony_ci if nderr or listerr: 18727db96d56Sopenharmony_ci self.assertIs(nderr, listerr) 18737db96d56Sopenharmony_ci else: 18747db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), result) 18757db96d56Sopenharmony_ci 18767db96d56Sopenharmony_ci def test_ndarray_random(self): 18777db96d56Sopenharmony_ci # construction of valid arrays 18787db96d56Sopenharmony_ci for _ in range(ITERATIONS): 18797db96d56Sopenharmony_ci for fmt in fmtdict['@']: 18807db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 18817db96d56Sopenharmony_ci 18827db96d56Sopenharmony_ci t = rand_structure(itemsize, True, maxdim=MAXDIM, 18837db96d56Sopenharmony_ci maxshape=MAXSHAPE) 18847db96d56Sopenharmony_ci self.assertTrue(verify_structure(*t)) 18857db96d56Sopenharmony_ci items = randitems_from_structure(fmt, t) 18867db96d56Sopenharmony_ci 18877db96d56Sopenharmony_ci x = ndarray_from_structure(items, fmt, t) 18887db96d56Sopenharmony_ci xlist = x.tolist() 18897db96d56Sopenharmony_ci 18907db96d56Sopenharmony_ci mv = memoryview(x) 18917db96d56Sopenharmony_ci if is_memoryview_format(fmt): 18927db96d56Sopenharmony_ci mvlist = mv.tolist() 18937db96d56Sopenharmony_ci self.assertEqual(mvlist, xlist) 18947db96d56Sopenharmony_ci 18957db96d56Sopenharmony_ci if t[2] > 0: 18967db96d56Sopenharmony_ci # ndim > 0: test against suboffsets representation. 18977db96d56Sopenharmony_ci y = ndarray_from_structure(items, fmt, t, flags=ND_PIL) 18987db96d56Sopenharmony_ci ylist = y.tolist() 18997db96d56Sopenharmony_ci self.assertEqual(xlist, ylist) 19007db96d56Sopenharmony_ci 19017db96d56Sopenharmony_ci mv = memoryview(y) 19027db96d56Sopenharmony_ci if is_memoryview_format(fmt): 19037db96d56Sopenharmony_ci self.assertEqual(mv, y) 19047db96d56Sopenharmony_ci mvlist = mv.tolist() 19057db96d56Sopenharmony_ci self.assertEqual(mvlist, ylist) 19067db96d56Sopenharmony_ci 19077db96d56Sopenharmony_ci if numpy_array: 19087db96d56Sopenharmony_ci shape = t[3] 19097db96d56Sopenharmony_ci if 0 in shape: 19107db96d56Sopenharmony_ci continue # http://projects.scipy.org/numpy/ticket/1910 19117db96d56Sopenharmony_ci z = numpy_array_from_structure(items, fmt, t) 19127db96d56Sopenharmony_ci self.verify(x, obj=None, 19137db96d56Sopenharmony_ci itemsize=z.itemsize, fmt=fmt, readonly=False, 19147db96d56Sopenharmony_ci ndim=z.ndim, shape=z.shape, strides=z.strides, 19157db96d56Sopenharmony_ci lst=z.tolist()) 19167db96d56Sopenharmony_ci 19177db96d56Sopenharmony_ci def test_ndarray_random_invalid(self): 19187db96d56Sopenharmony_ci # exceptions during construction of invalid arrays 19197db96d56Sopenharmony_ci for _ in range(ITERATIONS): 19207db96d56Sopenharmony_ci for fmt in fmtdict['@']: 19217db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 19227db96d56Sopenharmony_ci 19237db96d56Sopenharmony_ci t = rand_structure(itemsize, False, maxdim=MAXDIM, 19247db96d56Sopenharmony_ci maxshape=MAXSHAPE) 19257db96d56Sopenharmony_ci self.assertFalse(verify_structure(*t)) 19267db96d56Sopenharmony_ci items = randitems_from_structure(fmt, t) 19277db96d56Sopenharmony_ci 19287db96d56Sopenharmony_ci nderr = False 19297db96d56Sopenharmony_ci try: 19307db96d56Sopenharmony_ci x = ndarray_from_structure(items, fmt, t) 19317db96d56Sopenharmony_ci except Exception as e: 19327db96d56Sopenharmony_ci nderr = e.__class__ 19337db96d56Sopenharmony_ci self.assertTrue(nderr) 19347db96d56Sopenharmony_ci 19357db96d56Sopenharmony_ci if numpy_array: 19367db96d56Sopenharmony_ci numpy_err = False 19377db96d56Sopenharmony_ci try: 19387db96d56Sopenharmony_ci y = numpy_array_from_structure(items, fmt, t) 19397db96d56Sopenharmony_ci except Exception as e: 19407db96d56Sopenharmony_ci numpy_err = e.__class__ 19417db96d56Sopenharmony_ci 19427db96d56Sopenharmony_ci if 0: # http://projects.scipy.org/numpy/ticket/1910 19437db96d56Sopenharmony_ci self.assertTrue(numpy_err) 19447db96d56Sopenharmony_ci 19457db96d56Sopenharmony_ci def test_ndarray_random_slice_assign(self): 19467db96d56Sopenharmony_ci # valid slice assignments 19477db96d56Sopenharmony_ci for _ in range(ITERATIONS): 19487db96d56Sopenharmony_ci for fmt in fmtdict['@']: 19497db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 19507db96d56Sopenharmony_ci 19517db96d56Sopenharmony_ci lshape, rshape, lslices, rslices = \ 19527db96d56Sopenharmony_ci rand_aligned_slices(maxdim=MAXDIM, maxshape=MAXSHAPE) 19537db96d56Sopenharmony_ci tl = rand_structure(itemsize, True, shape=lshape) 19547db96d56Sopenharmony_ci tr = rand_structure(itemsize, True, shape=rshape) 19557db96d56Sopenharmony_ci self.assertTrue(verify_structure(*tl)) 19567db96d56Sopenharmony_ci self.assertTrue(verify_structure(*tr)) 19577db96d56Sopenharmony_ci litems = randitems_from_structure(fmt, tl) 19587db96d56Sopenharmony_ci ritems = randitems_from_structure(fmt, tr) 19597db96d56Sopenharmony_ci 19607db96d56Sopenharmony_ci xl = ndarray_from_structure(litems, fmt, tl) 19617db96d56Sopenharmony_ci xr = ndarray_from_structure(ritems, fmt, tr) 19627db96d56Sopenharmony_ci xl[lslices] = xr[rslices] 19637db96d56Sopenharmony_ci xllist = xl.tolist() 19647db96d56Sopenharmony_ci xrlist = xr.tolist() 19657db96d56Sopenharmony_ci 19667db96d56Sopenharmony_ci ml = memoryview(xl) 19677db96d56Sopenharmony_ci mr = memoryview(xr) 19687db96d56Sopenharmony_ci self.assertEqual(ml.tolist(), xllist) 19697db96d56Sopenharmony_ci self.assertEqual(mr.tolist(), xrlist) 19707db96d56Sopenharmony_ci 19717db96d56Sopenharmony_ci if tl[2] > 0 and tr[2] > 0: 19727db96d56Sopenharmony_ci # ndim > 0: test against suboffsets representation. 19737db96d56Sopenharmony_ci yl = ndarray_from_structure(litems, fmt, tl, flags=ND_PIL) 19747db96d56Sopenharmony_ci yr = ndarray_from_structure(ritems, fmt, tr, flags=ND_PIL) 19757db96d56Sopenharmony_ci yl[lslices] = yr[rslices] 19767db96d56Sopenharmony_ci yllist = yl.tolist() 19777db96d56Sopenharmony_ci yrlist = yr.tolist() 19787db96d56Sopenharmony_ci self.assertEqual(xllist, yllist) 19797db96d56Sopenharmony_ci self.assertEqual(xrlist, yrlist) 19807db96d56Sopenharmony_ci 19817db96d56Sopenharmony_ci ml = memoryview(yl) 19827db96d56Sopenharmony_ci mr = memoryview(yr) 19837db96d56Sopenharmony_ci self.assertEqual(ml.tolist(), yllist) 19847db96d56Sopenharmony_ci self.assertEqual(mr.tolist(), yrlist) 19857db96d56Sopenharmony_ci 19867db96d56Sopenharmony_ci if numpy_array: 19877db96d56Sopenharmony_ci if 0 in lshape or 0 in rshape: 19887db96d56Sopenharmony_ci continue # http://projects.scipy.org/numpy/ticket/1910 19897db96d56Sopenharmony_ci 19907db96d56Sopenharmony_ci zl = numpy_array_from_structure(litems, fmt, tl) 19917db96d56Sopenharmony_ci zr = numpy_array_from_structure(ritems, fmt, tr) 19927db96d56Sopenharmony_ci zl[lslices] = zr[rslices] 19937db96d56Sopenharmony_ci 19947db96d56Sopenharmony_ci if not is_overlapping(tl) and not is_overlapping(tr): 19957db96d56Sopenharmony_ci # Slice assignment of overlapping structures 19967db96d56Sopenharmony_ci # is undefined in NumPy. 19977db96d56Sopenharmony_ci self.verify(xl, obj=None, 19987db96d56Sopenharmony_ci itemsize=zl.itemsize, fmt=fmt, readonly=False, 19997db96d56Sopenharmony_ci ndim=zl.ndim, shape=zl.shape, 20007db96d56Sopenharmony_ci strides=zl.strides, lst=zl.tolist()) 20017db96d56Sopenharmony_ci 20027db96d56Sopenharmony_ci self.verify(xr, obj=None, 20037db96d56Sopenharmony_ci itemsize=zr.itemsize, fmt=fmt, readonly=False, 20047db96d56Sopenharmony_ci ndim=zr.ndim, shape=zr.shape, 20057db96d56Sopenharmony_ci strides=zr.strides, lst=zr.tolist()) 20067db96d56Sopenharmony_ci 20077db96d56Sopenharmony_ci def test_ndarray_re_export(self): 20087db96d56Sopenharmony_ci items = [1,2,3,4,5,6,7,8,9,10,11,12] 20097db96d56Sopenharmony_ci 20107db96d56Sopenharmony_ci nd = ndarray(items, shape=[3,4], flags=ND_PIL) 20117db96d56Sopenharmony_ci ex = ndarray(nd) 20127db96d56Sopenharmony_ci 20137db96d56Sopenharmony_ci self.assertTrue(ex.flags & ND_PIL) 20147db96d56Sopenharmony_ci self.assertIs(ex.obj, nd) 20157db96d56Sopenharmony_ci self.assertEqual(ex.suboffsets, (0, -1)) 20167db96d56Sopenharmony_ci self.assertFalse(ex.c_contiguous) 20177db96d56Sopenharmony_ci self.assertFalse(ex.f_contiguous) 20187db96d56Sopenharmony_ci self.assertFalse(ex.contiguous) 20197db96d56Sopenharmony_ci 20207db96d56Sopenharmony_ci def test_ndarray_zero_shape(self): 20217db96d56Sopenharmony_ci # zeros in shape 20227db96d56Sopenharmony_ci for flags in (0, ND_PIL): 20237db96d56Sopenharmony_ci nd = ndarray([1,2,3], shape=[0], flags=flags) 20247db96d56Sopenharmony_ci mv = memoryview(nd) 20257db96d56Sopenharmony_ci self.assertEqual(mv, nd) 20267db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), []) 20277db96d56Sopenharmony_ci self.assertEqual(mv.tolist(), []) 20287db96d56Sopenharmony_ci 20297db96d56Sopenharmony_ci nd = ndarray([1,2,3], shape=[0,3,3], flags=flags) 20307db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), []) 20317db96d56Sopenharmony_ci 20327db96d56Sopenharmony_ci nd = ndarray([1,2,3], shape=[3,0,3], flags=flags) 20337db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), [[], [], []]) 20347db96d56Sopenharmony_ci 20357db96d56Sopenharmony_ci nd = ndarray([1,2,3], shape=[3,3,0], flags=flags) 20367db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), 20377db96d56Sopenharmony_ci [[[], [], []], [[], [], []], [[], [], []]]) 20387db96d56Sopenharmony_ci 20397db96d56Sopenharmony_ci def test_ndarray_zero_strides(self): 20407db96d56Sopenharmony_ci # zero strides 20417db96d56Sopenharmony_ci for flags in (0, ND_PIL): 20427db96d56Sopenharmony_ci nd = ndarray([1], shape=[5], strides=[0], flags=flags) 20437db96d56Sopenharmony_ci mv = memoryview(nd) 20447db96d56Sopenharmony_ci self.assertEqual(mv, nd) 20457db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), [1, 1, 1, 1, 1]) 20467db96d56Sopenharmony_ci self.assertEqual(mv.tolist(), [1, 1, 1, 1, 1]) 20477db96d56Sopenharmony_ci 20487db96d56Sopenharmony_ci def test_ndarray_offset(self): 20497db96d56Sopenharmony_ci nd = ndarray(list(range(20)), shape=[3], offset=7) 20507db96d56Sopenharmony_ci self.assertEqual(nd.offset, 7) 20517db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), [7,8,9]) 20527db96d56Sopenharmony_ci 20537db96d56Sopenharmony_ci def test_ndarray_memoryview_from_buffer(self): 20547db96d56Sopenharmony_ci for flags in (0, ND_PIL): 20557db96d56Sopenharmony_ci nd = ndarray(list(range(3)), shape=[3], flags=flags) 20567db96d56Sopenharmony_ci m = nd.memoryview_from_buffer() 20577db96d56Sopenharmony_ci self.assertEqual(m, nd) 20587db96d56Sopenharmony_ci 20597db96d56Sopenharmony_ci def test_ndarray_get_pointer(self): 20607db96d56Sopenharmony_ci for flags in (0, ND_PIL): 20617db96d56Sopenharmony_ci nd = ndarray(list(range(3)), shape=[3], flags=flags) 20627db96d56Sopenharmony_ci for i in range(3): 20637db96d56Sopenharmony_ci self.assertEqual(nd[i], get_pointer(nd, [i])) 20647db96d56Sopenharmony_ci 20657db96d56Sopenharmony_ci def test_ndarray_tolist_null_strides(self): 20667db96d56Sopenharmony_ci ex = ndarray(list(range(20)), shape=[2,2,5]) 20677db96d56Sopenharmony_ci 20687db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_ND|PyBUF_FORMAT) 20697db96d56Sopenharmony_ci self.assertEqual(nd.tolist(), ex.tolist()) 20707db96d56Sopenharmony_ci 20717db96d56Sopenharmony_ci m = memoryview(ex) 20727db96d56Sopenharmony_ci self.assertEqual(m.tolist(), ex.tolist()) 20737db96d56Sopenharmony_ci 20747db96d56Sopenharmony_ci def test_ndarray_cmp_contig(self): 20757db96d56Sopenharmony_ci 20767db96d56Sopenharmony_ci self.assertFalse(cmp_contig(b"123", b"456")) 20777db96d56Sopenharmony_ci 20787db96d56Sopenharmony_ci x = ndarray(list(range(12)), shape=[3,4]) 20797db96d56Sopenharmony_ci y = ndarray(list(range(12)), shape=[4,3]) 20807db96d56Sopenharmony_ci self.assertFalse(cmp_contig(x, y)) 20817db96d56Sopenharmony_ci 20827db96d56Sopenharmony_ci x = ndarray([1], shape=[1], format="B") 20837db96d56Sopenharmony_ci self.assertTrue(cmp_contig(x, b'\x01')) 20847db96d56Sopenharmony_ci self.assertTrue(cmp_contig(b'\x01', x)) 20857db96d56Sopenharmony_ci 20867db96d56Sopenharmony_ci def test_ndarray_hash(self): 20877db96d56Sopenharmony_ci 20887db96d56Sopenharmony_ci a = array.array('L', [1,2,3]) 20897db96d56Sopenharmony_ci nd = ndarray(a) 20907db96d56Sopenharmony_ci self.assertRaises(ValueError, hash, nd) 20917db96d56Sopenharmony_ci 20927db96d56Sopenharmony_ci # one-dimensional 20937db96d56Sopenharmony_ci b = bytes(list(range(12))) 20947db96d56Sopenharmony_ci 20957db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[12]) 20967db96d56Sopenharmony_ci self.assertEqual(hash(nd), hash(b)) 20977db96d56Sopenharmony_ci 20987db96d56Sopenharmony_ci # C-contiguous 20997db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3,4]) 21007db96d56Sopenharmony_ci self.assertEqual(hash(nd), hash(b)) 21017db96d56Sopenharmony_ci 21027db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3,2,2]) 21037db96d56Sopenharmony_ci self.assertEqual(hash(nd), hash(b)) 21047db96d56Sopenharmony_ci 21057db96d56Sopenharmony_ci # Fortran contiguous 21067db96d56Sopenharmony_ci b = bytes(transpose(list(range(12)), shape=[4,3])) 21077db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3,4], flags=ND_FORTRAN) 21087db96d56Sopenharmony_ci self.assertEqual(hash(nd), hash(b)) 21097db96d56Sopenharmony_ci 21107db96d56Sopenharmony_ci b = bytes(transpose(list(range(12)), shape=[2,3,2])) 21117db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[2,3,2], flags=ND_FORTRAN) 21127db96d56Sopenharmony_ci self.assertEqual(hash(nd), hash(b)) 21137db96d56Sopenharmony_ci 21147db96d56Sopenharmony_ci # suboffsets 21157db96d56Sopenharmony_ci b = bytes(list(range(12))) 21167db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[2,2,3], flags=ND_PIL) 21177db96d56Sopenharmony_ci self.assertEqual(hash(nd), hash(b)) 21187db96d56Sopenharmony_ci 21197db96d56Sopenharmony_ci # non-byte formats 21207db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[2,2,3], format='L') 21217db96d56Sopenharmony_ci self.assertEqual(hash(nd), hash(nd.tobytes())) 21227db96d56Sopenharmony_ci 21237db96d56Sopenharmony_ci def test_py_buffer_to_contiguous(self): 21247db96d56Sopenharmony_ci 21257db96d56Sopenharmony_ci # The requests are used in _testbuffer.c:py_buffer_to_contiguous 21267db96d56Sopenharmony_ci # to generate buffers without full information for testing. 21277db96d56Sopenharmony_ci requests = ( 21287db96d56Sopenharmony_ci # distinct flags 21297db96d56Sopenharmony_ci PyBUF_INDIRECT, PyBUF_STRIDES, PyBUF_ND, PyBUF_SIMPLE, 21307db96d56Sopenharmony_ci # compound requests 21317db96d56Sopenharmony_ci PyBUF_FULL, PyBUF_FULL_RO, 21327db96d56Sopenharmony_ci PyBUF_RECORDS, PyBUF_RECORDS_RO, 21337db96d56Sopenharmony_ci PyBUF_STRIDED, PyBUF_STRIDED_RO, 21347db96d56Sopenharmony_ci PyBUF_CONTIG, PyBUF_CONTIG_RO, 21357db96d56Sopenharmony_ci ) 21367db96d56Sopenharmony_ci 21377db96d56Sopenharmony_ci # no buffer interface 21387db96d56Sopenharmony_ci self.assertRaises(TypeError, py_buffer_to_contiguous, {}, 'F', 21397db96d56Sopenharmony_ci PyBUF_FULL_RO) 21407db96d56Sopenharmony_ci 21417db96d56Sopenharmony_ci # scalar, read-only request 21427db96d56Sopenharmony_ci nd = ndarray(9, shape=(), format="L", flags=ND_WRITABLE) 21437db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 21447db96d56Sopenharmony_ci for request in requests: 21457db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, order, request) 21467db96d56Sopenharmony_ci self.assertEqual(b, nd.tobytes()) 21477db96d56Sopenharmony_ci 21487db96d56Sopenharmony_ci # zeros in shape 21497db96d56Sopenharmony_ci nd = ndarray([1], shape=[0], format="L", flags=ND_WRITABLE) 21507db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 21517db96d56Sopenharmony_ci for request in requests: 21527db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, order, request) 21537db96d56Sopenharmony_ci self.assertEqual(b, b'') 21547db96d56Sopenharmony_ci 21557db96d56Sopenharmony_ci nd = ndarray(list(range(8)), shape=[2, 0, 7], format="L", 21567db96d56Sopenharmony_ci flags=ND_WRITABLE) 21577db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 21587db96d56Sopenharmony_ci for request in requests: 21597db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, order, request) 21607db96d56Sopenharmony_ci self.assertEqual(b, b'') 21617db96d56Sopenharmony_ci 21627db96d56Sopenharmony_ci ### One-dimensional arrays are trivial, since Fortran and C order 21637db96d56Sopenharmony_ci ### are the same. 21647db96d56Sopenharmony_ci 21657db96d56Sopenharmony_ci # one-dimensional 21667db96d56Sopenharmony_ci for f in [0, ND_FORTRAN]: 21677db96d56Sopenharmony_ci nd = ndarray([1], shape=[1], format="h", flags=f|ND_WRITABLE) 21687db96d56Sopenharmony_ci ndbytes = nd.tobytes() 21697db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 21707db96d56Sopenharmony_ci for request in requests: 21717db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, order, request) 21727db96d56Sopenharmony_ci self.assertEqual(b, ndbytes) 21737db96d56Sopenharmony_ci 21747db96d56Sopenharmony_ci nd = ndarray([1, 2, 3], shape=[3], format="b", flags=f|ND_WRITABLE) 21757db96d56Sopenharmony_ci ndbytes = nd.tobytes() 21767db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 21777db96d56Sopenharmony_ci for request in requests: 21787db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, order, request) 21797db96d56Sopenharmony_ci self.assertEqual(b, ndbytes) 21807db96d56Sopenharmony_ci 21817db96d56Sopenharmony_ci # one-dimensional, non-contiguous input 21827db96d56Sopenharmony_ci nd = ndarray([1, 2, 3], shape=[2], strides=[2], flags=ND_WRITABLE) 21837db96d56Sopenharmony_ci ndbytes = nd.tobytes() 21847db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 21857db96d56Sopenharmony_ci for request in [PyBUF_STRIDES, PyBUF_FULL]: 21867db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, order, request) 21877db96d56Sopenharmony_ci self.assertEqual(b, ndbytes) 21887db96d56Sopenharmony_ci 21897db96d56Sopenharmony_ci nd = nd[::-1] 21907db96d56Sopenharmony_ci ndbytes = nd.tobytes() 21917db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 21927db96d56Sopenharmony_ci for request in requests: 21937db96d56Sopenharmony_ci try: 21947db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, order, request) 21957db96d56Sopenharmony_ci except BufferError: 21967db96d56Sopenharmony_ci continue 21977db96d56Sopenharmony_ci self.assertEqual(b, ndbytes) 21987db96d56Sopenharmony_ci 21997db96d56Sopenharmony_ci ### 22007db96d56Sopenharmony_ci ### Multi-dimensional arrays: 22017db96d56Sopenharmony_ci ### 22027db96d56Sopenharmony_ci ### The goal here is to preserve the logical representation of the 22037db96d56Sopenharmony_ci ### input array but change the physical representation if necessary. 22047db96d56Sopenharmony_ci ### 22057db96d56Sopenharmony_ci ### _testbuffer example: 22067db96d56Sopenharmony_ci ### ==================== 22077db96d56Sopenharmony_ci ### 22087db96d56Sopenharmony_ci ### C input array: 22097db96d56Sopenharmony_ci ### -------------- 22107db96d56Sopenharmony_ci ### >>> nd = ndarray(list(range(12)), shape=[3, 4]) 22117db96d56Sopenharmony_ci ### >>> nd.tolist() 22127db96d56Sopenharmony_ci ### [[0, 1, 2, 3], 22137db96d56Sopenharmony_ci ### [4, 5, 6, 7], 22147db96d56Sopenharmony_ci ### [8, 9, 10, 11]] 22157db96d56Sopenharmony_ci ### 22167db96d56Sopenharmony_ci ### Fortran output: 22177db96d56Sopenharmony_ci ### --------------- 22187db96d56Sopenharmony_ci ### >>> py_buffer_to_contiguous(nd, 'F', PyBUF_FULL_RO) 22197db96d56Sopenharmony_ci ### >>> b'\x00\x04\x08\x01\x05\t\x02\x06\n\x03\x07\x0b' 22207db96d56Sopenharmony_ci ### 22217db96d56Sopenharmony_ci ### The return value corresponds to this input list for 22227db96d56Sopenharmony_ci ### _testbuffer's ndarray: 22237db96d56Sopenharmony_ci ### >>> nd = ndarray([0,4,8,1,5,9,2,6,10,3,7,11], shape=[3,4], 22247db96d56Sopenharmony_ci ### flags=ND_FORTRAN) 22257db96d56Sopenharmony_ci ### >>> nd.tolist() 22267db96d56Sopenharmony_ci ### [[0, 1, 2, 3], 22277db96d56Sopenharmony_ci ### [4, 5, 6, 7], 22287db96d56Sopenharmony_ci ### [8, 9, 10, 11]] 22297db96d56Sopenharmony_ci ### 22307db96d56Sopenharmony_ci ### The logical array is the same, but the values in memory are now 22317db96d56Sopenharmony_ci ### in Fortran order. 22327db96d56Sopenharmony_ci ### 22337db96d56Sopenharmony_ci ### NumPy example: 22347db96d56Sopenharmony_ci ### ============== 22357db96d56Sopenharmony_ci ### _testbuffer's ndarray takes lists to initialize the memory. 22367db96d56Sopenharmony_ci ### Here's the same sequence in NumPy: 22377db96d56Sopenharmony_ci ### 22387db96d56Sopenharmony_ci ### C input: 22397db96d56Sopenharmony_ci ### -------- 22407db96d56Sopenharmony_ci ### >>> nd = ndarray(buffer=bytearray(list(range(12))), 22417db96d56Sopenharmony_ci ### shape=[3, 4], dtype='B') 22427db96d56Sopenharmony_ci ### >>> nd 22437db96d56Sopenharmony_ci ### array([[ 0, 1, 2, 3], 22447db96d56Sopenharmony_ci ### [ 4, 5, 6, 7], 22457db96d56Sopenharmony_ci ### [ 8, 9, 10, 11]], dtype=uint8) 22467db96d56Sopenharmony_ci ### 22477db96d56Sopenharmony_ci ### Fortran output: 22487db96d56Sopenharmony_ci ### --------------- 22497db96d56Sopenharmony_ci ### >>> fortran_buf = nd.tostring(order='F') 22507db96d56Sopenharmony_ci ### >>> fortran_buf 22517db96d56Sopenharmony_ci ### b'\x00\x04\x08\x01\x05\t\x02\x06\n\x03\x07\x0b' 22527db96d56Sopenharmony_ci ### 22537db96d56Sopenharmony_ci ### >>> nd = ndarray(buffer=fortran_buf, shape=[3, 4], 22547db96d56Sopenharmony_ci ### dtype='B', order='F') 22557db96d56Sopenharmony_ci ### 22567db96d56Sopenharmony_ci ### >>> nd 22577db96d56Sopenharmony_ci ### array([[ 0, 1, 2, 3], 22587db96d56Sopenharmony_ci ### [ 4, 5, 6, 7], 22597db96d56Sopenharmony_ci ### [ 8, 9, 10, 11]], dtype=uint8) 22607db96d56Sopenharmony_ci ### 22617db96d56Sopenharmony_ci 22627db96d56Sopenharmony_ci # multi-dimensional, contiguous input 22637db96d56Sopenharmony_ci lst = list(range(12)) 22647db96d56Sopenharmony_ci for f in [0, ND_FORTRAN]: 22657db96d56Sopenharmony_ci nd = ndarray(lst, shape=[3, 4], flags=f|ND_WRITABLE) 22667db96d56Sopenharmony_ci if numpy_array: 22677db96d56Sopenharmony_ci na = numpy_array(buffer=bytearray(lst), 22687db96d56Sopenharmony_ci shape=[3, 4], dtype='B', 22697db96d56Sopenharmony_ci order='C' if f == 0 else 'F') 22707db96d56Sopenharmony_ci 22717db96d56Sopenharmony_ci # 'C' request 22727db96d56Sopenharmony_ci if f == ND_FORTRAN: # 'F' to 'C' 22737db96d56Sopenharmony_ci x = ndarray(transpose(lst, [4, 3]), shape=[3, 4], 22747db96d56Sopenharmony_ci flags=ND_WRITABLE) 22757db96d56Sopenharmony_ci expected = x.tobytes() 22767db96d56Sopenharmony_ci else: 22777db96d56Sopenharmony_ci expected = nd.tobytes() 22787db96d56Sopenharmony_ci for request in requests: 22797db96d56Sopenharmony_ci try: 22807db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, 'C', request) 22817db96d56Sopenharmony_ci except BufferError: 22827db96d56Sopenharmony_ci continue 22837db96d56Sopenharmony_ci 22847db96d56Sopenharmony_ci self.assertEqual(b, expected) 22857db96d56Sopenharmony_ci 22867db96d56Sopenharmony_ci # Check that output can be used as the basis for constructing 22877db96d56Sopenharmony_ci # a C array that is logically identical to the input array. 22887db96d56Sopenharmony_ci y = ndarray([v for v in b], shape=[3, 4], flags=ND_WRITABLE) 22897db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(nd)) 22907db96d56Sopenharmony_ci 22917db96d56Sopenharmony_ci if numpy_array: 22927db96d56Sopenharmony_ci self.assertEqual(b, na.tostring(order='C')) 22937db96d56Sopenharmony_ci 22947db96d56Sopenharmony_ci # 'F' request 22957db96d56Sopenharmony_ci if f == 0: # 'C' to 'F' 22967db96d56Sopenharmony_ci x = ndarray(transpose(lst, [3, 4]), shape=[4, 3], 22977db96d56Sopenharmony_ci flags=ND_WRITABLE) 22987db96d56Sopenharmony_ci else: 22997db96d56Sopenharmony_ci x = ndarray(lst, shape=[3, 4], flags=ND_WRITABLE) 23007db96d56Sopenharmony_ci expected = x.tobytes() 23017db96d56Sopenharmony_ci for request in [PyBUF_FULL, PyBUF_FULL_RO, PyBUF_INDIRECT, 23027db96d56Sopenharmony_ci PyBUF_STRIDES, PyBUF_ND]: 23037db96d56Sopenharmony_ci try: 23047db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, 'F', request) 23057db96d56Sopenharmony_ci except BufferError: 23067db96d56Sopenharmony_ci continue 23077db96d56Sopenharmony_ci self.assertEqual(b, expected) 23087db96d56Sopenharmony_ci 23097db96d56Sopenharmony_ci # Check that output can be used as the basis for constructing 23107db96d56Sopenharmony_ci # a Fortran array that is logically identical to the input array. 23117db96d56Sopenharmony_ci y = ndarray([v for v in b], shape=[3, 4], flags=ND_FORTRAN|ND_WRITABLE) 23127db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(nd)) 23137db96d56Sopenharmony_ci 23147db96d56Sopenharmony_ci if numpy_array: 23157db96d56Sopenharmony_ci self.assertEqual(b, na.tostring(order='F')) 23167db96d56Sopenharmony_ci 23177db96d56Sopenharmony_ci # 'A' request 23187db96d56Sopenharmony_ci if f == ND_FORTRAN: 23197db96d56Sopenharmony_ci x = ndarray(lst, shape=[3, 4], flags=ND_WRITABLE) 23207db96d56Sopenharmony_ci expected = x.tobytes() 23217db96d56Sopenharmony_ci else: 23227db96d56Sopenharmony_ci expected = nd.tobytes() 23237db96d56Sopenharmony_ci for request in [PyBUF_FULL, PyBUF_FULL_RO, PyBUF_INDIRECT, 23247db96d56Sopenharmony_ci PyBUF_STRIDES, PyBUF_ND]: 23257db96d56Sopenharmony_ci try: 23267db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, 'A', request) 23277db96d56Sopenharmony_ci except BufferError: 23287db96d56Sopenharmony_ci continue 23297db96d56Sopenharmony_ci 23307db96d56Sopenharmony_ci self.assertEqual(b, expected) 23317db96d56Sopenharmony_ci 23327db96d56Sopenharmony_ci # Check that output can be used as the basis for constructing 23337db96d56Sopenharmony_ci # an array with order=f that is logically identical to the input 23347db96d56Sopenharmony_ci # array. 23357db96d56Sopenharmony_ci y = ndarray([v for v in b], shape=[3, 4], flags=f|ND_WRITABLE) 23367db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(nd)) 23377db96d56Sopenharmony_ci 23387db96d56Sopenharmony_ci if numpy_array: 23397db96d56Sopenharmony_ci self.assertEqual(b, na.tostring(order='A')) 23407db96d56Sopenharmony_ci 23417db96d56Sopenharmony_ci # multi-dimensional, non-contiguous input 23427db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3, 4], flags=ND_WRITABLE|ND_PIL) 23437db96d56Sopenharmony_ci 23447db96d56Sopenharmony_ci # 'C' 23457db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, 'C', PyBUF_FULL_RO) 23467db96d56Sopenharmony_ci self.assertEqual(b, nd.tobytes()) 23477db96d56Sopenharmony_ci y = ndarray([v for v in b], shape=[3, 4], flags=ND_WRITABLE) 23487db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(nd)) 23497db96d56Sopenharmony_ci 23507db96d56Sopenharmony_ci # 'F' 23517db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, 'F', PyBUF_FULL_RO) 23527db96d56Sopenharmony_ci x = ndarray(transpose(lst, [3, 4]), shape=[4, 3], flags=ND_WRITABLE) 23537db96d56Sopenharmony_ci self.assertEqual(b, x.tobytes()) 23547db96d56Sopenharmony_ci y = ndarray([v for v in b], shape=[3, 4], flags=ND_FORTRAN|ND_WRITABLE) 23557db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(nd)) 23567db96d56Sopenharmony_ci 23577db96d56Sopenharmony_ci # 'A' 23587db96d56Sopenharmony_ci b = py_buffer_to_contiguous(nd, 'A', PyBUF_FULL_RO) 23597db96d56Sopenharmony_ci self.assertEqual(b, nd.tobytes()) 23607db96d56Sopenharmony_ci y = ndarray([v for v in b], shape=[3, 4], flags=ND_WRITABLE) 23617db96d56Sopenharmony_ci self.assertEqual(memoryview(y), memoryview(nd)) 23627db96d56Sopenharmony_ci 23637db96d56Sopenharmony_ci def test_memoryview_construction(self): 23647db96d56Sopenharmony_ci 23657db96d56Sopenharmony_ci items_shape = [(9, []), ([1,2,3], [3]), (list(range(2*3*5)), [2,3,5])] 23667db96d56Sopenharmony_ci 23677db96d56Sopenharmony_ci # NumPy style, C-contiguous: 23687db96d56Sopenharmony_ci for items, shape in items_shape: 23697db96d56Sopenharmony_ci 23707db96d56Sopenharmony_ci # From PEP-3118 compliant exporter: 23717db96d56Sopenharmony_ci ex = ndarray(items, shape=shape) 23727db96d56Sopenharmony_ci m = memoryview(ex) 23737db96d56Sopenharmony_ci self.assertTrue(m.c_contiguous) 23747db96d56Sopenharmony_ci self.assertTrue(m.contiguous) 23757db96d56Sopenharmony_ci 23767db96d56Sopenharmony_ci ndim = len(shape) 23777db96d56Sopenharmony_ci strides = strides_from_shape(ndim, shape, 1, 'C') 23787db96d56Sopenharmony_ci lst = carray(items, shape) 23797db96d56Sopenharmony_ci 23807db96d56Sopenharmony_ci self.verify(m, obj=ex, 23817db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 23827db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 23837db96d56Sopenharmony_ci lst=lst) 23847db96d56Sopenharmony_ci 23857db96d56Sopenharmony_ci # From memoryview: 23867db96d56Sopenharmony_ci m2 = memoryview(m) 23877db96d56Sopenharmony_ci self.verify(m2, obj=ex, 23887db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 23897db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 23907db96d56Sopenharmony_ci lst=lst) 23917db96d56Sopenharmony_ci 23927db96d56Sopenharmony_ci # PyMemoryView_FromBuffer(): no strides 23937db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO|PyBUF_FORMAT) 23947db96d56Sopenharmony_ci self.assertEqual(nd.strides, ()) 23957db96d56Sopenharmony_ci m = nd.memoryview_from_buffer() 23967db96d56Sopenharmony_ci self.verify(m, obj=None, 23977db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 23987db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 23997db96d56Sopenharmony_ci lst=lst) 24007db96d56Sopenharmony_ci 24017db96d56Sopenharmony_ci # PyMemoryView_FromBuffer(): no format, shape, strides 24027db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_SIMPLE) 24037db96d56Sopenharmony_ci self.assertEqual(nd.format, '') 24047db96d56Sopenharmony_ci self.assertEqual(nd.shape, ()) 24057db96d56Sopenharmony_ci self.assertEqual(nd.strides, ()) 24067db96d56Sopenharmony_ci m = nd.memoryview_from_buffer() 24077db96d56Sopenharmony_ci 24087db96d56Sopenharmony_ci lst = [items] if ndim == 0 else items 24097db96d56Sopenharmony_ci self.verify(m, obj=None, 24107db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 24117db96d56Sopenharmony_ci ndim=1, shape=[ex.nbytes], strides=(1,), 24127db96d56Sopenharmony_ci lst=lst) 24137db96d56Sopenharmony_ci 24147db96d56Sopenharmony_ci # NumPy style, Fortran contiguous: 24157db96d56Sopenharmony_ci for items, shape in items_shape: 24167db96d56Sopenharmony_ci 24177db96d56Sopenharmony_ci # From PEP-3118 compliant exporter: 24187db96d56Sopenharmony_ci ex = ndarray(items, shape=shape, flags=ND_FORTRAN) 24197db96d56Sopenharmony_ci m = memoryview(ex) 24207db96d56Sopenharmony_ci self.assertTrue(m.f_contiguous) 24217db96d56Sopenharmony_ci self.assertTrue(m.contiguous) 24227db96d56Sopenharmony_ci 24237db96d56Sopenharmony_ci ndim = len(shape) 24247db96d56Sopenharmony_ci strides = strides_from_shape(ndim, shape, 1, 'F') 24257db96d56Sopenharmony_ci lst = farray(items, shape) 24267db96d56Sopenharmony_ci 24277db96d56Sopenharmony_ci self.verify(m, obj=ex, 24287db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 24297db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 24307db96d56Sopenharmony_ci lst=lst) 24317db96d56Sopenharmony_ci 24327db96d56Sopenharmony_ci # From memoryview: 24337db96d56Sopenharmony_ci m2 = memoryview(m) 24347db96d56Sopenharmony_ci self.verify(m2, obj=ex, 24357db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 24367db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 24377db96d56Sopenharmony_ci lst=lst) 24387db96d56Sopenharmony_ci 24397db96d56Sopenharmony_ci # PIL style: 24407db96d56Sopenharmony_ci for items, shape in items_shape[1:]: 24417db96d56Sopenharmony_ci 24427db96d56Sopenharmony_ci # From PEP-3118 compliant exporter: 24437db96d56Sopenharmony_ci ex = ndarray(items, shape=shape, flags=ND_PIL) 24447db96d56Sopenharmony_ci m = memoryview(ex) 24457db96d56Sopenharmony_ci 24467db96d56Sopenharmony_ci ndim = len(shape) 24477db96d56Sopenharmony_ci lst = carray(items, shape) 24487db96d56Sopenharmony_ci 24497db96d56Sopenharmony_ci self.verify(m, obj=ex, 24507db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 24517db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=ex.strides, 24527db96d56Sopenharmony_ci lst=lst) 24537db96d56Sopenharmony_ci 24547db96d56Sopenharmony_ci # From memoryview: 24557db96d56Sopenharmony_ci m2 = memoryview(m) 24567db96d56Sopenharmony_ci self.verify(m2, obj=ex, 24577db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 24587db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=ex.strides, 24597db96d56Sopenharmony_ci lst=lst) 24607db96d56Sopenharmony_ci 24617db96d56Sopenharmony_ci # Invalid number of arguments: 24627db96d56Sopenharmony_ci self.assertRaises(TypeError, memoryview, b'9', 'x') 24637db96d56Sopenharmony_ci # Not a buffer provider: 24647db96d56Sopenharmony_ci self.assertRaises(TypeError, memoryview, {}) 24657db96d56Sopenharmony_ci # Non-compliant buffer provider: 24667db96d56Sopenharmony_ci ex = ndarray([1,2,3], shape=[3]) 24677db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_SIMPLE) 24687db96d56Sopenharmony_ci self.assertRaises(BufferError, memoryview, nd) 24697db96d56Sopenharmony_ci nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO|PyBUF_FORMAT) 24707db96d56Sopenharmony_ci self.assertRaises(BufferError, memoryview, nd) 24717db96d56Sopenharmony_ci 24727db96d56Sopenharmony_ci # ndim > 64 24737db96d56Sopenharmony_ci nd = ndarray([1]*128, shape=[1]*128, format='L') 24747db96d56Sopenharmony_ci self.assertRaises(ValueError, memoryview, nd) 24757db96d56Sopenharmony_ci self.assertRaises(ValueError, nd.memoryview_from_buffer) 24767db96d56Sopenharmony_ci self.assertRaises(ValueError, get_contiguous, nd, PyBUF_READ, 'C') 24777db96d56Sopenharmony_ci self.assertRaises(ValueError, get_contiguous, nd, PyBUF_READ, 'F') 24787db96d56Sopenharmony_ci self.assertRaises(ValueError, get_contiguous, nd[::-1], PyBUF_READ, 'C') 24797db96d56Sopenharmony_ci 24807db96d56Sopenharmony_ci def test_memoryview_cast_zero_shape(self): 24817db96d56Sopenharmony_ci # Casts are undefined if buffer is multidimensional and shape 24827db96d56Sopenharmony_ci # contains zeros. These arrays are regarded as C-contiguous by 24837db96d56Sopenharmony_ci # Numpy and PyBuffer_GetContiguous(), so they are not caught by 24847db96d56Sopenharmony_ci # the test for C-contiguity in memory_cast(). 24857db96d56Sopenharmony_ci items = [1,2,3] 24867db96d56Sopenharmony_ci for shape in ([0,3,3], [3,0,3], [0,3,3]): 24877db96d56Sopenharmony_ci ex = ndarray(items, shape=shape) 24887db96d56Sopenharmony_ci self.assertTrue(ex.c_contiguous) 24897db96d56Sopenharmony_ci msrc = memoryview(ex) 24907db96d56Sopenharmony_ci self.assertRaises(TypeError, msrc.cast, 'c') 24917db96d56Sopenharmony_ci # Monodimensional empty view can be cast (issue #19014). 24927db96d56Sopenharmony_ci for fmt, _, _ in iter_format(1, 'memoryview'): 24937db96d56Sopenharmony_ci msrc = memoryview(b'') 24947db96d56Sopenharmony_ci m = msrc.cast(fmt) 24957db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), b'') 24967db96d56Sopenharmony_ci self.assertEqual(m.tolist(), []) 24977db96d56Sopenharmony_ci 24987db96d56Sopenharmony_ci check_sizeof = support.check_sizeof 24997db96d56Sopenharmony_ci 25007db96d56Sopenharmony_ci def test_memoryview_sizeof(self): 25017db96d56Sopenharmony_ci check = self.check_sizeof 25027db96d56Sopenharmony_ci vsize = support.calcvobjsize 25037db96d56Sopenharmony_ci base_struct = 'Pnin 2P2n2i5P P' 25047db96d56Sopenharmony_ci per_dim = '3n' 25057db96d56Sopenharmony_ci 25067db96d56Sopenharmony_ci items = list(range(8)) 25077db96d56Sopenharmony_ci check(memoryview(b''), vsize(base_struct + 1 * per_dim)) 25087db96d56Sopenharmony_ci a = ndarray(items, shape=[2, 4], format="b") 25097db96d56Sopenharmony_ci check(memoryview(a), vsize(base_struct + 2 * per_dim)) 25107db96d56Sopenharmony_ci a = ndarray(items, shape=[2, 2, 2], format="b") 25117db96d56Sopenharmony_ci check(memoryview(a), vsize(base_struct + 3 * per_dim)) 25127db96d56Sopenharmony_ci 25137db96d56Sopenharmony_ci def test_memoryview_struct_module(self): 25147db96d56Sopenharmony_ci 25157db96d56Sopenharmony_ci class INT(object): 25167db96d56Sopenharmony_ci def __init__(self, val): 25177db96d56Sopenharmony_ci self.val = val 25187db96d56Sopenharmony_ci def __int__(self): 25197db96d56Sopenharmony_ci return self.val 25207db96d56Sopenharmony_ci 25217db96d56Sopenharmony_ci class IDX(object): 25227db96d56Sopenharmony_ci def __init__(self, val): 25237db96d56Sopenharmony_ci self.val = val 25247db96d56Sopenharmony_ci def __index__(self): 25257db96d56Sopenharmony_ci return self.val 25267db96d56Sopenharmony_ci 25277db96d56Sopenharmony_ci def f(): return 7 25287db96d56Sopenharmony_ci 25297db96d56Sopenharmony_ci values = [INT(9), IDX(9), 25307db96d56Sopenharmony_ci 2.2+3j, Decimal("-21.1"), 12.2, Fraction(5, 2), 25317db96d56Sopenharmony_ci [1,2,3], {4,5,6}, {7:8}, (), (9,), 25327db96d56Sopenharmony_ci True, False, None, Ellipsis, 25337db96d56Sopenharmony_ci b'a', b'abc', bytearray(b'a'), bytearray(b'abc'), 25347db96d56Sopenharmony_ci 'a', 'abc', r'a', r'abc', 25357db96d56Sopenharmony_ci f, lambda x: x] 25367db96d56Sopenharmony_ci 25377db96d56Sopenharmony_ci for fmt, items, item in iter_format(10, 'memoryview'): 25387db96d56Sopenharmony_ci ex = ndarray(items, shape=[10], format=fmt, flags=ND_WRITABLE) 25397db96d56Sopenharmony_ci nd = ndarray(items, shape=[10], format=fmt, flags=ND_WRITABLE) 25407db96d56Sopenharmony_ci m = memoryview(ex) 25417db96d56Sopenharmony_ci 25427db96d56Sopenharmony_ci struct.pack_into(fmt, nd, 0, item) 25437db96d56Sopenharmony_ci m[0] = item 25447db96d56Sopenharmony_ci self.assertEqual(m[0], nd[0]) 25457db96d56Sopenharmony_ci 25467db96d56Sopenharmony_ci itemsize = struct.calcsize(fmt) 25477db96d56Sopenharmony_ci if 'P' in fmt: 25487db96d56Sopenharmony_ci continue 25497db96d56Sopenharmony_ci 25507db96d56Sopenharmony_ci for v in values: 25517db96d56Sopenharmony_ci struct_err = None 25527db96d56Sopenharmony_ci try: 25537db96d56Sopenharmony_ci struct.pack_into(fmt, nd, itemsize, v) 25547db96d56Sopenharmony_ci except struct.error: 25557db96d56Sopenharmony_ci struct_err = struct.error 25567db96d56Sopenharmony_ci 25577db96d56Sopenharmony_ci mv_err = None 25587db96d56Sopenharmony_ci try: 25597db96d56Sopenharmony_ci m[1] = v 25607db96d56Sopenharmony_ci except (TypeError, ValueError) as e: 25617db96d56Sopenharmony_ci mv_err = e.__class__ 25627db96d56Sopenharmony_ci 25637db96d56Sopenharmony_ci if struct_err or mv_err: 25647db96d56Sopenharmony_ci self.assertIsNot(struct_err, None) 25657db96d56Sopenharmony_ci self.assertIsNot(mv_err, None) 25667db96d56Sopenharmony_ci else: 25677db96d56Sopenharmony_ci self.assertEqual(m[1], nd[1]) 25687db96d56Sopenharmony_ci 25697db96d56Sopenharmony_ci def test_memoryview_cast_zero_strides(self): 25707db96d56Sopenharmony_ci # Casts are undefined if strides contains zeros. These arrays are 25717db96d56Sopenharmony_ci # (sometimes!) regarded as C-contiguous by Numpy, but not by 25727db96d56Sopenharmony_ci # PyBuffer_GetContiguous(). 25737db96d56Sopenharmony_ci ex = ndarray([1,2,3], shape=[3], strides=[0]) 25747db96d56Sopenharmony_ci self.assertFalse(ex.c_contiguous) 25757db96d56Sopenharmony_ci msrc = memoryview(ex) 25767db96d56Sopenharmony_ci self.assertRaises(TypeError, msrc.cast, 'c') 25777db96d56Sopenharmony_ci 25787db96d56Sopenharmony_ci def test_memoryview_cast_invalid(self): 25797db96d56Sopenharmony_ci # invalid format 25807db96d56Sopenharmony_ci for sfmt in NON_BYTE_FORMAT: 25817db96d56Sopenharmony_ci sformat = '@' + sfmt if randrange(2) else sfmt 25827db96d56Sopenharmony_ci ssize = struct.calcsize(sformat) 25837db96d56Sopenharmony_ci for dfmt in NON_BYTE_FORMAT: 25847db96d56Sopenharmony_ci dformat = '@' + dfmt if randrange(2) else dfmt 25857db96d56Sopenharmony_ci dsize = struct.calcsize(dformat) 25867db96d56Sopenharmony_ci ex = ndarray(list(range(32)), shape=[32//ssize], format=sformat) 25877db96d56Sopenharmony_ci msrc = memoryview(ex) 25887db96d56Sopenharmony_ci self.assertRaises(TypeError, msrc.cast, dfmt, [32//dsize]) 25897db96d56Sopenharmony_ci 25907db96d56Sopenharmony_ci for sfmt, sitems, _ in iter_format(1): 25917db96d56Sopenharmony_ci ex = ndarray(sitems, shape=[1], format=sfmt) 25927db96d56Sopenharmony_ci msrc = memoryview(ex) 25937db96d56Sopenharmony_ci for dfmt, _, _ in iter_format(1): 25947db96d56Sopenharmony_ci if not is_memoryview_format(dfmt): 25957db96d56Sopenharmony_ci self.assertRaises(ValueError, msrc.cast, dfmt, 25967db96d56Sopenharmony_ci [32//dsize]) 25977db96d56Sopenharmony_ci else: 25987db96d56Sopenharmony_ci if not is_byte_format(sfmt) and not is_byte_format(dfmt): 25997db96d56Sopenharmony_ci self.assertRaises(TypeError, msrc.cast, dfmt, 26007db96d56Sopenharmony_ci [32//dsize]) 26017db96d56Sopenharmony_ci 26027db96d56Sopenharmony_ci # invalid shape 26037db96d56Sopenharmony_ci size_h = struct.calcsize('h') 26047db96d56Sopenharmony_ci size_d = struct.calcsize('d') 26057db96d56Sopenharmony_ci ex = ndarray(list(range(2*2*size_d)), shape=[2,2,size_d], format='h') 26067db96d56Sopenharmony_ci msrc = memoryview(ex) 26077db96d56Sopenharmony_ci self.assertRaises(TypeError, msrc.cast, shape=[2,2,size_h], format='d') 26087db96d56Sopenharmony_ci 26097db96d56Sopenharmony_ci ex = ndarray(list(range(120)), shape=[1,2,3,4,5]) 26107db96d56Sopenharmony_ci m = memoryview(ex) 26117db96d56Sopenharmony_ci 26127db96d56Sopenharmony_ci # incorrect number of args 26137db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast) 26147db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, 1, 2, 3) 26157db96d56Sopenharmony_ci 26167db96d56Sopenharmony_ci # incorrect dest format type 26177db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, {}) 26187db96d56Sopenharmony_ci 26197db96d56Sopenharmony_ci # incorrect dest format 26207db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "X") 26217db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "@X") 26227db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "@XY") 26237db96d56Sopenharmony_ci 26247db96d56Sopenharmony_ci # dest format not implemented 26257db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "=B") 26267db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "!L") 26277db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "<P") 26287db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, ">l") 26297db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "BI") 26307db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "xBI") 26317db96d56Sopenharmony_ci 26327db96d56Sopenharmony_ci # src format not implemented 26337db96d56Sopenharmony_ci ex = ndarray([(1,2), (3,4)], shape=[2], format="II") 26347db96d56Sopenharmony_ci m = memoryview(ex) 26357db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__getitem__, 0) 26367db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__setitem__, 0, 8) 26377db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.tolist) 26387db96d56Sopenharmony_ci 26397db96d56Sopenharmony_ci # incorrect shape type 26407db96d56Sopenharmony_ci ex = ndarray(list(range(120)), shape=[1,2,3,4,5]) 26417db96d56Sopenharmony_ci m = memoryview(ex) 26427db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, "B", shape={}) 26437db96d56Sopenharmony_ci 26447db96d56Sopenharmony_ci # incorrect shape elements 26457db96d56Sopenharmony_ci ex = ndarray(list(range(120)), shape=[2*3*4*5]) 26467db96d56Sopenharmony_ci m = memoryview(ex) 26477db96d56Sopenharmony_ci self.assertRaises(OverflowError, m.cast, "B", shape=[2**64]) 26487db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "B", shape=[-1]) 26497db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "B", shape=[2,3,4,5,6,7,-1]) 26507db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, "B", shape=[2,3,4,5,6,7,0]) 26517db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, "B", shape=[2,3,4,5,6,7,'x']) 26527db96d56Sopenharmony_ci 26537db96d56Sopenharmony_ci # N-D -> N-D cast 26547db96d56Sopenharmony_ci ex = ndarray(list([9 for _ in range(3*5*7*11)]), shape=[3,5,7,11]) 26557db96d56Sopenharmony_ci m = memoryview(ex) 26567db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, "I", shape=[2,3,4,5]) 26577db96d56Sopenharmony_ci 26587db96d56Sopenharmony_ci # cast with ndim > 64 26597db96d56Sopenharmony_ci nd = ndarray(list(range(128)), shape=[128], format='I') 26607db96d56Sopenharmony_ci m = memoryview(nd) 26617db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, 'I', [1]*128) 26627db96d56Sopenharmony_ci 26637db96d56Sopenharmony_ci # view->len not a multiple of itemsize 26647db96d56Sopenharmony_ci ex = ndarray(list([9 for _ in range(3*5*7*11)]), shape=[3*5*7*11]) 26657db96d56Sopenharmony_ci m = memoryview(ex) 26667db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, "I", shape=[2,3,4,5]) 26677db96d56Sopenharmony_ci 26687db96d56Sopenharmony_ci # product(shape) * itemsize != buffer size 26697db96d56Sopenharmony_ci ex = ndarray(list([9 for _ in range(3*5*7*11)]), shape=[3*5*7*11]) 26707db96d56Sopenharmony_ci m = memoryview(ex) 26717db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, "B", shape=[2,3,4,5]) 26727db96d56Sopenharmony_ci 26737db96d56Sopenharmony_ci # product(shape) * itemsize overflow 26747db96d56Sopenharmony_ci nd = ndarray(list(range(128)), shape=[128], format='I') 26757db96d56Sopenharmony_ci m1 = memoryview(nd) 26767db96d56Sopenharmony_ci nd = ndarray(list(range(128)), shape=[128], format='B') 26777db96d56Sopenharmony_ci m2 = memoryview(nd) 26787db96d56Sopenharmony_ci if sys.maxsize == 2**63-1: 26797db96d56Sopenharmony_ci self.assertRaises(TypeError, m1.cast, 'B', 26807db96d56Sopenharmony_ci [7, 7, 73, 127, 337, 92737, 649657]) 26817db96d56Sopenharmony_ci self.assertRaises(ValueError, m1.cast, 'B', 26827db96d56Sopenharmony_ci [2**20, 2**20, 2**10, 2**10, 2**3]) 26837db96d56Sopenharmony_ci self.assertRaises(ValueError, m2.cast, 'I', 26847db96d56Sopenharmony_ci [2**20, 2**20, 2**10, 2**10, 2**1]) 26857db96d56Sopenharmony_ci else: 26867db96d56Sopenharmony_ci self.assertRaises(TypeError, m1.cast, 'B', 26877db96d56Sopenharmony_ci [1, 2147483647]) 26887db96d56Sopenharmony_ci self.assertRaises(ValueError, m1.cast, 'B', 26897db96d56Sopenharmony_ci [2**10, 2**10, 2**5, 2**5, 2**1]) 26907db96d56Sopenharmony_ci self.assertRaises(ValueError, m2.cast, 'I', 26917db96d56Sopenharmony_ci [2**10, 2**10, 2**5, 2**3, 2**1]) 26927db96d56Sopenharmony_ci 26937db96d56Sopenharmony_ci def test_memoryview_cast(self): 26947db96d56Sopenharmony_ci bytespec = ( 26957db96d56Sopenharmony_ci ('B', lambda ex: list(ex.tobytes())), 26967db96d56Sopenharmony_ci ('b', lambda ex: [x-256 if x > 127 else x for x in list(ex.tobytes())]), 26977db96d56Sopenharmony_ci ('c', lambda ex: [bytes(chr(x), 'latin-1') for x in list(ex.tobytes())]), 26987db96d56Sopenharmony_ci ) 26997db96d56Sopenharmony_ci 27007db96d56Sopenharmony_ci def iter_roundtrip(ex, m, items, fmt): 27017db96d56Sopenharmony_ci srcsize = struct.calcsize(fmt) 27027db96d56Sopenharmony_ci for bytefmt, to_bytelist in bytespec: 27037db96d56Sopenharmony_ci 27047db96d56Sopenharmony_ci m2 = m.cast(bytefmt) 27057db96d56Sopenharmony_ci lst = to_bytelist(ex) 27067db96d56Sopenharmony_ci self.verify(m2, obj=ex, 27077db96d56Sopenharmony_ci itemsize=1, fmt=bytefmt, readonly=False, 27087db96d56Sopenharmony_ci ndim=1, shape=[31*srcsize], strides=(1,), 27097db96d56Sopenharmony_ci lst=lst, cast=True) 27107db96d56Sopenharmony_ci 27117db96d56Sopenharmony_ci m3 = m2.cast(fmt) 27127db96d56Sopenharmony_ci self.assertEqual(m3, ex) 27137db96d56Sopenharmony_ci lst = ex.tolist() 27147db96d56Sopenharmony_ci self.verify(m3, obj=ex, 27157db96d56Sopenharmony_ci itemsize=srcsize, fmt=fmt, readonly=False, 27167db96d56Sopenharmony_ci ndim=1, shape=[31], strides=(srcsize,), 27177db96d56Sopenharmony_ci lst=lst, cast=True) 27187db96d56Sopenharmony_ci 27197db96d56Sopenharmony_ci # cast from ndim = 0 to ndim = 1 27207db96d56Sopenharmony_ci srcsize = struct.calcsize('I') 27217db96d56Sopenharmony_ci ex = ndarray(9, shape=[], format='I') 27227db96d56Sopenharmony_ci destitems, destshape = cast_items(ex, 'B', 1) 27237db96d56Sopenharmony_ci m = memoryview(ex) 27247db96d56Sopenharmony_ci m2 = m.cast('B') 27257db96d56Sopenharmony_ci self.verify(m2, obj=ex, 27267db96d56Sopenharmony_ci itemsize=1, fmt='B', readonly=True, 27277db96d56Sopenharmony_ci ndim=1, shape=destshape, strides=(1,), 27287db96d56Sopenharmony_ci lst=destitems, cast=True) 27297db96d56Sopenharmony_ci 27307db96d56Sopenharmony_ci # cast from ndim = 1 to ndim = 0 27317db96d56Sopenharmony_ci destsize = struct.calcsize('I') 27327db96d56Sopenharmony_ci ex = ndarray([9]*destsize, shape=[destsize], format='B') 27337db96d56Sopenharmony_ci destitems, destshape = cast_items(ex, 'I', destsize, shape=[]) 27347db96d56Sopenharmony_ci m = memoryview(ex) 27357db96d56Sopenharmony_ci m2 = m.cast('I', shape=[]) 27367db96d56Sopenharmony_ci self.verify(m2, obj=ex, 27377db96d56Sopenharmony_ci itemsize=destsize, fmt='I', readonly=True, 27387db96d56Sopenharmony_ci ndim=0, shape=(), strides=(), 27397db96d56Sopenharmony_ci lst=destitems, cast=True) 27407db96d56Sopenharmony_ci 27417db96d56Sopenharmony_ci # array.array: roundtrip to/from bytes 27427db96d56Sopenharmony_ci for fmt, items, _ in iter_format(31, 'array'): 27437db96d56Sopenharmony_ci ex = array.array(fmt, items) 27447db96d56Sopenharmony_ci m = memoryview(ex) 27457db96d56Sopenharmony_ci iter_roundtrip(ex, m, items, fmt) 27467db96d56Sopenharmony_ci 27477db96d56Sopenharmony_ci # ndarray: roundtrip to/from bytes 27487db96d56Sopenharmony_ci for fmt, items, _ in iter_format(31, 'memoryview'): 27497db96d56Sopenharmony_ci ex = ndarray(items, shape=[31], format=fmt, flags=ND_WRITABLE) 27507db96d56Sopenharmony_ci m = memoryview(ex) 27517db96d56Sopenharmony_ci iter_roundtrip(ex, m, items, fmt) 27527db96d56Sopenharmony_ci 27537db96d56Sopenharmony_ci def test_memoryview_cast_1D_ND(self): 27547db96d56Sopenharmony_ci # Cast between C-contiguous buffers. At least one buffer must 27557db96d56Sopenharmony_ci # be 1D, at least one format must be 'c', 'b' or 'B'. 27567db96d56Sopenharmony_ci for _tshape in gencastshapes(): 27577db96d56Sopenharmony_ci for char in fmtdict['@']: 27587db96d56Sopenharmony_ci # Casts to _Bool are undefined if the source contains values 27597db96d56Sopenharmony_ci # other than 0 or 1. 27607db96d56Sopenharmony_ci if char == "?": 27617db96d56Sopenharmony_ci continue 27627db96d56Sopenharmony_ci tfmt = ('', '@')[randrange(2)] + char 27637db96d56Sopenharmony_ci tsize = struct.calcsize(tfmt) 27647db96d56Sopenharmony_ci n = prod(_tshape) * tsize 27657db96d56Sopenharmony_ci obj = 'memoryview' if is_byte_format(tfmt) else 'bytefmt' 27667db96d56Sopenharmony_ci for fmt, items, _ in iter_format(n, obj): 27677db96d56Sopenharmony_ci size = struct.calcsize(fmt) 27687db96d56Sopenharmony_ci shape = [n] if n > 0 else [] 27697db96d56Sopenharmony_ci tshape = _tshape + [size] 27707db96d56Sopenharmony_ci 27717db96d56Sopenharmony_ci ex = ndarray(items, shape=shape, format=fmt) 27727db96d56Sopenharmony_ci m = memoryview(ex) 27737db96d56Sopenharmony_ci 27747db96d56Sopenharmony_ci titems, tshape = cast_items(ex, tfmt, tsize, shape=tshape) 27757db96d56Sopenharmony_ci 27767db96d56Sopenharmony_ci if titems is None: 27777db96d56Sopenharmony_ci self.assertRaises(TypeError, m.cast, tfmt, tshape) 27787db96d56Sopenharmony_ci continue 27797db96d56Sopenharmony_ci if titems == 'nan': 27807db96d56Sopenharmony_ci continue # NaNs in lists are a recipe for trouble. 27817db96d56Sopenharmony_ci 27827db96d56Sopenharmony_ci # 1D -> ND 27837db96d56Sopenharmony_ci nd = ndarray(titems, shape=tshape, format=tfmt) 27847db96d56Sopenharmony_ci 27857db96d56Sopenharmony_ci m2 = m.cast(tfmt, shape=tshape) 27867db96d56Sopenharmony_ci ndim = len(tshape) 27877db96d56Sopenharmony_ci strides = nd.strides 27887db96d56Sopenharmony_ci lst = nd.tolist() 27897db96d56Sopenharmony_ci self.verify(m2, obj=ex, 27907db96d56Sopenharmony_ci itemsize=tsize, fmt=tfmt, readonly=True, 27917db96d56Sopenharmony_ci ndim=ndim, shape=tshape, strides=strides, 27927db96d56Sopenharmony_ci lst=lst, cast=True) 27937db96d56Sopenharmony_ci 27947db96d56Sopenharmony_ci # ND -> 1D 27957db96d56Sopenharmony_ci m3 = m2.cast(fmt) 27967db96d56Sopenharmony_ci m4 = m2.cast(fmt, shape=shape) 27977db96d56Sopenharmony_ci ndim = len(shape) 27987db96d56Sopenharmony_ci strides = ex.strides 27997db96d56Sopenharmony_ci lst = ex.tolist() 28007db96d56Sopenharmony_ci 28017db96d56Sopenharmony_ci self.verify(m3, obj=ex, 28027db96d56Sopenharmony_ci itemsize=size, fmt=fmt, readonly=True, 28037db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 28047db96d56Sopenharmony_ci lst=lst, cast=True) 28057db96d56Sopenharmony_ci 28067db96d56Sopenharmony_ci self.verify(m4, obj=ex, 28077db96d56Sopenharmony_ci itemsize=size, fmt=fmt, readonly=True, 28087db96d56Sopenharmony_ci ndim=ndim, shape=shape, strides=strides, 28097db96d56Sopenharmony_ci lst=lst, cast=True) 28107db96d56Sopenharmony_ci 28117db96d56Sopenharmony_ci if ctypes: 28127db96d56Sopenharmony_ci # format: "T{>l:x:>d:y:}" 28137db96d56Sopenharmony_ci class BEPoint(ctypes.BigEndianStructure): 28147db96d56Sopenharmony_ci _fields_ = [("x", ctypes.c_long), ("y", ctypes.c_double)] 28157db96d56Sopenharmony_ci point = BEPoint(100, 200.1) 28167db96d56Sopenharmony_ci m1 = memoryview(point) 28177db96d56Sopenharmony_ci m2 = m1.cast('B') 28187db96d56Sopenharmony_ci self.assertEqual(m2.obj, point) 28197db96d56Sopenharmony_ci self.assertEqual(m2.itemsize, 1) 28207db96d56Sopenharmony_ci self.assertIs(m2.readonly, False) 28217db96d56Sopenharmony_ci self.assertEqual(m2.ndim, 1) 28227db96d56Sopenharmony_ci self.assertEqual(m2.shape, (m2.nbytes,)) 28237db96d56Sopenharmony_ci self.assertEqual(m2.strides, (1,)) 28247db96d56Sopenharmony_ci self.assertEqual(m2.suboffsets, ()) 28257db96d56Sopenharmony_ci 28267db96d56Sopenharmony_ci x = ctypes.c_double(1.2) 28277db96d56Sopenharmony_ci m1 = memoryview(x) 28287db96d56Sopenharmony_ci m2 = m1.cast('c') 28297db96d56Sopenharmony_ci self.assertEqual(m2.obj, x) 28307db96d56Sopenharmony_ci self.assertEqual(m2.itemsize, 1) 28317db96d56Sopenharmony_ci self.assertIs(m2.readonly, False) 28327db96d56Sopenharmony_ci self.assertEqual(m2.ndim, 1) 28337db96d56Sopenharmony_ci self.assertEqual(m2.shape, (m2.nbytes,)) 28347db96d56Sopenharmony_ci self.assertEqual(m2.strides, (1,)) 28357db96d56Sopenharmony_ci self.assertEqual(m2.suboffsets, ()) 28367db96d56Sopenharmony_ci 28377db96d56Sopenharmony_ci def test_memoryview_tolist(self): 28387db96d56Sopenharmony_ci 28397db96d56Sopenharmony_ci # Most tolist() tests are in self.verify() etc. 28407db96d56Sopenharmony_ci 28417db96d56Sopenharmony_ci a = array.array('h', list(range(-6, 6))) 28427db96d56Sopenharmony_ci m = memoryview(a) 28437db96d56Sopenharmony_ci self.assertEqual(m, a) 28447db96d56Sopenharmony_ci self.assertEqual(m.tolist(), a.tolist()) 28457db96d56Sopenharmony_ci 28467db96d56Sopenharmony_ci a = a[2::3] 28477db96d56Sopenharmony_ci m = m[2::3] 28487db96d56Sopenharmony_ci self.assertEqual(m, a) 28497db96d56Sopenharmony_ci self.assertEqual(m.tolist(), a.tolist()) 28507db96d56Sopenharmony_ci 28517db96d56Sopenharmony_ci ex = ndarray(list(range(2*3*5*7*11)), shape=[11,2,7,3,5], format='L') 28527db96d56Sopenharmony_ci m = memoryview(ex) 28537db96d56Sopenharmony_ci self.assertEqual(m.tolist(), ex.tolist()) 28547db96d56Sopenharmony_ci 28557db96d56Sopenharmony_ci ex = ndarray([(2, 5), (7, 11)], shape=[2], format='lh') 28567db96d56Sopenharmony_ci m = memoryview(ex) 28577db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.tolist) 28587db96d56Sopenharmony_ci 28597db96d56Sopenharmony_ci ex = ndarray([b'12345'], shape=[1], format="s") 28607db96d56Sopenharmony_ci m = memoryview(ex) 28617db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.tolist) 28627db96d56Sopenharmony_ci 28637db96d56Sopenharmony_ci ex = ndarray([b"a",b"b",b"c",b"d",b"e",b"f"], shape=[2,3], format='s') 28647db96d56Sopenharmony_ci m = memoryview(ex) 28657db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.tolist) 28667db96d56Sopenharmony_ci 28677db96d56Sopenharmony_ci def test_memoryview_repr(self): 28687db96d56Sopenharmony_ci m = memoryview(bytearray(9)) 28697db96d56Sopenharmony_ci r = m.__repr__() 28707db96d56Sopenharmony_ci self.assertTrue(r.startswith("<memory")) 28717db96d56Sopenharmony_ci 28727db96d56Sopenharmony_ci m.release() 28737db96d56Sopenharmony_ci r = m.__repr__() 28747db96d56Sopenharmony_ci self.assertTrue(r.startswith("<released")) 28757db96d56Sopenharmony_ci 28767db96d56Sopenharmony_ci def test_memoryview_sequence(self): 28777db96d56Sopenharmony_ci 28787db96d56Sopenharmony_ci for fmt in ('d', 'f'): 28797db96d56Sopenharmony_ci inf = float(3e400) 28807db96d56Sopenharmony_ci ex = array.array(fmt, [1.0, inf, 3.0]) 28817db96d56Sopenharmony_ci m = memoryview(ex) 28827db96d56Sopenharmony_ci self.assertIn(1.0, m) 28837db96d56Sopenharmony_ci self.assertIn(5e700, m) 28847db96d56Sopenharmony_ci self.assertIn(3.0, m) 28857db96d56Sopenharmony_ci 28867db96d56Sopenharmony_ci ex = ndarray(9.0, [], format='f') 28877db96d56Sopenharmony_ci m = memoryview(ex) 28887db96d56Sopenharmony_ci self.assertRaises(TypeError, eval, "9.0 in m", locals()) 28897db96d56Sopenharmony_ci 28907db96d56Sopenharmony_ci @contextlib.contextmanager 28917db96d56Sopenharmony_ci def assert_out_of_bounds_error(self, dim): 28927db96d56Sopenharmony_ci with self.assertRaises(IndexError) as cm: 28937db96d56Sopenharmony_ci yield 28947db96d56Sopenharmony_ci self.assertEqual(str(cm.exception), 28957db96d56Sopenharmony_ci "index out of bounds on dimension %d" % (dim,)) 28967db96d56Sopenharmony_ci 28977db96d56Sopenharmony_ci def test_memoryview_index(self): 28987db96d56Sopenharmony_ci 28997db96d56Sopenharmony_ci # ndim = 0 29007db96d56Sopenharmony_ci ex = ndarray(12.5, shape=[], format='d') 29017db96d56Sopenharmony_ci m = memoryview(ex) 29027db96d56Sopenharmony_ci self.assertEqual(m[()], 12.5) 29037db96d56Sopenharmony_ci self.assertEqual(m[...], m) 29047db96d56Sopenharmony_ci self.assertEqual(m[...], ex) 29057db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__getitem__, 0) 29067db96d56Sopenharmony_ci 29077db96d56Sopenharmony_ci ex = ndarray((1,2,3), shape=[], format='iii') 29087db96d56Sopenharmony_ci m = memoryview(ex) 29097db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__getitem__, ()) 29107db96d56Sopenharmony_ci 29117db96d56Sopenharmony_ci # range 29127db96d56Sopenharmony_ci ex = ndarray(list(range(7)), shape=[7], flags=ND_WRITABLE) 29137db96d56Sopenharmony_ci m = memoryview(ex) 29147db96d56Sopenharmony_ci 29157db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__getitem__, 2**64) 29167db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__getitem__, 2.0) 29177db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__getitem__, 0.0) 29187db96d56Sopenharmony_ci 29197db96d56Sopenharmony_ci # out of bounds 29207db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__getitem__, -8) 29217db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__getitem__, 8) 29227db96d56Sopenharmony_ci 29237db96d56Sopenharmony_ci # multi-dimensional 29247db96d56Sopenharmony_ci ex = ndarray(list(range(12)), shape=[3,4], flags=ND_WRITABLE) 29257db96d56Sopenharmony_ci m = memoryview(ex) 29267db96d56Sopenharmony_ci 29277db96d56Sopenharmony_ci self.assertEqual(m[0, 0], 0) 29287db96d56Sopenharmony_ci self.assertEqual(m[2, 0], 8) 29297db96d56Sopenharmony_ci self.assertEqual(m[2, 3], 11) 29307db96d56Sopenharmony_ci self.assertEqual(m[-1, -1], 11) 29317db96d56Sopenharmony_ci self.assertEqual(m[-3, -4], 0) 29327db96d56Sopenharmony_ci 29337db96d56Sopenharmony_ci # out of bounds 29347db96d56Sopenharmony_ci for index in (3, -4): 29357db96d56Sopenharmony_ci with self.assert_out_of_bounds_error(dim=1): 29367db96d56Sopenharmony_ci m[index, 0] 29377db96d56Sopenharmony_ci for index in (4, -5): 29387db96d56Sopenharmony_ci with self.assert_out_of_bounds_error(dim=2): 29397db96d56Sopenharmony_ci m[0, index] 29407db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__getitem__, (2**64, 0)) 29417db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__getitem__, (0, 2**64)) 29427db96d56Sopenharmony_ci 29437db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__getitem__, (0, 0, 0)) 29447db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__getitem__, (0.0, 0.0)) 29457db96d56Sopenharmony_ci 29467db96d56Sopenharmony_ci # Not implemented: multidimensional sub-views 29477db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__getitem__, ()) 29487db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__getitem__, 0) 29497db96d56Sopenharmony_ci 29507db96d56Sopenharmony_ci def test_memoryview_assign(self): 29517db96d56Sopenharmony_ci 29527db96d56Sopenharmony_ci # ndim = 0 29537db96d56Sopenharmony_ci ex = ndarray(12.5, shape=[], format='f', flags=ND_WRITABLE) 29547db96d56Sopenharmony_ci m = memoryview(ex) 29557db96d56Sopenharmony_ci m[()] = 22.5 29567db96d56Sopenharmony_ci self.assertEqual(m[()], 22.5) 29577db96d56Sopenharmony_ci m[...] = 23.5 29587db96d56Sopenharmony_ci self.assertEqual(m[()], 23.5) 29597db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, 0, 24.7) 29607db96d56Sopenharmony_ci 29617db96d56Sopenharmony_ci # read-only 29627db96d56Sopenharmony_ci ex = ndarray(list(range(7)), shape=[7]) 29637db96d56Sopenharmony_ci m = memoryview(ex) 29647db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, 2, 10) 29657db96d56Sopenharmony_ci 29667db96d56Sopenharmony_ci # range 29677db96d56Sopenharmony_ci ex = ndarray(list(range(7)), shape=[7], flags=ND_WRITABLE) 29687db96d56Sopenharmony_ci m = memoryview(ex) 29697db96d56Sopenharmony_ci 29707db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__setitem__, 2**64, 9) 29717db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, 2.0, 10) 29727db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, 0.0, 11) 29737db96d56Sopenharmony_ci 29747db96d56Sopenharmony_ci # out of bounds 29757db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__setitem__, -8, 20) 29767db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__setitem__, 8, 25) 29777db96d56Sopenharmony_ci 29787db96d56Sopenharmony_ci # pack_single() success: 29797db96d56Sopenharmony_ci for fmt in fmtdict['@']: 29807db96d56Sopenharmony_ci if fmt == 'c' or fmt == '?': 29817db96d56Sopenharmony_ci continue 29827db96d56Sopenharmony_ci ex = ndarray([1,2,3], shape=[3], format=fmt, flags=ND_WRITABLE) 29837db96d56Sopenharmony_ci m = memoryview(ex) 29847db96d56Sopenharmony_ci i = randrange(-3, 3) 29857db96d56Sopenharmony_ci m[i] = 8 29867db96d56Sopenharmony_ci self.assertEqual(m[i], 8) 29877db96d56Sopenharmony_ci self.assertEqual(m[i], ex[i]) 29887db96d56Sopenharmony_ci 29897db96d56Sopenharmony_ci ex = ndarray([b'1', b'2', b'3'], shape=[3], format='c', 29907db96d56Sopenharmony_ci flags=ND_WRITABLE) 29917db96d56Sopenharmony_ci m = memoryview(ex) 29927db96d56Sopenharmony_ci m[2] = b'9' 29937db96d56Sopenharmony_ci self.assertEqual(m[2], b'9') 29947db96d56Sopenharmony_ci 29957db96d56Sopenharmony_ci ex = ndarray([True, False, True], shape=[3], format='?', 29967db96d56Sopenharmony_ci flags=ND_WRITABLE) 29977db96d56Sopenharmony_ci m = memoryview(ex) 29987db96d56Sopenharmony_ci m[1] = True 29997db96d56Sopenharmony_ci self.assertIs(m[1], True) 30007db96d56Sopenharmony_ci 30017db96d56Sopenharmony_ci # pack_single() exceptions: 30027db96d56Sopenharmony_ci nd = ndarray([b'x'], shape=[1], format='c', flags=ND_WRITABLE) 30037db96d56Sopenharmony_ci m = memoryview(nd) 30047db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, 0, 100) 30057db96d56Sopenharmony_ci 30067db96d56Sopenharmony_ci ex = ndarray(list(range(120)), shape=[1,2,3,4,5], flags=ND_WRITABLE) 30077db96d56Sopenharmony_ci m1 = memoryview(ex) 30087db96d56Sopenharmony_ci 30097db96d56Sopenharmony_ci for fmt, _range in fmtdict['@'].items(): 30107db96d56Sopenharmony_ci if (fmt == '?'): # PyObject_IsTrue() accepts anything 30117db96d56Sopenharmony_ci continue 30127db96d56Sopenharmony_ci if fmt == 'c': # special case tested above 30137db96d56Sopenharmony_ci continue 30147db96d56Sopenharmony_ci m2 = m1.cast(fmt) 30157db96d56Sopenharmony_ci lo, hi = _range 30167db96d56Sopenharmony_ci if fmt == 'd' or fmt == 'f': 30177db96d56Sopenharmony_ci lo, hi = -2**1024, 2**1024 30187db96d56Sopenharmony_ci if fmt != 'P': # PyLong_AsVoidPtr() accepts negative numbers 30197db96d56Sopenharmony_ci self.assertRaises(ValueError, m2.__setitem__, 0, lo-1) 30207db96d56Sopenharmony_ci self.assertRaises(TypeError, m2.__setitem__, 0, "xyz") 30217db96d56Sopenharmony_ci self.assertRaises(ValueError, m2.__setitem__, 0, hi) 30227db96d56Sopenharmony_ci 30237db96d56Sopenharmony_ci # invalid item 30247db96d56Sopenharmony_ci m2 = m1.cast('c') 30257db96d56Sopenharmony_ci self.assertRaises(ValueError, m2.__setitem__, 0, b'\xff\xff') 30267db96d56Sopenharmony_ci 30277db96d56Sopenharmony_ci # format not implemented 30287db96d56Sopenharmony_ci ex = ndarray(list(range(1)), shape=[1], format="xL", flags=ND_WRITABLE) 30297db96d56Sopenharmony_ci m = memoryview(ex) 30307db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__setitem__, 0, 1) 30317db96d56Sopenharmony_ci 30327db96d56Sopenharmony_ci ex = ndarray([b'12345'], shape=[1], format="s", flags=ND_WRITABLE) 30337db96d56Sopenharmony_ci m = memoryview(ex) 30347db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__setitem__, 0, 1) 30357db96d56Sopenharmony_ci 30367db96d56Sopenharmony_ci # multi-dimensional 30377db96d56Sopenharmony_ci ex = ndarray(list(range(12)), shape=[3,4], flags=ND_WRITABLE) 30387db96d56Sopenharmony_ci m = memoryview(ex) 30397db96d56Sopenharmony_ci m[0,1] = 42 30407db96d56Sopenharmony_ci self.assertEqual(ex[0][1], 42) 30417db96d56Sopenharmony_ci m[-1,-1] = 43 30427db96d56Sopenharmony_ci self.assertEqual(ex[2][3], 43) 30437db96d56Sopenharmony_ci # errors 30447db96d56Sopenharmony_ci for index in (3, -4): 30457db96d56Sopenharmony_ci with self.assert_out_of_bounds_error(dim=1): 30467db96d56Sopenharmony_ci m[index, 0] = 0 30477db96d56Sopenharmony_ci for index in (4, -5): 30487db96d56Sopenharmony_ci with self.assert_out_of_bounds_error(dim=2): 30497db96d56Sopenharmony_ci m[0, index] = 0 30507db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__setitem__, (2**64, 0), 0) 30517db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__setitem__, (0, 2**64), 0) 30527db96d56Sopenharmony_ci 30537db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, (0, 0, 0), 0) 30547db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, (0.0, 0.0), 0) 30557db96d56Sopenharmony_ci 30567db96d56Sopenharmony_ci # Not implemented: multidimensional sub-views 30577db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__setitem__, 0, [2, 3]) 30587db96d56Sopenharmony_ci 30597db96d56Sopenharmony_ci def test_memoryview_slice(self): 30607db96d56Sopenharmony_ci 30617db96d56Sopenharmony_ci ex = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE) 30627db96d56Sopenharmony_ci m = memoryview(ex) 30637db96d56Sopenharmony_ci 30647db96d56Sopenharmony_ci # zero step 30657db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__getitem__, slice(0,2,0)) 30667db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__setitem__, slice(0,2,0), 30677db96d56Sopenharmony_ci bytearray([1,2])) 30687db96d56Sopenharmony_ci 30697db96d56Sopenharmony_ci # 0-dim slicing (identity function) 30707db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__getitem__, ()) 30717db96d56Sopenharmony_ci 30727db96d56Sopenharmony_ci # multidimensional slices 30737db96d56Sopenharmony_ci ex = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE) 30747db96d56Sopenharmony_ci m = memoryview(ex) 30757db96d56Sopenharmony_ci 30767db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__getitem__, 30777db96d56Sopenharmony_ci (slice(0,2,1), slice(0,2,1))) 30787db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, m.__setitem__, 30797db96d56Sopenharmony_ci (slice(0,2,1), slice(0,2,1)), bytearray([1,2])) 30807db96d56Sopenharmony_ci 30817db96d56Sopenharmony_ci # invalid slice tuple 30827db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__getitem__, (slice(0,2,1), {})) 30837db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, (slice(0,2,1), {}), 30847db96d56Sopenharmony_ci bytearray([1,2])) 30857db96d56Sopenharmony_ci 30867db96d56Sopenharmony_ci # rvalue is not an exporter 30877db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, slice(0,1,1), [1]) 30887db96d56Sopenharmony_ci 30897db96d56Sopenharmony_ci # non-contiguous slice assignment 30907db96d56Sopenharmony_ci for flags in (0, ND_PIL): 30917db96d56Sopenharmony_ci ex1 = ndarray(list(range(12)), shape=[12], strides=[-1], offset=11, 30927db96d56Sopenharmony_ci flags=ND_WRITABLE|flags) 30937db96d56Sopenharmony_ci ex2 = ndarray(list(range(24)), shape=[12], strides=[2], flags=flags) 30947db96d56Sopenharmony_ci m1 = memoryview(ex1) 30957db96d56Sopenharmony_ci m2 = memoryview(ex2) 30967db96d56Sopenharmony_ci 30977db96d56Sopenharmony_ci ex1[2:5] = ex1[2:5] 30987db96d56Sopenharmony_ci m1[2:5] = m2[2:5] 30997db96d56Sopenharmony_ci 31007db96d56Sopenharmony_ci self.assertEqual(m1, ex1) 31017db96d56Sopenharmony_ci self.assertEqual(m2, ex2) 31027db96d56Sopenharmony_ci 31037db96d56Sopenharmony_ci ex1[1:3][::-1] = ex2[0:2][::1] 31047db96d56Sopenharmony_ci m1[1:3][::-1] = m2[0:2][::1] 31057db96d56Sopenharmony_ci 31067db96d56Sopenharmony_ci self.assertEqual(m1, ex1) 31077db96d56Sopenharmony_ci self.assertEqual(m2, ex2) 31087db96d56Sopenharmony_ci 31097db96d56Sopenharmony_ci ex1[4:1:-2][::-1] = ex1[1:4:2][::1] 31107db96d56Sopenharmony_ci m1[4:1:-2][::-1] = m1[1:4:2][::1] 31117db96d56Sopenharmony_ci 31127db96d56Sopenharmony_ci self.assertEqual(m1, ex1) 31137db96d56Sopenharmony_ci self.assertEqual(m2, ex2) 31147db96d56Sopenharmony_ci 31157db96d56Sopenharmony_ci def test_memoryview_array(self): 31167db96d56Sopenharmony_ci 31177db96d56Sopenharmony_ci def cmptest(testcase, a, b, m, singleitem): 31187db96d56Sopenharmony_ci for i, _ in enumerate(a): 31197db96d56Sopenharmony_ci ai = a[i] 31207db96d56Sopenharmony_ci mi = m[i] 31217db96d56Sopenharmony_ci testcase.assertEqual(ai, mi) 31227db96d56Sopenharmony_ci a[i] = singleitem 31237db96d56Sopenharmony_ci if singleitem != ai: 31247db96d56Sopenharmony_ci testcase.assertNotEqual(a, m) 31257db96d56Sopenharmony_ci testcase.assertNotEqual(a, b) 31267db96d56Sopenharmony_ci else: 31277db96d56Sopenharmony_ci testcase.assertEqual(a, m) 31287db96d56Sopenharmony_ci testcase.assertEqual(a, b) 31297db96d56Sopenharmony_ci m[i] = singleitem 31307db96d56Sopenharmony_ci testcase.assertEqual(a, m) 31317db96d56Sopenharmony_ci testcase.assertEqual(b, m) 31327db96d56Sopenharmony_ci a[i] = ai 31337db96d56Sopenharmony_ci m[i] = mi 31347db96d56Sopenharmony_ci 31357db96d56Sopenharmony_ci for n in range(1, 5): 31367db96d56Sopenharmony_ci for fmt, items, singleitem in iter_format(n, 'array'): 31377db96d56Sopenharmony_ci for lslice in genslices(n): 31387db96d56Sopenharmony_ci for rslice in genslices(n): 31397db96d56Sopenharmony_ci 31407db96d56Sopenharmony_ci a = array.array(fmt, items) 31417db96d56Sopenharmony_ci b = array.array(fmt, items) 31427db96d56Sopenharmony_ci m = memoryview(b) 31437db96d56Sopenharmony_ci 31447db96d56Sopenharmony_ci self.assertEqual(m, a) 31457db96d56Sopenharmony_ci self.assertEqual(m.tolist(), a.tolist()) 31467db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), a.tobytes()) 31477db96d56Sopenharmony_ci self.assertEqual(len(m), len(a)) 31487db96d56Sopenharmony_ci 31497db96d56Sopenharmony_ci cmptest(self, a, b, m, singleitem) 31507db96d56Sopenharmony_ci 31517db96d56Sopenharmony_ci array_err = None 31527db96d56Sopenharmony_ci have_resize = None 31537db96d56Sopenharmony_ci try: 31547db96d56Sopenharmony_ci al = a[lslice] 31557db96d56Sopenharmony_ci ar = a[rslice] 31567db96d56Sopenharmony_ci a[lslice] = a[rslice] 31577db96d56Sopenharmony_ci have_resize = len(al) != len(ar) 31587db96d56Sopenharmony_ci except Exception as e: 31597db96d56Sopenharmony_ci array_err = e.__class__ 31607db96d56Sopenharmony_ci 31617db96d56Sopenharmony_ci m_err = None 31627db96d56Sopenharmony_ci try: 31637db96d56Sopenharmony_ci m[lslice] = m[rslice] 31647db96d56Sopenharmony_ci except Exception as e: 31657db96d56Sopenharmony_ci m_err = e.__class__ 31667db96d56Sopenharmony_ci 31677db96d56Sopenharmony_ci if have_resize: # memoryview cannot change shape 31687db96d56Sopenharmony_ci self.assertIs(m_err, ValueError) 31697db96d56Sopenharmony_ci elif m_err or array_err: 31707db96d56Sopenharmony_ci self.assertIs(m_err, array_err) 31717db96d56Sopenharmony_ci else: 31727db96d56Sopenharmony_ci self.assertEqual(m, a) 31737db96d56Sopenharmony_ci self.assertEqual(m.tolist(), a.tolist()) 31747db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), a.tobytes()) 31757db96d56Sopenharmony_ci cmptest(self, a, b, m, singleitem) 31767db96d56Sopenharmony_ci 31777db96d56Sopenharmony_ci def test_memoryview_compare_special_cases(self): 31787db96d56Sopenharmony_ci 31797db96d56Sopenharmony_ci a = array.array('L', [1, 2, 3]) 31807db96d56Sopenharmony_ci b = array.array('L', [1, 2, 7]) 31817db96d56Sopenharmony_ci 31827db96d56Sopenharmony_ci # Ordering comparisons raise: 31837db96d56Sopenharmony_ci v = memoryview(a) 31847db96d56Sopenharmony_ci w = memoryview(b) 31857db96d56Sopenharmony_ci for attr in ('__lt__', '__le__', '__gt__', '__ge__'): 31867db96d56Sopenharmony_ci self.assertIs(getattr(v, attr)(w), NotImplemented) 31877db96d56Sopenharmony_ci self.assertIs(getattr(a, attr)(v), NotImplemented) 31887db96d56Sopenharmony_ci 31897db96d56Sopenharmony_ci # Released views compare equal to themselves: 31907db96d56Sopenharmony_ci v = memoryview(a) 31917db96d56Sopenharmony_ci v.release() 31927db96d56Sopenharmony_ci self.assertEqual(v, v) 31937db96d56Sopenharmony_ci self.assertNotEqual(v, a) 31947db96d56Sopenharmony_ci self.assertNotEqual(a, v) 31957db96d56Sopenharmony_ci 31967db96d56Sopenharmony_ci v = memoryview(a) 31977db96d56Sopenharmony_ci w = memoryview(a) 31987db96d56Sopenharmony_ci w.release() 31997db96d56Sopenharmony_ci self.assertNotEqual(v, w) 32007db96d56Sopenharmony_ci self.assertNotEqual(w, v) 32017db96d56Sopenharmony_ci 32027db96d56Sopenharmony_ci # Operand does not implement the buffer protocol: 32037db96d56Sopenharmony_ci v = memoryview(a) 32047db96d56Sopenharmony_ci self.assertNotEqual(v, [1, 2, 3]) 32057db96d56Sopenharmony_ci 32067db96d56Sopenharmony_ci # NaNs 32077db96d56Sopenharmony_ci nd = ndarray([(0, 0)], shape=[1], format='l x d x', flags=ND_WRITABLE) 32087db96d56Sopenharmony_ci nd[0] = (-1, float('nan')) 32097db96d56Sopenharmony_ci self.assertNotEqual(memoryview(nd), nd) 32107db96d56Sopenharmony_ci 32117db96d56Sopenharmony_ci # Depends on issue #15625: the struct module does not understand 'u'. 32127db96d56Sopenharmony_ci a = array.array('u', 'xyz') 32137db96d56Sopenharmony_ci v = memoryview(a) 32147db96d56Sopenharmony_ci self.assertNotEqual(a, v) 32157db96d56Sopenharmony_ci self.assertNotEqual(v, a) 32167db96d56Sopenharmony_ci 32177db96d56Sopenharmony_ci # Some ctypes format strings are unknown to the struct module. 32187db96d56Sopenharmony_ci if ctypes: 32197db96d56Sopenharmony_ci # format: "T{>l:x:>l:y:}" 32207db96d56Sopenharmony_ci class BEPoint(ctypes.BigEndianStructure): 32217db96d56Sopenharmony_ci _fields_ = [("x", ctypes.c_long), ("y", ctypes.c_long)] 32227db96d56Sopenharmony_ci point = BEPoint(100, 200) 32237db96d56Sopenharmony_ci a = memoryview(point) 32247db96d56Sopenharmony_ci b = memoryview(point) 32257db96d56Sopenharmony_ci self.assertNotEqual(a, b) 32267db96d56Sopenharmony_ci self.assertNotEqual(a, point) 32277db96d56Sopenharmony_ci self.assertNotEqual(point, a) 32287db96d56Sopenharmony_ci self.assertRaises(NotImplementedError, a.tolist) 32297db96d56Sopenharmony_ci 32307db96d56Sopenharmony_ci def test_memoryview_compare_ndim_zero(self): 32317db96d56Sopenharmony_ci 32327db96d56Sopenharmony_ci nd1 = ndarray(1729, shape=[], format='@L') 32337db96d56Sopenharmony_ci nd2 = ndarray(1729, shape=[], format='L', flags=ND_WRITABLE) 32347db96d56Sopenharmony_ci v = memoryview(nd1) 32357db96d56Sopenharmony_ci w = memoryview(nd2) 32367db96d56Sopenharmony_ci self.assertEqual(v, w) 32377db96d56Sopenharmony_ci self.assertEqual(w, v) 32387db96d56Sopenharmony_ci self.assertEqual(v, nd2) 32397db96d56Sopenharmony_ci self.assertEqual(nd2, v) 32407db96d56Sopenharmony_ci self.assertEqual(w, nd1) 32417db96d56Sopenharmony_ci self.assertEqual(nd1, w) 32427db96d56Sopenharmony_ci 32437db96d56Sopenharmony_ci self.assertFalse(v.__ne__(w)) 32447db96d56Sopenharmony_ci self.assertFalse(w.__ne__(v)) 32457db96d56Sopenharmony_ci 32467db96d56Sopenharmony_ci w[()] = 1728 32477db96d56Sopenharmony_ci self.assertNotEqual(v, w) 32487db96d56Sopenharmony_ci self.assertNotEqual(w, v) 32497db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 32507db96d56Sopenharmony_ci self.assertNotEqual(nd2, v) 32517db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 32527db96d56Sopenharmony_ci self.assertNotEqual(nd1, w) 32537db96d56Sopenharmony_ci 32547db96d56Sopenharmony_ci self.assertFalse(v.__eq__(w)) 32557db96d56Sopenharmony_ci self.assertFalse(w.__eq__(v)) 32567db96d56Sopenharmony_ci 32577db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE|ND_PIL) 32587db96d56Sopenharmony_ci ex = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE|ND_PIL) 32597db96d56Sopenharmony_ci m = memoryview(ex) 32607db96d56Sopenharmony_ci 32617db96d56Sopenharmony_ci self.assertEqual(m, nd) 32627db96d56Sopenharmony_ci m[9] = 100 32637db96d56Sopenharmony_ci self.assertNotEqual(m, nd) 32647db96d56Sopenharmony_ci 32657db96d56Sopenharmony_ci # struct module: equal 32667db96d56Sopenharmony_ci nd1 = ndarray((1729, 1.2, b'12345'), shape=[], format='Lf5s') 32677db96d56Sopenharmony_ci nd2 = ndarray((1729, 1.2, b'12345'), shape=[], format='hf5s', 32687db96d56Sopenharmony_ci flags=ND_WRITABLE) 32697db96d56Sopenharmony_ci v = memoryview(nd1) 32707db96d56Sopenharmony_ci w = memoryview(nd2) 32717db96d56Sopenharmony_ci self.assertEqual(v, w) 32727db96d56Sopenharmony_ci self.assertEqual(w, v) 32737db96d56Sopenharmony_ci self.assertEqual(v, nd2) 32747db96d56Sopenharmony_ci self.assertEqual(nd2, v) 32757db96d56Sopenharmony_ci self.assertEqual(w, nd1) 32767db96d56Sopenharmony_ci self.assertEqual(nd1, w) 32777db96d56Sopenharmony_ci 32787db96d56Sopenharmony_ci # struct module: not equal 32797db96d56Sopenharmony_ci nd1 = ndarray((1729, 1.2, b'12345'), shape=[], format='Lf5s') 32807db96d56Sopenharmony_ci nd2 = ndarray((-1729, 1.2, b'12345'), shape=[], format='hf5s', 32817db96d56Sopenharmony_ci flags=ND_WRITABLE) 32827db96d56Sopenharmony_ci v = memoryview(nd1) 32837db96d56Sopenharmony_ci w = memoryview(nd2) 32847db96d56Sopenharmony_ci self.assertNotEqual(v, w) 32857db96d56Sopenharmony_ci self.assertNotEqual(w, v) 32867db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 32877db96d56Sopenharmony_ci self.assertNotEqual(nd2, v) 32887db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 32897db96d56Sopenharmony_ci self.assertNotEqual(nd1, w) 32907db96d56Sopenharmony_ci self.assertEqual(v, nd1) 32917db96d56Sopenharmony_ci self.assertEqual(w, nd2) 32927db96d56Sopenharmony_ci 32937db96d56Sopenharmony_ci def test_memoryview_compare_ndim_one(self): 32947db96d56Sopenharmony_ci 32957db96d56Sopenharmony_ci # contiguous 32967db96d56Sopenharmony_ci nd1 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='@h') 32977db96d56Sopenharmony_ci nd2 = ndarray([-529, 576, -625, 676, 729], shape=[5], format='@h') 32987db96d56Sopenharmony_ci v = memoryview(nd1) 32997db96d56Sopenharmony_ci w = memoryview(nd2) 33007db96d56Sopenharmony_ci 33017db96d56Sopenharmony_ci self.assertEqual(v, nd1) 33027db96d56Sopenharmony_ci self.assertEqual(w, nd2) 33037db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 33047db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 33057db96d56Sopenharmony_ci self.assertNotEqual(v, w) 33067db96d56Sopenharmony_ci 33077db96d56Sopenharmony_ci # contiguous, struct module 33087db96d56Sopenharmony_ci nd1 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='<i') 33097db96d56Sopenharmony_ci nd2 = ndarray([-529, 576, -625, 676, 729], shape=[5], format='>h') 33107db96d56Sopenharmony_ci v = memoryview(nd1) 33117db96d56Sopenharmony_ci w = memoryview(nd2) 33127db96d56Sopenharmony_ci 33137db96d56Sopenharmony_ci self.assertEqual(v, nd1) 33147db96d56Sopenharmony_ci self.assertEqual(w, nd2) 33157db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 33167db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 33177db96d56Sopenharmony_ci self.assertNotEqual(v, w) 33187db96d56Sopenharmony_ci 33197db96d56Sopenharmony_ci # non-contiguous 33207db96d56Sopenharmony_ci nd1 = ndarray([-529, -625, -729], shape=[3], format='@h') 33217db96d56Sopenharmony_ci nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='@h') 33227db96d56Sopenharmony_ci v = memoryview(nd1) 33237db96d56Sopenharmony_ci w = memoryview(nd2) 33247db96d56Sopenharmony_ci 33257db96d56Sopenharmony_ci self.assertEqual(v, nd2[::2]) 33267db96d56Sopenharmony_ci self.assertEqual(w[::2], nd1) 33277db96d56Sopenharmony_ci self.assertEqual(v, w[::2]) 33287db96d56Sopenharmony_ci self.assertEqual(v[::-1], w[::-2]) 33297db96d56Sopenharmony_ci 33307db96d56Sopenharmony_ci # non-contiguous, struct module 33317db96d56Sopenharmony_ci nd1 = ndarray([-529, -625, -729], shape=[3], format='!h') 33327db96d56Sopenharmony_ci nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='<l') 33337db96d56Sopenharmony_ci v = memoryview(nd1) 33347db96d56Sopenharmony_ci w = memoryview(nd2) 33357db96d56Sopenharmony_ci 33367db96d56Sopenharmony_ci self.assertEqual(v, nd2[::2]) 33377db96d56Sopenharmony_ci self.assertEqual(w[::2], nd1) 33387db96d56Sopenharmony_ci self.assertEqual(v, w[::2]) 33397db96d56Sopenharmony_ci self.assertEqual(v[::-1], w[::-2]) 33407db96d56Sopenharmony_ci 33417db96d56Sopenharmony_ci # non-contiguous, suboffsets 33427db96d56Sopenharmony_ci nd1 = ndarray([-529, -625, -729], shape=[3], format='@h') 33437db96d56Sopenharmony_ci nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='@h', 33447db96d56Sopenharmony_ci flags=ND_PIL) 33457db96d56Sopenharmony_ci v = memoryview(nd1) 33467db96d56Sopenharmony_ci w = memoryview(nd2) 33477db96d56Sopenharmony_ci 33487db96d56Sopenharmony_ci self.assertEqual(v, nd2[::2]) 33497db96d56Sopenharmony_ci self.assertEqual(w[::2], nd1) 33507db96d56Sopenharmony_ci self.assertEqual(v, w[::2]) 33517db96d56Sopenharmony_ci self.assertEqual(v[::-1], w[::-2]) 33527db96d56Sopenharmony_ci 33537db96d56Sopenharmony_ci # non-contiguous, suboffsets, struct module 33547db96d56Sopenharmony_ci nd1 = ndarray([-529, -625, -729], shape=[3], format='h 0c') 33557db96d56Sopenharmony_ci nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='> h', 33567db96d56Sopenharmony_ci flags=ND_PIL) 33577db96d56Sopenharmony_ci v = memoryview(nd1) 33587db96d56Sopenharmony_ci w = memoryview(nd2) 33597db96d56Sopenharmony_ci 33607db96d56Sopenharmony_ci self.assertEqual(v, nd2[::2]) 33617db96d56Sopenharmony_ci self.assertEqual(w[::2], nd1) 33627db96d56Sopenharmony_ci self.assertEqual(v, w[::2]) 33637db96d56Sopenharmony_ci self.assertEqual(v[::-1], w[::-2]) 33647db96d56Sopenharmony_ci 33657db96d56Sopenharmony_ci def test_memoryview_compare_zero_shape(self): 33667db96d56Sopenharmony_ci 33677db96d56Sopenharmony_ci # zeros in shape 33687db96d56Sopenharmony_ci nd1 = ndarray([900, 961], shape=[0], format='@h') 33697db96d56Sopenharmony_ci nd2 = ndarray([-900, -961], shape=[0], format='@h') 33707db96d56Sopenharmony_ci v = memoryview(nd1) 33717db96d56Sopenharmony_ci w = memoryview(nd2) 33727db96d56Sopenharmony_ci 33737db96d56Sopenharmony_ci self.assertEqual(v, nd1) 33747db96d56Sopenharmony_ci self.assertEqual(w, nd2) 33757db96d56Sopenharmony_ci self.assertEqual(v, nd2) 33767db96d56Sopenharmony_ci self.assertEqual(w, nd1) 33777db96d56Sopenharmony_ci self.assertEqual(v, w) 33787db96d56Sopenharmony_ci 33797db96d56Sopenharmony_ci # zeros in shape, struct module 33807db96d56Sopenharmony_ci nd1 = ndarray([900, 961], shape=[0], format='= h0c') 33817db96d56Sopenharmony_ci nd2 = ndarray([-900, -961], shape=[0], format='@ i') 33827db96d56Sopenharmony_ci v = memoryview(nd1) 33837db96d56Sopenharmony_ci w = memoryview(nd2) 33847db96d56Sopenharmony_ci 33857db96d56Sopenharmony_ci self.assertEqual(v, nd1) 33867db96d56Sopenharmony_ci self.assertEqual(w, nd2) 33877db96d56Sopenharmony_ci self.assertEqual(v, nd2) 33887db96d56Sopenharmony_ci self.assertEqual(w, nd1) 33897db96d56Sopenharmony_ci self.assertEqual(v, w) 33907db96d56Sopenharmony_ci 33917db96d56Sopenharmony_ci def test_memoryview_compare_zero_strides(self): 33927db96d56Sopenharmony_ci 33937db96d56Sopenharmony_ci # zero strides 33947db96d56Sopenharmony_ci nd1 = ndarray([900, 900, 900, 900], shape=[4], format='@L') 33957db96d56Sopenharmony_ci nd2 = ndarray([900], shape=[4], strides=[0], format='L') 33967db96d56Sopenharmony_ci v = memoryview(nd1) 33977db96d56Sopenharmony_ci w = memoryview(nd2) 33987db96d56Sopenharmony_ci 33997db96d56Sopenharmony_ci self.assertEqual(v, nd1) 34007db96d56Sopenharmony_ci self.assertEqual(w, nd2) 34017db96d56Sopenharmony_ci self.assertEqual(v, nd2) 34027db96d56Sopenharmony_ci self.assertEqual(w, nd1) 34037db96d56Sopenharmony_ci self.assertEqual(v, w) 34047db96d56Sopenharmony_ci 34057db96d56Sopenharmony_ci # zero strides, struct module 34067db96d56Sopenharmony_ci nd1 = ndarray([(900, 900)]*4, shape=[4], format='@ Li') 34077db96d56Sopenharmony_ci nd2 = ndarray([(900, 900)], shape=[4], strides=[0], format='!L h') 34087db96d56Sopenharmony_ci v = memoryview(nd1) 34097db96d56Sopenharmony_ci w = memoryview(nd2) 34107db96d56Sopenharmony_ci 34117db96d56Sopenharmony_ci self.assertEqual(v, nd1) 34127db96d56Sopenharmony_ci self.assertEqual(w, nd2) 34137db96d56Sopenharmony_ci self.assertEqual(v, nd2) 34147db96d56Sopenharmony_ci self.assertEqual(w, nd1) 34157db96d56Sopenharmony_ci self.assertEqual(v, w) 34167db96d56Sopenharmony_ci 34177db96d56Sopenharmony_ci def test_memoryview_compare_random_formats(self): 34187db96d56Sopenharmony_ci 34197db96d56Sopenharmony_ci # random single character native formats 34207db96d56Sopenharmony_ci n = 10 34217db96d56Sopenharmony_ci for char in fmtdict['@m']: 34227db96d56Sopenharmony_ci fmt, items, singleitem = randitems(n, 'memoryview', '@', char) 34237db96d56Sopenharmony_ci for flags in (0, ND_PIL): 34247db96d56Sopenharmony_ci nd = ndarray(items, shape=[n], format=fmt, flags=flags) 34257db96d56Sopenharmony_ci m = memoryview(nd) 34267db96d56Sopenharmony_ci self.assertEqual(m, nd) 34277db96d56Sopenharmony_ci 34287db96d56Sopenharmony_ci nd = nd[::-3] 34297db96d56Sopenharmony_ci m = memoryview(nd) 34307db96d56Sopenharmony_ci self.assertEqual(m, nd) 34317db96d56Sopenharmony_ci 34327db96d56Sopenharmony_ci # random formats 34337db96d56Sopenharmony_ci n = 10 34347db96d56Sopenharmony_ci for _ in range(100): 34357db96d56Sopenharmony_ci fmt, items, singleitem = randitems(n) 34367db96d56Sopenharmony_ci for flags in (0, ND_PIL): 34377db96d56Sopenharmony_ci nd = ndarray(items, shape=[n], format=fmt, flags=flags) 34387db96d56Sopenharmony_ci m = memoryview(nd) 34397db96d56Sopenharmony_ci self.assertEqual(m, nd) 34407db96d56Sopenharmony_ci 34417db96d56Sopenharmony_ci nd = nd[::-3] 34427db96d56Sopenharmony_ci m = memoryview(nd) 34437db96d56Sopenharmony_ci self.assertEqual(m, nd) 34447db96d56Sopenharmony_ci 34457db96d56Sopenharmony_ci def test_memoryview_compare_multidim_c(self): 34467db96d56Sopenharmony_ci 34477db96d56Sopenharmony_ci # C-contiguous, different values 34487db96d56Sopenharmony_ci nd1 = ndarray(list(range(-15, 15)), shape=[3, 2, 5], format='@h') 34497db96d56Sopenharmony_ci nd2 = ndarray(list(range(0, 30)), shape=[3, 2, 5], format='@h') 34507db96d56Sopenharmony_ci v = memoryview(nd1) 34517db96d56Sopenharmony_ci w = memoryview(nd2) 34527db96d56Sopenharmony_ci 34537db96d56Sopenharmony_ci self.assertEqual(v, nd1) 34547db96d56Sopenharmony_ci self.assertEqual(w, nd2) 34557db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 34567db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 34577db96d56Sopenharmony_ci self.assertNotEqual(v, w) 34587db96d56Sopenharmony_ci 34597db96d56Sopenharmony_ci # C-contiguous, different values, struct module 34607db96d56Sopenharmony_ci nd1 = ndarray([(0, 1, 2)]*30, shape=[3, 2, 5], format='=f q xxL') 34617db96d56Sopenharmony_ci nd2 = ndarray([(-1.2, 1, 2)]*30, shape=[3, 2, 5], format='< f 2Q') 34627db96d56Sopenharmony_ci v = memoryview(nd1) 34637db96d56Sopenharmony_ci w = memoryview(nd2) 34647db96d56Sopenharmony_ci 34657db96d56Sopenharmony_ci self.assertEqual(v, nd1) 34667db96d56Sopenharmony_ci self.assertEqual(w, nd2) 34677db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 34687db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 34697db96d56Sopenharmony_ci self.assertNotEqual(v, w) 34707db96d56Sopenharmony_ci 34717db96d56Sopenharmony_ci # C-contiguous, different shape 34727db96d56Sopenharmony_ci nd1 = ndarray(list(range(30)), shape=[2, 3, 5], format='L') 34737db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='L') 34747db96d56Sopenharmony_ci v = memoryview(nd1) 34757db96d56Sopenharmony_ci w = memoryview(nd2) 34767db96d56Sopenharmony_ci 34777db96d56Sopenharmony_ci self.assertEqual(v, nd1) 34787db96d56Sopenharmony_ci self.assertEqual(w, nd2) 34797db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 34807db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 34817db96d56Sopenharmony_ci self.assertNotEqual(v, w) 34827db96d56Sopenharmony_ci 34837db96d56Sopenharmony_ci # C-contiguous, different shape, struct module 34847db96d56Sopenharmony_ci nd1 = ndarray([(0, 1, 2)]*21, shape=[3, 7], format='! b B xL') 34857db96d56Sopenharmony_ci nd2 = ndarray([(0, 1, 2)]*21, shape=[7, 3], format='= Qx l xxL') 34867db96d56Sopenharmony_ci v = memoryview(nd1) 34877db96d56Sopenharmony_ci w = memoryview(nd2) 34887db96d56Sopenharmony_ci 34897db96d56Sopenharmony_ci self.assertEqual(v, nd1) 34907db96d56Sopenharmony_ci self.assertEqual(w, nd2) 34917db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 34927db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 34937db96d56Sopenharmony_ci self.assertNotEqual(v, w) 34947db96d56Sopenharmony_ci 34957db96d56Sopenharmony_ci # C-contiguous, different format, struct module 34967db96d56Sopenharmony_ci nd1 = ndarray(list(range(30)), shape=[2, 3, 5], format='L') 34977db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[2, 3, 5], format='l') 34987db96d56Sopenharmony_ci v = memoryview(nd1) 34997db96d56Sopenharmony_ci w = memoryview(nd2) 35007db96d56Sopenharmony_ci 35017db96d56Sopenharmony_ci self.assertEqual(v, nd1) 35027db96d56Sopenharmony_ci self.assertEqual(w, nd2) 35037db96d56Sopenharmony_ci self.assertEqual(v, nd2) 35047db96d56Sopenharmony_ci self.assertEqual(w, nd1) 35057db96d56Sopenharmony_ci self.assertEqual(v, w) 35067db96d56Sopenharmony_ci 35077db96d56Sopenharmony_ci def test_memoryview_compare_multidim_fortran(self): 35087db96d56Sopenharmony_ci 35097db96d56Sopenharmony_ci # Fortran-contiguous, different values 35107db96d56Sopenharmony_ci nd1 = ndarray(list(range(-15, 15)), shape=[5, 2, 3], format='@h', 35117db96d56Sopenharmony_ci flags=ND_FORTRAN) 35127db96d56Sopenharmony_ci nd2 = ndarray(list(range(0, 30)), shape=[5, 2, 3], format='@h', 35137db96d56Sopenharmony_ci flags=ND_FORTRAN) 35147db96d56Sopenharmony_ci v = memoryview(nd1) 35157db96d56Sopenharmony_ci w = memoryview(nd2) 35167db96d56Sopenharmony_ci 35177db96d56Sopenharmony_ci self.assertEqual(v, nd1) 35187db96d56Sopenharmony_ci self.assertEqual(w, nd2) 35197db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 35207db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 35217db96d56Sopenharmony_ci self.assertNotEqual(v, w) 35227db96d56Sopenharmony_ci 35237db96d56Sopenharmony_ci # Fortran-contiguous, different values, struct module 35247db96d56Sopenharmony_ci nd1 = ndarray([(2**64-1, -1)]*6, shape=[2, 3], format='=Qq', 35257db96d56Sopenharmony_ci flags=ND_FORTRAN) 35267db96d56Sopenharmony_ci nd2 = ndarray([(-1, 2**64-1)]*6, shape=[2, 3], format='=qQ', 35277db96d56Sopenharmony_ci flags=ND_FORTRAN) 35287db96d56Sopenharmony_ci v = memoryview(nd1) 35297db96d56Sopenharmony_ci w = memoryview(nd2) 35307db96d56Sopenharmony_ci 35317db96d56Sopenharmony_ci self.assertEqual(v, nd1) 35327db96d56Sopenharmony_ci self.assertEqual(w, nd2) 35337db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 35347db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 35357db96d56Sopenharmony_ci self.assertNotEqual(v, w) 35367db96d56Sopenharmony_ci 35377db96d56Sopenharmony_ci # Fortran-contiguous, different shape 35387db96d56Sopenharmony_ci nd1 = ndarray(list(range(-15, 15)), shape=[2, 3, 5], format='l', 35397db96d56Sopenharmony_ci flags=ND_FORTRAN) 35407db96d56Sopenharmony_ci nd2 = ndarray(list(range(-15, 15)), shape=[3, 2, 5], format='l', 35417db96d56Sopenharmony_ci flags=ND_FORTRAN) 35427db96d56Sopenharmony_ci v = memoryview(nd1) 35437db96d56Sopenharmony_ci w = memoryview(nd2) 35447db96d56Sopenharmony_ci 35457db96d56Sopenharmony_ci self.assertEqual(v, nd1) 35467db96d56Sopenharmony_ci self.assertEqual(w, nd2) 35477db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 35487db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 35497db96d56Sopenharmony_ci self.assertNotEqual(v, w) 35507db96d56Sopenharmony_ci 35517db96d56Sopenharmony_ci # Fortran-contiguous, different shape, struct module 35527db96d56Sopenharmony_ci nd1 = ndarray(list(range(-15, 15)), shape=[2, 3, 5], format='0ll', 35537db96d56Sopenharmony_ci flags=ND_FORTRAN) 35547db96d56Sopenharmony_ci nd2 = ndarray(list(range(-15, 15)), shape=[3, 2, 5], format='l', 35557db96d56Sopenharmony_ci flags=ND_FORTRAN) 35567db96d56Sopenharmony_ci v = memoryview(nd1) 35577db96d56Sopenharmony_ci w = memoryview(nd2) 35587db96d56Sopenharmony_ci 35597db96d56Sopenharmony_ci self.assertEqual(v, nd1) 35607db96d56Sopenharmony_ci self.assertEqual(w, nd2) 35617db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 35627db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 35637db96d56Sopenharmony_ci self.assertNotEqual(v, w) 35647db96d56Sopenharmony_ci 35657db96d56Sopenharmony_ci # Fortran-contiguous, different format, struct module 35667db96d56Sopenharmony_ci nd1 = ndarray(list(range(30)), shape=[5, 2, 3], format='@h', 35677db96d56Sopenharmony_ci flags=ND_FORTRAN) 35687db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[5, 2, 3], format='@b', 35697db96d56Sopenharmony_ci flags=ND_FORTRAN) 35707db96d56Sopenharmony_ci v = memoryview(nd1) 35717db96d56Sopenharmony_ci w = memoryview(nd2) 35727db96d56Sopenharmony_ci 35737db96d56Sopenharmony_ci self.assertEqual(v, nd1) 35747db96d56Sopenharmony_ci self.assertEqual(w, nd2) 35757db96d56Sopenharmony_ci self.assertEqual(v, nd2) 35767db96d56Sopenharmony_ci self.assertEqual(w, nd1) 35777db96d56Sopenharmony_ci self.assertEqual(v, w) 35787db96d56Sopenharmony_ci 35797db96d56Sopenharmony_ci def test_memoryview_compare_multidim_mixed(self): 35807db96d56Sopenharmony_ci 35817db96d56Sopenharmony_ci # mixed C/Fortran contiguous 35827db96d56Sopenharmony_ci lst1 = list(range(-15, 15)) 35837db96d56Sopenharmony_ci lst2 = transpose(lst1, [3, 2, 5]) 35847db96d56Sopenharmony_ci nd1 = ndarray(lst1, shape=[3, 2, 5], format='@l') 35857db96d56Sopenharmony_ci nd2 = ndarray(lst2, shape=[3, 2, 5], format='l', flags=ND_FORTRAN) 35867db96d56Sopenharmony_ci v = memoryview(nd1) 35877db96d56Sopenharmony_ci w = memoryview(nd2) 35887db96d56Sopenharmony_ci 35897db96d56Sopenharmony_ci self.assertEqual(v, nd1) 35907db96d56Sopenharmony_ci self.assertEqual(w, nd2) 35917db96d56Sopenharmony_ci self.assertEqual(v, w) 35927db96d56Sopenharmony_ci 35937db96d56Sopenharmony_ci # mixed C/Fortran contiguous, struct module 35947db96d56Sopenharmony_ci lst1 = [(-3.3, -22, b'x')]*30 35957db96d56Sopenharmony_ci lst1[5] = (-2.2, -22, b'x') 35967db96d56Sopenharmony_ci lst2 = transpose(lst1, [3, 2, 5]) 35977db96d56Sopenharmony_ci nd1 = ndarray(lst1, shape=[3, 2, 5], format='d b c') 35987db96d56Sopenharmony_ci nd2 = ndarray(lst2, shape=[3, 2, 5], format='d h c', flags=ND_FORTRAN) 35997db96d56Sopenharmony_ci v = memoryview(nd1) 36007db96d56Sopenharmony_ci w = memoryview(nd2) 36017db96d56Sopenharmony_ci 36027db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36037db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36047db96d56Sopenharmony_ci self.assertEqual(v, w) 36057db96d56Sopenharmony_ci 36067db96d56Sopenharmony_ci # different values, non-contiguous 36077db96d56Sopenharmony_ci ex1 = ndarray(list(range(40)), shape=[5, 8], format='@I') 36087db96d56Sopenharmony_ci nd1 = ex1[3:1:-1, ::-2] 36097db96d56Sopenharmony_ci ex2 = ndarray(list(range(40)), shape=[5, 8], format='I') 36107db96d56Sopenharmony_ci nd2 = ex2[1:3:1, ::-2] 36117db96d56Sopenharmony_ci v = memoryview(nd1) 36127db96d56Sopenharmony_ci w = memoryview(nd2) 36137db96d56Sopenharmony_ci 36147db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36157db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36167db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 36177db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 36187db96d56Sopenharmony_ci self.assertNotEqual(v, w) 36197db96d56Sopenharmony_ci 36207db96d56Sopenharmony_ci # same values, non-contiguous, struct module 36217db96d56Sopenharmony_ci ex1 = ndarray([(2**31-1, -2**31)]*22, shape=[11, 2], format='=ii') 36227db96d56Sopenharmony_ci nd1 = ex1[3:1:-1, ::-2] 36237db96d56Sopenharmony_ci ex2 = ndarray([(2**31-1, -2**31)]*22, shape=[11, 2], format='>ii') 36247db96d56Sopenharmony_ci nd2 = ex2[1:3:1, ::-2] 36257db96d56Sopenharmony_ci v = memoryview(nd1) 36267db96d56Sopenharmony_ci w = memoryview(nd2) 36277db96d56Sopenharmony_ci 36287db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36297db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36307db96d56Sopenharmony_ci self.assertEqual(v, nd2) 36317db96d56Sopenharmony_ci self.assertEqual(w, nd1) 36327db96d56Sopenharmony_ci self.assertEqual(v, w) 36337db96d56Sopenharmony_ci 36347db96d56Sopenharmony_ci # different shape 36357db96d56Sopenharmony_ci ex1 = ndarray(list(range(30)), shape=[2, 3, 5], format='b') 36367db96d56Sopenharmony_ci nd1 = ex1[1:3:, ::-2] 36377db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='b') 36387db96d56Sopenharmony_ci nd2 = ex2[1:3:, ::-2] 36397db96d56Sopenharmony_ci v = memoryview(nd1) 36407db96d56Sopenharmony_ci w = memoryview(nd2) 36417db96d56Sopenharmony_ci 36427db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36437db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36447db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 36457db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 36467db96d56Sopenharmony_ci self.assertNotEqual(v, w) 36477db96d56Sopenharmony_ci 36487db96d56Sopenharmony_ci # different shape, struct module 36497db96d56Sopenharmony_ci ex1 = ndarray(list(range(30)), shape=[2, 3, 5], format='B') 36507db96d56Sopenharmony_ci nd1 = ex1[1:3:, ::-2] 36517db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='b') 36527db96d56Sopenharmony_ci nd2 = ex2[1:3:, ::-2] 36537db96d56Sopenharmony_ci v = memoryview(nd1) 36547db96d56Sopenharmony_ci w = memoryview(nd2) 36557db96d56Sopenharmony_ci 36567db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36577db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36587db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 36597db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 36607db96d56Sopenharmony_ci self.assertNotEqual(v, w) 36617db96d56Sopenharmony_ci 36627db96d56Sopenharmony_ci # different format, struct module 36637db96d56Sopenharmony_ci ex1 = ndarray([(2, b'123')]*30, shape=[5, 3, 2], format='b3s') 36647db96d56Sopenharmony_ci nd1 = ex1[1:3:, ::-2] 36657db96d56Sopenharmony_ci nd2 = ndarray([(2, b'123')]*30, shape=[5, 3, 2], format='i3s') 36667db96d56Sopenharmony_ci nd2 = ex2[1:3:, ::-2] 36677db96d56Sopenharmony_ci v = memoryview(nd1) 36687db96d56Sopenharmony_ci w = memoryview(nd2) 36697db96d56Sopenharmony_ci 36707db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36717db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36727db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 36737db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 36747db96d56Sopenharmony_ci self.assertNotEqual(v, w) 36757db96d56Sopenharmony_ci 36767db96d56Sopenharmony_ci def test_memoryview_compare_multidim_zero_shape(self): 36777db96d56Sopenharmony_ci 36787db96d56Sopenharmony_ci # zeros in shape 36797db96d56Sopenharmony_ci nd1 = ndarray(list(range(30)), shape=[0, 3, 2], format='i') 36807db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[5, 0, 2], format='@i') 36817db96d56Sopenharmony_ci v = memoryview(nd1) 36827db96d56Sopenharmony_ci w = memoryview(nd2) 36837db96d56Sopenharmony_ci 36847db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36857db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36867db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 36877db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 36887db96d56Sopenharmony_ci self.assertNotEqual(v, w) 36897db96d56Sopenharmony_ci 36907db96d56Sopenharmony_ci # zeros in shape, struct module 36917db96d56Sopenharmony_ci nd1 = ndarray(list(range(30)), shape=[0, 3, 2], format='i') 36927db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[5, 0, 2], format='@i') 36937db96d56Sopenharmony_ci v = memoryview(nd1) 36947db96d56Sopenharmony_ci w = memoryview(nd2) 36957db96d56Sopenharmony_ci 36967db96d56Sopenharmony_ci self.assertEqual(v, nd1) 36977db96d56Sopenharmony_ci self.assertEqual(w, nd2) 36987db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 36997db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 37007db96d56Sopenharmony_ci self.assertNotEqual(v, w) 37017db96d56Sopenharmony_ci 37027db96d56Sopenharmony_ci def test_memoryview_compare_multidim_zero_strides(self): 37037db96d56Sopenharmony_ci 37047db96d56Sopenharmony_ci # zero strides 37057db96d56Sopenharmony_ci nd1 = ndarray([900]*80, shape=[4, 5, 4], format='@L') 37067db96d56Sopenharmony_ci nd2 = ndarray([900], shape=[4, 5, 4], strides=[0, 0, 0], format='L') 37077db96d56Sopenharmony_ci v = memoryview(nd1) 37087db96d56Sopenharmony_ci w = memoryview(nd2) 37097db96d56Sopenharmony_ci 37107db96d56Sopenharmony_ci self.assertEqual(v, nd1) 37117db96d56Sopenharmony_ci self.assertEqual(w, nd2) 37127db96d56Sopenharmony_ci self.assertEqual(v, nd2) 37137db96d56Sopenharmony_ci self.assertEqual(w, nd1) 37147db96d56Sopenharmony_ci self.assertEqual(v, w) 37157db96d56Sopenharmony_ci self.assertEqual(v.tolist(), w.tolist()) 37167db96d56Sopenharmony_ci 37177db96d56Sopenharmony_ci # zero strides, struct module 37187db96d56Sopenharmony_ci nd1 = ndarray([(1, 2)]*10, shape=[2, 5], format='=lQ') 37197db96d56Sopenharmony_ci nd2 = ndarray([(1, 2)], shape=[2, 5], strides=[0, 0], format='<lQ') 37207db96d56Sopenharmony_ci v = memoryview(nd1) 37217db96d56Sopenharmony_ci w = memoryview(nd2) 37227db96d56Sopenharmony_ci 37237db96d56Sopenharmony_ci self.assertEqual(v, nd1) 37247db96d56Sopenharmony_ci self.assertEqual(w, nd2) 37257db96d56Sopenharmony_ci self.assertEqual(v, nd2) 37267db96d56Sopenharmony_ci self.assertEqual(w, nd1) 37277db96d56Sopenharmony_ci self.assertEqual(v, w) 37287db96d56Sopenharmony_ci 37297db96d56Sopenharmony_ci def test_memoryview_compare_multidim_suboffsets(self): 37307db96d56Sopenharmony_ci 37317db96d56Sopenharmony_ci # suboffsets 37327db96d56Sopenharmony_ci ex1 = ndarray(list(range(40)), shape=[5, 8], format='@I') 37337db96d56Sopenharmony_ci nd1 = ex1[3:1:-1, ::-2] 37347db96d56Sopenharmony_ci ex2 = ndarray(list(range(40)), shape=[5, 8], format='I', flags=ND_PIL) 37357db96d56Sopenharmony_ci nd2 = ex2[1:3:1, ::-2] 37367db96d56Sopenharmony_ci v = memoryview(nd1) 37377db96d56Sopenharmony_ci w = memoryview(nd2) 37387db96d56Sopenharmony_ci 37397db96d56Sopenharmony_ci self.assertEqual(v, nd1) 37407db96d56Sopenharmony_ci self.assertEqual(w, nd2) 37417db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 37427db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 37437db96d56Sopenharmony_ci self.assertNotEqual(v, w) 37447db96d56Sopenharmony_ci 37457db96d56Sopenharmony_ci # suboffsets, struct module 37467db96d56Sopenharmony_ci ex1 = ndarray([(2**64-1, -1)]*40, shape=[5, 8], format='=Qq', 37477db96d56Sopenharmony_ci flags=ND_WRITABLE) 37487db96d56Sopenharmony_ci ex1[2][7] = (1, -2) 37497db96d56Sopenharmony_ci nd1 = ex1[3:1:-1, ::-2] 37507db96d56Sopenharmony_ci 37517db96d56Sopenharmony_ci ex2 = ndarray([(2**64-1, -1)]*40, shape=[5, 8], format='>Qq', 37527db96d56Sopenharmony_ci flags=ND_PIL|ND_WRITABLE) 37537db96d56Sopenharmony_ci ex2[2][7] = (1, -2) 37547db96d56Sopenharmony_ci nd2 = ex2[1:3:1, ::-2] 37557db96d56Sopenharmony_ci 37567db96d56Sopenharmony_ci v = memoryview(nd1) 37577db96d56Sopenharmony_ci w = memoryview(nd2) 37587db96d56Sopenharmony_ci 37597db96d56Sopenharmony_ci self.assertEqual(v, nd1) 37607db96d56Sopenharmony_ci self.assertEqual(w, nd2) 37617db96d56Sopenharmony_ci self.assertEqual(v, nd2) 37627db96d56Sopenharmony_ci self.assertEqual(w, nd1) 37637db96d56Sopenharmony_ci self.assertEqual(v, w) 37647db96d56Sopenharmony_ci 37657db96d56Sopenharmony_ci # suboffsets, different shape 37667db96d56Sopenharmony_ci ex1 = ndarray(list(range(30)), shape=[2, 3, 5], format='b', 37677db96d56Sopenharmony_ci flags=ND_PIL) 37687db96d56Sopenharmony_ci nd1 = ex1[1:3:, ::-2] 37697db96d56Sopenharmony_ci nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='b') 37707db96d56Sopenharmony_ci nd2 = ex2[1:3:, ::-2] 37717db96d56Sopenharmony_ci v = memoryview(nd1) 37727db96d56Sopenharmony_ci w = memoryview(nd2) 37737db96d56Sopenharmony_ci 37747db96d56Sopenharmony_ci self.assertEqual(v, nd1) 37757db96d56Sopenharmony_ci self.assertEqual(w, nd2) 37767db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 37777db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 37787db96d56Sopenharmony_ci self.assertNotEqual(v, w) 37797db96d56Sopenharmony_ci 37807db96d56Sopenharmony_ci # suboffsets, different shape, struct module 37817db96d56Sopenharmony_ci ex1 = ndarray([(2**8-1, -1)]*40, shape=[2, 3, 5], format='Bb', 37827db96d56Sopenharmony_ci flags=ND_PIL|ND_WRITABLE) 37837db96d56Sopenharmony_ci nd1 = ex1[1:2:, ::-2] 37847db96d56Sopenharmony_ci 37857db96d56Sopenharmony_ci ex2 = ndarray([(2**8-1, -1)]*40, shape=[3, 2, 5], format='Bb') 37867db96d56Sopenharmony_ci nd2 = ex2[1:2:, ::-2] 37877db96d56Sopenharmony_ci 37887db96d56Sopenharmony_ci v = memoryview(nd1) 37897db96d56Sopenharmony_ci w = memoryview(nd2) 37907db96d56Sopenharmony_ci 37917db96d56Sopenharmony_ci self.assertEqual(v, nd1) 37927db96d56Sopenharmony_ci self.assertEqual(w, nd2) 37937db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 37947db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 37957db96d56Sopenharmony_ci self.assertNotEqual(v, w) 37967db96d56Sopenharmony_ci 37977db96d56Sopenharmony_ci # suboffsets, different format 37987db96d56Sopenharmony_ci ex1 = ndarray(list(range(30)), shape=[5, 3, 2], format='i', flags=ND_PIL) 37997db96d56Sopenharmony_ci nd1 = ex1[1:3:, ::-2] 38007db96d56Sopenharmony_ci ex2 = ndarray(list(range(30)), shape=[5, 3, 2], format='@I', flags=ND_PIL) 38017db96d56Sopenharmony_ci nd2 = ex2[1:3:, ::-2] 38027db96d56Sopenharmony_ci v = memoryview(nd1) 38037db96d56Sopenharmony_ci w = memoryview(nd2) 38047db96d56Sopenharmony_ci 38057db96d56Sopenharmony_ci self.assertEqual(v, nd1) 38067db96d56Sopenharmony_ci self.assertEqual(w, nd2) 38077db96d56Sopenharmony_ci self.assertEqual(v, nd2) 38087db96d56Sopenharmony_ci self.assertEqual(w, nd1) 38097db96d56Sopenharmony_ci self.assertEqual(v, w) 38107db96d56Sopenharmony_ci 38117db96d56Sopenharmony_ci # suboffsets, different format, struct module 38127db96d56Sopenharmony_ci ex1 = ndarray([(b'hello', b'', 1)]*27, shape=[3, 3, 3], format='5s0sP', 38137db96d56Sopenharmony_ci flags=ND_PIL|ND_WRITABLE) 38147db96d56Sopenharmony_ci ex1[1][2][2] = (b'sushi', b'', 1) 38157db96d56Sopenharmony_ci nd1 = ex1[1:3:, ::-2] 38167db96d56Sopenharmony_ci 38177db96d56Sopenharmony_ci ex2 = ndarray([(b'hello', b'', 1)]*27, shape=[3, 3, 3], format='5s0sP', 38187db96d56Sopenharmony_ci flags=ND_PIL|ND_WRITABLE) 38197db96d56Sopenharmony_ci ex1[1][2][2] = (b'sushi', b'', 1) 38207db96d56Sopenharmony_ci nd2 = ex2[1:3:, ::-2] 38217db96d56Sopenharmony_ci 38227db96d56Sopenharmony_ci v = memoryview(nd1) 38237db96d56Sopenharmony_ci w = memoryview(nd2) 38247db96d56Sopenharmony_ci 38257db96d56Sopenharmony_ci self.assertEqual(v, nd1) 38267db96d56Sopenharmony_ci self.assertEqual(w, nd2) 38277db96d56Sopenharmony_ci self.assertNotEqual(v, nd2) 38287db96d56Sopenharmony_ci self.assertNotEqual(w, nd1) 38297db96d56Sopenharmony_ci self.assertNotEqual(v, w) 38307db96d56Sopenharmony_ci 38317db96d56Sopenharmony_ci # initialize mixed C/Fortran + suboffsets 38327db96d56Sopenharmony_ci lst1 = list(range(-15, 15)) 38337db96d56Sopenharmony_ci lst2 = transpose(lst1, [3, 2, 5]) 38347db96d56Sopenharmony_ci nd1 = ndarray(lst1, shape=[3, 2, 5], format='@l', flags=ND_PIL) 38357db96d56Sopenharmony_ci nd2 = ndarray(lst2, shape=[3, 2, 5], format='l', flags=ND_FORTRAN|ND_PIL) 38367db96d56Sopenharmony_ci v = memoryview(nd1) 38377db96d56Sopenharmony_ci w = memoryview(nd2) 38387db96d56Sopenharmony_ci 38397db96d56Sopenharmony_ci self.assertEqual(v, nd1) 38407db96d56Sopenharmony_ci self.assertEqual(w, nd2) 38417db96d56Sopenharmony_ci self.assertEqual(v, w) 38427db96d56Sopenharmony_ci 38437db96d56Sopenharmony_ci # initialize mixed C/Fortran + suboffsets, struct module 38447db96d56Sopenharmony_ci lst1 = [(b'sashimi', b'sliced', 20.05)]*30 38457db96d56Sopenharmony_ci lst1[11] = (b'ramen', b'spicy', 9.45) 38467db96d56Sopenharmony_ci lst2 = transpose(lst1, [3, 2, 5]) 38477db96d56Sopenharmony_ci 38487db96d56Sopenharmony_ci nd1 = ndarray(lst1, shape=[3, 2, 5], format='< 10p 9p d', flags=ND_PIL) 38497db96d56Sopenharmony_ci nd2 = ndarray(lst2, shape=[3, 2, 5], format='> 10p 9p d', 38507db96d56Sopenharmony_ci flags=ND_FORTRAN|ND_PIL) 38517db96d56Sopenharmony_ci v = memoryview(nd1) 38527db96d56Sopenharmony_ci w = memoryview(nd2) 38537db96d56Sopenharmony_ci 38547db96d56Sopenharmony_ci self.assertEqual(v, nd1) 38557db96d56Sopenharmony_ci self.assertEqual(w, nd2) 38567db96d56Sopenharmony_ci self.assertEqual(v, w) 38577db96d56Sopenharmony_ci 38587db96d56Sopenharmony_ci def test_memoryview_compare_not_equal(self): 38597db96d56Sopenharmony_ci 38607db96d56Sopenharmony_ci # items not equal 38617db96d56Sopenharmony_ci for byteorder in ['=', '<', '>', '!']: 38627db96d56Sopenharmony_ci x = ndarray([2**63]*120, shape=[3,5,2,2,2], format=byteorder+'Q') 38637db96d56Sopenharmony_ci y = ndarray([2**63]*120, shape=[3,5,2,2,2], format=byteorder+'Q', 38647db96d56Sopenharmony_ci flags=ND_WRITABLE|ND_FORTRAN) 38657db96d56Sopenharmony_ci y[2][3][1][1][1] = 1 38667db96d56Sopenharmony_ci a = memoryview(x) 38677db96d56Sopenharmony_ci b = memoryview(y) 38687db96d56Sopenharmony_ci self.assertEqual(a, x) 38697db96d56Sopenharmony_ci self.assertEqual(b, y) 38707db96d56Sopenharmony_ci self.assertNotEqual(a, b) 38717db96d56Sopenharmony_ci self.assertNotEqual(a, y) 38727db96d56Sopenharmony_ci self.assertNotEqual(b, x) 38737db96d56Sopenharmony_ci 38747db96d56Sopenharmony_ci x = ndarray([(2**63, 2**31, 2**15)]*120, shape=[3,5,2,2,2], 38757db96d56Sopenharmony_ci format=byteorder+'QLH') 38767db96d56Sopenharmony_ci y = ndarray([(2**63, 2**31, 2**15)]*120, shape=[3,5,2,2,2], 38777db96d56Sopenharmony_ci format=byteorder+'QLH', flags=ND_WRITABLE|ND_FORTRAN) 38787db96d56Sopenharmony_ci y[2][3][1][1][1] = (1, 1, 1) 38797db96d56Sopenharmony_ci a = memoryview(x) 38807db96d56Sopenharmony_ci b = memoryview(y) 38817db96d56Sopenharmony_ci self.assertEqual(a, x) 38827db96d56Sopenharmony_ci self.assertEqual(b, y) 38837db96d56Sopenharmony_ci self.assertNotEqual(a, b) 38847db96d56Sopenharmony_ci self.assertNotEqual(a, y) 38857db96d56Sopenharmony_ci self.assertNotEqual(b, x) 38867db96d56Sopenharmony_ci 38877db96d56Sopenharmony_ci def test_memoryview_check_released(self): 38887db96d56Sopenharmony_ci 38897db96d56Sopenharmony_ci a = array.array('d', [1.1, 2.2, 3.3]) 38907db96d56Sopenharmony_ci 38917db96d56Sopenharmony_ci m = memoryview(a) 38927db96d56Sopenharmony_ci m.release() 38937db96d56Sopenharmony_ci 38947db96d56Sopenharmony_ci # PyMemoryView_FromObject() 38957db96d56Sopenharmony_ci self.assertRaises(ValueError, memoryview, m) 38967db96d56Sopenharmony_ci # memoryview.cast() 38977db96d56Sopenharmony_ci self.assertRaises(ValueError, m.cast, 'c') 38987db96d56Sopenharmony_ci # getbuffer() 38997db96d56Sopenharmony_ci self.assertRaises(ValueError, ndarray, m) 39007db96d56Sopenharmony_ci # memoryview.tolist() 39017db96d56Sopenharmony_ci self.assertRaises(ValueError, m.tolist) 39027db96d56Sopenharmony_ci # memoryview.tobytes() 39037db96d56Sopenharmony_ci self.assertRaises(ValueError, m.tobytes) 39047db96d56Sopenharmony_ci # sequence 39057db96d56Sopenharmony_ci self.assertRaises(ValueError, eval, "1.0 in m", locals()) 39067db96d56Sopenharmony_ci # subscript 39077db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__getitem__, 0) 39087db96d56Sopenharmony_ci # assignment 39097db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__setitem__, 0, 1) 39107db96d56Sopenharmony_ci 39117db96d56Sopenharmony_ci for attr in ('obj', 'nbytes', 'readonly', 'itemsize', 'format', 'ndim', 39127db96d56Sopenharmony_ci 'shape', 'strides', 'suboffsets', 'c_contiguous', 39137db96d56Sopenharmony_ci 'f_contiguous', 'contiguous'): 39147db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__getattribute__, attr) 39157db96d56Sopenharmony_ci 39167db96d56Sopenharmony_ci # richcompare 39177db96d56Sopenharmony_ci b = array.array('d', [1.1, 2.2, 3.3]) 39187db96d56Sopenharmony_ci m1 = memoryview(a) 39197db96d56Sopenharmony_ci m2 = memoryview(b) 39207db96d56Sopenharmony_ci 39217db96d56Sopenharmony_ci self.assertEqual(m1, m2) 39227db96d56Sopenharmony_ci m1.release() 39237db96d56Sopenharmony_ci self.assertNotEqual(m1, m2) 39247db96d56Sopenharmony_ci self.assertNotEqual(m1, a) 39257db96d56Sopenharmony_ci self.assertEqual(m1, m1) 39267db96d56Sopenharmony_ci 39277db96d56Sopenharmony_ci def test_memoryview_tobytes(self): 39287db96d56Sopenharmony_ci # Many implicit tests are already in self.verify(). 39297db96d56Sopenharmony_ci 39307db96d56Sopenharmony_ci t = (-529, 576, -625, 676, -729) 39317db96d56Sopenharmony_ci 39327db96d56Sopenharmony_ci nd = ndarray(t, shape=[5], format='@h') 39337db96d56Sopenharmony_ci m = memoryview(nd) 39347db96d56Sopenharmony_ci self.assertEqual(m, nd) 39357db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), nd.tobytes()) 39367db96d56Sopenharmony_ci 39377db96d56Sopenharmony_ci nd = ndarray([t], shape=[1], format='>hQiLl') 39387db96d56Sopenharmony_ci m = memoryview(nd) 39397db96d56Sopenharmony_ci self.assertEqual(m, nd) 39407db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), nd.tobytes()) 39417db96d56Sopenharmony_ci 39427db96d56Sopenharmony_ci nd = ndarray([t for _ in range(12)], shape=[2,2,3], format='=hQiLl') 39437db96d56Sopenharmony_ci m = memoryview(nd) 39447db96d56Sopenharmony_ci self.assertEqual(m, nd) 39457db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), nd.tobytes()) 39467db96d56Sopenharmony_ci 39477db96d56Sopenharmony_ci nd = ndarray([t for _ in range(120)], shape=[5,2,2,3,2], 39487db96d56Sopenharmony_ci format='<hQiLl') 39497db96d56Sopenharmony_ci m = memoryview(nd) 39507db96d56Sopenharmony_ci self.assertEqual(m, nd) 39517db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), nd.tobytes()) 39527db96d56Sopenharmony_ci 39537db96d56Sopenharmony_ci # Unknown formats are handled: tobytes() purely depends on itemsize. 39547db96d56Sopenharmony_ci if ctypes: 39557db96d56Sopenharmony_ci # format: "T{>l:x:>l:y:}" 39567db96d56Sopenharmony_ci class BEPoint(ctypes.BigEndianStructure): 39577db96d56Sopenharmony_ci _fields_ = [("x", ctypes.c_long), ("y", ctypes.c_long)] 39587db96d56Sopenharmony_ci point = BEPoint(100, 200) 39597db96d56Sopenharmony_ci a = memoryview(point) 39607db96d56Sopenharmony_ci self.assertEqual(a.tobytes(), bytes(point)) 39617db96d56Sopenharmony_ci 39627db96d56Sopenharmony_ci def test_memoryview_get_contiguous(self): 39637db96d56Sopenharmony_ci # Many implicit tests are already in self.verify(). 39647db96d56Sopenharmony_ci 39657db96d56Sopenharmony_ci # no buffer interface 39667db96d56Sopenharmony_ci self.assertRaises(TypeError, get_contiguous, {}, PyBUF_READ, 'F') 39677db96d56Sopenharmony_ci 39687db96d56Sopenharmony_ci # writable request to read-only object 39697db96d56Sopenharmony_ci self.assertRaises(BufferError, get_contiguous, b'x', PyBUF_WRITE, 'C') 39707db96d56Sopenharmony_ci 39717db96d56Sopenharmony_ci # writable request to non-contiguous object 39727db96d56Sopenharmony_ci nd = ndarray([1, 2, 3], shape=[2], strides=[2]) 39737db96d56Sopenharmony_ci self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE, 'A') 39747db96d56Sopenharmony_ci 39757db96d56Sopenharmony_ci # scalar, read-only request from read-only exporter 39767db96d56Sopenharmony_ci nd = ndarray(9, shape=(), format="L") 39777db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 39787db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 39797db96d56Sopenharmony_ci self.assertEqual(m, nd) 39807db96d56Sopenharmony_ci self.assertEqual(m[()], 9) 39817db96d56Sopenharmony_ci 39827db96d56Sopenharmony_ci # scalar, read-only request from writable exporter 39837db96d56Sopenharmony_ci nd = ndarray(9, shape=(), format="L", flags=ND_WRITABLE) 39847db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 39857db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 39867db96d56Sopenharmony_ci self.assertEqual(m, nd) 39877db96d56Sopenharmony_ci self.assertEqual(m[()], 9) 39887db96d56Sopenharmony_ci 39897db96d56Sopenharmony_ci # scalar, writable request 39907db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 39917db96d56Sopenharmony_ci nd[()] = 9 39927db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_WRITE, order) 39937db96d56Sopenharmony_ci self.assertEqual(m, nd) 39947db96d56Sopenharmony_ci self.assertEqual(m[()], 9) 39957db96d56Sopenharmony_ci 39967db96d56Sopenharmony_ci m[()] = 10 39977db96d56Sopenharmony_ci self.assertEqual(m[()], 10) 39987db96d56Sopenharmony_ci self.assertEqual(nd[()], 10) 39997db96d56Sopenharmony_ci 40007db96d56Sopenharmony_ci # zeros in shape 40017db96d56Sopenharmony_ci nd = ndarray([1], shape=[0], format="L", flags=ND_WRITABLE) 40027db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 40037db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 40047db96d56Sopenharmony_ci self.assertRaises(IndexError, m.__getitem__, 0) 40057db96d56Sopenharmony_ci self.assertEqual(m, nd) 40067db96d56Sopenharmony_ci self.assertEqual(m.tolist(), []) 40077db96d56Sopenharmony_ci 40087db96d56Sopenharmony_ci nd = ndarray(list(range(8)), shape=[2, 0, 7], format="L", 40097db96d56Sopenharmony_ci flags=ND_WRITABLE) 40107db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 40117db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 40127db96d56Sopenharmony_ci self.assertEqual(ndarray(m).tolist(), [[], []]) 40137db96d56Sopenharmony_ci 40147db96d56Sopenharmony_ci # one-dimensional 40157db96d56Sopenharmony_ci nd = ndarray([1], shape=[1], format="h", flags=ND_WRITABLE) 40167db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 40177db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_WRITE, order) 40187db96d56Sopenharmony_ci self.assertEqual(m, nd) 40197db96d56Sopenharmony_ci self.assertEqual(m.tolist(), nd.tolist()) 40207db96d56Sopenharmony_ci 40217db96d56Sopenharmony_ci nd = ndarray([1, 2, 3], shape=[3], format="b", flags=ND_WRITABLE) 40227db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 40237db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_WRITE, order) 40247db96d56Sopenharmony_ci self.assertEqual(m, nd) 40257db96d56Sopenharmony_ci self.assertEqual(m.tolist(), nd.tolist()) 40267db96d56Sopenharmony_ci 40277db96d56Sopenharmony_ci # one-dimensional, non-contiguous 40287db96d56Sopenharmony_ci nd = ndarray([1, 2, 3], shape=[2], strides=[2], flags=ND_WRITABLE) 40297db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 40307db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 40317db96d56Sopenharmony_ci self.assertEqual(m, nd) 40327db96d56Sopenharmony_ci self.assertEqual(m.tolist(), nd.tolist()) 40337db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, 1, 20) 40347db96d56Sopenharmony_ci self.assertEqual(m[1], 3) 40357db96d56Sopenharmony_ci self.assertEqual(nd[1], 3) 40367db96d56Sopenharmony_ci 40377db96d56Sopenharmony_ci nd = nd[::-1] 40387db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 40397db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 40407db96d56Sopenharmony_ci self.assertEqual(m, nd) 40417db96d56Sopenharmony_ci self.assertEqual(m.tolist(), nd.tolist()) 40427db96d56Sopenharmony_ci self.assertRaises(TypeError, m.__setitem__, 1, 20) 40437db96d56Sopenharmony_ci self.assertEqual(m[1], 1) 40447db96d56Sopenharmony_ci self.assertEqual(nd[1], 1) 40457db96d56Sopenharmony_ci 40467db96d56Sopenharmony_ci # multi-dimensional, contiguous input 40477db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3, 4], flags=ND_WRITABLE) 40487db96d56Sopenharmony_ci for order in ['C', 'A']: 40497db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_WRITE, order) 40507db96d56Sopenharmony_ci self.assertEqual(ndarray(m).tolist(), nd.tolist()) 40517db96d56Sopenharmony_ci 40527db96d56Sopenharmony_ci self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE, 'F') 40537db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 40547db96d56Sopenharmony_ci self.assertEqual(ndarray(m).tolist(), nd.tolist()) 40557db96d56Sopenharmony_ci 40567db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3, 4], 40577db96d56Sopenharmony_ci flags=ND_WRITABLE|ND_FORTRAN) 40587db96d56Sopenharmony_ci for order in ['F', 'A']: 40597db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_WRITE, order) 40607db96d56Sopenharmony_ci self.assertEqual(ndarray(m).tolist(), nd.tolist()) 40617db96d56Sopenharmony_ci 40627db96d56Sopenharmony_ci self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE, 'C') 40637db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 40647db96d56Sopenharmony_ci self.assertEqual(ndarray(m).tolist(), nd.tolist()) 40657db96d56Sopenharmony_ci 40667db96d56Sopenharmony_ci # multi-dimensional, non-contiguous input 40677db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[3, 4], flags=ND_WRITABLE|ND_PIL) 40687db96d56Sopenharmony_ci for order in ['C', 'F', 'A']: 40697db96d56Sopenharmony_ci self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE, 40707db96d56Sopenharmony_ci order) 40717db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, order) 40727db96d56Sopenharmony_ci self.assertEqual(ndarray(m).tolist(), nd.tolist()) 40737db96d56Sopenharmony_ci 40747db96d56Sopenharmony_ci # flags 40757db96d56Sopenharmony_ci nd = ndarray([1,2,3,4,5], shape=[3], strides=[2]) 40767db96d56Sopenharmony_ci m = get_contiguous(nd, PyBUF_READ, 'C') 40777db96d56Sopenharmony_ci self.assertTrue(m.c_contiguous) 40787db96d56Sopenharmony_ci 40797db96d56Sopenharmony_ci def test_memoryview_serializing(self): 40807db96d56Sopenharmony_ci 40817db96d56Sopenharmony_ci # C-contiguous 40827db96d56Sopenharmony_ci size = struct.calcsize('i') 40837db96d56Sopenharmony_ci a = array.array('i', [1,2,3,4,5]) 40847db96d56Sopenharmony_ci m = memoryview(a) 40857db96d56Sopenharmony_ci buf = io.BytesIO(m) 40867db96d56Sopenharmony_ci b = bytearray(5*size) 40877db96d56Sopenharmony_ci buf.readinto(b) 40887db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), b) 40897db96d56Sopenharmony_ci 40907db96d56Sopenharmony_ci # C-contiguous, multi-dimensional 40917db96d56Sopenharmony_ci size = struct.calcsize('L') 40927db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[2,3,2], format="L") 40937db96d56Sopenharmony_ci m = memoryview(nd) 40947db96d56Sopenharmony_ci buf = io.BytesIO(m) 40957db96d56Sopenharmony_ci b = bytearray(2*3*2*size) 40967db96d56Sopenharmony_ci buf.readinto(b) 40977db96d56Sopenharmony_ci self.assertEqual(m.tobytes(), b) 40987db96d56Sopenharmony_ci 40997db96d56Sopenharmony_ci # Fortran contiguous, multi-dimensional 41007db96d56Sopenharmony_ci #size = struct.calcsize('L') 41017db96d56Sopenharmony_ci #nd = ndarray(list(range(12)), shape=[2,3,2], format="L", 41027db96d56Sopenharmony_ci # flags=ND_FORTRAN) 41037db96d56Sopenharmony_ci #m = memoryview(nd) 41047db96d56Sopenharmony_ci #buf = io.BytesIO(m) 41057db96d56Sopenharmony_ci #b = bytearray(2*3*2*size) 41067db96d56Sopenharmony_ci #buf.readinto(b) 41077db96d56Sopenharmony_ci #self.assertEqual(m.tobytes(), b) 41087db96d56Sopenharmony_ci 41097db96d56Sopenharmony_ci def test_memoryview_hash(self): 41107db96d56Sopenharmony_ci 41117db96d56Sopenharmony_ci # bytes exporter 41127db96d56Sopenharmony_ci b = bytes(list(range(12))) 41137db96d56Sopenharmony_ci m = memoryview(b) 41147db96d56Sopenharmony_ci self.assertEqual(hash(b), hash(m)) 41157db96d56Sopenharmony_ci 41167db96d56Sopenharmony_ci # C-contiguous 41177db96d56Sopenharmony_ci mc = m.cast('c', shape=[3,4]) 41187db96d56Sopenharmony_ci self.assertEqual(hash(mc), hash(b)) 41197db96d56Sopenharmony_ci 41207db96d56Sopenharmony_ci # non-contiguous 41217db96d56Sopenharmony_ci mx = m[::-2] 41227db96d56Sopenharmony_ci b = bytes(list(range(12))[::-2]) 41237db96d56Sopenharmony_ci self.assertEqual(hash(mx), hash(b)) 41247db96d56Sopenharmony_ci 41257db96d56Sopenharmony_ci # Fortran contiguous 41267db96d56Sopenharmony_ci nd = ndarray(list(range(30)), shape=[3,2,5], flags=ND_FORTRAN) 41277db96d56Sopenharmony_ci m = memoryview(nd) 41287db96d56Sopenharmony_ci self.assertEqual(hash(m), hash(nd)) 41297db96d56Sopenharmony_ci 41307db96d56Sopenharmony_ci # multi-dimensional slice 41317db96d56Sopenharmony_ci nd = ndarray(list(range(30)), shape=[3,2,5]) 41327db96d56Sopenharmony_ci x = nd[::2, ::, ::-1] 41337db96d56Sopenharmony_ci m = memoryview(x) 41347db96d56Sopenharmony_ci self.assertEqual(hash(m), hash(x)) 41357db96d56Sopenharmony_ci 41367db96d56Sopenharmony_ci # multi-dimensional slice with suboffsets 41377db96d56Sopenharmony_ci nd = ndarray(list(range(30)), shape=[2,5,3], flags=ND_PIL) 41387db96d56Sopenharmony_ci x = nd[::2, ::, ::-1] 41397db96d56Sopenharmony_ci m = memoryview(x) 41407db96d56Sopenharmony_ci self.assertEqual(hash(m), hash(x)) 41417db96d56Sopenharmony_ci 41427db96d56Sopenharmony_ci # equality-hash invariant 41437db96d56Sopenharmony_ci x = ndarray(list(range(12)), shape=[12], format='B') 41447db96d56Sopenharmony_ci a = memoryview(x) 41457db96d56Sopenharmony_ci 41467db96d56Sopenharmony_ci y = ndarray(list(range(12)), shape=[12], format='b') 41477db96d56Sopenharmony_ci b = memoryview(y) 41487db96d56Sopenharmony_ci 41497db96d56Sopenharmony_ci self.assertEqual(a, b) 41507db96d56Sopenharmony_ci self.assertEqual(hash(a), hash(b)) 41517db96d56Sopenharmony_ci 41527db96d56Sopenharmony_ci # non-byte formats 41537db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[2,2,3], format='L') 41547db96d56Sopenharmony_ci m = memoryview(nd) 41557db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__hash__) 41567db96d56Sopenharmony_ci 41577db96d56Sopenharmony_ci nd = ndarray(list(range(-6, 6)), shape=[2,2,3], format='h') 41587db96d56Sopenharmony_ci m = memoryview(nd) 41597db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__hash__) 41607db96d56Sopenharmony_ci 41617db96d56Sopenharmony_ci nd = ndarray(list(range(12)), shape=[2,2,3], format='= L') 41627db96d56Sopenharmony_ci m = memoryview(nd) 41637db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__hash__) 41647db96d56Sopenharmony_ci 41657db96d56Sopenharmony_ci nd = ndarray(list(range(-6, 6)), shape=[2,2,3], format='< h') 41667db96d56Sopenharmony_ci m = memoryview(nd) 41677db96d56Sopenharmony_ci self.assertRaises(ValueError, m.__hash__) 41687db96d56Sopenharmony_ci 41697db96d56Sopenharmony_ci def test_memoryview_release(self): 41707db96d56Sopenharmony_ci 41717db96d56Sopenharmony_ci # Create re-exporter from getbuffer(memoryview), then release the view. 41727db96d56Sopenharmony_ci a = bytearray([1,2,3]) 41737db96d56Sopenharmony_ci m = memoryview(a) 41747db96d56Sopenharmony_ci nd = ndarray(m) # re-exporter 41757db96d56Sopenharmony_ci self.assertRaises(BufferError, m.release) 41767db96d56Sopenharmony_ci del nd 41777db96d56Sopenharmony_ci m.release() 41787db96d56Sopenharmony_ci 41797db96d56Sopenharmony_ci a = bytearray([1,2,3]) 41807db96d56Sopenharmony_ci m = memoryview(a) 41817db96d56Sopenharmony_ci nd1 = ndarray(m, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 41827db96d56Sopenharmony_ci nd2 = ndarray(nd1, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 41837db96d56Sopenharmony_ci self.assertIs(nd2.obj, m) 41847db96d56Sopenharmony_ci self.assertRaises(BufferError, m.release) 41857db96d56Sopenharmony_ci del nd1, nd2 41867db96d56Sopenharmony_ci m.release() 41877db96d56Sopenharmony_ci 41887db96d56Sopenharmony_ci # chained views 41897db96d56Sopenharmony_ci a = bytearray([1,2,3]) 41907db96d56Sopenharmony_ci m1 = memoryview(a) 41917db96d56Sopenharmony_ci m2 = memoryview(m1) 41927db96d56Sopenharmony_ci nd = ndarray(m2) # re-exporter 41937db96d56Sopenharmony_ci m1.release() 41947db96d56Sopenharmony_ci self.assertRaises(BufferError, m2.release) 41957db96d56Sopenharmony_ci del nd 41967db96d56Sopenharmony_ci m2.release() 41977db96d56Sopenharmony_ci 41987db96d56Sopenharmony_ci a = bytearray([1,2,3]) 41997db96d56Sopenharmony_ci m1 = memoryview(a) 42007db96d56Sopenharmony_ci m2 = memoryview(m1) 42017db96d56Sopenharmony_ci nd1 = ndarray(m2, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 42027db96d56Sopenharmony_ci nd2 = ndarray(nd1, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 42037db96d56Sopenharmony_ci self.assertIs(nd2.obj, m2) 42047db96d56Sopenharmony_ci m1.release() 42057db96d56Sopenharmony_ci self.assertRaises(BufferError, m2.release) 42067db96d56Sopenharmony_ci del nd1, nd2 42077db96d56Sopenharmony_ci m2.release() 42087db96d56Sopenharmony_ci 42097db96d56Sopenharmony_ci # Allow changing layout while buffers are exported. 42107db96d56Sopenharmony_ci nd = ndarray([1,2,3], shape=[3], flags=ND_VAREXPORT) 42117db96d56Sopenharmony_ci m1 = memoryview(nd) 42127db96d56Sopenharmony_ci 42137db96d56Sopenharmony_ci nd.push([4,5,6,7,8], shape=[5]) # mutate nd 42147db96d56Sopenharmony_ci m2 = memoryview(nd) 42157db96d56Sopenharmony_ci 42167db96d56Sopenharmony_ci x = memoryview(m1) 42177db96d56Sopenharmony_ci self.assertEqual(x.tolist(), m1.tolist()) 42187db96d56Sopenharmony_ci 42197db96d56Sopenharmony_ci y = memoryview(m2) 42207db96d56Sopenharmony_ci self.assertEqual(y.tolist(), m2.tolist()) 42217db96d56Sopenharmony_ci self.assertEqual(y.tolist(), nd.tolist()) 42227db96d56Sopenharmony_ci m2.release() 42237db96d56Sopenharmony_ci y.release() 42247db96d56Sopenharmony_ci 42257db96d56Sopenharmony_ci nd.pop() # pop the current view 42267db96d56Sopenharmony_ci self.assertEqual(x.tolist(), nd.tolist()) 42277db96d56Sopenharmony_ci 42287db96d56Sopenharmony_ci del nd 42297db96d56Sopenharmony_ci m1.release() 42307db96d56Sopenharmony_ci x.release() 42317db96d56Sopenharmony_ci 42327db96d56Sopenharmony_ci # If multiple memoryviews share the same managed buffer, implicit 42337db96d56Sopenharmony_ci # release() in the context manager's __exit__() method should still 42347db96d56Sopenharmony_ci # work. 42357db96d56Sopenharmony_ci def catch22(b): 42367db96d56Sopenharmony_ci with memoryview(b) as m2: 42377db96d56Sopenharmony_ci pass 42387db96d56Sopenharmony_ci 42397db96d56Sopenharmony_ci x = bytearray(b'123') 42407db96d56Sopenharmony_ci with memoryview(x) as m1: 42417db96d56Sopenharmony_ci catch22(m1) 42427db96d56Sopenharmony_ci self.assertEqual(m1[0], ord(b'1')) 42437db96d56Sopenharmony_ci 42447db96d56Sopenharmony_ci x = ndarray(list(range(12)), shape=[2,2,3], format='l') 42457db96d56Sopenharmony_ci y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 42467db96d56Sopenharmony_ci z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 42477db96d56Sopenharmony_ci self.assertIs(z.obj, x) 42487db96d56Sopenharmony_ci with memoryview(z) as m: 42497db96d56Sopenharmony_ci catch22(m) 42507db96d56Sopenharmony_ci self.assertEqual(m[0:1].tolist(), [[[0, 1, 2], [3, 4, 5]]]) 42517db96d56Sopenharmony_ci 42527db96d56Sopenharmony_ci # Test garbage collection. 42537db96d56Sopenharmony_ci for flags in (0, ND_REDIRECT): 42547db96d56Sopenharmony_ci x = bytearray(b'123') 42557db96d56Sopenharmony_ci with memoryview(x) as m1: 42567db96d56Sopenharmony_ci del x 42577db96d56Sopenharmony_ci y = ndarray(m1, getbuf=PyBUF_FULL_RO, flags=flags) 42587db96d56Sopenharmony_ci with memoryview(y) as m2: 42597db96d56Sopenharmony_ci del y 42607db96d56Sopenharmony_ci z = ndarray(m2, getbuf=PyBUF_FULL_RO, flags=flags) 42617db96d56Sopenharmony_ci with memoryview(z) as m3: 42627db96d56Sopenharmony_ci del z 42637db96d56Sopenharmony_ci catch22(m3) 42647db96d56Sopenharmony_ci catch22(m2) 42657db96d56Sopenharmony_ci catch22(m1) 42667db96d56Sopenharmony_ci self.assertEqual(m1[0], ord(b'1')) 42677db96d56Sopenharmony_ci self.assertEqual(m2[1], ord(b'2')) 42687db96d56Sopenharmony_ci self.assertEqual(m3[2], ord(b'3')) 42697db96d56Sopenharmony_ci del m3 42707db96d56Sopenharmony_ci del m2 42717db96d56Sopenharmony_ci del m1 42727db96d56Sopenharmony_ci 42737db96d56Sopenharmony_ci x = bytearray(b'123') 42747db96d56Sopenharmony_ci with memoryview(x) as m1: 42757db96d56Sopenharmony_ci del x 42767db96d56Sopenharmony_ci y = ndarray(m1, getbuf=PyBUF_FULL_RO, flags=flags) 42777db96d56Sopenharmony_ci with memoryview(y) as m2: 42787db96d56Sopenharmony_ci del y 42797db96d56Sopenharmony_ci z = ndarray(m2, getbuf=PyBUF_FULL_RO, flags=flags) 42807db96d56Sopenharmony_ci with memoryview(z) as m3: 42817db96d56Sopenharmony_ci del z 42827db96d56Sopenharmony_ci catch22(m1) 42837db96d56Sopenharmony_ci catch22(m2) 42847db96d56Sopenharmony_ci catch22(m3) 42857db96d56Sopenharmony_ci self.assertEqual(m1[0], ord(b'1')) 42867db96d56Sopenharmony_ci self.assertEqual(m2[1], ord(b'2')) 42877db96d56Sopenharmony_ci self.assertEqual(m3[2], ord(b'3')) 42887db96d56Sopenharmony_ci del m1, m2, m3 42897db96d56Sopenharmony_ci 42907db96d56Sopenharmony_ci # memoryview.release() fails if the view has exported buffers. 42917db96d56Sopenharmony_ci x = bytearray(b'123') 42927db96d56Sopenharmony_ci with self.assertRaises(BufferError): 42937db96d56Sopenharmony_ci with memoryview(x) as m: 42947db96d56Sopenharmony_ci ex = ndarray(m) 42957db96d56Sopenharmony_ci m[0] == ord(b'1') 42967db96d56Sopenharmony_ci 42977db96d56Sopenharmony_ci def test_memoryview_redirect(self): 42987db96d56Sopenharmony_ci 42997db96d56Sopenharmony_ci nd = ndarray([1.0 * x for x in range(12)], shape=[12], format='d') 43007db96d56Sopenharmony_ci a = array.array('d', [1.0 * x for x in range(12)]) 43017db96d56Sopenharmony_ci 43027db96d56Sopenharmony_ci for x in (nd, a): 43037db96d56Sopenharmony_ci y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 43047db96d56Sopenharmony_ci z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 43057db96d56Sopenharmony_ci m = memoryview(z) 43067db96d56Sopenharmony_ci 43077db96d56Sopenharmony_ci self.assertIs(y.obj, x) 43087db96d56Sopenharmony_ci self.assertIs(z.obj, x) 43097db96d56Sopenharmony_ci self.assertIs(m.obj, x) 43107db96d56Sopenharmony_ci 43117db96d56Sopenharmony_ci self.assertEqual(m, x) 43127db96d56Sopenharmony_ci self.assertEqual(m, y) 43137db96d56Sopenharmony_ci self.assertEqual(m, z) 43147db96d56Sopenharmony_ci 43157db96d56Sopenharmony_ci self.assertEqual(m[1:3], x[1:3]) 43167db96d56Sopenharmony_ci self.assertEqual(m[1:3], y[1:3]) 43177db96d56Sopenharmony_ci self.assertEqual(m[1:3], z[1:3]) 43187db96d56Sopenharmony_ci del y, z 43197db96d56Sopenharmony_ci self.assertEqual(m[1:3], x[1:3]) 43207db96d56Sopenharmony_ci 43217db96d56Sopenharmony_ci def test_memoryview_from_static_exporter(self): 43227db96d56Sopenharmony_ci 43237db96d56Sopenharmony_ci fmt = 'B' 43247db96d56Sopenharmony_ci lst = [0,1,2,3,4,5,6,7,8,9,10,11] 43257db96d56Sopenharmony_ci 43267db96d56Sopenharmony_ci # exceptions 43277db96d56Sopenharmony_ci self.assertRaises(TypeError, staticarray, 1, 2, 3) 43287db96d56Sopenharmony_ci 43297db96d56Sopenharmony_ci # view.obj==x 43307db96d56Sopenharmony_ci x = staticarray() 43317db96d56Sopenharmony_ci y = memoryview(x) 43327db96d56Sopenharmony_ci self.verify(y, obj=x, 43337db96d56Sopenharmony_ci itemsize=1, fmt=fmt, readonly=True, 43347db96d56Sopenharmony_ci ndim=1, shape=[12], strides=[1], 43357db96d56Sopenharmony_ci lst=lst) 43367db96d56Sopenharmony_ci for i in range(12): 43377db96d56Sopenharmony_ci self.assertEqual(y[i], i) 43387db96d56Sopenharmony_ci del x 43397db96d56Sopenharmony_ci del y 43407db96d56Sopenharmony_ci 43417db96d56Sopenharmony_ci x = staticarray() 43427db96d56Sopenharmony_ci y = memoryview(x) 43437db96d56Sopenharmony_ci del y 43447db96d56Sopenharmony_ci del x 43457db96d56Sopenharmony_ci 43467db96d56Sopenharmony_ci x = staticarray() 43477db96d56Sopenharmony_ci y = ndarray(x, getbuf=PyBUF_FULL_RO) 43487db96d56Sopenharmony_ci z = ndarray(y, getbuf=PyBUF_FULL_RO) 43497db96d56Sopenharmony_ci m = memoryview(z) 43507db96d56Sopenharmony_ci self.assertIs(y.obj, x) 43517db96d56Sopenharmony_ci self.assertIs(m.obj, z) 43527db96d56Sopenharmony_ci self.verify(m, obj=z, 43537db96d56Sopenharmony_ci itemsize=1, fmt=fmt, readonly=True, 43547db96d56Sopenharmony_ci ndim=1, shape=[12], strides=[1], 43557db96d56Sopenharmony_ci lst=lst) 43567db96d56Sopenharmony_ci del x, y, z, m 43577db96d56Sopenharmony_ci 43587db96d56Sopenharmony_ci x = staticarray() 43597db96d56Sopenharmony_ci y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 43607db96d56Sopenharmony_ci z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 43617db96d56Sopenharmony_ci m = memoryview(z) 43627db96d56Sopenharmony_ci self.assertIs(y.obj, x) 43637db96d56Sopenharmony_ci self.assertIs(z.obj, x) 43647db96d56Sopenharmony_ci self.assertIs(m.obj, x) 43657db96d56Sopenharmony_ci self.verify(m, obj=x, 43667db96d56Sopenharmony_ci itemsize=1, fmt=fmt, readonly=True, 43677db96d56Sopenharmony_ci ndim=1, shape=[12], strides=[1], 43687db96d56Sopenharmony_ci lst=lst) 43697db96d56Sopenharmony_ci del x, y, z, m 43707db96d56Sopenharmony_ci 43717db96d56Sopenharmony_ci # view.obj==NULL 43727db96d56Sopenharmony_ci x = staticarray(legacy_mode=True) 43737db96d56Sopenharmony_ci y = memoryview(x) 43747db96d56Sopenharmony_ci self.verify(y, obj=None, 43757db96d56Sopenharmony_ci itemsize=1, fmt=fmt, readonly=True, 43767db96d56Sopenharmony_ci ndim=1, shape=[12], strides=[1], 43777db96d56Sopenharmony_ci lst=lst) 43787db96d56Sopenharmony_ci for i in range(12): 43797db96d56Sopenharmony_ci self.assertEqual(y[i], i) 43807db96d56Sopenharmony_ci del x 43817db96d56Sopenharmony_ci del y 43827db96d56Sopenharmony_ci 43837db96d56Sopenharmony_ci x = staticarray(legacy_mode=True) 43847db96d56Sopenharmony_ci y = memoryview(x) 43857db96d56Sopenharmony_ci del y 43867db96d56Sopenharmony_ci del x 43877db96d56Sopenharmony_ci 43887db96d56Sopenharmony_ci x = staticarray(legacy_mode=True) 43897db96d56Sopenharmony_ci y = ndarray(x, getbuf=PyBUF_FULL_RO) 43907db96d56Sopenharmony_ci z = ndarray(y, getbuf=PyBUF_FULL_RO) 43917db96d56Sopenharmony_ci m = memoryview(z) 43927db96d56Sopenharmony_ci self.assertIs(y.obj, None) 43937db96d56Sopenharmony_ci self.assertIs(m.obj, z) 43947db96d56Sopenharmony_ci self.verify(m, obj=z, 43957db96d56Sopenharmony_ci itemsize=1, fmt=fmt, readonly=True, 43967db96d56Sopenharmony_ci ndim=1, shape=[12], strides=[1], 43977db96d56Sopenharmony_ci lst=lst) 43987db96d56Sopenharmony_ci del x, y, z, m 43997db96d56Sopenharmony_ci 44007db96d56Sopenharmony_ci x = staticarray(legacy_mode=True) 44017db96d56Sopenharmony_ci y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 44027db96d56Sopenharmony_ci z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT) 44037db96d56Sopenharmony_ci m = memoryview(z) 44047db96d56Sopenharmony_ci # Clearly setting view.obj==NULL is inferior, since it 44057db96d56Sopenharmony_ci # messes up the redirection chain: 44067db96d56Sopenharmony_ci self.assertIs(y.obj, None) 44077db96d56Sopenharmony_ci self.assertIs(z.obj, y) 44087db96d56Sopenharmony_ci self.assertIs(m.obj, y) 44097db96d56Sopenharmony_ci self.verify(m, obj=y, 44107db96d56Sopenharmony_ci itemsize=1, fmt=fmt, readonly=True, 44117db96d56Sopenharmony_ci ndim=1, shape=[12], strides=[1], 44127db96d56Sopenharmony_ci lst=lst) 44137db96d56Sopenharmony_ci del x, y, z, m 44147db96d56Sopenharmony_ci 44157db96d56Sopenharmony_ci def test_memoryview_getbuffer_undefined(self): 44167db96d56Sopenharmony_ci 44177db96d56Sopenharmony_ci # getbufferproc does not adhere to the new documentation 44187db96d56Sopenharmony_ci nd = ndarray([1,2,3], [3], flags=ND_GETBUF_FAIL|ND_GETBUF_UNDEFINED) 44197db96d56Sopenharmony_ci self.assertRaises(BufferError, memoryview, nd) 44207db96d56Sopenharmony_ci 44217db96d56Sopenharmony_ci def test_issue_7385(self): 44227db96d56Sopenharmony_ci x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL) 44237db96d56Sopenharmony_ci self.assertRaises(BufferError, memoryview, x) 44247db96d56Sopenharmony_ci 44257db96d56Sopenharmony_ci @support.cpython_only 44267db96d56Sopenharmony_ci def test_pybuffer_size_from_format(self): 44277db96d56Sopenharmony_ci # basic tests 44287db96d56Sopenharmony_ci for format in ('', 'ii', '3s'): 44297db96d56Sopenharmony_ci self.assertEqual(_testcapi.PyBuffer_SizeFromFormat(format), 44307db96d56Sopenharmony_ci struct.calcsize(format)) 44317db96d56Sopenharmony_ci 44327db96d56Sopenharmony_ci 44337db96d56Sopenharmony_ciif __name__ == "__main__": 44347db96d56Sopenharmony_ci unittest.main() 4435