1/* 2 * Copyright (C) 2013 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; 18 19import com.google.common.annotations.GwtCompatible; 20import com.google.common.annotations.GwtIncompatible; 21import com.google.common.collect.MapConstraintsTest.TestKeyException; 22import com.google.common.collect.MapConstraintsTest.TestValueException; 23import com.google.common.collect.testing.MapTestSuiteBuilder; 24import com.google.common.collect.testing.TestStringMapGenerator; 25import com.google.common.collect.testing.features.CollectionFeature; 26import com.google.common.collect.testing.features.CollectionSize; 27import com.google.common.collect.testing.features.MapFeature; 28 29import junit.framework.Test; 30import junit.framework.TestCase; 31import junit.framework.TestSuite; 32 33import java.util.HashMap; 34import java.util.Map; 35import java.util.Map.Entry; 36 37/** 38 * Tests for {@link MapConstraints#constrainedMap}. 39 * 40 * @author Jared Levy 41 * @author Louis Wasserman 42 */ 43@GwtCompatible(emulated = true) 44public class ConstrainedMapTest extends TestCase { 45 46 private static final String TEST_KEY = "42"; 47 private static final String TEST_VALUE = "test"; 48 private static final MapConstraint<String, String> TEST_CONSTRAINT = new TestConstraint(); 49 50 @GwtIncompatible("suite") 51 public static Test suite() { 52 TestSuite suite = new TestSuite(); 53 suite.addTest(MapTestSuiteBuilder 54 .using(new ConstrainedMapGenerator()) 55 .named("Maps.constrainedMap[HashMap]") 56 .withFeatures( 57 CollectionSize.ANY, 58 MapFeature.ALLOWS_NULL_KEYS, 59 MapFeature.ALLOWS_NULL_VALUES, 60 MapFeature.ALLOWS_ANY_NULL_QUERIES, 61 MapFeature.GENERAL_PURPOSE, 62 CollectionFeature.SUPPORTS_ITERATOR_REMOVE) 63 .createTestSuite()); 64 suite.addTestSuite(ConstrainedMapTest.class); 65 return suite; 66 } 67 68 public void testPutWithForbiddenKeyForbiddenValue() { 69 Map<String, String> map = MapConstraints.constrainedMap( 70 new HashMap<String, String>(), 71 TEST_CONSTRAINT); 72 try { 73 map.put(TEST_KEY, TEST_VALUE); 74 fail("Expected IllegalArgumentException"); 75 } catch (IllegalArgumentException expected) { 76 // success 77 } 78 } 79 80 public void testPutWithForbiddenKeyAllowedValue() { 81 Map<String, String> map = MapConstraints.constrainedMap( 82 new HashMap<String, String>(), 83 TEST_CONSTRAINT); 84 try { 85 map.put(TEST_KEY, "allowed"); 86 fail("Expected IllegalArgumentException"); 87 } catch (IllegalArgumentException expected) { 88 // success 89 } 90 } 91 92 public void testPutWithAllowedKeyForbiddenValue() { 93 Map<String, String> map = MapConstraints.constrainedMap( 94 new HashMap<String, String>(), 95 TEST_CONSTRAINT); 96 try { 97 map.put("allowed", TEST_VALUE); 98 fail("Expected IllegalArgumentException"); 99 } catch (IllegalArgumentException expected) { 100 // success 101 } 102 } 103 104 public static final class ConstrainedMapGenerator extends TestStringMapGenerator { 105 @Override 106 protected Map<String, String> create(Entry<String, String>[] entries) { 107 Map<String, String> map = MapConstraints.constrainedMap( 108 new HashMap<String, String>(), 109 TEST_CONSTRAINT); 110 for (Entry<String, String> entry : entries) { 111 map.put(entry.getKey(), entry.getValue()); 112 } 113 return map; 114 } 115 } 116 117 private static final class TestConstraint implements MapConstraint<String, String> { 118 @Override 119 public void checkKeyValue(String key, String value) { 120 if (TEST_KEY.equals(key)) { 121 throw new TestKeyException(); 122 } 123 if (TEST_VALUE.equals(value)) { 124 throw new TestValueException(); 125 } 126 } 127 128 private static final long serialVersionUID = 0; 129 } 130} 131