1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2008 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License.
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage com.android.layoutlib.bridge.android;
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.ParserFactory;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2178af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Guptaimport org.junit.AfterClass;
2278af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Guptaimport org.junit.BeforeClass;
2378af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Guptaimport org.junit.Test;
2478af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Guptaimport org.kxml2.io.KXmlParser;
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.w3c.dom.Node;
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.xmlpull.v1.XmlPullParser;
2778af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Guptaimport org.xmlpull.v1.XmlPullParserException;
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
29476e582d2ffdf25102d4c55f8c242baa3d21d37fDeepanshu Guptaimport android.annotation.NonNull;
30476e582d2ffdf25102d4c55f8c242baa3d21d37fDeepanshu Gupta
3178af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Guptaimport static org.junit.Assert.assertEquals;
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
3378af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Guptapublic class BridgeXmlBlockParserTest {
3478af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta
3578af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta    @BeforeClass
36d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    public static void setUp() {
37f2d408b51debadca830eefbf8131185ac55ce699Deepanshu Gupta        ParserFactory.setParserFactory(new ParserFactoryImpl());
3878af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta    }
3978af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta
4078af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta    @Test
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void testXmlBlockParser() throws Exception {
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        XmlPullParser parser = ParserFactory.create(
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                getClass().getResourceAsStream("/com/android/layoutlib/testdata/layout1.xml"),
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        "layout1.xml");
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        parser = new BridgeXmlBlockParser(parser, null, false /* platformResourceFlag */);
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.START_DOCUMENT, parser.next());
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.START_TAG, parser.next());
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals("LinearLayout", parser.getName());
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.TEXT, parser.next());
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.START_TAG, parser.next());
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals("Button", parser.getName());
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.TEXT, parser.next());
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.END_TAG, parser.next());
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.TEXT, parser.next());
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.START_TAG, parser.next());
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals("View", parser.getName());
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.END_TAG, parser.next());
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.TEXT, parser.next());
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.START_TAG, parser.next());
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals("TextView", parser.getName());
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.END_TAG, parser.next());
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.TEXT, parser.next());
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.END_TAG, parser.next());
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //------------
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
8278af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta     * Quick 'n' dirty debug helper that dumps an XML structure to stdout.
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @SuppressWarnings("unused")
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private void dump(Node node, String prefix) {
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Node n;
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String[] types = {
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "unknown",
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "ELEMENT_NODE",
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "ATTRIBUTE_NODE",
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "TEXT_NODE",
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "CDATA_SECTION_NODE",
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "ENTITY_REFERENCE_NODE",
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "ENTITY_NODE",
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "PROCESSING_INSTRUCTION_NODE",
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "COMMENT_NODE",
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "DOCUMENT_NODE",
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "DOCUMENT_TYPE_NODE",
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "DOCUMENT_FRAGMENT_NODE",
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                "NOTATION_NODE"
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        };
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String s = String.format("%s<%s> %s %s",
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                prefix,
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                types[node.getNodeType()],
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                node.getNodeName(),
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                node.getNodeValue() == null ? "" : node.getNodeValue().trim());
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        System.out.println(s);
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        n = node.getFirstChild();
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (n != null) {
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            dump(n, prefix + "- ");
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        n = node.getNextSibling();
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (n != null) {
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            dump(n, prefix);
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
12178af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta    }
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
12378af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta    @AfterClass
124d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    public static void tearDown() {
125f2d408b51debadca830eefbf8131185ac55ce699Deepanshu Gupta        ParserFactory.setParserFactory(null);
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
128f2d408b51debadca830eefbf8131185ac55ce699Deepanshu Gupta    private static class ParserFactoryImpl
129f2d408b51debadca830eefbf8131185ac55ce699Deepanshu Gupta            extends com.android.ide.common.rendering.api.ParserFactory {
13078af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta
13178af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta        @NonNull
13278af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta        @Override
13378af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta        public XmlPullParser createParser(String displayName) throws XmlPullParserException {
13478af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta            return new KXmlParser();
13578af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta        }
13678af25584633462e4ab8cf9bafe10f43e7cb2d83Deepanshu Gupta    }
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
138