class_docstr: A class that "mocks" ndarray by encapsulating an ndarray and using
  protocols to "look like" an ndarray. Basically tests whether Dask
  works fine with something that is essentially an array but uses
  protocols instead of being an actual array. Must be manually
  registered as a valid chunk type to be considered a downcast type
  of Dask array in the type casting hierarchy.
code: def __array_function__(self, f, t, arrs, kw):
      if not all(
          issubclass(ti, (type(self), np.ndarray) + np.ScalarType)
          for ti in t
      ):
          return NotImplemented
      arrs = tuple(
          arr if not isinstance(arr, type(self)) else arr.arr
          for arr in arrs
      )
      t = tuple(ti for ti in t if not issubclass(ti, type(self)))
      print(t)
      a = self.arr.__array_function__(f, t, arrs, kw)
      return a if not isinstance(a, np.ndarray) else type(self)(a)
  
imports: from __future__ import annotations
  import operator
  import numpy
  import pytest
  import dask.array
  from dask.array import Array
  from dask.array.chunk_types import is_valid_array_chunk, is_valid_chunk_type
  from dask.array.utils import assert_eq
label_desc: Use image node_id 3 for calling the EncapsulateNDArray obj's underlying member method code with example usage: obj.__array_function__(f, t, arrs, kw) and returns: unknown, NotImplemented