194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson/* 294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * Copyright (C) 2011 Google Inc. 394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * 494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * you may not use this file except in compliance with the License. 694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * You may obtain a copy of the License at 794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * 894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * 1094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * Unless required by applicable law or agreed to in writing, software 1194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 1294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * See the License for the specific language governing permissions and 1494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * limitations under the License. 1594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson */ 1694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 1794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilsonpackage libcore.java.util; 1894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 1994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilsonimport java.util.NavigableSet; 2094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilsonimport java.util.SortedSet; 2194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilsonimport java.util.TreeSet; 2294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilsonimport junit.framework.TestCase; 23b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilsonimport libcore.util.SerializationTester; 2494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 2594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilsonpublic final class TreeSetTest extends TestCase { 2694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 2794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson public void testEmptySetSerialization() { 2894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson String s = "aced0005737200116a6176612e7574696c2e54726565536574dd98509395ed87" 2994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "5b03000078707077040000000078"; 3094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson TreeSet<String> set = new TreeSet<String>(); 31b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson new SerializationTester<TreeSet<String>>(set, s).test(); 3294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 3394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 3494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson public void testSerializationWithComparator() { 3594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson String s = "aced0005737200116a6176612e7574696c2e54726565536574dd98509395ed87" 3694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "5b03000078707372002a6a6176612e6c616e672e537472696e672443617365496" 3794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "e73656e736974697665436f6d70617261746f7277035c7d5c50e5ce0200007870" 3894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "770400000002740001617400016278"; 3994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson TreeSet<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 4094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("a"); 4194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("b"); 42b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson new SerializationTester<NavigableSet<String>>(set, s) { 4394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson @Override protected void verify(NavigableSet<String> deserialized) { 4494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson assertEquals(0, deserialized.comparator().compare("X", "x")); 4594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 4694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson }.test(); 4794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 4894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 4994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson public void testSubSetSerialization() { 5094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson String s = "aced0005737200116a6176612e7574696c2e54726565536574dd98509395ed87" 5194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "5b03000078707372002a6a6176612e6c616e672e537472696e672443617365496" 5294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "e73656e736974697665436f6d70617261746f7277035c7d5c50e5ce0200007870" 5394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "770400000002740001617400016278"; 5494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson TreeSet<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 5594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("a"); 5694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("b"); 5794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("c"); 5894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("d"); 5994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson final SortedSet<String> subSet = set.subSet("a", "c"); 60b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson new SerializationTester<SortedSet<String>>(subSet, s) { 6194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson @Override protected void verify(SortedSet<String> deserialized) { 6294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson assertBounded(deserialized, deserialized == subSet); 6394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 6494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson }.test(); 6594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 6694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 6794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson public void testNavigableSubSetSerialization() { 6894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson String s = "aced0005737200116a6176612e7574696c2e54726565536574dd98509395ed87" 6994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "5b03000078707372002a6a6176612e6c616e672e537472696e672443617365496" 7094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "e73656e736974697665436f6d70617261746f7277035c7d5c50e5ce0200007870" 7194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "770400000002740001627400016378"; 7294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson TreeSet<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 7394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("a"); 7494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("b"); 7594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("c"); 7694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("d"); 7794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson final SortedSet<String> subSet = set.subSet("a", false, "c", true); 78b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson new SerializationTester<SortedSet<String>>(subSet, s) { 7994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson @Override protected void verify(SortedSet<String> deserialized) { 8094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson assertBounded(deserialized, deserialized == subSet); 8194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 8294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson }.test(); 8394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 8494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 8594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson /** 8694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * Regrettably, serializing a TreeSet causes it to forget its bounds. This 8794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * is unlike a serialized TreeMap which retains its bounds when serialized. 8894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson */ 8994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson private void assertBounded(SortedSet<String> deserialized, boolean bounded) { 9094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson if (bounded) { 9194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson try { 9294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson deserialized.add("e"); 9394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson fail(); 9494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } catch (IllegalArgumentException expected) { 9594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 9694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } else { 9794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson assertTrue(deserialized.add("e")); 9894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson assertTrue(deserialized.remove("e")); 9994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 10094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 10194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 10294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson /** 10394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * Test that TreeSet never attempts to serialize a non-serializable 10494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson * comparator. http://b/5552608 10594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson */ 10694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson public void testDescendingSetSerialization() { 10794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson String s = "aced0005737200116a6176612e7574696c2e54726565536574dd98509395ed87" 10894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "5b0300007870737200276a6176612e7574696c2e436f6c6c656374696f6e73245" 10994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "2657665727365436f6d70617261746f7264048af0534e4ad00200007870770400" 11094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "000002740001627400016178"; 11194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson TreeSet<String> set = new TreeSet<String>(); 11294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("a"); 11394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("b"); 11494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson NavigableSet<String> descendingSet = set.descendingSet(); 115b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson new SerializationTester<NavigableSet<String>>(descendingSet, s) { 11694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson @Override protected void verify(NavigableSet<String> deserialized) { 11794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson assertEquals("b", deserialized.first()); 11894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 11994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson }.test(); 12094fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 12194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson 12294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson public void testJava5SerializationWithComparator() { 12394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson String s = "aced0005737200116a6176612e7574696c2e54726565536574dd98509395ed87" 12494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "5b03000078707372002a6a6176612e6c616e672e537472696e672443617365496" 12594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "e73656e736974697665436f6d70617261746f7277035c7d5c50e5ce0200007870" 12694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson + "770400000002740001617400016278"; 12794fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson TreeSet<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 12894fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("a"); 12994fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson set.add("b"); 130b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson new SerializationTester<TreeSet<String>>(set, s) { 13194fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson @Override protected void verify(TreeSet<String> deserialized) { 13294fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson assertEquals(0, deserialized.comparator().compare("X", "x")); 13394fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 13494fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson }.test(); 13594fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson } 13694fab96cd4c1bd4363ba1d70b59475132ddd441eJesse Wilson} 137