001/* 002 * Copyright (C) 2010 The Guava Authors 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package com.google.common.collect.testing; 018 019import static com.google.common.collect.testing.features.CollectionFeature.DESCENDING_VIEW; 020import static com.google.common.collect.testing.features.CollectionFeature.SUBSET_VIEW; 021 022import com.google.common.annotations.GwtIncompatible; 023import com.google.common.collect.testing.DerivedCollectionGenerators.Bound; 024import com.google.common.collect.testing.DerivedCollectionGenerators.SortedSetSubsetTestSetGenerator; 025import com.google.common.collect.testing.features.Feature; 026import com.google.common.collect.testing.testers.NavigableSetNavigationTester; 027import java.util.ArrayList; 028import java.util.Collection; 029import java.util.Collections; 030import java.util.List; 031import java.util.NavigableSet; 032import java.util.Set; 033import java.util.SortedSet; 034import junit.framework.TestSuite; 035 036/** 037 * Creates, based on your criteria, a JUnit test suite that exhaustively tests a NavigableSet 038 * implementation. 039 */ 040@GwtIncompatible 041public final class NavigableSetTestSuiteBuilder<E> extends SortedSetTestSuiteBuilder<E> { 042 public static <E> NavigableSetTestSuiteBuilder<E> using(TestSortedSetGenerator<E> generator) { 043 NavigableSetTestSuiteBuilder<E> builder = new NavigableSetTestSuiteBuilder<>(); 044 builder.usingGenerator(generator); 045 return builder; 046 } 047 048 @Override 049 protected List<TestSuite> createDerivedSuites( 050 FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>> 051 parentBuilder) { 052 List<TestSuite> derivedSuites = new ArrayList<>(super.createDerivedSuites(parentBuilder)); 053 054 if (!parentBuilder.getFeatures().contains(SUBSET_VIEW)) { 055 // Other combinations are inherited from SortedSetTestSuiteBuilder. 056 derivedSuites.add(createSubsetSuite(parentBuilder, Bound.NO_BOUND, Bound.INCLUSIVE)); 057 derivedSuites.add(createSubsetSuite(parentBuilder, Bound.EXCLUSIVE, Bound.NO_BOUND)); 058 derivedSuites.add(createSubsetSuite(parentBuilder, Bound.EXCLUSIVE, Bound.EXCLUSIVE)); 059 derivedSuites.add(createSubsetSuite(parentBuilder, Bound.EXCLUSIVE, Bound.INCLUSIVE)); 060 derivedSuites.add(createSubsetSuite(parentBuilder, Bound.INCLUSIVE, Bound.INCLUSIVE)); 061 } 062 if (!parentBuilder.getFeatures().contains(DESCENDING_VIEW)) { 063 derivedSuites.add(createDescendingSuite(parentBuilder)); 064 } 065 return derivedSuites; 066 } 067 068 public static final class NavigableSetSubsetTestSetGenerator<E> 069 extends SortedSetSubsetTestSetGenerator<E> { 070 public NavigableSetSubsetTestSetGenerator( 071 TestSortedSetGenerator<E> delegate, Bound to, Bound from) { 072 super(delegate, to, from); 073 } 074 075 @Override 076 NavigableSet<E> createSubSet(SortedSet<E> sortedSet, E firstExclusive, E lastExclusive) { 077 NavigableSet<E> set = (NavigableSet<E>) sortedSet; 078 if (from == Bound.NO_BOUND && to == Bound.INCLUSIVE) { 079 return set.headSet(lastInclusive, true); 080 } else if (from == Bound.EXCLUSIVE && to == Bound.NO_BOUND) { 081 return set.tailSet(firstExclusive, false); 082 } else if (from == Bound.EXCLUSIVE && to == Bound.EXCLUSIVE) { 083 return set.subSet(firstExclusive, false, lastExclusive, false); 084 } else if (from == Bound.EXCLUSIVE && to == Bound.INCLUSIVE) { 085 return set.subSet(firstExclusive, false, lastInclusive, true); 086 } else if (from == Bound.INCLUSIVE && to == Bound.INCLUSIVE) { 087 return set.subSet(firstInclusive, true, lastInclusive, true); 088 } else { 089 return (NavigableSet<E>) super.createSubSet(set, firstExclusive, lastExclusive); 090 } 091 } 092 } 093 094 @Override 095 public NavigableSetTestSuiteBuilder<E> newBuilderUsing( 096 TestSortedSetGenerator<E> delegate, Bound to, Bound from) { 097 return using(new NavigableSetSubsetTestSetGenerator<E>(delegate, to, from)); 098 } 099 100 /** Create a suite whose maps are descending views of other maps. */ 101 private TestSuite createDescendingSuite( 102 FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>> 103 parentBuilder) { 104 TestSetGenerator<E> delegate = 105 (TestSetGenerator<E>) parentBuilder.getSubjectGenerator().getInnerGenerator(); 106 107 List<Feature<?>> features = new ArrayList<>(); 108 features.add(DESCENDING_VIEW); 109 features.addAll(parentBuilder.getFeatures()); 110 111 return NavigableSetTestSuiteBuilder.using( 112 new TestSetGenerator<E>() { 113 114 @Override 115 public SampleElements<E> samples() { 116 return delegate.samples(); 117 } 118 119 @Override 120 public E[] createArray(int length) { 121 return delegate.createArray(length); 122 } 123 124 @Override 125 public Iterable<E> order(List<E> insertionOrder) { 126 List<E> list = new ArrayList<>(); 127 for (E e : delegate.order(insertionOrder)) { 128 list.add(e); 129 } 130 Collections.reverse(list); 131 return list; 132 } 133 134 @Override 135 public Set<E> create(Object... elements) { 136 NavigableSet<E> navigableSet = (NavigableSet<E>) delegate.create(elements); 137 return navigableSet.descendingSet(); 138 } 139 }) 140 .named(parentBuilder.getName() + " descending") 141 .withFeatures(features) 142 .suppressing(parentBuilder.getSuppressedTests()) 143 .createTestSuite(); 144 } 145 146 @Override 147 protected List<Class<? extends AbstractTester>> getTesters() { 148 List<Class<? extends AbstractTester>> testers = Helpers.copyToList(super.getTesters()); 149 testers.add(NavigableSetNavigationTester.class); 150 return testers; 151 } 152}