/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.sis.referencing.operation.transform;

import org.apache.sis.internal.referencing.j2d.AffineTransform2D;
import org.opengis.util.FactoryException;
import org.opengis.referencing.operation.Matrix;
import org.opengis.referencing.operation.TransformException;

// Test imports
import org.junit.Test;
import org.junit.runner.RunWith;
import org.apache.sis.test.DependsOn;
import org.apache.sis.test.TestRunner;
import static org.opengis.test.Assert.*;


/**
 * Tests various implementation of the {@link LinearTransform} interface by inheriting the tests defined
 * in GeoAPI conformance module. The transforms are created by {@link MathTransforms#linear(Matrix)}.
 *
 * @author  Martin Desruisseaux (Geomatys)
 * @since   0.5
 * @version 0.5
 * @module
 */
@RunWith(TestRunner.class)
@DependsOn(ProjectiveTransformTest.class)
public final strictfp class LinearTransformTest extends ProjectiveTransformTest {
    /**
     * Creates a new test suite.
     */
    public LinearTransformTest() {
        super(new MathTransformFactoryBase() {
            @Override
            public LinearTransform createAffineTransform(final Matrix matrix) {
                return MathTransforms.linear(matrix);
            }
        });
    }

    /**
     * Do not skip any interface check - all of them shall be correct in this test case.
     */
    @Override
    boolean skipInterfaceCheckForDimension(final int dimension) {
        return false;
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testIdentity1D() throws FactoryException, TransformException {
        super.testIdentity1D();
        assertInstanceOf("Unexpected implementation.", IdentityTransform1D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testIdentity2D() throws FactoryException, TransformException {
        super.testIdentity2D();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testIdentity3D() throws FactoryException, TransformException {
        super.testIdentity3D();
        assertInstanceOf("Unexpected implementation.", IdentityTransform.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testAxisSwapping2D() throws FactoryException, TransformException {
        super.testAxisSwapping2D();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testSouthOrientated2D() throws FactoryException, TransformException {
        super.testSouthOrientated2D();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testTranslatation2D() throws FactoryException, TransformException {
        super.testTranslatation2D();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testUniformScale2D() throws FactoryException, TransformException {
        super.testUniformScale2D();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testGenericScale2D() throws FactoryException, TransformException {
        super.testGenericScale2D();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testRotation2D() throws FactoryException, TransformException {
        super.testRotation2D();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testGeneral() throws FactoryException, TransformException {
        super.testGeneral();
        assertInstanceOf("Unexpected implementation.", AffineTransform2D.class, transform);
    }

    /**
     * Runs the GeoAPI tests, then perform implementation-specific checks.
     *
     * @throws FactoryException should never happen.
     * @throws TransformException should never happen.
     */
    @Test
    @Override
    public void testDimensionReduction() throws FactoryException, TransformException {
        super.testDimensionReduction();
        assertInstanceOf("Unexpected implementation.", ProjectiveTransform.class, transform);
    }
}
