Java
312 строк · 11.5 Кб
1/*
2* Copyright (C) 2008 The Guava Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package com.google.common.collect.testing.features;18
19import static com.google.common.collect.Sets.newHashSet;20import static com.google.common.collect.testing.features.FeatureEnumTest.assertGoodFeatureEnum;21import static com.google.common.collect.testing.features.FeatureUtil.addImpliedFeatures;22import static com.google.common.collect.testing.features.FeatureUtil.buildDeclaredTesterRequirements;23import static com.google.common.collect.testing.features.FeatureUtil.buildTesterRequirements;24import static com.google.common.collect.testing.features.FeatureUtil.getTesterAnnotations;25import static com.google.common.collect.testing.features.FeatureUtil.impliedFeatures;26import static com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.BAR;27import static com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.FOO;28import static com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.IMPLIES_BAR;29import static com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.IMPLIES_FOO;30import static com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.IMPLIES_IMPLIES_FOO;31import static com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR;32import static com.google.common.truth.Truth.assertThat;33import static java.lang.annotation.RetentionPolicy.RUNTIME;34import static org.junit.Assert.assertThrows;35
36import com.google.common.collect.ImmutableSet;37import com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.NotTesterAnnotation;38import com.google.common.collect.testing.features.FeatureUtilTest.ExampleFeature.Require;39import java.lang.annotation.Inherited;40import java.lang.annotation.Retention;41import java.lang.reflect.Method;42import java.util.Set;43import junit.framework.TestCase;44
45/**
46* @author George van den Driessche
47*/
48public class FeatureUtilTest extends TestCase {49enum ExampleFeature implements Feature<Object> {50FOO,51IMPLIES_FOO,52IMPLIES_IMPLIES_FOO,53BAR,54IMPLIES_BAR,55IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR;56
57@Override58public ImmutableSet<Feature<? super Object>> getImpliedFeatures() {59switch (this) {60case IMPLIES_FOO:61return ImmutableSet.of(FOO);62case IMPLIES_IMPLIES_FOO:63return ImmutableSet.of(IMPLIES_FOO);64case IMPLIES_BAR:65return ImmutableSet.of(BAR);66case IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR:67return ImmutableSet.of(IMPLIES_FOO, IMPLIES_BAR);68default:69return ImmutableSet.of();70}71}72
73@Retention(RUNTIME)74@Inherited75@TesterAnnotation76@interface Require {77ExampleFeature[] value() default {};78
79ExampleFeature[] absent() default {};80}81
82@Retention(RUNTIME)83@Inherited84@interface NotTesterAnnotation {85ExampleFeature[] value() default {};86
87ExampleFeature[] absent() default {};88}89}90
91public void testTestFeatureEnums() {92// Haha! Let's test our own test rig!93assertGoodFeatureEnum(ExampleFeature.class);94}95
96public void testAddImpliedFeatures_returnsSameSetInstance() {97Set<Feature<?>> features = newHashSet(FOO);98assertThat(addImpliedFeatures(features)).isSameInstanceAs(features);99}100
101public void testAddImpliedFeatures_addsImpliedFeatures() {102assertThat(addImpliedFeatures(newHashSet(FOO))).containsExactly(FOO);103
104assertThat(addImpliedFeatures(newHashSet(IMPLIES_IMPLIES_FOO)))105.containsExactly(IMPLIES_IMPLIES_FOO, IMPLIES_FOO, FOO);106
107assertThat(addImpliedFeatures(newHashSet(IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR)))108.containsExactly(IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR, IMPLIES_FOO, FOO, IMPLIES_BAR, BAR);109}110
111public void testImpliedFeatures_returnsNewSetInstance() {112Set<Feature<?>> features = newHashSet(IMPLIES_FOO);113assertThat(impliedFeatures(features)).isNotSameInstanceAs(features);114}115
116public void testImpliedFeatures_returnsImpliedFeatures() {117assertThat(impliedFeatures(newHashSet(FOO))).isEmpty();118
119assertThat(impliedFeatures(newHashSet(IMPLIES_IMPLIES_FOO))).containsExactly(IMPLIES_FOO, FOO);120
121assertThat(impliedFeatures(newHashSet(IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR)))122.containsExactly(IMPLIES_FOO, FOO, IMPLIES_BAR, BAR);123}124
125public void testBuildTesterRequirements_class_notAnnotated() throws Exception {126class Tester {}127
128TesterRequirements requirements = buildTesterRequirements(Tester.class);129
130assertThat(requirements.getPresentFeatures()).isEmpty();131assertThat(requirements.getAbsentFeatures()).isEmpty();132}133
134public void testBuildTesterRequirements_class_empty() throws Exception {135@Require136class Tester {}137
138TesterRequirements requirements = buildTesterRequirements(Tester.class);139
140assertThat(requirements.getPresentFeatures()).isEmpty();141assertThat(requirements.getAbsentFeatures()).isEmpty();142}143
144public void testBuildTesterRequirements_class_present() throws Exception {145@Require({IMPLIES_IMPLIES_FOO, IMPLIES_BAR})146class Tester {}147
148TesterRequirements requirements = buildTesterRequirements(Tester.class);149
150assertThat(requirements.getPresentFeatures())151.containsExactly(IMPLIES_IMPLIES_FOO, IMPLIES_FOO, FOO, IMPLIES_BAR, BAR);152assertThat(requirements.getAbsentFeatures()).isEmpty();153}154
155public void testBuildTesterRequirements_class_absent() throws Exception {156@Require(absent = {IMPLIES_IMPLIES_FOO, IMPLIES_BAR})157class Tester {}158
159TesterRequirements requirements = buildTesterRequirements(Tester.class);160
161assertThat(requirements.getPresentFeatures()).isEmpty();162assertThat(requirements.getAbsentFeatures()).containsExactly(IMPLIES_IMPLIES_FOO, IMPLIES_BAR);163}164
165public void testBuildTesterRequirements_class_present_and_absent() throws Exception {166@Require(value = IMPLIES_FOO, absent = IMPLIES_IMPLIES_FOO)167class Tester {}168
169TesterRequirements requirements = buildTesterRequirements(Tester.class);170
171assertThat(requirements.getPresentFeatures()).containsExactly(IMPLIES_FOO, FOO);172assertThat(requirements.getAbsentFeatures()).containsExactly(IMPLIES_IMPLIES_FOO);173}174
175public void testBuildTesterRequirements_class_present_method_present() throws Exception {176@Require(IMPLIES_BAR)177class Tester {178@Require(IMPLIES_IMPLIES_FOO)179public void test() {}180}181
182TesterRequirements requirements = buildTesterRequirements(Tester.class.getMethod("test"));183
184assertThat(requirements.getPresentFeatures())185.containsExactly(IMPLIES_IMPLIES_FOO, IMPLIES_FOO, FOO, IMPLIES_BAR, BAR);186assertThat(requirements.getAbsentFeatures()).isEmpty();187}188
189public void testBuildTesterRequirements_class_absent_method_absent() throws Exception {190@Require(absent = IMPLIES_BAR)191class Tester {192@Require(absent = IMPLIES_IMPLIES_FOO)193public void test() {}194}195
196TesterRequirements requirements = buildTesterRequirements(Tester.class.getMethod("test"));197
198assertThat(requirements.getPresentFeatures()).isEmpty();199assertThat(requirements.getAbsentFeatures()).containsExactly(IMPLIES_IMPLIES_FOO, IMPLIES_BAR);200}201
202public void testBuildTesterRequirements_class_present_method_absent() throws Exception {203@Require(IMPLIES_IMPLIES_FOO)204class Tester {205@Require(absent = IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR)206public void test() {}207}208
209TesterRequirements requirements = buildTesterRequirements(Tester.class.getMethod("test"));210
211assertThat(requirements.getPresentFeatures())212.containsExactly(IMPLIES_IMPLIES_FOO, IMPLIES_FOO, FOO);213assertThat(requirements.getAbsentFeatures())214.containsExactly(IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR);215}216
217public void testBuildTesterRequirements_class_absent_method_present() throws Exception {218@Require(absent = IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR)219class Tester {220@Require(IMPLIES_IMPLIES_FOO)221public void test() {}222}223
224TesterRequirements requirements = buildTesterRequirements(Tester.class.getMethod("test"));225
226assertThat(requirements.getPresentFeatures())227.containsExactly(IMPLIES_IMPLIES_FOO, IMPLIES_FOO, FOO);228assertThat(requirements.getAbsentFeatures())229.containsExactly(IMPLIES_IMPLIES_FOO_AND_IMPLIES_BAR);230}231
232public void testBuildTesterRequirements_classClassConflict() {233@Require(value = FOO, absent = FOO)234class Tester {}235
236ConflictingRequirementsException e =237assertThrows(238ConflictingRequirementsException.class, () -> buildTesterRequirements(Tester.class));239assertThat(e.getConflicts()).containsExactly(FOO);240assertThat(e.getSource()).isEqualTo(Tester.class.getAnnotation(Require.class));241}242
243public void testBuildTesterRequirements_classClassConflict_inherited() {244@Require(FOO)245abstract class BaseTester {}246@Require(absent = FOO)247class Tester extends BaseTester {}248
249ConflictingRequirementsException e =250assertThrows(251ConflictingRequirementsException.class, () -> buildTesterRequirements(Tester.class));252assertThat(e.getConflicts()).containsExactly(FOO);253assertThat(e.getSource()).isEqualTo(Tester.class);254}255
256public void testBuildTesterRequirements_classClassConflict_implied() {257@Require(value = IMPLIES_FOO, absent = FOO)258class Tester {}259
260ConflictingRequirementsException e =261assertThrows(262ConflictingRequirementsException.class, () -> buildTesterRequirements(Tester.class));263assertThat(e.getConflicts()).containsExactly(FOO);264assertThat(e.getSource()).isEqualTo(Tester.class.getAnnotation(Require.class));265}266
267public void testBuildTesterRequirements_methodClassConflict() throws Exception {268@Require(IMPLIES_FOO)269class Tester {270@Require(absent = FOO)271public void test() {}272}273
274Method method = Tester.class.getMethod("test");275ConflictingRequirementsException e =276assertThrows(ConflictingRequirementsException.class, () -> buildTesterRequirements(method));277assertThat(e.getConflicts()).containsExactly(FOO);278assertThat(e.getSource()).isEqualTo(method);279}280
281public void testBuildDeclaredTesterRequirements() throws Exception {282@Require(IMPLIES_FOO)283abstract class BaseTester {}284@Require(IMPLIES_BAR)285class Tester extends BaseTester {}286
287TesterRequirements requirements = buildDeclaredTesterRequirements(Tester.class);288
289assertThat(requirements.getPresentFeatures()).containsExactly(IMPLIES_BAR, BAR);290assertThat(requirements.getAbsentFeatures()).isEmpty();291}292
293public void testGetTesterAnnotations_class() {294@Require295@NotTesterAnnotation296class Tester {}297
298assertThat(getTesterAnnotations(Tester.class))299.containsExactly(Tester.class.getAnnotation(Require.class));300}301
302public void testGetTesterAnnotations_method() throws Exception {303class Tester {304@Require305@NotTesterAnnotation306public void test() {}307}308Method method = Tester.class.getMethod("test");309
310assertThat(getTesterAnnotations(method)).containsExactly(method.getAnnotation(Require.class));311}312}
313