blob: ae817f627dfb5a7b193e22b126e779832873f736 [file] [log] [blame]
/*
* Copyright 2021 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.testing.junit.testparameterinjector;
import static com.google.common.truth.Truth.assertThat;
import static java.util.stream.Collectors.toList;
import com.google.common.collect.ImmutableList;
import com.google.common.truth.IterableSubject;
import com.google.testing.junit.testparameterinjector.TestInfo.TestInfoParameter;
import java.util.List;
import java.util.stream.IntStream;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class TestInfoTest {
@Test
public void shortenNamesIfNecessary_emptyTestInfos() throws Exception {
ImmutableList<TestInfo> result = TestInfo.shortenNamesIfNecessary(ImmutableList.of());
assertThat(result).isEmpty();
}
@Test
public void shortenNamesIfNecessary_noParameters() throws Exception {
ImmutableList<TestInfo> givenTestInfos = ImmutableList.of(fakeTestInfo());
ImmutableList<TestInfo> result = TestInfo.shortenNamesIfNecessary(givenTestInfos);
assertThat(result).containsExactlyElementsIn(givenTestInfos).inOrder();
}
@Test
public void shortenNamesIfNecessary_veryLongTestMethodName_noParameters() throws Exception {
ImmutableList<TestInfo> givenTestInfos =
ImmutableList.of(
TestInfo.createWithoutParameters(
getClass()
.getMethod(
"unusedMethodThatHasAVeryLongNameForTest000000000000000000000000000000000"
+ "000000000000000000000000000000000000000000000000000000000000000000"
+ "000000000000000000000000000000000000000000000000000000000000000000"
+ "000000000000000000000000"),
/* annotations= */ ImmutableList.of()));
ImmutableList<TestInfo> result = TestInfo.shortenNamesIfNecessary(givenTestInfos);
assertThat(result).containsExactlyElementsIn(givenTestInfos).inOrder();
}
@Test
public void shortenNamesIfNecessary_noShorteningNeeded() throws Exception {
ImmutableList<TestInfo> givenTestInfos =
ImmutableList.of(
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "short", /* value= */ 1, /* indexInValueSource= */ 1),
TestInfoParameter.create(
/* name= */ "shorter", /* value= */ null, /* indexInValueSource= */ 3)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "short", /* value= */ 1, /* indexInValueSource= */ 1),
TestInfoParameter.create(
/* name= */ "shortest", /* value= */ 20, /* indexInValueSource= */ 0)));
ImmutableList<TestInfo> result = TestInfo.shortenNamesIfNecessary(givenTestInfos);
assertThat(result).containsExactlyElementsIn(givenTestInfos).inOrder();
}
@Test
public void shortenNamesIfNecessary_singleParameterTooLong_twoParameters() throws Exception {
ImmutableList<TestInfo> result =
TestInfo.shortenNamesIfNecessary(
ImmutableList.of(
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "short", /* value= */ 1, /* indexInValueSource= */ 0),
TestInfoParameter.create(
/* name= */ "shorter", /* value= */ null, /* indexInValueSource= */ 0)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "short", /* value= */ 1, /* indexInValueSource= */ 0),
TestInfoParameter.create(
/* name= */ "very long parameter name for test"
+ " 00000000000000000000000000000000000000000000000000000000"
+ "000000000000000000000000000000000000000000000000000000000"
+ "0000000000000000000000000000000000000000000000",
/* value= */ 20,
/* indexInValueSource= */ 1))));
assertThatTestNamesOf(result)
.containsExactly(
"toLowerCase[short,1.shorter]",
"toLowerCase[short,2.very long parameter name for test "
+ "0000000000000000000000000000000000000000000000000000...]")
.inOrder();
}
@Test
public void shortenNamesIfNecessary_singleParameterTooLong_onlyParameter() throws Exception {
ImmutableList<TestInfo> result =
TestInfo.shortenNamesIfNecessary(
ImmutableList.of(
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "shorter", /* value= */ null, /* indexInValueSource= */ 0)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "very long parameter name for test"
+ " 00000000000000000000000000000000000000000000000000000000"
+ "000000000000000000000000000000000000000000000000000000000"
+ "0000000000000000000000000000000000000000000000",
/* value= */ 20,
/* indexInValueSource= */ 1))));
assertThatTestNamesOf(result)
.containsExactly(
"toLowerCase[1.shorter]",
"toLowerCase[2.very long parameter name for test"
+ " 000000000000000000000000000000000000000000000000000000000000...]")
.inOrder();
}
@Test
public void shortenNamesIfNecessary_tooManyParameters() throws Exception {
TestInfo testInfoWithManyParams =
fakeTestInfo(
IntStream.range(0, 50)
.mapToObj(
i ->
TestInfoParameter.create(
/* name= */ "short", /* value= */ i, /* indexInValueSource= */ i))
.toArray(TestInfoParameter[]::new));
ImmutableList<TestInfo> result =
TestInfo.shortenNamesIfNecessary(ImmutableList.of(testInfoWithManyParams));
assertThatTestNamesOf(result)
.containsExactly(
"toLowerCase[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,"
+ "27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]");
}
@Test
public void deduplicateTestNames_noDuplicates() throws Exception {
ImmutableList<TestInfo> givenTestInfos =
ImmutableList.of(
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 1),
TestInfoParameter.create(
/* name= */ "bbb", /* value= */ null, /* indexInValueSource= */ 3)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 1),
TestInfoParameter.create(
/* name= */ "ccc", /* value= */ 1, /* indexInValueSource= */ 0)));
ImmutableList<TestInfo> result = TestInfo.deduplicateTestNames(givenTestInfos);
assertThat(result).containsExactlyElementsIn(givenTestInfos).inOrder();
}
@Test
public void deduplicateTestNames_duplicateParameterNamesWithDifferentTypes() throws Exception {
ImmutableList<TestInfo> result =
TestInfo.deduplicateTestNames(
ImmutableList.of(
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 1),
TestInfoParameter.create(
/* name= */ "null", /* value= */ null, /* indexInValueSource= */ 3)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 1),
TestInfoParameter.create(
/* name= */ "null", /* value= */ "null", /* indexInValueSource= */ 0)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 1),
TestInfoParameter.create(
/* name= */ "bbb", /* value= */ "b", /* indexInValueSource= */ 0))));
assertThatTestNamesOf(result)
.containsExactly(
"toLowerCase[aaa,null (null reference)]",
"toLowerCase[aaa,null (String)]",
"toLowerCase[aaa,bbb]")
.inOrder();
}
@Test
public void deduplicateTestNames_duplicateParameterNamesWithSameTypes() throws Exception {
ImmutableList<TestInfo> result =
TestInfo.deduplicateTestNames(
ImmutableList.of(
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 0),
TestInfoParameter.create(
/* name= */ "bbb", /* value= */ 1, /* indexInValueSource= */ 0)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 0),
TestInfoParameter.create(
/* name= */ "bbb", /* value= */ 1, /* indexInValueSource= */ 1)),
fakeTestInfo(
TestInfoParameter.create(
/* name= */ "aaa", /* value= */ 1, /* indexInValueSource= */ 0),
TestInfoParameter.create(
/* name= */ "ccc", /* value= */ "b", /* indexInValueSource= */ 2))));
assertThatTestNamesOf(result)
.containsExactly(
"toLowerCase[1.aaa,1.bbb]", "toLowerCase[1.aaa,2.bbb]", "toLowerCase[1.aaa,3.ccc]")
.inOrder();
}
private static TestInfo fakeTestInfo(TestInfoParameter... parameters)
throws NoSuchMethodException {
return TestInfo.createWithoutParameters(
String.class.getMethod("toLowerCase"), /* annotations= */ ImmutableList.of())
.withExtraParameters(ImmutableList.copyOf(parameters));
}
private static IterableSubject assertThatTestNamesOf(List<TestInfo> result) {
return assertThat(result.stream().map(TestInfo::getName).collect(toList()));
}
public void
unusedMethodThatHasAVeryLongNameForTest000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000() {}
}