/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.collect.array; import static com.opengamma.strata.collect.DoubleArrayMath.EMPTY_DOUBLE_ARRAY; import static com.opengamma.strata.collect.TestHelper.assertThrows; import static com.opengamma.strata.collect.TestHelper.coverImmutableBean; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.NoSuchElementException; import java.util.concurrent.atomic.AtomicInteger; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; /** * Test {@link DoubleArray}. */ @Test public class DoubleArrayTest { private static final double DELTA = 1e-14; public void test_EMPTY() { assertContent(DoubleArray.EMPTY); } public void test_of() { assertContent(DoubleArray.of()); assertContent(DoubleArray.of(1d), 1d); assertContent(DoubleArray.of(1d, 2d), 1d, 2d); assertContent(DoubleArray.of(1d, 2d, 3d), 1d, 2d, 3d); assertContent(DoubleArray.of(1d, 2d, 3d, 4d), 1d, 2d, 3d, 4d); assertContent(DoubleArray.of(1d, 2d, 3d, 4d, 5d), 1d, 2d, 3d, 4d, 5d); assertContent(DoubleArray.of(1d, 2d, 3d, 4d, 5d, 6d), 1d, 2d, 3d, 4d, 5d, 6d); assertContent(DoubleArray.of(1d, 2d, 3d, 4d, 5d, 6d, 7d), 1d, 2d, 3d, 4d, 5d, 6d, 7d); assertContent(DoubleArray.of(1d, 2d, 3d, 4d, 5d, 6d, 7d, 8d), 1d, 2d, 3d, 4d, 5d, 6d, 7d, 8d); assertContent(DoubleArray.of(1d, 2d, 3d, 4d, 5d, 6d, 7d, 8d, 9d), 1d, 2d, 3d, 4d, 5d, 6d, 7d, 8d, 9d); } public void test_of_lambda() { assertContent(DoubleArray.of(0, i -> { throw new AssertionError(); })); AtomicInteger counter = new AtomicInteger(2); assertContent(DoubleArray.of(1, i -> counter.getAndIncrement()), 2d); assertContent(DoubleArray.of(2, i -> counter.getAndIncrement()), 3d, 4d); } public void test_ofUnsafe() { double[] base = {1d, 2d, 3d}; DoubleArray test = DoubleArray.ofUnsafe(base); assertContent(test, 1d, 2d, 3d); base[0] = 4d; // internal state of object mutated - don't do this in application code! assertContent(test, 4d, 2d, 3d); // empty assertContent(DoubleArray.ofUnsafe(EMPTY_DOUBLE_ARRAY)); } public void test_copyOf_List() { assertContent(DoubleArray.copyOf(ImmutableList.of(1d, 2d, 3d)), 1d, 2d, 3d); assertContent(DoubleArray.copyOf(ImmutableList.of())); } public void test_copyOf_array() { double[] base = new double[] {1d, 2d, 3d}; DoubleArray test = DoubleArray.copyOf(base); assertContent(test, 1d, 2d, 3d); base[0] = 4d; // internal state of object is not mutated assertContent(test, 1d, 2d, 3d); // empty assertContent(DoubleArray.copyOf(EMPTY_DOUBLE_ARRAY)); } public void test_copyOf_array_fromIndex() { assertContent(DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 0), 1d, 2d, 3d); assertContent(DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 1), 2d, 3d); assertContent(DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 3)); assertThrows(() -> DoubleArray.copyOf(new double[] {1d, 2d, 3d}, -1), IndexOutOfBoundsException.class); assertThrows(() -> DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 4), IndexOutOfBoundsException.class); } public void test_copyOf_array_fromToIndex() { assertContent(DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 0, 3), 1d, 2d, 3d); assertContent(DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 1, 2), 2d); assertContent(DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 1, 1)); assertThrows(() -> DoubleArray.copyOf(new double[] {1d, 2d, 3d}, -1, 3), IndexOutOfBoundsException.class); assertThrows(() -> DoubleArray.copyOf(new double[] {1d, 2d, 3d}, 0, 5), IndexOutOfBoundsException.class); } public void test_filled() { assertContent(DoubleArray.filled(0)); assertContent(DoubleArray.filled(3), 0d, 0d, 0d); } public void test_filled_withValue() { assertContent(DoubleArray.filled(0, 1.5)); assertContent(DoubleArray.filled(3, 1.5), 1.5, 1.5, 1.5); } //------------------------------------------------------------------------- public void test_get() { DoubleArray test = DoubleArray.of(1d, 2d, 3d, 3d, 4d); assertEquals(test.get(0), 1d); assertEquals(test.get(4), 4d); assertThrows(() -> test.get(-1), IndexOutOfBoundsException.class); assertThrows(() -> test.get(5), IndexOutOfBoundsException.class); } public void test_contains() { DoubleArray test = DoubleArray.of(1d, 2d, 3d, 3d, 4d); assertEquals(test.contains(1d), true); assertEquals(test.contains(3d), true); assertEquals(test.contains(5d), false); assertEquals(DoubleArray.EMPTY.contains(5d), false); } public void test_indexOf() { DoubleArray test = DoubleArray.of(1d, 2d, 3d, 3d, 4d); assertEquals(test.indexOf(2d), 1); assertEquals(test.indexOf(3d), 2); assertEquals(test.indexOf(5d), -1); assertEquals(DoubleArray.EMPTY.indexOf(5d), -1); } public void test_lastIndexOf() { DoubleArray test = DoubleArray.of(1d, 2d, 3d, 3d, 4d); assertEquals(test.lastIndexOf(2d), 1); assertEquals(test.lastIndexOf(3d), 3); assertEquals(test.lastIndexOf(5d), -1); assertEquals(DoubleArray.EMPTY.lastIndexOf(5d), -1); } //------------------------------------------------------------------------- public void test_copyInto() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); double[] dest = new double[4]; test.copyInto(dest, 0); assertTrue(Arrays.equals(dest, new double[] {1d, 2d, 3d, 0d})); double[] dest2 = new double[4]; test.copyInto(dest2, 1); assertTrue(Arrays.equals(dest2, new double[] {0d, 1d, 2d, 3d})); double[] dest3 = new double[4]; assertThrows(() -> test.copyInto(dest3, 2), IndexOutOfBoundsException.class); assertThrows(() -> test.copyInto(dest3, -1), IndexOutOfBoundsException.class); } //------------------------------------------------------------------------- public void test_subArray_from() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.subArray(0), 1d, 2d, 3d); assertContent(test.subArray(1), 2d, 3d); assertContent(test.subArray(2), 3d); assertContent(test.subArray(3)); assertThrows(() -> test.subArray(4), IndexOutOfBoundsException.class); assertThrows(() -> test.subArray(-1), IndexOutOfBoundsException.class); } public void test_subArray_fromTo() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.subArray(0, 3), 1d, 2d, 3d); assertContent(test.subArray(1, 3), 2d, 3d); assertContent(test.subArray(2, 3), 3d); assertContent(test.subArray(3, 3)); assertContent(test.subArray(1, 2), 2d); assertThrows(() -> test.subArray(0, 4), IndexOutOfBoundsException.class); assertThrows(() -> test.subArray(-1, 3), IndexOutOfBoundsException.class); } //------------------------------------------------------------------------- public void test_toList() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); List<Double> list = test.toList(); assertContent(DoubleArray.copyOf(list), 1d, 2d, 3d); assertEquals(list.size(), 3); assertEquals(list.isEmpty(), false); assertEquals(list.get(0), 1d); assertEquals(list.get(2), 3d); assertEquals(list.contains(2d), true); assertEquals(list.contains(5d), false); assertEquals(list.contains(""), false); assertEquals(list.indexOf(2d), 1); assertEquals(list.indexOf(5d), -1); assertEquals(list.indexOf(""), -1); assertEquals(list.lastIndexOf(3d), 2); assertEquals(list.lastIndexOf(5d), -1); assertEquals(list.lastIndexOf(""), -1); assertThrows(() -> list.clear(), UnsupportedOperationException.class); assertThrows(() -> list.set(0, 3d), UnsupportedOperationException.class); } public void test_toList_iterator() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); List<Double> list = test.toList(); Iterator<Double> it = list.iterator(); assertEquals(it.hasNext(), true); assertEquals(it.next(), 1d); assertEquals(it.hasNext(), true); assertEquals(it.next(), 2d); assertEquals(it.hasNext(), true); assertEquals(it.next(), 3d); assertEquals(it.hasNext(), false); assertThrows(() -> it.remove(), UnsupportedOperationException.class); } public void test_toList_listIterator() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); List<Double> list = test.toList(); ListIterator<Double> lit = list.listIterator(); assertEquals(lit.nextIndex(), 0); assertEquals(lit.previousIndex(), -1); assertEquals(lit.hasNext(), true); assertEquals(lit.hasPrevious(), false); assertThrows(() -> lit.previous(), NoSuchElementException.class); assertEquals(lit.next(), 1d); assertEquals(lit.nextIndex(), 1); assertEquals(lit.previousIndex(), 0); assertEquals(lit.hasNext(), true); assertEquals(lit.hasPrevious(), true); assertEquals(lit.next(), 2d); assertEquals(lit.nextIndex(), 2); assertEquals(lit.previousIndex(), 1); assertEquals(lit.hasNext(), true); assertEquals(lit.hasPrevious(), true); assertEquals(lit.next(), 3d); assertEquals(lit.nextIndex(), 3); assertEquals(lit.previousIndex(), 2); assertEquals(lit.hasNext(), false); assertEquals(lit.hasPrevious(), true); assertThrows(() -> lit.next(), NoSuchElementException.class); assertEquals(lit.previous(), 3d); assertEquals(lit.nextIndex(), 2); assertEquals(lit.previousIndex(), 1); assertEquals(lit.hasNext(), true); assertEquals(lit.hasPrevious(), true); assertThrows(() -> lit.remove(), UnsupportedOperationException.class); assertThrows(() -> lit.set(2d), UnsupportedOperationException.class); assertThrows(() -> lit.add(2d), UnsupportedOperationException.class); } //------------------------------------------------------------------------- public void test_stream() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); double[] streamed = test.stream().toArray(); assertTrue(Arrays.equals(streamed, new double[] {1d, 2d, 3d})); } //------------------------------------------------------------------------- public void test_forEach() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); double[] extracted = new double[3]; test.forEach((i, v) -> extracted[i] = v); assertTrue(Arrays.equals(extracted, new double[] {1d, 2d, 3d})); } //------------------------------------------------------------------------- public void test_with() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.with(0, 2.6d), 2.6d, 2d, 3d); assertContent(test.with(0, 1d), 1d, 2d, 3d); assertThrows(() -> test.with(-1, 2d), IndexOutOfBoundsException.class); assertThrows(() -> test.with(3, 2d), IndexOutOfBoundsException.class); } //------------------------------------------------------------------------- public void test_plus() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.plus(5), 6d, 7d, 8d); assertContent(test.plus(0), 1d, 2d, 3d); assertContent(test.plus(-5), -4d, -3d, -2d); } public void test_minus() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.minus(5), -4d, -3d, -2d); assertContent(test.minus(0), 1d, 2d, 3d); assertContent(test.minus(-5), 6d, 7d, 8d); } public void test_multipliedBy() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.multipliedBy(5), 5d, 10d, 15d); assertContent(test.multipliedBy(1), 1d, 2d, 3d); } public void test_dividedBy() { DoubleArray test = DoubleArray.of(10d, 20d, 30d); assertContent(test.dividedBy(5), 2d, 4d, 6d); assertContent(test.dividedBy(1), 10d, 20d, 30d); } public void test_map() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.map(v -> 1 / v), 1d, 1d / 2d, 1d / 3d); } public void test_mapWithIndex() { DoubleArray test = DoubleArray.of(1d, 2d, 3d); assertContent(test.mapWithIndex((i, v) -> i * v), 0d, 2d, 6d); } //------------------------------------------------------------------------- public void test_plus_array() { DoubleArray test1 = DoubleArray.of(1d, 2d, 3d); DoubleArray test2 = DoubleArray.of(0.5d, 0.6d, 0.7d); assertContent(test1.plus(test2), 1.5d, 2.6d, 3.7d); assertThrows(() -> test1.plus(DoubleArray.EMPTY), IllegalArgumentException.class); } public void test_minus_array() { DoubleArray test1 = DoubleArray.of(1d, 2d, 3d); DoubleArray test2 = DoubleArray.of(0.5d, 0.6d, 0.7d); assertContent(test1.minus(test2), 0.5d, 1.4d, 2.3d); assertThrows(() -> test1.minus(DoubleArray.EMPTY), IllegalArgumentException.class); } public void test_multipliedBy_array() { DoubleArray test1 = DoubleArray.of(1d, 2d, 3d); DoubleArray test2 = DoubleArray.of(0.5d, 0.6d, 0.7d); assertContent(test1.multipliedBy(test2), 0.5d, 1.2d, 2.1d); assertThrows(() -> test1.multipliedBy(DoubleArray.EMPTY), IllegalArgumentException.class); } public void test_dividedBy_array() { DoubleArray test1 = DoubleArray.of(10d, 20d, 30d); DoubleArray test2 = DoubleArray.of(2d, 5d, 10d); assertContent(test1.dividedBy(test2), 5d, 4d, 3d); assertThrows(() -> test1.dividedBy(DoubleArray.EMPTY), IllegalArgumentException.class); } public void test_combine() { DoubleArray test1 = DoubleArray.of(1d, 2d, 3d); DoubleArray test2 = DoubleArray.of(0.5d, 0.6d, 0.7d); assertContent(test1.combine(test2, (a, b) -> a * b), 0.5d, 2d * 0.6d, 3d * 0.7d); assertThrows(() -> test1.combine(DoubleArray.EMPTY, (a, b) -> a * b), IllegalArgumentException.class); } public void test_combineReduce() { DoubleArray test1 = DoubleArray.of(1d, 2d, 3d); DoubleArray test2 = DoubleArray.of(0.5d, 0.6d, 0.7d); assertEquals(test1.combineReduce(test2, (r, a, b) -> r + a * b), 0.5d + 2d * 0.6d + 3d * 0.7d); assertThrows(() -> test1.combineReduce(DoubleArray.EMPTY, (r, a, b) -> r + a * b), IllegalArgumentException.class); } //------------------------------------------------------------------------- public void test_sorted() { assertContent(DoubleArray.of().sorted()); assertContent(DoubleArray.of(2d).sorted(), 2d); assertContent(DoubleArray.of(2d, 1d, 3d, 0d).sorted(), 0d, 1d, 2d, 3d); } //------------------------------------------------------------------------- public void test_min() { assertEquals(DoubleArray.of(2d).min(), 2d); assertEquals(DoubleArray.of(2d, 1d, 3d).min(), 1d); assertThrows(() -> DoubleArray.EMPTY.min(), IllegalStateException.class); } public void test_max() { assertEquals(DoubleArray.of(2d).max(), 2d); assertEquals(DoubleArray.of(2d, 1d, 3d).max(), 3d); assertThrows(() -> DoubleArray.EMPTY.max(), IllegalStateException.class); } public void test_sum() { assertEquals(DoubleArray.EMPTY.sum(), 0d); assertEquals(DoubleArray.of(2d).sum(), 2d); assertEquals(DoubleArray.of(2d, 1d, 3d).sum(), 6d); } public void test_reduce() { assertEquals(DoubleArray.EMPTY.reduce(2d, (r, v) -> { throw new AssertionError(); }), 2d); assertEquals(DoubleArray.of(2d).reduce(1d, (r, v) -> r * v), 2d); assertEquals(DoubleArray.of(2d, 1d, 3d).reduce(1d, (r, v) -> r * v), 6d); } //------------------------------------------------------------------------- public void test_concat_varargs() { DoubleArray test1 = DoubleArray.of(1d, 2d, 3d); assertContent(test1.concat(0.5d, 0.6d, 0.7d), 1d, 2d, 3d, 0.5d, 0.6d, 0.7d); assertContent(test1.concat(new double[] {0.5d, 0.6d, 0.7d}), 1d, 2d, 3d, 0.5d, 0.6d, 0.7d); assertContent(test1.concat(EMPTY_DOUBLE_ARRAY), 1d, 2d, 3d); assertContent(DoubleArray.EMPTY.concat(new double[] {1d, 2d, 3d}), 1d, 2d, 3d); } public void test_concat_object() { DoubleArray test1 = DoubleArray.of(1d, 2d, 3d); DoubleArray test2 = DoubleArray.of(0.5d, 0.6d, 0.7d); assertContent(test1.concat(test2), 1d, 2d, 3d, 0.5d, 0.6d, 0.7d); assertContent(test1.concat(DoubleArray.EMPTY), 1d, 2d, 3d); assertContent(DoubleArray.EMPTY.concat(test1), 1d, 2d, 3d); } //------------------------------------------------------------------------- public void test_equalWithTolerance() { DoubleArray a1 = DoubleArray.of(1d, 2d); DoubleArray a2 = DoubleArray.of(1d, 2.02d); DoubleArray a3 = DoubleArray.of(1d, 2.009d); DoubleArray b = DoubleArray.of(1d, 2d, 3d); assertEquals(a1.equalWithTolerance(a2, 0.01d), false); assertEquals(a1.equalWithTolerance(a3, 0.01d), true); assertEquals(a1.equalWithTolerance(b, 0.01d), false); } public void test_equalZeroWithTolerance() { DoubleArray a1 = DoubleArray.of(0d, 0d); DoubleArray a2 = DoubleArray.of(0d, 0.02d); DoubleArray a3 = DoubleArray.of(0d, 0.009d); DoubleArray b = DoubleArray.of(1d, 2d, 3d); assertEquals(a1.equalZeroWithTolerance(0.01d), true); assertEquals(a2.equalZeroWithTolerance(0.01d), false); assertEquals(a3.equalZeroWithTolerance(0.01d), true); assertEquals(b.equalZeroWithTolerance(0.01d), false); } //------------------------------------------------------------------------- public void test_equalsHashCode() { DoubleArray a1 = DoubleArray.of(1d, 2d); DoubleArray a2 = DoubleArray.of(1d, 2d); DoubleArray b = DoubleArray.of(1d, 2d, 3d); assertEquals(a1.equals(a1), true); assertEquals(a1.equals(a2), true); assertEquals(a1.equals(b), false); assertEquals(a1.equals(""), false); assertEquals(a1.equals(null), false); assertEquals(a1.hashCode(), a2.hashCode()); } public void test_toString() { DoubleArray test = DoubleArray.of(1d, 2d); assertEquals(test.toString(), "[1.0, 2.0]"); } //------------------------------------------------------------------------- public void coverage() { coverImmutableBean(DoubleArray.of(1d, 2d, 3d)); DoubleArray.of(1d, 2d, 3d).metaBean().metaProperty("array").metaBean(); DoubleArray.of(1d, 2d, 3d).metaBean().metaProperty("array").propertyGenericType(); DoubleArray.of(1d, 2d, 3d).metaBean().metaProperty("array").annotations(); } //------------------------------------------------------------------------- private void assertContent(DoubleArray array, double... expected) { if (expected.length == 0) { assertSame(array, DoubleArray.EMPTY); assertEquals(array.isEmpty(), true); } else { assertEquals(array.size(), expected.length); assertArray(array.toArray(), expected); assertArray(array.toArrayUnsafe(), expected); assertEquals(array.dimensions(), 1); assertEquals(array.isEmpty(), false); } } private void assertArray(double[] array, double[] expected) { assertEquals(array.length, expected.length); for (int i = 0; i < array.length; i++) { assertEquals(array[i], expected[i], DELTA, "Unexpected value at index " + i + ","); } } }