blob: b8cd29a99b2d1780691bb394a302f0fdf0d14c62 [file] [log] [blame]
/*
* Copyright (c) 2014 Google, Inc.
*
* 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.truth;
import static com.google.common.truth.Truth.assertThat;
import static java.lang.Double.NEGATIVE_INFINITY;
import static java.lang.Double.NaN;
import static java.lang.Double.POSITIVE_INFINITY;
import static java.lang.Math.nextAfter;
import static org.junit.Assert.fail;
import com.google.common.primitives.Doubles;
import com.google.common.primitives.Floats;
import com.google.common.primitives.Longs;
import java.math.BigDecimal;
import java.math.BigInteger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Tests for {@link PrimitiveDoubleArraySubject}.
*
* @author Christian Gruber (cgruber@israfil.net)
*/
@RunWith(JUnit4.class)
public class PrimitiveDoubleArraySubjectTest {
private static final double DEFAULT_TOLERANCE = 0.000005d;
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Default_Fail() {
try {
assertThat(array(2.2d, 5.4d)).isEqualTo(array(2.2d, 5.4d));
throw new Error("Expected to throw.");
} catch (UnsupportedOperationException expected) {
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo() {
assertThat(array(2.2d, 5.4d)).isEqualTo(array(2.2d, 5.4d), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_ApproximatelyEquals() {
assertThat(array(2.2d, 3.3d))
.isEqualTo(
array(2.2d, nextAfter(3.3d + DEFAULT_TOLERANCE, NEGATIVE_INFINITY)), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_FailNotQuiteApproximatelyEquals() {
double roughly3point3 = nextAfter(3.3d + DEFAULT_TOLERANCE, POSITIVE_INFINITY);
try {
assertThat(array(2.2d, 3.3d)).isEqualTo(array(2.2d, roughly3point3), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> is equal to <[2.2, " + roughly3point3 + "]>");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_DifferentOrder() {
try {
assertThat(array(2.2d, 3.3d)).isEqualTo(array(3.3d, 2.2d), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Not true that <(double[]) [2.2, 3.3]> is equal to <[3.3, 2.2]>");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_Longer() {
try {
assertThat(array(2.2d, 3.3d)).isEqualTo(array(2.2d, 3.3d, 1.1d), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Arrays are of different lengths. expected: [2.2, 3.3, 1.1], actual [2.2, 3.3]");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_Shorter() {
try {
assertThat(array(2.2d, 3.3d)).isEqualTo(array(2.2d), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Arrays are of different lengths. expected: [2.2], actual [2.2, 3.3]");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_NotAnArray() {
try {
assertThat(array(2.2d, 3.3d, 4.4d)).isEqualTo(new Object(), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.contains("Incompatible types compared. expected: Object, actual: double[]");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_Infinity() {
try {
assertThat(array(2.2d, POSITIVE_INFINITY))
.isEqualTo(array(2.2d, POSITIVE_INFINITY), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Not true that <(double[]) [2.2, Infinity]> is equal to <[2.2, Infinity]>");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_SameInfinity() {
double[] same = array(2.2d, POSITIVE_INFINITY);
assertThat(same).isEqualTo(same, DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_OneInfinity() {
try {
assertThat(array(2.2d, 3.3d)).isEqualTo(array(2.2d, POSITIVE_INFINITY), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Not true that <(double[]) [2.2, 3.3]> is equal to <[2.2, Infinity]>");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_LongerOneInfinity() {
try {
assertThat(array(2.2d, 3.3d)).isEqualTo(array(POSITIVE_INFINITY), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Arrays are of different lengths. expected: [Infinity], actual [2.2, 3.3]");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isEqualTo_Fail_NaN() {
try {
assertThat(array(NaN)).isEqualTo(array(NaN), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Not true that <(double[]) [NaN]> is equal to <[NaN]>");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_Default_Fail() {
try {
assertThat(array(2.2d, 5.4d)).isNotEqualTo(array(5.4d, 2.2d));
throw new Error("Expected to throw.");
} catch (UnsupportedOperationException expected) {
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_DifferentOrder() {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(array(3.3d, 2.2d), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_Longer() {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(array(2.2d, 3.3d, 1.1d), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_Shorter() {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(array(2.2d), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_DifferentTypes() {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(new Object(), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_FailEquals() {
try {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(array(2.2d, 3.3d), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("<(double[]) [2.2, 3.3]> unexpectedly equal to [2.2, 3.3].");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_FailApproximatelyEquals() {
double roughly3point3 = nextAfter(3.3d + DEFAULT_TOLERANCE, NEGATIVE_INFINITY);
try {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(array(2.2d, roughly3point3), DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"<(double[]) [2.2, 3.3]> unexpectedly equal to [2.2, " + roughly3point3 + "].");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_NotQuiteApproximatelyEquals() {
assertThat(array(2.2d, 3.3d))
.isNotEqualTo(
array(2.2d, nextAfter(3.3d + DEFAULT_TOLERANCE, POSITIVE_INFINITY)), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_FailSame() {
try {
double[] same = array(2.2d, 3.3d);
assertThat(same).isNotEqualTo(same, DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("<(double[]) [2.2, 3.3]> unexpectedly equal to [2.2, 3.3].");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_Fail_Infinity() {
assertThat(array(2.2d, POSITIVE_INFINITY))
.isNotEqualTo(array(2.2d, POSITIVE_INFINITY), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_Fail_SameInfinity() {
try {
double[] same = array(2.2d, POSITIVE_INFINITY);
assertThat(same).isNotEqualTo(same, DEFAULT_TOLERANCE);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("<(double[]) [2.2, Infinity]> unexpectedly equal to [2.2, Infinity].");
}
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_OneInfinity() {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(array(2.2d, POSITIVE_INFINITY), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_LongerOneInfinity() {
assertThat(array(2.2d, 3.3d)).isNotEqualTo(array(POSITIVE_INFINITY), DEFAULT_TOLERANCE);
}
@SuppressWarnings("deprecation") // testing deprecated method
@Test
public void isNotEqualTo_Fail_NaN() {
assertThat(array(NaN)).isNotEqualTo(array(NaN), DEFAULT_TOLERANCE);
}
@Test
public void hasValuesWithinOf() {
assertThat(array(2.2d, 5.4d)).hasValuesWithin(DEFAULT_TOLERANCE).of(2.2d, 5.4d);
}
@Test
public void hasValuesWithinOf_ApproximatelyEquals() {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.of(2.2d, nextAfter(3.3d + DEFAULT_TOLERANCE, NEGATIVE_INFINITY));
}
@Test
public void hasValuesWithinOf_FailNotQuiteApproximatelyEquals() {
double roughly3point3 = nextAfter(3.3d + DEFAULT_TOLERANCE, POSITIVE_INFINITY);
try {
assertThat(array(2.2d, 3.3d)).hasValuesWithin(DEFAULT_TOLERANCE).of(2.2d, roughly3point3);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2, "
+ roughly3point3
+ "]>. It differs at indexes <[1]>");
}
}
@Test
public void hasValuesWithinOf_Fail_DifferentOrder() {
try {
assertThat(array(2.2d, 3.3d)).hasValuesWithin(DEFAULT_TOLERANCE).of(3.3d, 2.2d);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[3.3, 2.2]>."
+ " It differs at indexes <[0, 1]>");
}
}
@Test
public void hasValuesWithinOf_Fail_Longer() {
try {
assertThat(array(2.2d, 3.3d)).hasValuesWithin(DEFAULT_TOLERANCE).of(2.2d, 3.3d, 1.1d);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2, 3.3, 1.1]>."
+ " Expected length <3> but got <2>");
}
}
@Test
public void hasValuesWithinOf_Fail_Shorter() {
try {
assertThat(array(2.2d, 3.3d)).hasValuesWithin(DEFAULT_TOLERANCE).of(2.2d);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2]>."
+ " Expected length <1> but got <2>");
}
}
@Test
public void hasValuesWithinOf_Fail_Infinity() {
try {
assertThat(array(2.2d, POSITIVE_INFINITY))
.hasValuesWithin(DEFAULT_TOLERANCE)
.of(2.2d, POSITIVE_INFINITY);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, Infinity]> has values within 5.0E-6 of"
+ " <[2.2, Infinity]>. It differs at indexes <[1]>");
}
}
@Test
public void hasValuesWithinOf_Fail_SameInfinity() {
double[] same = array(2.2d, POSITIVE_INFINITY);
try {
assertThat(same).hasValuesWithin(DEFAULT_TOLERANCE).of(same);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, Infinity]> has values within 5.0E-6 of"
+ " <[2.2, Infinity]>. It differs at indexes <[1]>");
}
}
@Test
public void hasValuesWithinOf_Fail_OneInfinity() {
try {
assertThat(array(2.2d, 3.3d)).hasValuesWithin(DEFAULT_TOLERANCE).of(2.2d, POSITIVE_INFINITY);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2, Infinity]>."
+ " It differs at indexes <[1]>");
}
}
@Test
public void hasValuesWithinOf_Fail_LongerOneInfinity() {
try {
assertThat(array(2.2d, 3.3d)).hasValuesWithin(DEFAULT_TOLERANCE).of(POSITIVE_INFINITY);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[Infinity]>."
+ " Expected length <1> but got <2>");
}
}
@Test
public void hasValuesWithinOf_Fail_NaN() {
try {
assertThat(array(NaN)).hasValuesWithin(DEFAULT_TOLERANCE).of(NaN);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [NaN]> has values within 5.0E-6 of <[NaN]>."
+ " It differs at indexes <[0]>");
}
}
@Test
public void hasValuesWithinOf_NullSubject() {
double[] nullArray = null;
try {
assertThat(nullArray).hasValuesWithin(DEFAULT_TOLERANCE).of(3.3d, 2.2d);
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
public void hasValuesWithinOf_NullObbject() {
double[] nullArray = null;
try {
assertThat(array(3.3d, 2.2d)).hasValuesWithin(DEFAULT_TOLERANCE).of(nullArray);
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
public void hasValuesWithinOf_NegativeTolerance() {
try {
assertThat(array(3.3d, 2.2d)).hasValuesWithin(-0.001d).of(3.3d, 2.2d);
throw new Error("Expected to throw.");
} catch (IllegalArgumentException e) {
assertThat(e).hasMessageThat().isEqualTo("tolerance (-0.001) cannot be negative");
}
}
@Test
public void hasValuesWithinOfElementsIn_doubles() {
assertThat(array(2.2d, 5.4d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, 5.4d));
}
@Test
public void hasValuesWithinOfElementsIn_floats() {
assertThat(array(2.2d, 5.4d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Floats.asList(2.2f, 5.4f));
}
@Test
public void hasValuesWithinOfElementsIn_longs() {
assertThat(array(2.0d, 5.0d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Longs.asList(2L, 5L));
}
@Test
public void hasValuesWithinOfElementsIn_ApproximatelyEquals() {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, nextAfter(3.3d + DEFAULT_TOLERANCE, NEGATIVE_INFINITY)));
}
@Test
public void hasValuesWithinOfElementsIn_FailNotQuiteApproximatelyEquals() {
double roughly3point3 = nextAfter(3.3d + DEFAULT_TOLERANCE, POSITIVE_INFINITY);
try {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, roughly3point3));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2, "
+ roughly3point3
+ "]>. It differs at indexes <[1]>");
}
}
@Test
public void hasValuesWithinOfElementsIn_Fail_DifferentOrder() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(3.3d, 2.2d));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[3.3, 2.2]>."
+ " It differs at indexes <[0, 1]>");
}
}
@Test
public void hasValuesWithinOfElementsIn_Fail_Longer() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, 3.3d, 1.1d));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2, 3.3, 1.1]>."
+ " Expected length <3> but got <2>");
}
}
@Test
public void hasValuesWithinOfElementsIn_Fail_Shorter() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2]>."
+ " Expected length <1> but got <2>");
}
}
@Test
public void hasValuesWithinOfElementsIn_Fail_Infinity() {
try {
assertThat(array(2.2d, POSITIVE_INFINITY))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, POSITIVE_INFINITY));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, Infinity]> has values within 5.0E-6 of"
+ " <[2.2, Infinity]>. It differs at indexes <[1]>");
}
}
@Test
public void hasValuesWithinOfElementsIn_Fail_OneInfinity() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, POSITIVE_INFINITY));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[2.2, Infinity]>."
+ " It differs at indexes <[1]>");
}
}
@Test
public void hasValuesWithinOfElementsIn_Fail_LongerOneInfinity() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(POSITIVE_INFINITY));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values within 5.0E-6 of <[Infinity]>."
+ " Expected length <1> but got <2>");
}
}
@Test
public void hasValuesWithinOfElementsIn_Fail_NaN() {
try {
assertThat(array(NaN)).hasValuesWithin(DEFAULT_TOLERANCE).ofElementsIn(Doubles.asList(NaN));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [NaN]> has values within 5.0E-6 of <[NaN]>."
+ " It differs at indexes <[0]>");
}
}
@Test
public void hasValuesWithinOfElementsIn_NullSubject() {
double[] nullArray = null;
try {
assertThat(nullArray)
.hasValuesWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(3.3d, 2.2d));
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
public void hasValuesWithinOfElementsIn_NullObject() {
Iterable<Number> nullIterable = null;
try {
assertThat(array(3.3d, 2.2d)).hasValuesWithin(DEFAULT_TOLERANCE).ofElementsIn(nullIterable);
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
public void hasValuesWithinOfElementsIn_NegativeTolerance() {
try {
assertThat(array(3.3d, 2.2d))
.hasValuesWithin(-0.001d)
.ofElementsIn(Doubles.asList(3.3d, 2.2d));
throw new Error("Expected to throw.");
} catch (IllegalArgumentException e) {
assertThat(e).hasMessageThat().isEqualTo("tolerance (-0.001) cannot be negative");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_DifferentOrder() {
assertThat(array(2.2d, 3.3d)).hasValuesNotWithin(DEFAULT_TOLERANCE).of(3.3d, 2.2d);
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_DifferentLengths() {
assertThat(array(2.2d, 3.3d)).hasValuesNotWithin(DEFAULT_TOLERANCE).of(2.2d, 3.3d, 1.1d);
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_FailEquals() {
try {
assertThat(array(2.2d, 3.3d)).hasValuesNotWithin(DEFAULT_TOLERANCE).of(2.2d, 3.3d);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values not within 5.0E-6 of <[2.2, 3.3]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_FailApproximatelyEquals() {
double roughly3point3 = nextAfter(3.3d + DEFAULT_TOLERANCE, NEGATIVE_INFINITY);
try {
assertThat(array(2.2d, 3.3d)).hasValuesNotWithin(DEFAULT_TOLERANCE).of(2.2d, roughly3point3);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values not within 5.0E-6 of <[2.2, "
+ roughly3point3
+ "]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_NotQuiteApproximatelyEquals() {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.of(2.2d, nextAfter(3.3d + DEFAULT_TOLERANCE, POSITIVE_INFINITY));
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_FailSame() {
try {
double[] same = array(2.2d, 3.3d);
assertThat(same).hasValuesNotWithin(DEFAULT_TOLERANCE).of(same);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values not within 5.0E-6 of <[2.2, 3.3]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_Fail_Infinity() {
try {
assertThat(array(2.2d, POSITIVE_INFINITY))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.of(2.2d, POSITIVE_INFINITY);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, Infinity]> has values not within 5.0E-6 of"
+ " <[2.2, Infinity]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_Fail_SameInfinity() {
try {
double[] same = array(2.2d, POSITIVE_INFINITY);
assertThat(same).hasValuesNotWithin(DEFAULT_TOLERANCE).of(same);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, Infinity]> has values not within 5.0E-6 of"
+ " <[2.2, Infinity]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_OneInfinity() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.of(2.2d, POSITIVE_INFINITY);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values not within 5.0E-6 of"
+ " <[2.2, Infinity]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_LongerOneInfinity() {
assertThat(array(2.2d, 3.3d)).hasValuesNotWithin(DEFAULT_TOLERANCE).of(POSITIVE_INFINITY);
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_Fail_NaN() {
try {
assertThat(array(NaN)).hasValuesNotWithin(DEFAULT_TOLERANCE).of(NaN);
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Not true that <(double[]) [NaN]> has values not within 5.0E-6 of <[NaN]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_NullSubject() {
double[] nullArray = null;
try {
assertThat(nullArray).hasValuesNotWithin(DEFAULT_TOLERANCE).of(3.3d, 2.2d);
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_NullObject() {
double[] nullArray = null;
try {
assertThat(array(3.3d, 2.2d)).hasValuesNotWithin(DEFAULT_TOLERANCE).of(nullArray);
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOf_NegativeTolerance() {
try {
assertThat(array(3.3d, 2.2d)).hasValuesNotWithin(-0.001d).of(3.3d, 2.2d);
throw new Error("Expected to throw.");
} catch (IllegalArgumentException e) {
assertThat(e).hasMessageThat().isEqualTo("tolerance (-0.001) cannot be negative");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_DifferentOrderDoubles() {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(3.3d, 2.2d));
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_DifferentOrderFloats() {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Floats.asList(3.3f, 2.2f));
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_DifferentOrderLongs() {
assertThat(array(2d, 3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Longs.asList(3L, 2L));
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_DifferentLengths() {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, 3.3d, 1.1d));
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_FailEquals() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, 3.3d));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values not within 5.0E-6 of <[2.2, 3.3]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_FailApproximatelyEquals() {
double roughly3point3 = nextAfter(3.3d + DEFAULT_TOLERANCE, NEGATIVE_INFINITY);
try {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, roughly3point3));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values not within 5.0E-6 of <[2.2, "
+ roughly3point3
+ "]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_NotQuiteApproximatelyEquals() {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, nextAfter(3.3d + DEFAULT_TOLERANCE, POSITIVE_INFINITY)));
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_Fail_Infinity() {
try {
assertThat(array(2.2d, POSITIVE_INFINITY))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, POSITIVE_INFINITY));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, Infinity]> has values not within 5.0E-6 of"
+ " <[2.2, Infinity]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_OneInfinity() {
try {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(2.2d, POSITIVE_INFINITY));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo(
"Not true that <(double[]) [2.2, 3.3]> has values not within 5.0E-6 of"
+ " <[2.2, Infinity]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_LongerOneInfinity() {
assertThat(array(2.2d, 3.3d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(POSITIVE_INFINITY));
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_Fail_NaN() {
try {
assertThat(array(NaN))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(NaN));
throw new Error("Expected to throw.");
} catch (AssertionError e) {
assertThat(e)
.hasMessageThat()
.isEqualTo("Not true that <(double[]) [NaN]> has values not within 5.0E-6 of <[NaN]>");
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_NullSubject() {
double[] nullArray = null;
try {
assertThat(nullArray)
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(Doubles.asList(3.3d, 2.2d));
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_NullObject() {
Iterable<Number> nullIterable = null;
try {
assertThat(array(3.3d, 2.2d))
.hasValuesNotWithin(DEFAULT_TOLERANCE)
.ofElementsIn(nullIterable);
throw new Error("Expected to throw.");
} catch (NullPointerException expected) {
}
}
@Test
@SuppressWarnings("deprecation") // testing deprecated method
public void hasValuesNotWithinOfElementsIn_NegativeTolerance() {
try {
assertThat(array(3.3d, 2.2d))
.hasValuesNotWithin(-0.001d)
.ofElementsIn(Doubles.asList(3.3d, 2.2d));
throw new Error("Expected to throw.");
} catch (IllegalArgumentException e) {
assertThat(e).hasMessageThat().isEqualTo("tolerance (-0.001) cannot be negative");
}
}
@Test
public void usingTolerance_contains_success() {
assertThat(array(1.0, nextAfter(2.0 + DEFAULT_TOLERANCE, NEGATIVE_INFINITY), 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(2.0);
}
@Test
public void usingTolerance_contains_successWithExpectedLong() {
assertThat(array(1.0, nextAfter(2.0 + DEFAULT_TOLERANCE, NEGATIVE_INFINITY), 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(2L);
}
@Test
public void usingTolerance_contains_failure() {
double justOverTwoPlusTolerance = nextAfter(2.0 + DEFAULT_TOLERANCE, POSITIVE_INFINITY);
try {
assertThat(array(1.0, justOverTwoPlusTolerance, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(2.0);
fail("Expected AssertionError to be thrown but wasn't");
} catch (AssertionError expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Not true that <[1.0, "
+ justOverTwoPlusTolerance
+ ", 3.0]> contains at least one element that is a finite number within "
+ DEFAULT_TOLERANCE
+ " of <2.0>");
}
}
@Test
public void usingTolerance_contains_failureWithInfinity() {
try {
assertThat(array(1.0, POSITIVE_INFINITY, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(POSITIVE_INFINITY);
fail("Expected AssertionError to be thrown but wasn't");
} catch (AssertionError expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Not true that <[1.0, Infinity, 3.0]> contains at least one element that is "
+ "a finite number within "
+ DEFAULT_TOLERANCE
+ " of <Infinity>");
}
}
@Test
public void usingTolerance_contains_failureWithNaN() {
try {
assertThat(array(1.0, NaN, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(NaN);
fail("Expected AssertionError to be thrown but wasn't");
} catch (AssertionError expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Not true that <[1.0, NaN, 3.0]> contains at least one element that is "
+ "a finite number within "
+ DEFAULT_TOLERANCE
+ " of <NaN>");
}
}
@Test
public void usingTolerance_contains_successWithNegativeZero() {
assertThat(array(1.0, -0.0, 3.0))
.usingTolerance(0.0)
.contains(0.0);
}
@Test
public void usingTolerance_contains_otherTypes() {
// Expected value is Float
assertThat(array(1.0, 2.0 + 0.5 * DEFAULT_TOLERANCE, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(2.0f);
// Expected value is Integer
assertThat(array(1.0, 2.0 + 0.5 * DEFAULT_TOLERANCE, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(2);
// Expected value is Integer.MAX_VALUE
assertThat(array(1.0, Integer.MAX_VALUE + 0.5 * DEFAULT_TOLERANCE, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(Integer.MAX_VALUE);
// Expected value is Long
assertThat(array(1.0, 2.0 + 0.5 * DEFAULT_TOLERANCE, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(2L);
// Expected value is Long.MIN_VALUE. This is -1*2^63, which has an exact double representation.
// For the actual value we use the next value down, which is is 2^11 smaller (because the
// resolution of doubles with absolute values between 2^63 and 2^64 is 2^11). So we'll make the
// assertion with a tolerance of 2^12.
assertThat(array(1.0, nextAfter((double) Long.MIN_VALUE, NEGATIVE_INFINITY), 3.0))
.usingTolerance(1 << 12)
.contains(Long.MIN_VALUE);
// Expected value is BigInteger
assertThat(array(1.0, 2.0 + 0.5 * DEFAULT_TOLERANCE, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(BigInteger.valueOf(2));
// Expected value is BigDecimal
assertThat(array(1.0, 2.0 + 0.5 * DEFAULT_TOLERANCE, 3.0))
.usingTolerance(DEFAULT_TOLERANCE)
.contains(BigDecimal.valueOf(2.0));
}
@Test
public void usingTolerance_contains_nullExpected() {
try {
assertThat(array(1.0, 2.0, 3.0)).usingTolerance(DEFAULT_TOLERANCE).contains(null);
fail("Expected NullPointerException to be thrown but wasn't");
} catch (NullPointerException expected) {
}
}
@Test
public void usingTolerance_contains_negativeTolerance() {
try {
assertThat(array(1.0, 2.0, 3.0)).usingTolerance(-1.0 * DEFAULT_TOLERANCE).contains(2.0f);
fail("Expected IllegalArgumentException to be thrown but wasn't");
} catch (IllegalArgumentException expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo("tolerance (" + -1.0 * DEFAULT_TOLERANCE + ") cannot be negative");
}
}
@Test
public void usingExactEquality_contains_success() {
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains(2.0);
}
@Test
public void usingExactEquality_contains_failure() {
double justOverTwo = nextAfter(2.0, POSITIVE_INFINITY);
try {
assertThat(array(1.0, justOverTwo, 3.0)).usingExactEquality().contains(2.0);
fail("Expected AssertionError to be thrown but wasn't");
} catch (AssertionError expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Not true that <[1.0, "
+ justOverTwo
+ ", 3.0]> contains at least one element that is exactly equal to <2.0>");
}
}
@Test
public void usingExactEquality_contains_otherTypes() {
// Expected value is Float
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains(2.0f);
// Expected value is Integer
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains(2);
assertThat(array(1.0, Integer.MAX_VALUE, 3.0)).usingExactEquality().contains(Integer.MAX_VALUE);
// Expected value is Long - supported up to +/- 2^53
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains(2L);
assertThat(array(1.0, 1L << 53, 3.0)).usingExactEquality().contains(1L << 53);
try {
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains((1L << 53) + 1L);
} catch (IllegalArgumentException expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Expected value 9007199254740993 in assertion using exact double equality was a long "
+ "with an absolute value greater than 2^52 which has no exact double "
+ "representation");
}
// Expected value is BigInteger - not supported
try {
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains(BigInteger.valueOf(2));
} catch (IllegalArgumentException expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Expected value in assertion using exact double equality was of unsupported type "
+ BigInteger.class
+ " (it may not have an exact double representation)");
}
// Expected value is BigDecimal - not supported
try {
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains(BigDecimal.valueOf(2.0));
} catch (IllegalArgumentException expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Expected value in assertion using exact double equality was of unsupported type "
+ BigDecimal.class
+ " (it may not have an exact double representation)");
}
}
@Test
public void usingExactEquality_contains_successWithInfinity() {
assertThat(array(1.0, POSITIVE_INFINITY, 3.0)).usingExactEquality().contains(POSITIVE_INFINITY);
}
@Test
public void usingExactEquality_contains_successWithNaN() {
assertThat(array(1.0, NaN, 3.0)).usingExactEquality().contains(NaN);
}
@Test
public void usingExactEquality_contains_failureWithNegativeZero() {
try {
assertThat(array(1.0, -0.0, 3.0)).usingExactEquality().contains(0.0);
} catch (AssertionError expected) {
assertThat(expected)
.hasMessageThat()
.isEqualTo(
"Not true that <[1.0, -0.0, 3.0]> contains at least one element that is "
+ "exactly equal to <0.0>");
}
}
@Test
public void usingExactEquality_contains_nullExpected() {
try {
assertThat(array(1.0, 2.0, 3.0)).usingExactEquality().contains(null);
fail("Expected NullPointerException to be thrown but wasn't");
} catch (NullPointerException expected) {
}
}
private static double[] array(double... primitives) {
return primitives;
}
}