blob: 36d5e84329e3438384a51ed0dd764bb0b4f19c86 [file] [log] [blame]
/*
* Copyright (C) 2012 The Guava Authors
*
* Licensed 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 com.google.common.math;
import static com.google.common.math.StatsTesting.assertDiagonalLinearTransformation;
import static com.google.common.math.StatsTesting.assertHorizontalLinearTransformation;
import static com.google.common.math.StatsTesting.assertLinearTransformationNaN;
import static com.google.common.math.StatsTesting.assertVerticalLinearTransformation;
import static com.google.common.truth.Truth.assertThat;
import junit.framework.TestCase;
/**
* Tests for {@link LinearTransformation}.
*
* @author Pete Gillin
*/
public class LinearTransformationTest extends TestCase {
private static final double ALLOWED_ERROR = 1e-10;
public void testMappingAnd_regular() {
double x1 = 1.2;
double y1 = 3.4;
double xDelta = 5.6;
double yDelta = 7.8;
LinearTransformation transformation =
LinearTransformation.mapping(x1, y1).and(x1 + xDelta, y1 + yDelta);
assertDiagonalLinearTransformation(transformation, x1, y1, xDelta, yDelta);
}
public void testMappingAnd_horizontal() {
double x1 = 1.2;
double xDelta = 3.4;
double y = 5.6;
LinearTransformation transformation = LinearTransformation.mapping(x1, y).and(x1 + xDelta, y);
assertHorizontalLinearTransformation(transformation, y);
}
public void testMappingAnd_vertical() {
double x = 1.2;
double y1 = 3.4;
double yDelta = 5.6;
LinearTransformation transformation = LinearTransformation.mapping(x, y1).and(x, y1 + yDelta);
assertVerticalLinearTransformation(transformation, x);
}
public void testMapping_infiniteX1() {
try {
LinearTransformation.mapping(Double.POSITIVE_INFINITY, 3.4);
fail("Expected IllegalArgumentException from mapping(x, y) with infinite x");
} catch (IllegalArgumentException expected) {
}
}
public void testMapping_infiniteY1() {
try {
LinearTransformation.mapping(1.2, Double.NEGATIVE_INFINITY);
fail("Expected IllegalArgumentException from mapping(x, y) with infinite y");
} catch (IllegalArgumentException expected) {
}
}
public void testMappingAnd_infiniteX2() {
try {
LinearTransformation.mapping(1.2, 3.4).and(Double.NEGATIVE_INFINITY, 7.8);
fail("Expected IllegalArgumentException from and(x, y) with infinite x");
} catch (IllegalArgumentException expected) {
}
}
public void testMappingAnd_infiniteY2() {
try {
LinearTransformation.mapping(1.2, 3.4).and(5.6, Double.POSITIVE_INFINITY);
fail("Expected IllegalArgumentException from and(x, y) with infinite y");
} catch (IllegalArgumentException expected) {
}
}
public void testMapping_nanX1() {
try {
LinearTransformation.mapping(Double.NaN, 3.4);
fail("Expected IllegalArgumentException from mapping(x, y) with NaN x");
} catch (IllegalArgumentException expected) {
}
}
public void testMapping_nanY1() {
try {
LinearTransformation.mapping(1.2, Double.NaN);
fail("Expected IllegalArgumentException from mapping(x, y) with NaN y");
} catch (IllegalArgumentException expected) {
}
}
public void testMappingAnd_nanX2() {
try {
LinearTransformation.mapping(1.2, 3.4).and(Double.NaN, 7.8);
fail("Expected IllegalArgumentException from and(x, y) with NaN x");
} catch (IllegalArgumentException expected) {
}
}
public void testMappingAnd_nanY2() {
try {
LinearTransformation.mapping(1.2, 3.4).and(5.6, Double.NaN);
fail("Expected IllegalArgumentException from and(x, y) with NaN y");
} catch (IllegalArgumentException expected) {
}
}
public void testMappingAnd_samePointTwice() {
try {
double x = 1.2;
double y = 3.4;
LinearTransformation.mapping(x, y).and(x, y);
fail(
"Expected IllegalArgumentException from mapping(x1, y1).and(x2, y2) with"
+ " (x1 == x2) && (y1 == y2)");
} catch (IllegalArgumentException expected) {
}
}
public void testMappingWithSlope_regular() {
double x1 = 1.2;
double y1 = 3.4;
double xDelta = -5.6;
double slope = -7.8;
LinearTransformation transformation = LinearTransformation.mapping(x1, y1).withSlope(slope);
assertDiagonalLinearTransformation(transformation, x1, y1, xDelta, xDelta * slope);
}
public void testMappingWithSlope_horizontal() {
double x1 = 1.2;
double y = 5.6;
LinearTransformation transformation = LinearTransformation.mapping(x1, y).withSlope(0.0);
assertHorizontalLinearTransformation(transformation, y);
}
public void testMappingWithSlope_vertical() {
double x = 1.2;
double y1 = 3.4;
LinearTransformation transformation =
LinearTransformation.mapping(x, y1).withSlope(Double.POSITIVE_INFINITY);
assertVerticalLinearTransformation(transformation, x);
}
public void testMappingWithSlope_minimalSlope() {
double x1 = 1.2;
double y1 = 3.4;
double slope = Double.MIN_VALUE;
LinearTransformation transformation = LinearTransformation.mapping(x1, y1).withSlope(slope);
assertThat(transformation.isVertical()).isFalse();
assertThat(transformation.isHorizontal()).isFalse();
assertThat(transformation.slope()).isWithin(ALLOWED_ERROR).of(slope);
// Note that we cannot test the actual mapping of points, as the results will be unreliable due
// to loss of precision with this value of the slope.
}
public void testMappingWithSlope_maximalSlope() {
double x1 = 1.2;
double y1 = 3.4;
double slope = Double.MAX_VALUE;
LinearTransformation transformation = LinearTransformation.mapping(x1, y1).withSlope(slope);
assertThat(transformation.isVertical()).isFalse();
assertThat(transformation.isHorizontal()).isFalse();
assertThat(transformation.slope()).isWithin(ALLOWED_ERROR).of(slope);
// Note that we cannot test the actual mapping of points, as the results will be unreliable due
// to loss of precision with this value of the slope.
}
public void testMappingWithSlope_nanSlope() {
try {
LinearTransformation.mapping(1.2, 3.4).withSlope(Double.NaN);
fail("Expected IllegalArgumentException from withSlope(slope) with NaN slope");
} catch (IllegalArgumentException expected) {
}
}
public void testVertical_regular() {
double x = 1.2;
LinearTransformation transformation = LinearTransformation.vertical(x);
assertVerticalLinearTransformation(transformation, x);
}
public void testVertical_infiniteX() {
try {
LinearTransformation.vertical(Double.NEGATIVE_INFINITY);
fail("Expected IllegalArgumentException from vertical(x) with infinite x");
} catch (IllegalArgumentException expected) {
}
}
public void testVertical_nanX() {
try {
LinearTransformation.vertical(Double.NaN);
fail("Expected IllegalArgumentException from vertical(x) with NaN x");
} catch (IllegalArgumentException expected) {
}
}
public void testHorizontal_regular() {
double y = 1.2;
LinearTransformation transformation = LinearTransformation.horizontal(y);
assertHorizontalLinearTransformation(transformation, y);
}
public void testHorizontal_infiniteY() {
try {
LinearTransformation.horizontal(Double.POSITIVE_INFINITY);
fail("Expected IllegalArgumentException from horizontal(y) with infinite y");
} catch (IllegalArgumentException expected) {
}
}
public void testHorizontal_nanY() {
try {
LinearTransformation.horizontal(Double.NaN);
fail("Expected IllegalArgumentException from horizontal(y) with NaN y");
} catch (IllegalArgumentException expected) {
}
}
public void testForNaN() {
LinearTransformation transformation = LinearTransformation.forNaN();
assertLinearTransformationNaN(transformation);
}
}