blob: bfd325617c41b55419215c8ed74dfbe0ac6b893b [file] [log] [blame]
/*
* 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.opengis.metadata.content.TransferFunctionType;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.MathTransform1D;
import org.opengis.referencing.operation.MathTransformFactory;
import org.opengis.util.FactoryException;
import org.apache.sis.referencing.operation.matrix.Matrix2;
// Test dependencies
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import org.apache.sis.test.TestCase;
// Specific to the main branch:
import static org.apache.sis.test.GeoapiAssert.assertMatrixEquals;
/**
* Tests {@link TransferFunction}.
*
* @author Martin Desruisseaux (Geomatys)
*/
public final class TransferFunctionTest extends TestCase {
/**
* Creates a new test case.
*/
public TransferFunctionTest() {
}
/**
* Tests the creation of a linear transfer function.
*/
@Test
public void testLinear() {
final TransferFunction f = new TransferFunction();
assertEquals(TransferFunctionType.LINEAR, f.getType());
assertEquals(1, f.getBase());
assertEquals(1, f.getScale());
assertEquals(0, f.getOffset());
assertEquals("y = x", f.toString());
assertTrue(f.isIdentity());
f.setScale(0.15);
f.setOffset(-2);
assertEquals("y = 0.15⋅x − 2", f.toString());
final MathTransform1D transform = f.getTransform();
assertMatrixEquals(new Matrix2(0.15, -2, 0, 1),
assertInstanceOf(LinearTransform.class, transform).getMatrix(),
STRICT, "transform.matrix");
/*
* Get back the coefficients.
*/
final var b = new TransferFunction();
b.setTransform(transform);
assertEquals(TransferFunctionType.LINEAR, b.getType());
assertEquals( 1, b.getBase());
assertEquals( 0.15, b.getScale());
assertEquals(-2, b.getOffset());
assertFalse(b.isIdentity());
}
/**
* Tests the creation of a logarithmic transfer function.
*/
@Test
public void testLogarithmic() {
final TransferFunction f = new TransferFunction();
f.setType(TransferFunctionType.LOGARITHMIC);
f.setOffset(-2);
assertEquals(10, f.getBase());
assertEquals("y = ㏒⒳ − 2", f.toString());
final MathTransform1D transform = f.getTransform();
assertInstanceOf(LogarithmicTransform1D.class, transform);
/*
* Get back the coefficients.
*/
final TransferFunction b = new TransferFunction();
b.setTransform(transform);
assertEquals(TransferFunctionType.LOGARITHMIC, b.getType());
assertEquals(10, b.getBase());
assertEquals( 1, b.getScale());
assertEquals(-2, b.getOffset());
assertFalse(b.isIdentity());
}
/**
* Tests the creation of an exponential transfer function.
*/
@Test
public void testExponential() {
final TransferFunction f = new TransferFunction();
f.setType(TransferFunctionType.EXPONENTIAL);
f.setScale(0.15);
assertEquals(10, f.getBase());
assertEquals("y = 0.15⋅10ˣ", f.toString());
final MathTransform1D transform = f.getTransform();
assertInstanceOf(ExponentialTransform1D.class, transform);
/*
* Get back the coefficients.
*/
final TransferFunction b = new TransferFunction();
b.setTransform(transform);
assertEquals(TransferFunctionType.EXPONENTIAL, b.getType());
assertEquals(10, b.getBase());
assertEquals(0.15, b.getScale());
assertEquals(0, b.getOffset());
assertFalse(b.isIdentity());
}
/**
* Tests the creation of a concatenated transfer function.
*/
@Test
public void testConcatenated() {
final TransferFunction f = new TransferFunction();
f.setType(TransferFunctionType.LOGARITHMIC);
f.setScale(0.15);
f.setOffset(-2);
assertEquals("y = 0.15⋅㏒⒳ − 2", f.toString());
final MathTransform1D transform = f.getTransform();
assertInstanceOf(ConcatenatedTransformDirect1D.class, transform);
/*
* Get back the coefficients.
*/
final TransferFunction b = new TransferFunction();
b.setTransform(transform);
assertEquals(TransferFunctionType.LOGARITHMIC, b.getType());
assertEquals(10, b.getBase());
assertEquals(0.15, b.getScale(), 1E-16);
assertEquals(-2, b.getOffset(), 1E-16);
assertFalse(b.isIdentity());
}
/**
* Same tests as above, but using a math transform factory.
*
* @throws FactoryException if the factory failed to create a transform.
*/
@Test
public void testCreateTransform() throws FactoryException {
final MathTransformFactory factory = DefaultMathTransformFactory.provider();
final TransferFunction f = new TransferFunction();
f.setScale(0.15);
f.setOffset(-2);
MathTransform transform = f.createTransform(factory);
assertMatrixEquals(new Matrix2(0.15, -2, 0, 1),
assertInstanceOf(LinearTransform.class, transform).getMatrix(),
STRICT, "transform.matrix");
/*
* Logarithmic case.
*/
f.setType(TransferFunctionType.LOGARITHMIC);
f.setScale(1);
f.setOffset(-2);
transform = f.getTransform();
assertInstanceOf(LogarithmicTransform1D.class, transform);
/*
* Exponential case.
*/
f.setType(TransferFunctionType.EXPONENTIAL);
f.setScale(0.15);
f.setOffset(0);
transform = f.getTransform();
assertInstanceOf(ExponentialTransform1D.class, transform);
}
}