xref: /third_party/python/Lib/test/test_buffer.py (revision 7db96d56)
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