• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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 
17 package com.google.common.collect;
18 
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.common.annotations.GwtIncompatible;
21 import com.google.common.collect.testing.SampleElements;
22 import com.google.common.collect.testing.SetTestSuiteBuilder;
23 import com.google.common.collect.testing.TestSetGenerator;
24 import com.google.common.collect.testing.features.CollectionFeature;
25 import com.google.common.collect.testing.features.CollectionSize;
26 import com.google.common.collect.testing.features.SetFeature;
27 
28 import junit.framework.TestCase;
29 import junit.framework.TestSuite;
30 
31 import java.util.Arrays;
32 import java.util.List;
33 import java.util.Set;
34 
35 /**
36  * Tests for {@link Sets#transform(Set, Sets.InvertibleFunction)}.
37  *
38  * @author Dimitris Andreou
39  */
40 @GwtCompatible(emulated = true)
41 public class TransformedSetTest extends TestCase {
42   // Negates each integer. This is a true bijection, even considering MIN_VALUE
43   private static final Sets.InvertibleFunction<Integer, Integer> integerBijection =
44       new Sets.InvertibleFunction<Integer, Integer>() {
45         @Override public Integer apply(Integer integer) {
46           return integer != null ? -integer : null;
47         }
48 
49         @Override
50         public Integer invert(Integer integer) {
51           return integer != null ? -integer : null;
52         }
53       };
54 
55   @GwtIncompatible("suite")
suite()56   public static TestSuite suite() {
57     TestSuite suite = new TestSuite();
58     suite.addTest(SetTestSuiteBuilder
59         .using(new TransformedIntegerSetGenerator())
60         .named("TransformedSet")
61         .withFeatures(
62         SetFeature.GENERAL_PURPOSE,
63         CollectionFeature.ALLOWS_NULL_VALUES,
64         CollectionSize.SEVERAL)
65       .createTestSuite());
66     return suite;
67   }
68 
testSimpleCases()69   public void testSimpleCases() {
70     Set<Integer> original = Sets.newHashSet(0, 1, 2, 3);
71     Set<Integer> transformed = Sets.transform(original, integerBijection);
72 
73     assertEquals(ImmutableSet.of(0, -1, -2, -3), transformed);
74 
75     // adding/removing to the original, see if transformed is affected
76     assertTrue(original.remove(2));
77     assertTrue(original.add(4));
78     assertEquals(ImmutableSet.of(0,  1,  3,  4), original);
79     assertEquals(ImmutableSet.of(0, -1, -3, -4), transformed);
80 
81     // adding/removing to the transformed, see if original is affected
82     assertTrue(transformed.remove(-1));
83     assertTrue(transformed.add(-5));
84     assertEquals(ImmutableSet.of(0, -3, -4, -5), transformed);
85     assertEquals(ImmutableSet.of(0,  3,  4,  5), original);
86 
87     // redoing the same actions as above; no effect
88     assertFalse(transformed.remove(-1));
89     assertFalse(transformed.add(-5));
90 
91     // they should always have the same size
92     assertEquals(original.size(), transformed.size());
93 
94     transformed.clear();
95     assertTrue(original.isEmpty());
96     assertTrue(transformed.isEmpty());
97   }
98 
99   public static class TransformedIntegerSetGenerator implements TestSetGenerator<Integer> {
create(Object... elements)100     @Override public Set<Integer> create(Object... elements) {
101       // Would use Collections#checkedCollection, but I get:
102       // [ERROR] The method checkedCollection(Collection, Class<Integer>)
103       // is undefined for the type Collections
104       @SuppressWarnings("unchecked")
105       Iterable<Integer> integers = (Iterable) Arrays.asList(elements);
106 
107       // I invert these before adding, so that the transformed set will have
108       // the expected elements themselves, not their image under the bijection
109       Set<Integer> invertedIntegers = Sets.newHashSet(Iterables.transform(integers,
110           integerBijection.inverse()));
111       return Sets.transform(invertedIntegers, integerBijection);
112     }
113 
createArray(int length)114     @Override public Integer[] createArray(int length) {
115       return new Integer[length];
116     }
117 
samples()118     @Override public SampleElements<Integer> samples() {
119       return new SampleElements<Integer>(-1, 0, 1, 2, 3);
120     }
121 
order(List<Integer> insertionOrder)122     @Override public Iterable<Integer> order(List<Integer> insertionOrder) {
123       throw new AssertionError();
124     }
125   }
126 }
127