/*
* Copyright 2014-present Facebook, 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.facebook.buck.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import com.facebook.buck.model.Pair;
import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.Set;
import org.hamcrest.Matchers;
import org.junit.Test;
public class MoreIterablesTest {
// Convert an iterable to a list.
private static <T> ImmutableList<T> lstI(Iterable<T> inputs) {
return ImmutableList.copyOf(inputs);
}
// Convert varargs to a list.
@SafeVarargs
private static <T> ImmutableList<T> lstV(T... inputs) {
return ImmutableList.copyOf(inputs);
}
@Test
public void testZipAndConcat() {
assertEquals(lstV(), lstI(MoreIterables.zipAndConcat()));
assertEquals(lstV("a"), lstI(MoreIterables.zipAndConcat(lstV("a"))));
assertEquals(
lstV("a", "b", "a", "b"),
lstI(MoreIterables.zipAndConcat(lstV("a", "a", "a"), lstV("b", "b"))));
assertEquals(
lstV("a", "b", "c"), lstI(MoreIterables.zipAndConcat(lstV("a"), lstV("b"), lstV("c"))));
}
@Test
public void testDedupKeepLast() {
String[] emptyInput = new String[] {};
Set<String> emptyDeduped = MoreIterables.dedupKeepLast(lstV(emptyInput));
assertArrayAndSetEqual("empty", emptyInput, emptyDeduped);
String[] noDups = new String[] {"a", "b", "c"};
Set<String> noDupsDeduped = MoreIterables.dedupKeepLast(lstV(noDups));
assertArrayAndSetEqual("noDups", noDups, noDupsDeduped);
List<String> singleDup = lstV("a", "b", "a", "c");
String[] singleDedupExpected = new String[] {"b", "a", "c"};
Set<String> singleDedupActual = MoreIterables.dedupKeepLast(singleDup);
assertArrayAndSetEqual("singleDup", singleDedupExpected, singleDedupActual);
List<String> onlyDups = lstV("a", "a", "a");
String[] onlyDupsDedupExpected = new String[] {"a"};
Set<String> onlydupsDedupActual = MoreIterables.dedupKeepLast(onlyDups);
assertArrayAndSetEqual("onlyDups", onlyDupsDedupExpected, onlydupsDedupActual);
}
@Test
public void enumerate() {
assertThat(lstI(MoreIterables.enumerate(ImmutableList.of())), Matchers.empty());
assertThat(
lstI(MoreIterables.enumerate(ImmutableList.of("a"))),
Matchers.equalTo(lstV(new Pair<>(0, "a"))));
assertThat(
lstI(MoreIterables.enumerate(ImmutableList.of("a", "b"))),
Matchers.equalTo(lstV(new Pair<>(0, "a"), new Pair<>(1, "b"))));
}
private static void assertArrayAndSetEqual(String testName, String[] first, Set<String> second) {
assertEquals(first.length, second.size());
int i = 0;
for (String s : second) {
assertEquals(
String.format("%s failed: Elements at %d are not equal", testName, i), first[i], s);
i++;
}
}
}