blob: 72fc01e71600f76dd8419f475024accbe68a4187 [file] [log] [blame]
/*
* Copyright 2017 HugeGraph Authors
*
* 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 com.baidu.hugegraph.unit.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import com.baidu.hugegraph.testutil.Assert;
import com.baidu.hugegraph.unit.BaseUnitTest;
import com.baidu.hugegraph.util.CollectionUtil;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
public class CollectionUtilTest extends BaseUnitTest {
@Test
public void testToSet() {
Assert.assertThrows(NullPointerException.class, () -> {
CollectionUtil.toSet(null);
});
Object array1 = new Integer[]{1, 2, 3};
Assert.assertEquals(ImmutableSet.of(1, 2, 3),
CollectionUtil.toSet(array1));
Object array2 = new String[]{"1", "2", "3"};
Assert.assertEquals(ImmutableSet.of("1", "2", "3"),
CollectionUtil.toSet(array2));
Set<Integer> set = ImmutableSet.of(1, 2, 3);
Assert.assertEquals(ImmutableSet.of(1, 2, 3),
CollectionUtil.toSet(set));
List<Integer> list = ImmutableList.of(1, 2, 3);
Assert.assertEquals(ImmutableSet.of(1, 2, 3),
CollectionUtil.toSet(list));
Assert.assertEquals(ImmutableSet.of(1), CollectionUtil.toSet(1));
}
@Test
public void testToList() {
Assert.assertThrows(NullPointerException.class, () -> {
CollectionUtil.toList(null);
});
Object array1 = new Integer[]{1, 2, 3};
Assert.assertEquals(ImmutableList.of(1, 2, 3),
CollectionUtil.toList(array1));
Object array2 = new String[]{"1", "2", "3"};
Assert.assertEquals(ImmutableList.of("1", "2", "3"),
CollectionUtil.toList(array2));
Set<Integer> set = ImmutableSet.of(1, 2, 3);
Assert.assertEquals(ImmutableList.of(1, 2, 3),
CollectionUtil.toList(set));
List<Integer> list = ImmutableList.of(1, 2, 3);
Assert.assertEquals(ImmutableList.of(1, 2, 3),
CollectionUtil.toList(list));
Assert.assertEquals(ImmutableList.of("123"),
CollectionUtil.toList("123"));
}
@Test
public void testPrefixOf() {
List<Integer> list = ImmutableList.of(1, 2, 3);
List<Integer> list1 = ImmutableList.of();
Assert.assertTrue(CollectionUtil.prefixOf(list1, list));
List<Integer> list2 = ImmutableList.of(1, 2);
Assert.assertTrue(CollectionUtil.prefixOf(list2, list));
List<Integer> list3 = ImmutableList.of(1, 2, 3);
Assert.assertTrue(CollectionUtil.prefixOf(list3, list));
List<Integer> list4 = ImmutableList.of(1, 2, 3, 4);
Assert.assertFalse(CollectionUtil.prefixOf(list4, list));
List<Integer> list5 = ImmutableList.of(1, 2, 4);
Assert.assertFalse(CollectionUtil.prefixOf(list5, list));
List<Integer> list6 = Arrays.asList(1, 2, null);
Assert.assertFalse(CollectionUtil.prefixOf(list6, list));
}
@Test
public void testRandomSet() {
Set<Integer> set = CollectionUtil.randomSet(0, 100, 10);
for (int i : set) {
Assert.assertTrue(0 <= i && i < 100);
}
// invalid min
Assert.assertThrows(IllegalArgumentException.class, () -> {
CollectionUtil.randomSet(200, 100, 10);
});
// invalid count = 0
Assert.assertThrows(IllegalArgumentException.class, () -> {
CollectionUtil.randomSet(1, 100, 0);
});
// invalid count > max - min
Assert.assertThrows(IllegalArgumentException.class, () -> {
CollectionUtil.randomSet(1, 100, 100);
});
}
@Test
public void testAllUnique() {
List<Integer> list = ImmutableList.of();
Assert.assertTrue(CollectionUtil.allUnique(list));
list = ImmutableList.of(1, 2, 3, 2, 3);
Assert.assertFalse(CollectionUtil.allUnique(list));
list = ImmutableList.of(1, 2, 3, 4, 5);
Assert.assertTrue(CollectionUtil.allUnique(list));
list = ImmutableList.of(1, 1, 1, 1, 1);
Assert.assertFalse(CollectionUtil.allUnique(list));
}
@Test
public void testSubSet() {
Set<Integer> originSet = ImmutableSet.of(1, 2, 3, 4, 5);
Set<Integer> subSet = CollectionUtil.subSet(originSet, 1, 1);
Assert.assertEquals(ImmutableSet.of(), subSet);
subSet = CollectionUtil.subSet(originSet, 2, 4);
Assert.assertEquals(ImmutableSet.of(3, 4), subSet);
subSet = CollectionUtil.subSet(originSet, 2, 5);
Assert.assertEquals(ImmutableSet.of(3, 4, 5), subSet);
subSet = CollectionUtil.subSet(originSet, 0, 5);
Assert.assertEquals(ImmutableSet.of(1, 2, 3, 4, 5), subSet);
subSet = CollectionUtil.subSet(originSet, 2, -1);
Assert.assertEquals(ImmutableSet.of(3, 4, 5), subSet);
subSet = CollectionUtil.subSet(originSet, 2, -100);
Assert.assertEquals(ImmutableSet.of(3, 4, 5), subSet);
Assert.assertThrows(IllegalArgumentException.class, () -> {
CollectionUtil.subSet(originSet, 2, 1);
}, e -> {
Assert.assertContains("Invalid to parameter ", e.getMessage());
});
Assert.assertThrows(IllegalArgumentException.class, () -> {
CollectionUtil.subSet(originSet, -1, 2);
}, e -> {
Assert.assertContains("Invalid from parameter ", e.getMessage());
});
Assert.assertThrows(IllegalArgumentException.class, () -> {
CollectionUtil.subSet(originSet, -10, 2);
}, e -> {
Assert.assertContains("Invalid from parameter ", e.getMessage());
});
}
@Test
public void testUnion() {
List<Integer> first = new ArrayList<>();
first.add(1);
first.add(2);
Set<Integer> second = new HashSet<>();
second.add(1);
second.add(3);
Set<Integer> results = CollectionUtil.union(first, second);
Assert.assertEquals(3, results.size());
}
@Test
public void testIntersectWithoutModifying() {
List<Integer> first = new ArrayList<>();
first.add(1);
first.add(2);
first.add(3);
List<Integer> second = new ArrayList<>();
second.add(4);
second.add(5);
Collection<Integer> results = CollectionUtil.intersect(first, second);
Assert.assertEquals(0, results.size());
Assert.assertEquals(3, first.size());
second.add(3);
results = CollectionUtil.intersect(first, second);
Assert.assertEquals(1, results.size());
Assert.assertEquals(3, first.size());
second.add(1);
second.add(2);
results = CollectionUtil.intersect(first, second);
Assert.assertEquals(3, results.size());
Assert.assertEquals(3, first.size());
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(3);
set.add(6);
results = CollectionUtil.intersect(set, second);
Assert.assertInstanceOf(HashSet.class, results);
Assert.assertEquals(2, results.size());
Assert.assertEquals(3, set.size());
set = new LinkedHashSet<>();
set.add(1);
set.add(2);
set.add(6);
results = CollectionUtil.intersect(set, second);
Assert.assertInstanceOf(LinkedHashSet.class, results);
Assert.assertEquals(2, results.size());
Assert.assertEquals(3, set.size());
}
@Test
public void testIntersectWithModifying() {
Set<Integer> first = new HashSet<>();
first.add(1);
first.add(2);
first.add(3);
Set<Integer> second = new HashSet<>();
second.add(1);
second.add(2);
second.add(3);
Collection<Integer> results = CollectionUtil.intersectWithModify(
first, second);
Assert.assertEquals(3, results.size());
Assert.assertEquals(3, first.size());
// The second set has "1", "2"
second.remove(3);
results = CollectionUtil.intersectWithModify(first, second);
Assert.assertEquals(2, results.size());
Assert.assertEquals(2, first.size());
// The second set is empty
second.remove(1);
second.remove(2);
results = CollectionUtil.intersectWithModify(first, second);
Assert.assertEquals(0, results.size());
Assert.assertEquals(0, first.size());
}
@Test
public void testHasIntersectionBetweenListAndSet() {
List<Integer> first = new ArrayList<>();
first.add(1);
first.add(2);
first.add(3);
Set<Integer> second = new HashSet<>();
Assert.assertFalse(CollectionUtil.hasIntersection(first, second));
second.add(4);
Assert.assertFalse(CollectionUtil.hasIntersection(first, second));
second.add(1);
Assert.assertTrue(CollectionUtil.hasIntersection(first, second));
second = new HashSet<>();
second.add(4);
second.add(5);
second.add(6);
second.add(7);
Assert.assertFalse(CollectionUtil.hasIntersection(first, second));
second.add(3);
Assert.assertTrue(CollectionUtil.hasIntersection(first, second));
}
@Test
public void testHasIntersectionBetweenSetAndSet() {
Set<Integer> first = new HashSet<>();
first.add(1);
first.add(2);
first.add(3);
Set<Integer> second = new HashSet<>();
Assert.assertFalse(CollectionUtil.hasIntersection(first, second));
second.add(4);
Assert.assertFalse(CollectionUtil.hasIntersection(first, second));
second.add(1);
Assert.assertTrue(CollectionUtil.hasIntersection(first, second));
second = new HashSet<>();
second.add(4);
second.add(5);
second.add(6);
second.add(7);
Assert.assertFalse(CollectionUtil.hasIntersection(first, second));
second.add(3);
Assert.assertTrue(CollectionUtil.hasIntersection(first, second));
}
@Test
public void testMapSortByStringKey() {
Map<String, Integer> unordered = new HashMap<>();
unordered.put("D", 1);
unordered.put("B", 2);
unordered.put("E", 3);
unordered.put("A", 4);
unordered.put("C", 5);
Map<String, Integer> incrOrdered = CollectionUtil.sortByKey(unordered,
true);
Assert.assertEquals(ImmutableList.of("A", "B", "C", "D", "E"),
ImmutableList.copyOf(incrOrdered.keySet()));
Map<String, Integer> decrOrdered = CollectionUtil.sortByKey(unordered,
false);
Assert.assertEquals(ImmutableList.of("E", "D", "C", "B", "A"),
ImmutableList.copyOf(decrOrdered.keySet()));
}
@Test
public void testMapSortByIntegerKey() {
Map<Integer, String> unordered = new HashMap<>();
unordered.put(4, "A");
unordered.put(2, "B");
unordered.put(5, "C");
unordered.put(1, "D");
unordered.put(3, "E");
Map<Integer, String> incrOrdered = CollectionUtil.sortByKey(unordered,
true);
Assert.assertEquals(ImmutableList.of(1, 2, 3, 4, 5),
ImmutableList.copyOf(incrOrdered.keySet()));
Map<Integer, String> decrOrdered = CollectionUtil.sortByKey(unordered,
false);
Assert.assertEquals(ImmutableList.of(5, 4, 3, 2, 1),
ImmutableList.copyOf(decrOrdered.keySet()));
}
@Test
public void testMapSortByIntegerValue() {
Map<String, Integer> unordered = new HashMap<>();
unordered.put("A", 4);
unordered.put("B", 2);
unordered.put("C", 5);
unordered.put("D", 1);
unordered.put("E", 3);
Map<String, Integer> incrOrdered = CollectionUtil.sortByValue(unordered,
true);
Assert.assertEquals(ImmutableList.of(1, 2, 3, 4, 5),
ImmutableList.copyOf(incrOrdered.values()));
Map<String, Integer> decrOrdered = CollectionUtil.sortByValue(unordered,
false);
Assert.assertEquals(ImmutableList.of(5, 4, 3, 2, 1),
ImmutableList.copyOf(decrOrdered.values()));
}
@Test
public void testMapSortByStringValue() {
Map<Integer, String> unordered = new HashMap<>();
unordered.put(1, "D");
unordered.put(2, "B");
unordered.put(3, "E");
unordered.put(4, "A");
unordered.put(5, "C");
Map<Integer, String> incrOrdered = CollectionUtil.sortByValue(unordered,
true);
Assert.assertEquals(ImmutableList.of("A", "B", "C", "D", "E"),
ImmutableList.copyOf(incrOrdered.values()));
Map<Integer, String> decrOrdered = CollectionUtil.sortByValue(unordered,
false);
Assert.assertEquals(ImmutableList.of("E", "D", "C", "B", "A"),
ImmutableList.copyOf(decrOrdered.values()));
}
@Test
public void testCrossCombineParts() {
List<List<Object>> parts;
parts = ImmutableList.of(ImmutableList.of("a", "b"),
ImmutableList.of(1, 2),
ImmutableList.of('x', 'y'));
List<List<Object>> combs = CollectionUtil.crossCombineParts(parts);
Assert.assertEquals(8, combs.size());
Assert.assertEquals(ImmutableList.of(
ImmutableList.of("a", "b", 1, 2, 'x', 'y'),
ImmutableList.of("a", "b", 1, 2, 'y', 'x'),
ImmutableList.of("a", "b", 2, 1, 'x', 'y'),
ImmutableList.of("a", "b", 2, 1, 'y', 'x'),
ImmutableList.of("b", "a", 1, 2, 'x', 'y'),
ImmutableList.of("b", "a", 1, 2, 'y', 'x'),
ImmutableList.of("b", "a", 2, 1, 'x', 'y'),
ImmutableList.of("b", "a", 2, 1, 'y', 'x')),
combs);
parts = ImmutableList.of(ImmutableList.of("a", "b", "c"),
ImmutableList.of(1, 2),
ImmutableList.of('x', 'y'));
Assert.assertEquals(24,
CollectionUtil.crossCombineParts(parts).size());
parts = ImmutableList.of(ImmutableList.of("a", "b", "c"),
ImmutableList.of(1, 2, 3),
ImmutableList.of('x', 'y'));
Assert.assertEquals(72,
CollectionUtil.crossCombineParts(parts).size());
parts = ImmutableList.of(ImmutableList.of("a", "b", "c"),
ImmutableList.of(1, 2, 3),
ImmutableList.of('x', 'y', 'z'));
Assert.assertEquals(216,
CollectionUtil.crossCombineParts(parts).size());
}
@Test
public void testCnm() {
List<Integer> list = ImmutableList.of(1, 2, 3, 4, 5);
// Test C(5, 2) with all combinations
List<List<Integer>> tuples = new ArrayList<>();
boolean found;
found = CollectionUtil.cnm(list, list.size(), 2, tuple -> {
tuples.add(new ArrayList<>(tuple));
return false;
});
Assert.assertFalse(found);
Assert.assertEquals(10, tuples.size());
Assert.assertEquals(10,
CollectionUtil.cnm(list, list.size(), 2).size());
// Test C(5, 2) with one combination
tuples.clear();
found = CollectionUtil.cnm(list, list.size(), 2, tuple -> {
if (tuple.equals(ImmutableList.of(2, 3))) {
tuples.add(new ArrayList<>(tuple));
return true;
}
return false;
});
Assert.assertTrue(found);
Assert.assertEquals(1, tuples.size());
Assert.assertEquals(ImmutableList.of(2, 3), tuples.get(0));
// Test C(5, 3) with all combinations
List<List<Integer>> triples = new ArrayList<>();
found = CollectionUtil.cnm(list, list.size(), 3, triple -> {
triples.add(new ArrayList<>(triple));
return false;
});
Assert.assertFalse(found);
Assert.assertEquals(10, triples.size());
Assert.assertEquals(10,
CollectionUtil.cnm(list, list.size(), 3).size());
// Test C(5, 3) with one combination
triples.clear();
found = CollectionUtil.cnm(list, list.size(), 3, triple -> {
if (triple.equals(ImmutableList.of(2, 3, 5))) {
triples.add(new ArrayList<>(triple));
return true;
}
return false;
});
Assert.assertTrue(found);
Assert.assertEquals(1, triples.size());
Assert.assertEquals(ImmutableList.of(2, 3, 5), triples.get(0));
}
@Test
public void testAnm() {
List<Integer> list = ImmutableList.of(1, 2, 3, 4, 5);
// Test A(5, 5) with all combinations
Assert.assertEquals(120, CollectionUtil.anm(list).size());
// Test A(5, 2) with all combinations
List<List<Integer>> tuples = new ArrayList<>();
boolean found;
found = CollectionUtil.anm(list, list.size(), 2, tuple -> {
tuples.add(new ArrayList<>(tuple));
return false;
});
Assert.assertFalse(found);
Assert.assertEquals(20, tuples.size());
Assert.assertEquals(20,
CollectionUtil.anm(list, list.size(), 2).size());
// Test A(5, 2) with one combination
tuples.clear();
found = CollectionUtil.anm(list, list.size(), 2, tuple -> {
if (tuple.equals(ImmutableList.of(2, 3))) {
tuples.add(new ArrayList<>(tuple));
return true;
}
return false;
});
Assert.assertTrue(found);
Assert.assertEquals(1, tuples.size());
Assert.assertEquals(ImmutableList.of(2, 3), tuples.get(0));
// Test A(5, 3) with all combinations
List<List<Integer>> triples = new ArrayList<>();
found = CollectionUtil.anm(list, list.size(), 3, triple -> {
triples.add(new ArrayList<>(triple));
return false;
});
Assert.assertFalse(found);
Assert.assertEquals(60, triples.size());
Assert.assertEquals(60,
CollectionUtil.anm(list, list.size(), 3).size());
// Test A(5, 3) with one combination
triples.clear();
found = CollectionUtil.anm(list, list.size(), 3, triple -> {
if (triple.equals(ImmutableList.of(2, 3, 5))) {
triples.add(new ArrayList<>(triple));
return true;
}
return false;
});
Assert.assertTrue(found);
Assert.assertEquals(1, triples.size());
Assert.assertEquals(ImmutableList.of(2, 3, 5), triples.get(0));
}
}