19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.tools.layoutlib.create;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static org.junit.Assert.assertArrayEquals;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static org.junit.Assert.assertEquals;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static org.junit.Assert.assertNotNull;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.tools.layoutlib.create.AsmAnalyzer.DependencyVisitor;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.After;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.Before;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.Test;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.ClassReader;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.URL;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
341cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptaimport java.util.HashSet;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
361cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptaimport java.util.Set;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.TreeMap;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unit tests for some methods of {@link AsmAnalyzer}.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AsmAnalyzerTest {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MockLog mLog;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList<String> mOsJarPath;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AsmAnalyzer mAa;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Before
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setUp() throws Exception {
50bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mLog = new MockLog();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URL url = this.getClass().getClassLoader().getResource("data/mock_android.jar");
52bc101806249eb883f89c4a770a8c27f9ac315837Raphael
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOsJarPath = new ArrayList<String>();
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOsJarPath.add(url.getFile());
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
561cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        Set<String> excludeClasses = new HashSet<String>(1);
571cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        excludeClasses.add("java.lang.JavaClass");
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa = new AsmAnalyzer(mLog, mOsJarPath, null /* gen */,
591cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta                null /* deriveFrom */, null /* includeGlobs */, excludeClasses);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @After
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void tearDown() throws Exception {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testParseZip() throws IOException {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> map = mAa.parseZip(mOsJarPath);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
711cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta                "java.lang.JavaClass",
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest",
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest$DerivingClass",
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest$MyGenerics1",
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest$MyIntEnum",
76bc101806249eb883f89c4a770a8c27f9ac315837Raphael                "mock_android.dummy.InnerTest$MyStaticInnerClass",
77bc101806249eb883f89c4a770a8c27f9ac315837Raphael                "mock_android.dummy.InnerTest$NotStaticInner1",
78bc101806249eb883f89c4a770a8c27f9ac315837Raphael                "mock_android.dummy.InnerTest$NotStaticInner2",
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams",
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.LinearLayout",
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.LinearLayout$LayoutParams",
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout",
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout$LayoutParams"
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            map.keySet().toArray());
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
90bc101806249eb883f89c4a770a8c27f9ac315837Raphael
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFindClass() throws IOException, LogAbortException {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ClassReader cr = mAa.findClass("mock_android.view.ViewGroup$LayoutParams",
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                zipClasses, found);
98bc101806249eb883f89c4a770a8c27f9ac315837Raphael
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cr);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("mock_android/view/ViewGroup$LayoutParams", cr.getClassName());
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] { "mock_android.view.ViewGroup$LayoutParams" },
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found.keySet().toArray());
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new ClassReader[] { cr }, found.values().toArray());
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFindGlobs() throws IOException, LogAbortException {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this matches classes, a package match returns nothing
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        found.clear();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.view", zipClasses, found);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] { },
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // a complex glob search. * is a search pattern that matches names, not dots
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.*.*Group$*Layout*", zipClasses, found);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams"
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // a complex glob search. ** is a search pattern that matches names including dots
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.**Group*", zipClasses, found);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams"
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // matches a single class
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        found.clear();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.view.View", zipClasses, found);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View"
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // matches everyting inside the given package but not sub-packages
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        found.clear();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.view.*", zipClasses, found);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams"
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String key : found.keySet()) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassReader value = found.get(key);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertNotNull("No value for " + key, value);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(key, AsmAnalyzer.classReaderToClassName(value));
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFindClassesDerivingFrom() throws LogAbortException, IOException {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findClassesDerivingFrom("mock_android.view.View", zipClasses, found);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.LinearLayout",
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout",
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
179bc101806249eb883f89c4a770a8c27f9ac315837Raphael
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String key : found.keySet()) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassReader value = found.get(key);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertNotNull("No value for " + key, value);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(key, AsmAnalyzer.classReaderToClassName(value));
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
186bc101806249eb883f89c4a770a8c27f9ac315837Raphael
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testDependencyVisitor() throws IOException, LogAbortException {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> keep = new TreeMap<String, ClassReader>();
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> new_keep = new TreeMap<String, ClassReader>();
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> in_deps = new TreeMap<String, ClassReader>();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> out_deps = new TreeMap<String, ClassReader>();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ClassReader cr = mAa.findClass("mock_android.widget.TableLayout", zipClasses, keep);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DependencyVisitor visitor = mAa.getVisitor(zipClasses, keep, new_keep, in_deps, out_deps);
197bc101806249eb883f89c4a770a8c27f9ac315837Raphael
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get first level dependencies
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cr.accept(visitor, 0 /* flags */);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout$LayoutParams",
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out_deps.keySet().toArray());
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        in_deps.putAll(out_deps);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out_deps.clear();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get second level dependencies
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (ClassReader cr2 : in_deps.values()) {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cr2.accept(visitor, 0 /* flags */);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams",
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out_deps.keySet().toArray());
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        in_deps.putAll(out_deps);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out_deps.clear();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get third level dependencies (there are none)
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (ClassReader cr2 : in_deps.values()) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cr2.accept(visitor, 0 /* flags */);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2291cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        keep.putAll(new_keep);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] { }, out_deps.keySet().toArray());
2321cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        assertArrayEquals(new String[] {
2331cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta                "mock_android.widget.TableLayout",
2341cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        }, keep.keySet().toArray());
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
237