11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SampleElements; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SetTestSuiteBuilder; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestSetGenerator; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.SetFeature; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link Sets#transform(Set, Sets.InvertibleFunction)}. 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Dimitris Andreou 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class TransformedSetTest extends TestCase { 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Negates each integer. This is a true bijection, even considering MIN_VALUE 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Sets.InvertibleFunction<Integer, Integer> integerBijection = 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new Sets.InvertibleFunction<Integer, Integer>() { 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Integer apply(Integer integer) { 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return integer != null ? -integer : null; 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Integer invert(Integer integer) { 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return integer != null ? -integer : null; 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("suite") 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static TestSuite suite() { 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TestSuite suite = new TestSuite(); 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(SetTestSuiteBuilder 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .using(new TransformedIntegerSetGenerator()) 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("TransformedSet") 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures( 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SetFeature.GENERAL_PURPOSE, 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_VALUES, 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionSize.SEVERAL) 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return suite; 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSimpleCases() { 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> original = Sets.newHashSet(0, 1, 2, 3); 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> transformed = Sets.transform(original, integerBijection); 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(0, -1, -2, -3), transformed); 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // adding/removing to the original, see if transformed is affected 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(original.remove(2)); 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(original.add(4)); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(0, 1, 3, 4), original); 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(0, -1, -3, -4), transformed); 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // adding/removing to the transformed, see if original is affected 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(transformed.remove(-1)); 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(transformed.add(-5)); 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(0, -3, -4, -5), transformed); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(0, 3, 4, 5), original); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // redoing the same actions as above; no effect 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(transformed.remove(-1)); 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(transformed.add(-5)); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // they should always have the same size 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(original.size(), transformed.size()); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert transformed.clear(); 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(original.isEmpty()); 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(transformed.isEmpty()); 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class TransformedIntegerSetGenerator implements TestSetGenerator<Integer> { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<Integer> create(Object... elements) { 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Would use Collections#checkedCollection, but I get: 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // [ERROR] The method checkedCollection(Collection, Class<Integer>) 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // is undefined for the type Collections 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterable<Integer> integers = (Iterable) Arrays.asList(elements); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // I invert these before adding, so that the transformed set will have 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // the expected elements themselves, not their image under the bijection 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> invertedIntegers = Sets.newHashSet(Iterables.transform(integers, 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert integerBijection.inverse())); 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.transform(invertedIntegers, integerBijection); 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Integer[] createArray(int length) { 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new Integer[length]; 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public SampleElements<Integer> samples() { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new SampleElements<Integer>(-1, 0, 1, 2, 3); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Iterable<Integer> order(List<Integer> insertionOrder) { 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError(); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 127