169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin/*
569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin *******************************************************************************
61c8a530973739aafa823d758240d2cd5dad96fe3Fredrik Roubert * Copyright (C) 1996-2016, International Business Machines Corporation and    *
769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin * others. All Rights Reserved.                                                *
869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin *******************************************************************************
969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin */
1069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinpackage android.icu.dev.test.util;
1169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
1269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinimport java.util.Arrays;
1369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinimport java.util.Collection;
1469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinimport java.util.Set;
1569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinimport java.util.TreeSet;
1669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
17f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test;
18f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinimport android.icu.dev.test.TestFmwk;
2069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinimport android.icu.dev.util.CollectionUtilities;
2169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
2269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffinpublic class TestUtilities extends TestFmwk {
23f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
2469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    public void TestCollectionUtilitySpeed() {
2569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        TreeSet ts1 = new TreeSet();
2669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        TreeSet ts2 = new TreeSet();
2769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        int size = 1000;
2869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        int iterations = 1000;
2969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        String prefix =  "abc";
3069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        String postfix = "nop";
3169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        for (int i = 0; i < size; ++i) {
3269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            ts1.add(prefix + String.valueOf(i) + postfix);
3369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            ts2.add(prefix + String.valueOf(i) + postfix);
3469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        }
3569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        // warm up
3669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        CollectionUtilities.containsAll(ts1, ts2);
3769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        ts1.containsAll(ts2);
3869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
3969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        timeAndCompare(ts1, ts2, iterations, true, .75);
4069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        // now different sets
4169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        ts1.add("Able");
4269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        timeAndCompare(ts1, ts2, iterations, true, .75);
4369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        timeAndCompare(ts2, ts1, iterations*100, false, 1.05);
4469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    }
4569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
4669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    private void timeAndCompare(TreeSet ts1, TreeSet ts2, int iterations, boolean expected, double factorOfStandard) {
4769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        double utilityTimeSorted = timeUtilityContainsAll(iterations, ts1, ts2, expected)/(double)iterations;
4869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        double standardTimeSorted = timeStandardContainsAll(iterations, ts1, ts2, expected)/(double)iterations;
49f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
5069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        if (utilityTimeSorted < standardTimeSorted*factorOfStandard) {
5169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            logln("Sorted: Utility time (" + utilityTimeSorted + ") << Standard duration (" + standardTimeSorted + "); " + 100*(utilityTimeSorted/standardTimeSorted) + "%");
5269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        } else {
53f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert            /*errln*/logln("Sorted: Utility time (" + utilityTimeSorted + ") !<< Standard duration (" + standardTimeSorted + "); " + 100*(utilityTimeSorted/standardTimeSorted) + "%");
5469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        }
5569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    }
5669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
5769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    private long timeStandardContainsAll(int iterations, Set hs1, Set hs2, boolean expected) {
5869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        long standardTime;
5969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        {
6069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            long start, end;
6169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            boolean temp = false;
6269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
6369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            start = System.currentTimeMillis();
6469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            for (int i = 0; i < iterations; ++i) {
6569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                temp = hs1.containsAll(hs2);
6669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                if (temp != expected) {
6769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    errln("Bad result");
6869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                }
6969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            }
7069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            end = System.currentTimeMillis();
7169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            standardTime = end - start;
7269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        }
7369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        return standardTime;
7469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    }
7569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
7669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    private long timeUtilityContainsAll(int iterations, Set hs1, Set hs2, boolean expected) {
7769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        long utilityTime;
7869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        {
7969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            long start, end;
8069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            boolean temp = false;
8169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            start = System.currentTimeMillis();
8269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            for (int i = 0; i < iterations; ++i) {
8369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                temp = CollectionUtilities.containsAll(hs1, hs2);
8469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                if (temp != expected) {
8569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    errln("Bad result");
8669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                }
8769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            }
8869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            end = System.currentTimeMillis();
8969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            utilityTime = end - start;
9069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        }
9169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        return utilityTime;
9269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    }
93f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
94f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
9569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    public void TestCollectionUtilities() {
96f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert        String[][] test = {{"a", "c", "e", "g", "h", "z"}, {"b", "d", "f", "h", "w"}, { "a", "b" }, { "a", "d" }, {"d"}, {}}; //
9769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        int resultMask = 0;
9869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        for (int i = 0; i < test.length; ++i) {
9969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            Collection a = new TreeSet(Arrays.asList(test[i]));
10069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            for (int j = 0; j < test.length; ++j) {
10169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                Collection b = new TreeSet(Arrays.asList(test[j]));
10269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                int relation = CollectionUtilities.getContainmentRelation(a, b);
10369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                resultMask |= (1 << relation);
10469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                switch (relation) {
10569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.ALL_EMPTY:
10669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(a.size() == 0 && b.size() == 0, a, relation, b);
10769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    break;
10869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.NOT_A_SUPERSET_B:
10969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(a.size() == 0 && b.size() != 0, a, relation, b);
11069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    break;
11169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.NOT_A_DISJOINT_B:
11269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(a.equals(b) && a.size() != 0, a, relation, b);
11369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    break;
11469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.NOT_A_SUBSET_B:
11569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(a.size() != 0 && b.size() == 0, a, relation, b);
11669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    break;
11769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.A_PROPER_SUBSET_OF_B:
11869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(b.containsAll(a) && !a.equals(b), a, relation, b);
11969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    break;
12069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.NOT_A_EQUALS_B:
12169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(!CollectionUtilities.containsSome(a, b) && a.size() != 0 && b.size() != 0, a, relation, b);
12269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    break;
12369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.A_PROPER_SUPERSET_B:
12469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(a.containsAll(b) && !a.equals(b), a, relation, b);
12569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                break;
12669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                case CollectionUtilities.A_PROPER_OVERLAPS_B:
12769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    checkContainment(!b.containsAll(a) && !a.containsAll(b) && CollectionUtilities.containsSome(a, b), a, relation, b);
12869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                break;
12969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                }
13069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            }
13169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        }
13269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        if (resultMask != 0xFF) {
13369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            String missing = "";
13469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            for (int i = 0; i < 8; ++i) {
13569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                if ((resultMask & (1 << i)) == 0) {
13669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    if (missing.length() != 0) missing += ", ";
13769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                    missing += RelationName[i];
13869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin                }
13969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            }
14069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            errln("Not all ContainmentRelations checked: " + missing);
14169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        }
14269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    }
14369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
14469ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    static final String[] RelationName = {"ALL_EMPTY",
14569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            "NOT_A_SUPERSET_B",
14669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            "NOT_A_DISJOINT_B",
14769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            "NOT_A_SUBSET_B",
14869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            "A_PROPER_SUBSET_OF_B",
14969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            "A_PROPER_DISJOINT_B",
15069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            "A_PROPER_SUPERSET_B",
15169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            "A_PROPER_OVERLAPS_B"};
15269ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin
15369ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    /**
154f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert     *
15569ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin     */
15669ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    private void checkContainment(boolean c, Collection a, int relation, Collection b) {
15769ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        if (!c) {
15869ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin            errln("Fails relation: " + a + " \t" + RelationName[relation] + " \t" + b);
15969ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin        }
16069ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin    }
16169ef1baa641465e7474f8646903b8f5fc3125534Paul Duffin}
162