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