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