blob: 2c960f47c302f9da87a94fb76991330dea04932d [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;
import org.apache.sis.internal.system.DefaultFactories;
import org.apache.sis.test.DependsOnMethod;
import org.apache.sis.test.DependsOn;
import org.apache.sis.test.TestCase;
import org.junit.Test;
import static org.opengis.test.Assert.*;
/**
* Tests {@link TransferFunction}.
*
* @author Martin Desruisseaux (Geomatys)
* @version 1.0
* @since 0.5
* @module
*/
@DependsOn(ExponentialTransform1DTest.class)
public final strictfp class TransferFunctionTest extends TestCase {
/**
* Tests the creation of a linear transfer function.
*/
@Test
public void testLinear() {
final TransferFunction f = new TransferFunction();
assertEquals("type", TransferFunctionType.LINEAR, f.getType());
assertEquals("base", 1, f.getBase(), STRICT);
assertEquals("scale", 1, f.getScale(), STRICT);
assertEquals("offset", 0, f.getOffset(), STRICT);
assertEquals("toString", "y = x", f.toString());
assertTrue ("isIdentity", f.isIdentity());
f.setScale(0.15);
f.setOffset(-2);
assertEquals("toString", "y = 0.15⋅x − 2", f.toString());
final MathTransform1D transform = f.getTransform();
assertInstanceOf("transform", LinearTransform.class, transform);
assertMatrixEquals("transform.matrix", new Matrix2(0.15, -2, 0, 1),
((LinearTransform) transform).getMatrix(), STRICT);
/*
* Get back the coefficients.
*/
final TransferFunction b = new TransferFunction();
b.setTransform(transform);
assertEquals("type", TransferFunctionType.LINEAR, b.getType());
assertEquals("base", 1, b.getBase(), STRICT);
assertEquals("scale", 0.15, b.getScale(), STRICT);
assertEquals("offset", -2, b.getOffset(), STRICT);
assertFalse ("isIdentity", b.isIdentity());
}
/**
* Tests the creation of a logarithmic transfer function.
*/
@Test
@DependsOnMethod("testLinear")
public void testLogarithmic() {
final TransferFunction f = new TransferFunction();
f.setType(TransferFunctionType.LOGARITHMIC);
f.setOffset(-2);
assertEquals("base", 10, f.getBase(), STRICT);
assertEquals("toString", "y = ㏒⒳ − 2", f.toString());
final MathTransform1D transform = f.getTransform();
assertInstanceOf("transform", LogarithmicTransform1D.class, transform);
/*
* Get back the coefficients.
*/
final TransferFunction b = new TransferFunction();
b.setTransform(transform);
assertEquals("type", TransferFunctionType.LOGARITHMIC, b.getType());
assertEquals("base", 10, b.getBase(), STRICT);
assertEquals("scale", 1, b.getScale(), STRICT);
assertEquals("offset", -2, b.getOffset(), STRICT);
assertFalse ("isIdentity", b.isIdentity());
}
/**
* Tests the creation of an exponential transfer function.
*/
@Test
@DependsOnMethod("testLinear")
public void testExponential() {
final TransferFunction f = new TransferFunction();
f.setType(TransferFunctionType.EXPONENTIAL);
f.setScale(0.15);
assertEquals("base", 10, f.getBase(), STRICT);
assertEquals("toString", "y = 0.15⋅10ˣ", f.toString());
final MathTransform1D transform = f.getTransform();
assertInstanceOf("transform", ExponentialTransform1D.class, transform);
/*
* Get back the coefficients.
*/
final TransferFunction b = new TransferFunction();
b.setTransform(transform);
assertEquals("type", TransferFunctionType.EXPONENTIAL, b.getType());
assertEquals("base", 10, b.getBase(), STRICT);
assertEquals("scale", 0.15, b.getScale(), STRICT);
assertEquals("offset", 0, b.getOffset(), STRICT);
assertFalse ("isIdentity", b.isIdentity());
}
/**
* Tests the creation of a concatenated transfer function.
*/
@Test
@DependsOnMethod("testLogarithmic")
public void testConcatenated() {
final TransferFunction f = new TransferFunction();
f.setType(TransferFunctionType.LOGARITHMIC);
f.setScale(0.15);
f.setOffset(-2);
assertEquals("toString", "y = 0.15⋅㏒⒳ − 2", f.toString());
final MathTransform1D transform = f.getTransform();
assertInstanceOf("transform", ConcatenatedTransformDirect1D.class, transform);
/*
* Get back the coefficients.
*/
final TransferFunction b = new TransferFunction();
b.setTransform(transform);
assertEquals("type", TransferFunctionType.LOGARITHMIC, b.getType());
assertEquals("base", 10, b.getBase(), STRICT);
assertEquals("scale", 0.15, b.getScale(), 1E-16);
assertEquals("offset", -2, b.getOffset(), 1E-16);
assertFalse ("isIdentity", b.isIdentity());
}
/**
* Same tests than 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 = DefaultFactories.forBuildin(MathTransformFactory.class);
final TransferFunction f = new TransferFunction();
f.setScale(0.15);
f.setOffset(-2);
MathTransform transform = f.createTransform(factory);
assertInstanceOf("transform", LinearTransform.class, transform);
assertMatrixEquals("transform.matrix", new Matrix2(0.15, -2, 0, 1),
((LinearTransform) transform).getMatrix(), STRICT);
/*
* Logarithmic case.
*/
f.setType(TransferFunctionType.LOGARITHMIC);
f.setScale(1);
f.setOffset(-2);
transform = f.getTransform();
assertInstanceOf("transform", LogarithmicTransform1D.class, transform);
/*
* Exponential case.
*/
f.setType(TransferFunctionType.EXPONENTIAL);
f.setScale(0.15);
f.setOffset(0);
transform = f.getTransform();
assertInstanceOf("transform", ExponentialTransform1D.class, transform);
}
}