| /* |
| * 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.el.stream; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import javax.el.ELException; |
| import javax.el.ELProcessor; |
| |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| import org.apache.el.TesterBeanA; |
| import org.apache.el.lang.ELSupport; |
| |
| public class TestCollectionOperations { |
| |
| private static final TesterBeanA bean01 = new TesterBeanA(); |
| private static final TesterBeanA bean02 = new TesterBeanA(); |
| private static final TesterBeanA bean03 = new TesterBeanA(); |
| private static final List<TesterBeanA> beans; |
| |
| static { |
| List<TesterBeanA> list = new ArrayList<>(); |
| |
| bean01.setValLong(1); |
| bean01.setName("bean01"); |
| list.add(bean01); |
| |
| bean02.setValLong(2); |
| bean02.setName("bean02"); |
| list.add(bean02); |
| |
| bean03.setValLong(3); |
| bean03.setName("bean03"); |
| list.add(bean03); |
| |
| beans = Collections.unmodifiableList(list); |
| } |
| |
| |
| @Test |
| public void testToList01() { |
| ELProcessor processor = new ELProcessor(); |
| Object result = processor.getValue("['a','b','c'].stream().toList()", |
| List.class); |
| List<String> expected = new ArrayList<>(3); |
| expected.add("a"); |
| expected.add("b"); |
| expected.add("c"); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testToList02() { |
| ELProcessor processor = new ELProcessor(); |
| String[] src = new String[] { "a", "b", "c" }; |
| processor.defineBean("src", src); |
| Object result = processor.getValue("src.stream().toList()", |
| List.class); |
| List<String> expected = new ArrayList<>(3); |
| expected.add("a"); |
| expected.add("b"); |
| expected.add("c"); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testFilter01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| Object result = processor.getValue( |
| "beans.stream().filter(b->b.valLong > 2).toList()", |
| List.class); |
| List<TesterBeanA> expected = new ArrayList<>(1); |
| expected.add(bean03); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testMap01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| Object result = processor.getValue( |
| "beans.stream().map(b->b.name).toList()", |
| List.class); |
| List<String> expected = new ArrayList<>(3); |
| expected.add("bean01"); |
| expected.add("bean02"); |
| expected.add("bean03"); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testMap02() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| Object result = processor.getValue( |
| "beans.stream().filter(b->b.valLong > 1).map(b->[b.name, b.valLong]).toList()", |
| List.class); |
| |
| Assert.assertTrue(result instanceof List); |
| |
| @SuppressWarnings("unchecked") |
| List<List<Object>> list = (List<List<Object>>) result; |
| |
| Assert.assertEquals(2, list.size()); |
| Assert.assertEquals("bean02", list.get(0).get(0)); |
| Assert.assertEquals(Long.valueOf(2), list.get(0).get(1)); |
| Assert.assertEquals("bean03", list.get(1).get(0)); |
| Assert.assertEquals(Long.valueOf(3), list.get(1).get(1)); |
| } |
| |
| |
| @Test |
| public void testFlatMap01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| Object result = processor.getValue( |
| "beans.stream().flatMap(b->b.name.toCharArray().stream()).toList()", |
| List.class); |
| |
| List<Character> expected = new ArrayList<>(18); |
| expected.add(Character.valueOf('b')); |
| expected.add(Character.valueOf('e')); |
| expected.add(Character.valueOf('a')); |
| expected.add(Character.valueOf('n')); |
| expected.add(Character.valueOf('0')); |
| expected.add(Character.valueOf('1')); |
| expected.add(Character.valueOf('b')); |
| expected.add(Character.valueOf('e')); |
| expected.add(Character.valueOf('a')); |
| expected.add(Character.valueOf('n')); |
| expected.add(Character.valueOf('0')); |
| expected.add(Character.valueOf('2')); |
| expected.add(Character.valueOf('b')); |
| expected.add(Character.valueOf('e')); |
| expected.add(Character.valueOf('a')); |
| expected.add(Character.valueOf('n')); |
| expected.add(Character.valueOf('0')); |
| expected.add(Character.valueOf('3')); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testDistinct01() { |
| ELProcessor processor = new ELProcessor(); |
| Object result = processor.getValue( |
| "['a', 'b', 'b', 'c'].stream().distinct().toList()", |
| List.class); |
| List<String> expected = new ArrayList<>(3); |
| expected.add("a"); |
| expected.add("b"); |
| expected.add("c"); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testSorted01() { |
| ELProcessor processor = new ELProcessor(); |
| Object result = processor.getValue( |
| "['c', 'd', 'b', 'a'].stream().sorted().toList()", |
| List.class); |
| List<String> expected = new ArrayList<>(4); |
| expected.add("a"); |
| expected.add("b"); |
| expected.add("c"); |
| expected.add("d"); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testSortedLambdaExpression01() { |
| ELProcessor processor = new ELProcessor(); |
| Object result = processor.getValue( |
| "['c', 'd', 'b', 'a'].stream().sorted((x,y)->x.compareTo(y)*-1).toList()", |
| List.class); |
| List<String> expected = new ArrayList<>(4); |
| expected.add("d"); |
| expected.add("c"); |
| expected.add("b"); |
| expected.add("a"); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testForEach01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| processor.getValue( |
| "beans.stream().forEach(b->b.setValLong(b.valLong + 1))", |
| Object.class); |
| |
| Assert.assertEquals(2, bean01.getValLong()); |
| Assert.assertEquals(3, bean02.getValLong()); |
| Assert.assertEquals(4, bean03.getValLong()); |
| |
| // Restore the beans to their default state |
| processor.getValue( |
| "beans.stream().forEach(b->b.setValLong(b.valLong - 1))", |
| Object.class); |
| |
| Assert.assertEquals(1, bean01.getValLong()); |
| Assert.assertEquals(2, bean02.getValLong()); |
| Assert.assertEquals(3, bean03.getValLong()); |
| } |
| |
| |
| @Test |
| public void testPeek01() { |
| ELProcessor processor = new ELProcessor(); |
| List<TesterBeanA> debug = new ArrayList<>(); |
| processor.defineBean("beans", beans); |
| processor.defineBean("debug", debug); |
| |
| Object result = processor.getValue( |
| "beans.stream().peek(b->debug.add(b)).toList()", |
| Object.class); |
| |
| List<TesterBeanA> expected = new ArrayList<>(3); |
| expected.add(bean01); |
| expected.add(bean02); |
| expected.add(bean03); |
| |
| Assert.assertEquals(expected, result); |
| Assert.assertEquals(expected, debug); |
| } |
| |
| |
| @Test |
| public void testLimit01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| Object result = processor.getValue( |
| "beans.stream().limit(2).toList()", |
| Object.class); |
| |
| List<TesterBeanA> expected = new ArrayList<>(2); |
| expected.add(bean01); |
| expected.add(bean02); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testSubstreamStart01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| Object result = processor.getValue( |
| "beans.stream().substream(1).toList()", |
| Object.class); |
| |
| List<TesterBeanA> expected = new ArrayList<>(2); |
| expected.add(bean02); |
| expected.add(bean03); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testSubstreamStartEnd01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| Object result = processor.getValue( |
| "beans.stream().substream(1,2).toList()", |
| Object.class); |
| |
| List<TesterBeanA> expected = new ArrayList<>(2); |
| expected.add(bean02); |
| |
| Assert.assertEquals(expected, result); |
| } |
| |
| |
| @Test |
| public void testToArray01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| Object result = processor.getValue( |
| "beans.stream().toArray()", |
| Object.class); |
| |
| Object[] expected = new Object[3]; |
| expected[0] = bean01; |
| expected[1] = bean02; |
| expected[2] = bean03; |
| |
| Assert.assertArrayEquals(expected, (Object[]) result); |
| } |
| |
| |
| @Test |
| public void testReduceLambda01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5].stream().reduce((x,y)->x+y)", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(15), ((Optional) result).get()); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testReduceLambda02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().reduce((x,y)->x+y)", |
| Object.class); |
| |
| ((Optional) result).get(); |
| } |
| |
| |
| @Test |
| public void testReduceLambdaSeed01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5].stream().reduce(10, (x,y)->x+y)", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(25), result); |
| } |
| |
| |
| @Test |
| public void testMax01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5].stream().max()", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(5), ((Optional) result).get()); |
| } |
| |
| |
| @Test |
| public void testMax02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[5,4,3,2,1].stream().max()", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(5), ((Optional) result).get()); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testMax03() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().max()", |
| Object.class); |
| |
| ((Optional) result).get(); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testMax04() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| processor.getValue( |
| "beans.stream().max()", |
| Object.class); |
| } |
| |
| |
| @Test |
| public void testMaxLambda01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| Object result = processor.getValue( |
| "beans.stream().max((x,y)->x.name.compareTo(y.name))", |
| Object.class); |
| |
| Assert.assertEquals(bean03, ((Optional) result).get()); |
| } |
| |
| |
| @Test |
| public void testMaxLambda02() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| processor.setVariable("comparison", "v->(x,y)->v(x).compareTo(v(y))"); |
| |
| Object result = processor.getValue( |
| "beans.stream().max(comparison(x->x.name))", |
| Object.class); |
| |
| Assert.assertEquals(bean03, ((Optional) result).get()); |
| } |
| @Test |
| public void testMin01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5].stream().min()", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(1), ((Optional) result).get()); |
| } |
| |
| |
| @Test |
| public void testMin02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[5,4,3,2,1].stream().min()", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(1), ((Optional) result).get()); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testMin03() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().min()", |
| Object.class); |
| |
| ((Optional) result).get(); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testMin04() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| processor.getValue( |
| "beans.stream().min()", |
| Object.class); |
| } |
| |
| |
| @Test |
| public void testMinLambda01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| Object result = processor.getValue( |
| "beans.stream().min((x,y)->x.name.compareTo(y.name))", |
| Object.class); |
| |
| Assert.assertEquals(bean01, ((Optional) result).get()); |
| } |
| |
| |
| @Test |
| public void testAverage01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5].stream().average()", |
| Object.class); |
| |
| Number average = (Number) ((Optional) result).get(); |
| Assert.assertTrue("Result: " + average.toString(), |
| ELSupport.equals(null, Long.valueOf(3), average)); |
| } |
| |
| |
| @Test |
| public void testAverage02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5,6].stream().average()", |
| Object.class); |
| |
| Number average = (Number) ((Optional) result).get(); |
| Assert.assertTrue("Result: " + average.toString(), |
| ELSupport.equals(null, Double.valueOf(3.5), average)); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testAverage03() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().average()", |
| Object.class); |
| |
| ((Optional) result).get(); |
| } |
| |
| |
| @Test |
| public void testAverage04() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().average().orElseGet(()->10)", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(10), result); |
| } |
| |
| |
| @Test |
| public void testAverage05() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().average().orElseGet(()->()->10)", |
| Object.class); |
| |
| Assert.assertEquals(Long.valueOf(10), result); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testAverage06() { |
| ELProcessor processor = new ELProcessor(); |
| |
| processor.getValue( |
| "[].stream().average().orElseGet(10)", |
| Object.class); |
| } |
| |
| |
| @Test |
| public void testSum01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5].stream().sum()", |
| Object.class); |
| |
| Assert.assertTrue("Result: " + result.toString(), |
| ELSupport.equals(null, Long.valueOf(15), result)); |
| } |
| |
| |
| @Test |
| public void testSum02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().sum()", |
| Object.class); |
| |
| Assert.assertTrue("Result: " + result.toString(), |
| ELSupport.equals(null, Long.valueOf(0), result)); |
| } |
| |
| |
| @Test |
| public void testCount01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[1,2,3,4,5].stream().count()", |
| Object.class); |
| |
| Assert.assertTrue("Result: " + result.toString(), |
| ELSupport.equals(null, Long.valueOf(5), result)); |
| } |
| |
| |
| @Test |
| public void testCount02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Object result = processor.getValue( |
| "[].stream().count()", |
| Object.class); |
| |
| Assert.assertTrue("Result: " + result.toString(), |
| ELSupport.equals(null, Long.valueOf(0), result)); |
| } |
| |
| |
| @Test |
| public void testAnyMatch01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().anyMatch(x->x==7)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.FALSE, result.get()); |
| } |
| |
| |
| @Test |
| public void testAnyMatch02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().anyMatch(x->x==3)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.TRUE, result.get()); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testAnyMatch03() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[].stream().anyMatch(x->x==7)", |
| Object.class); |
| |
| result.get(); |
| } |
| |
| |
| @Test |
| public void testAllMatch01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().allMatch(x->x>3)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.FALSE, result.get()); |
| } |
| |
| |
| @Test |
| public void testAllMatch02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().allMatch(x->x>0)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.TRUE, result.get()); |
| } |
| |
| |
| @Test |
| public void testAllMatch03() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().allMatch(x->x>10)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.FALSE, result.get()); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testAllMatch04() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[].stream().allMatch(x->x==7)", |
| Object.class); |
| |
| result.get(); |
| } |
| |
| |
| @Test |
| public void testNoneMatch01() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().allMatch(x->x>3)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.FALSE, result.get()); |
| } |
| |
| |
| @Test |
| public void testNoneMatch02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().noneMatch(x->x>0)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.FALSE, result.get()); |
| } |
| |
| |
| @Test |
| public void testNoneMatch03() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[1,2,3,4,5].stream().noneMatch(x->x>10)", |
| Object.class); |
| |
| Assert.assertEquals(Boolean.TRUE, result.get()); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testNoneMatch04() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[].stream().noneMatch(x->x==7)", |
| Object.class); |
| |
| result.get(); |
| } |
| |
| |
| @Test |
| public void testFindFirst01() { |
| ELProcessor processor = new ELProcessor(); |
| processor.defineBean("beans", beans); |
| |
| Optional result = (Optional) processor.getValue( |
| "beans.stream().findFirst()", |
| Object.class); |
| |
| Assert.assertEquals(bean01, result.get()); |
| } |
| |
| |
| @Test(expected=ELException.class) |
| public void testFindFirst02() { |
| ELProcessor processor = new ELProcessor(); |
| |
| Optional result = (Optional) processor.getValue( |
| "[].stream().findFirst()", |
| Object.class); |
| |
| result.get(); |
| } |
| } |