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;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.TreeMap;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unit tests for some methods of {@link AsmAnalyzer}.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AsmAnalyzerTest {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MockLog mLog;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList<String> mOsJarPath;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AsmAnalyzer mAa;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Before
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setUp() throws Exception {
48bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mLog = new MockLog();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URL url = this.getClass().getClassLoader().getResource("data/mock_android.jar");
50bc101806249eb883f89c4a770a8c27f9ac315837Raphael
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOsJarPath = new ArrayList<String>();
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOsJarPath.add(url.getFile());
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa = new AsmAnalyzer(mLog, mOsJarPath, null /* gen */,
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null /* deriveFrom */, null /* includeGlobs */ );
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @After
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void tearDown() throws Exception {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testParseZip() throws IOException {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> map = mAa.parseZip(mOsJarPath);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest",
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest$DerivingClass",
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest$MyGenerics1",
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.dummy.InnerTest$MyIntEnum",
71bc101806249eb883f89c4a770a8c27f9ac315837Raphael                "mock_android.dummy.InnerTest$MyStaticInnerClass",
72bc101806249eb883f89c4a770a8c27f9ac315837Raphael                "mock_android.dummy.InnerTest$NotStaticInner1",
73bc101806249eb883f89c4a770a8c27f9ac315837Raphael                "mock_android.dummy.InnerTest$NotStaticInner2",
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams",
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.LinearLayout",
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.LinearLayout$LayoutParams",
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout",
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout$LayoutParams"
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            map.keySet().toArray());
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
85bc101806249eb883f89c4a770a8c27f9ac315837Raphael
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFindClass() throws IOException, LogAbortException {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ClassReader cr = mAa.findClass("mock_android.view.ViewGroup$LayoutParams",
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                zipClasses, found);
93bc101806249eb883f89c4a770a8c27f9ac315837Raphael
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(cr);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("mock_android/view/ViewGroup$LayoutParams", cr.getClassName());
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] { "mock_android.view.ViewGroup$LayoutParams" },
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found.keySet().toArray());
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new ClassReader[] { cr }, found.values().toArray());
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFindGlobs() throws IOException, LogAbortException {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this matches classes, a package match returns nothing
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        found.clear();
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.view", zipClasses, found);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] { },
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // a complex glob search. * is a search pattern that matches names, not dots
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.*.*Group$*Layout*", zipClasses, found);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams"
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // a complex glob search. ** is a search pattern that matches names including dots
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.**Group*", zipClasses, found);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams"
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // matches a single class
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        found.clear();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.view.View", zipClasses, found);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View"
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // matches everyting inside the given package but not sub-packages
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        found.clear();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findGlobs("mock_android.view.*", zipClasses, found);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams"
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String key : found.keySet()) {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassReader value = found.get(key);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertNotNull("No value for " + key, value);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(key, AsmAnalyzer.classReaderToClassName(value));
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testFindClassesDerivingFrom() throws LogAbortException, IOException {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAa.findClassesDerivingFrom("mock_android.view.View", zipClasses, found);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.LinearLayout",
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout",
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            found.keySet().toArray());
174bc101806249eb883f89c4a770a8c27f9ac315837Raphael
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String key : found.keySet()) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassReader value = found.get(key);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertNotNull("No value for " + key, value);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(key, AsmAnalyzer.classReaderToClassName(value));
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
181bc101806249eb883f89c4a770a8c27f9ac315837Raphael
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testDependencyVisitor() throws IOException, LogAbortException {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> keep = new TreeMap<String, ClassReader>();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> new_keep = new TreeMap<String, ClassReader>();
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> in_deps = new TreeMap<String, ClassReader>();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TreeMap<String, ClassReader> out_deps = new TreeMap<String, ClassReader>();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ClassReader cr = mAa.findClass("mock_android.widget.TableLayout", zipClasses, keep);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DependencyVisitor visitor = mAa.getVisitor(zipClasses, keep, new_keep, in_deps, out_deps);
192bc101806249eb883f89c4a770a8c27f9ac315837Raphael
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get first level dependencies
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cr.accept(visitor, 0 /* flags */);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup",
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.widget.TableLayout$LayoutParams",
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out_deps.keySet().toArray());
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        in_deps.putAll(out_deps);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out_deps.clear();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get second level dependencies
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (ClassReader cr2 : in_deps.values()) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cr2.accept(visitor, 0 /* flags */);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.View",
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$LayoutParams",
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "mock_android.view.ViewGroup$MarginLayoutParams",
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            },
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out_deps.keySet().toArray());
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        in_deps.putAll(out_deps);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out_deps.clear();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get third level dependencies (there are none)
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (ClassReader cr2 : in_deps.values()) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cr2.accept(visitor, 0 /* flags */);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] { }, out_deps.keySet().toArray());
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
228