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