import pytest

pytest.importorskip("scipy")

import numpy as np
import scipy.sparse.linalg

import dask.array as da


def test_LinearOperator():
    X = np.random.random(size=(3, 2))
    y = np.random.random(size=(2, 1))
    w = np.random.random(size=(3, 1))
    square = np.random.random(size=(2, 2))

    dX = da.from_array(X, chunks=(2, 1))

    npLO = scipy.sparse.linalg.aslinearoperator(X)
    daLO = scipy.sparse.linalg.interface.MatrixLinearOperator(dX)

    functions = [lambda x, y: x.matvec(y), lambda x, y: x * y, lambda x, y: x.dot(y)]
    for func in functions:
        assert np.allclose(func(npLO, y), func(daLO, y))

    assert np.allclose(npLO.matmat(square), daLO.matmat(square))

    assert np.allclose(npLO.rmatvec(w), daLO.rmatvec(w))

    assert npLO.dtype == daLO.dtype
    assert npLO.shape == daLO.shape
