| /* |
| * Copyright 2016 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.gwt.emultest.java8.util.stream; |
| |
| import com.google.gwt.emultest.java.util.EmulTestBase; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.LongSummaryStatistics; |
| import java.util.OptionalLong; |
| import java.util.Spliterator; |
| import java.util.function.LongSupplier; |
| import java.util.function.Supplier; |
| import java.util.stream.DoubleStream; |
| import java.util.stream.LongStream; |
| import java.util.stream.Stream; |
| |
| /** |
| * Tests {@link LongStream}. |
| */ |
| public class LongStreamTest extends EmulTestBase { |
| |
| public void testEmptyStream() { |
| LongStream empty = LongStream.empty(); |
| assertEquals(0, empty.count()); |
| try { |
| empty.count(); |
| fail("second terminal operation should have thrown IllegalStateEx"); |
| } catch (IllegalStateException expected) { |
| // expected |
| } |
| |
| assertEquals(0, LongStream.empty().limit(2).toArray().length); |
| assertEquals(0L, LongStream.empty().count()); |
| assertEquals(0L, LongStream.empty().limit(2).count()); |
| |
| assertFalse(LongStream.empty().findFirst().isPresent()); |
| assertFalse(LongStream.empty().findAny().isPresent()); |
| assertFalse(LongStream.empty().max().isPresent()); |
| assertFalse(LongStream.empty().min().isPresent()); |
| assertTrue(LongStream.empty().noneMatch(item -> true)); |
| assertTrue(LongStream.empty().allMatch(item -> true)); |
| assertFalse(LongStream.empty().anyMatch(item -> true)); |
| assertEquals(new long[0], LongStream.empty().toArray()); |
| } |
| |
| public void testStreamOfOne() { |
| Supplier<LongStream> one = () -> LongStream.of(1); |
| assertEquals(new long[] {1L}, one.get().toArray()); |
| assertEquals(1L, one.get().count()); |
| assertEquals(1, one.get().findFirst().getAsLong()); |
| assertEquals(1, one.get().findAny().getAsLong()); |
| } |
| |
| public void testBuilder() { |
| LongStream s = LongStream.builder().add(1L).add(3L).add(2L).build(); |
| |
| assertEquals(new long[] {1L, 3L, 2L}, s.toArray()); |
| |
| LongStream.Builder builder = LongStream.builder(); |
| LongStream built = builder.build(); |
| assertEquals(0L, built.count()); |
| try { |
| builder.build(); |
| fail("build() after build() should fail"); |
| } catch (IllegalStateException expected) { |
| // expected |
| } |
| try { |
| builder.add(10L); |
| fail("add() after build() should fail"); |
| } catch (IllegalStateException expected) { |
| // expected |
| } |
| } |
| |
| public void testConcat() { |
| Supplier<LongStream> adbc = () -> LongStream.concat(LongStream.of(1, 4), LongStream.of(2, 3)); |
| |
| assertEquals(new long[] {1L, 4L, 2L, 3L}, adbc.get().toArray()); |
| assertEquals(new long[] {1L, 2L, 3L, 4L}, adbc.get().sorted().toArray()); |
| |
| List<String> closed = new ArrayList<>(); |
| LongStream first = LongStream.of(1L).onClose(() -> closed.add("first")); |
| LongStream second = LongStream.of(2L).onClose(() -> closed.add("second")); |
| |
| LongStream concat = LongStream.concat(first, second); |
| |
| // read everything, make sure we saw it all and didn't close automatically |
| long collectedAll = concat.sum(); |
| assertEquals(3L, collectedAll); |
| assertEquals(0, closed.size()); |
| |
| concat.close(); |
| assertEquals(Arrays.asList("first", "second"), closed); |
| } |
| |
| public void testIterate() { |
| assertEquals( |
| new long[] {10L, 11L, 12L, 13L, 14L}, |
| LongStream.iterate(0L, l -> l + 1L).skip(10).limit(5).toArray()); |
| } |
| |
| public void testGenerate() { |
| // infinite, but if you limit it is already too short to skip much |
| assertEquals(new long[0], LongStream.generate(makeGenerator()).limit(4).skip(5).toArray()); |
| |
| assertEquals( |
| new long[] {10L, 11L, 12L, 13L, 14L}, |
| LongStream.generate(makeGenerator()).skip(10).limit(5).toArray()); |
| } |
| |
| private LongSupplier makeGenerator() { |
| return new LongSupplier() { |
| long next = 0L; |
| |
| @Override |
| public long getAsLong() { |
| return next++; |
| } |
| }; |
| } |
| |
| public void testRange() { |
| assertEquals(new long[] {1L, 2L, 3L, 4L}, LongStream.range(1, 5).toArray()); |
| assertEquals(new long[] {-1L, 0L, 1L, 2L, 3L, 4L}, LongStream.range(-1, 5).toArray()); |
| assertEquals(new long[] {}, LongStream.range(1, -5).toArray()); |
| assertEquals(new long[] {}, LongStream.range(-1, -5).toArray()); |
| } |
| |
| public void testRangeClosed() { |
| assertEquals(new long[] {1L, 2L, 3L, 4L, 5L}, LongStream.rangeClosed(1, 5).toArray()); |
| assertEquals(new long[] {-1L, 0L, 1L, 2L, 3L, 4L, 5L}, LongStream.rangeClosed(-1, 5).toArray()); |
| assertEquals(new long[] {}, LongStream.rangeClosed(1, -5).toArray()); |
| assertEquals(new long[] {}, LongStream.rangeClosed(-1, -5).toArray()); |
| } |
| |
| public void testToArray() { |
| assertEquals(new long[0], LongStream.of().toArray()); |
| assertEquals(new long[] {1L}, LongStream.of(1L).toArray()); |
| assertEquals(new long[] {3L, 2L, 0L}, LongStream.of(3L, 2L, 0L).toArray()); |
| } |
| |
| public void testReduce() { |
| long reduced = LongStream.of(1L, 2L, 4L).reduce(0, Long::sum); |
| assertEquals(7, reduced); |
| |
| reduced = LongStream.of().reduce(0, Long::sum); |
| assertEquals(0L, reduced); |
| |
| OptionalLong maybe = LongStream.of(1L, 4L, 8L).reduce(Long::sum); |
| assertTrue(maybe.isPresent()); |
| assertEquals(13L, maybe.getAsLong()); |
| maybe = LongStream.of().reduce(Long::sum); |
| assertFalse(maybe.isPresent()); |
| } |
| |
| public void testFilter() { |
| // unconsumed stream never runs filter |
| boolean[] data = {false}; |
| LongStream.of(1L, 2L, 3L).filter(i -> data[0] |= true); |
| assertFalse(data[0]); |
| |
| // Nothing's *defined* to care about the Spliterator characteristics, but the implementation |
| // can't actually know the size before executing, so we check the characteristics explicitly. |
| assertFalse( |
| LongStream.of(1L, 2L, 3L) |
| .filter(a -> a == 1L) |
| .spliterator() |
| .hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED)); |
| |
| // one result |
| assertEquals(new long[] {1L}, LongStream.of(1L, 2L, 3L, 4L, 3L).filter(a -> a == 1).toArray()); |
| // zero results |
| assertEquals(new long[0], LongStream.of(1L, 2L, 3L, 4L, 3L).filter(a -> false).toArray()); |
| // two results |
| assertEquals( |
| new long[] {2L, 4L}, LongStream.of(1L, 2L, 3L, 4L, 3L).filter(a -> a % 2 == 0).toArray()); |
| // all |
| assertEquals( |
| new long[] {1L, 2L, 3L, 4L, 3L}, |
| LongStream.of(1L, 2L, 3L, 4L, 3L).filter(a -> true).toArray()); |
| } |
| |
| public void testMap() { |
| // unconsumed stream never runs map |
| int[] data = {0}; |
| LongStream.of(1L, 2L, 3L).map(i -> data[0]++); |
| assertEquals(0, data[0]); |
| |
| assertEquals(new long[] {2L, 4L, 6L}, LongStream.of(1L, 2L, 3L).map(i -> i * 2).toArray()); |
| } |
| |
| public void testPeek() { |
| // unconsumed stream never peeks |
| boolean[] data = {false}; |
| LongStream.of(1L, 2L, 3L).peek(i -> data[0] |= true); |
| assertFalse(data[0]); |
| |
| // make sure we saw it all in order |
| long[] items = new long[] {1L, 2L, 3L}; |
| List<Long> peeked = new ArrayList<>(); |
| LongStream.of(items) |
| .peek(peeked::add) |
| .forEach( |
| item -> { |
| // do nothing, just run |
| }); |
| assertEquals(items.length, peeked.size()); |
| for (int i = 0; i < items.length; i++) { |
| assertEquals(items[i], (long) peeked.get(i)); |
| } |
| } |
| |
| // same impl, no parallel in browser |
| public void testFindFirstOrAny() { |
| OptionalLong any = LongStream.of(1L, 2L).findAny(); |
| assertTrue(any.isPresent()); |
| assertEquals(1L, any.getAsLong()); |
| } |
| |
| public void testAnyMatch() { |
| // all |
| assertTrue(LongStream.of(1L, 2L).anyMatch(s -> true)); |
| |
| // some |
| assertTrue(LongStream.of(1L, 2L).anyMatch(s -> s == 1L)); |
| |
| // none |
| assertFalse(LongStream.of(1L, 2L).anyMatch(s -> false)); |
| } |
| |
| public void testAllMatch() { |
| // all |
| assertTrue(LongStream.of(1L, 2L).allMatch(s -> true)); |
| |
| // some |
| assertFalse(LongStream.of(1L, 2L).allMatch(s -> s == 1L)); |
| |
| // none |
| assertFalse(LongStream.of(1L, 2L).allMatch(s -> false)); |
| } |
| |
| public void testNoneMatch() { |
| // all |
| assertFalse(LongStream.of(1L, 2L).noneMatch(s -> true)); |
| |
| // some |
| assertFalse(LongStream.of(1L, 2L).noneMatch(s -> s == 1L)); |
| |
| // none |
| assertTrue(LongStream.of(1L, 2L).noneMatch(s -> false)); |
| } |
| |
| public void testFlatMap() { |
| assertEquals(0L, LongStream.empty().flatMap(value -> LongStream.of(1L)).count()); |
| assertEquals(0L, LongStream.of(1L).flatMap(value -> LongStream.empty()).count()); |
| assertEquals(0L, LongStream.of(1L).flatMap(value -> LongStream.of()).count()); |
| assertEquals(0L, LongStream.of().flatMap(value -> LongStream.of(1L)).count()); |
| assertEquals(1L, LongStream.of(1L).flatMap(value -> LongStream.of(1L)).count()); |
| |
| LongStream values = LongStream.of(1L, 2L, 3L); |
| |
| assertEquals( |
| new long[] {1L, 2L, 2L, 4L, 3L, 6L}, |
| values.flatMap(i -> LongStream.of(i, i * 2)).toArray()); |
| } |
| |
| public void testMapToOthers() { |
| Supplier<LongStream> s = () -> LongStream.of(1, 2, 10); |
| |
| assertEquals( |
| new String[] {"1", "2", "10"}, s.get().mapToObj(String::valueOf).toArray(String[]::new)); |
| |
| assertEquals(new int[] {1, 2, 10}, s.get().mapToInt(i -> (int) i).toArray()); |
| |
| assertEquals(new double[] {1d, 2d, 10d}, s.get().mapToDouble(i -> (double) i).toArray()); |
| } |
| |
| public void testDistinct() { |
| long[] distinct = LongStream.of(1L, 2L, 3L, 2L).distinct().toArray(); |
| assertEquals(3, distinct.length); |
| assertEquals(1L + 2L + 3L, distinct[0] + distinct[1] + distinct[2]); |
| } |
| |
| public void testSorted() { |
| long[] sorted = LongStream.of(3L, 1L, 2L).sorted().toArray(); |
| assertEquals(new long[] {1L, 2L, 3L}, sorted); |
| } |
| |
| public void testMinMax() { |
| Supplier<LongStream> stream = () -> LongStream.of(2L, 3L, 4L, 1L); |
| |
| assertEquals(1L, stream.get().min().orElse(0)); |
| assertEquals(4L, stream.get().max().orElse(0)); |
| |
| assertFalse(stream.get().filter(a -> false).max().isPresent()); |
| assertFalse(stream.get().filter(a -> false).min().isPresent()); |
| } |
| |
| public void testCountLimitSkip() { |
| Supplier<LongStream> stream = () -> LongStream.of(1L, 2L, 3L, 4L); |
| |
| assertEquals(4L, stream.get().count()); |
| |
| assertEquals(4L, stream.get().limit(4).count()); |
| assertEquals(4L, stream.get().limit(5).count()); |
| assertEquals(3L, stream.get().limit(3).count()); |
| |
| assertEquals(3L, stream.get().skip(1).limit(3).count()); |
| |
| assertEquals(2L, stream.get().limit(3).skip(1).count()); |
| |
| assertEquals(1L, stream.get().skip(3).count()); |
| |
| assertEquals(new long[] {3L, 4L}, stream.get().skip(2).limit(3).toArray()); |
| assertEquals(new long[] {3L}, stream.get().skip(2).limit(1).toArray()); |
| |
| assertEquals(new long[] {4L}, stream.get().skip(3).toArray()); |
| assertEquals(new long[] {}, stream.get().skip(5).toArray()); |
| |
| assertEquals(new long[] {1L, 2L}, stream.get().limit(2).toArray()); |
| |
| assertEquals(new long[] {2L}, stream.get().limit(2).skip(1).toArray()); |
| } |
| |
| public void testBoxed() { |
| Supplier<LongStream> stream = () -> LongStream.of(1L, 2L); |
| Stream<Long> expected = stream.get().mapToObj(Long::valueOf); |
| assertEquals(expected.toArray(), stream.get().boxed().toArray()); |
| } |
| |
| public void testAsOtherPrimitive() { |
| Supplier<LongStream> stream = () -> LongStream.of(1L, 2L); |
| DoubleStream actualDoubleStream = stream.get().asDoubleStream(); |
| assertEquals(new double[] {1, 2}, actualDoubleStream.toArray()); |
| } |
| |
| public void testSummaryStats() { |
| Supplier<LongStream> stream = () -> LongStream.of(1L, 2L, 3L); |
| LongSummaryStatistics summaryStats = stream.get().summaryStatistics(); |
| assertEquals(3L, summaryStats.getCount()); |
| assertEquals(1L, summaryStats.getMin()); |
| assertEquals(2L, summaryStats.getAverage(), 0d); |
| assertEquals(3L, summaryStats.getMax()); |
| assertEquals(6L, summaryStats.getSum()); |
| |
| summaryStats.accept(6L); |
| assertEquals(4L, summaryStats.getCount()); |
| assertEquals(1L, summaryStats.getMin()); |
| assertEquals(3L, summaryStats.getAverage(), 0d); |
| assertEquals(6L, summaryStats.getMax()); |
| assertEquals(12L, summaryStats.getSum()); |
| |
| LongSummaryStatistics combinedSumStats = stream.get().summaryStatistics(); |
| combinedSumStats.combine(LongStream.of(4L, 5L, 6L, 0L).summaryStatistics()); |
| assertEquals(7L, combinedSumStats.getCount()); |
| assertEquals(0L, combinedSumStats.getMin()); |
| assertEquals(3L, combinedSumStats.getAverage(), 0d); |
| assertEquals(6L, combinedSumStats.getMax()); |
| assertEquals(21L, combinedSumStats.getSum()); |
| } |
| |
| public void testAverage() { |
| assertFalse(LongStream.empty().average().isPresent()); |
| assertEquals(2.0d, LongStream.of(1L, 2L, 3L).average().getAsDouble(), 0d); |
| assertEquals(0d, LongStream.of(1L, 2L, -3L).average().getAsDouble(), 0d); |
| assertEquals(-2.0d, LongStream.of(-1L, -2L, -3L).average().getAsDouble(), 0d); |
| } |
| |
| public void testSum() { |
| assertEquals(6L, LongStream.of(1L, 2L, 3L).sum()); |
| assertEquals(0L, LongStream.of(1L, 2L, -3L).sum()); |
| assertEquals(-6L, LongStream.of(-1L, -2L, -3L).sum()); |
| } |
| |
| public void testCollect() { |
| String val = |
| LongStream.of(1L, 2L, 3L, 4L, 5L) |
| .collect( |
| StringBuilder::new, |
| // TODO switch to a lambda reference once #9340 is fixed |
| (stringBuilder, lng) -> stringBuilder.append(lng), |
| StringBuilder::append) |
| .toString(); |
| |
| assertEquals("12345", val); |
| } |
| |
| public void testForEach() { |
| List<Long> vals = new ArrayList<>(); |
| LongStream.of(1L, 2L, 3L, 4L, 5L).forEach(vals::add); |
| assertEquals(5, vals.size()); |
| assertEquals(new Long[] {1L, 2L, 3L, 4L, 5L}, vals.toArray(new Long[vals.size()])); |
| } |
| |
| public void testIterator() { |
| List<Long> vals = new ArrayList<>(); |
| Iterator<Long> iterator = LongStream.of(1L, 2L, 3L, 4L, 5L).iterator(); |
| while (iterator.hasNext()) { |
| vals.add(iterator.next()); |
| } |
| assertEquals(5, vals.size()); |
| assertEquals(new Long[] {1L, 2L, 3L, 4L, 5L}, vals.toArray(new Long[vals.size()])); |
| } |
| |
| public void testSpliterator() { |
| Spliterator<Long> spliterator = LongStream.of(1L, 2L, 3L, 4L, 5L).spliterator(); |
| assertEquals(5, spliterator.estimateSize()); |
| assertEquals(5, spliterator.getExactSizeIfKnown()); |
| |
| List<Long> vals = new ArrayList<>(); |
| while (spliterator.tryAdvance(vals::add)) { |
| // work is all done in the condition |
| } |
| |
| assertEquals(5, vals.size()); |
| assertEquals(new Long[] {1L, 2L, 3L, 4L, 5L}, vals.toArray(new Long[vals.size()])); |
| } |
| } |