blob: 3d594bf8add6a670b7ae9617d66b6b58d4c3dd8a [file] [log] [blame]
package org.apache.maven.shared.utils.xml.pull;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.IOException;
import java.io.StringReader;
import org.apache.maven.shared.utils.xml.Xpp3Dom;
import org.apache.maven.shared.utils.xml.Xpp3DomBuilder;
import org.junit.Test;
import static org.apache.maven.shared.utils.xml.Xpp3Dom.mergeXpp3Dom;
import static org.junit.Assert.*;
/**
* @author Kristian Rosenvold
*/
public class Xpp3DomTest
{
private Xpp3Dom createElement( String element, String value )
{
Xpp3Dom t1s1 = new Xpp3Dom( element );
t1s1.setValue( value );
return t1s1;
}
@Test
public void mergePrecedenceSelfClosed()
throws XmlPullParserException, IOException
{
Xpp3Dom parentConfig = build( "<configuration><items><item/></items></configuration>" );
Xpp3Dom childConfig = build( "<configuration><items><item>ooopise</item></items></configuration>" );
Xpp3Dom result = Xpp3Dom.mergeXpp3Dom( childConfig, parentConfig );
Xpp3Dom items = result.getChild( "items" );
assertEquals( 1, items.getChildCount() );
Xpp3Dom item = items.getChild( 0 );
assertEquals( "ooopise", item.getValue() );
}
@Test
public void mergePrecedenceOpenClose()
throws XmlPullParserException, IOException
{
Xpp3Dom parentConfig = build( "<configuration><items><item></item></items></configuration>" );
Xpp3Dom childConfig = build( "<configuration><items><item>ooopise</item></items></configuration>" );
Xpp3Dom result = Xpp3Dom.mergeXpp3Dom( childConfig, parentConfig );
Xpp3Dom items = result.getChild( "items" );
assertEquals( 1, items.getChildCount() );
Xpp3Dom item = items.getChild( 0 );
assertEquals( "ooopise", item.getValue() );
}
@Test
public void selfOverrideOnRootNode()
{
// Todo: This does not work when loaded. Probably a bug related to null vs "" handling
// Xpp3Dom t1 = build( "<top combine.self='override' attr='value'></top>" );
Xpp3Dom t1 = new Xpp3Dom( "top" );
t1.setAttribute( "attr", "value" );
t1.setAttribute( Xpp3Dom.SELF_COMBINATION_MODE_ATTRIBUTE, Xpp3Dom.SELF_COMBINATION_OVERRIDE );
Xpp3Dom t2 = build( "<top attr2='value2'>val2</top>" );
Xpp3Dom result = mergeXpp3Dom( t1, t2 );
assertEquals( 2, result.getAttributeNames().length );
assertNull( result.getValue() );
}
@Test
public void mergeValuesOnRootNode()
{
Xpp3Dom t1 = build( "<root attr='value'/>" );
Xpp3Dom t2 = build( "<root attr2='value2'>t2Val</root>" );
Xpp3Dom result = mergeXpp3Dom( t1, t2 );
assertEquals( 2, result.getAttributeNames().length );
assertEquals( result.getValue(), t2.getValue() );
}
@Test
public void mergeAttributesOnRootNode()
{
Xpp3Dom t1 = build( "<root combine.self='merge' attr='value'/>" );
Xpp3Dom t2 = build( "<root attr2='value2'/>" );
Xpp3Dom dom = mergeXpp3Dom( t1, t2 );
assertEquals( 3, dom.getAttributeNames().length );
}
@Test
public void combineAppend()
{
Xpp3Dom t1 = new Xpp3Dom( "root" );
t1.setAttribute( Xpp3Dom.CHILDREN_COMBINATION_MODE_ATTRIBUTE, Xpp3Dom.CHILDREN_COMBINATION_APPEND );
t1.addChild( createElement( "sub", "s1Value" ) );
Xpp3Dom t2 = new Xpp3Dom( "root" );
t2.addChild( createElement( "sub", "s1Value" ) );
Xpp3Dom result = mergeXpp3Dom( t1, t2 );
assertEquals( 2, result.getChildren( "sub" ).length );
}
@Test
public void mergeOverride()
{
Xpp3Dom t1 = new Xpp3Dom( "root" );
t1.setAttribute( Xpp3Dom.CHILDREN_COMBINATION_MODE_ATTRIBUTE, Xpp3Dom.CHILDREN_COMBINATION_APPEND );
t1.addChild( createElement( "sub", "s1Value" ) );
Xpp3Dom t2 = new Xpp3Dom( "root" );
t2.addChild( createElement( "sub", "s1Value" ) );
Xpp3Dom result = mergeXpp3Dom( t1, t2, Boolean.TRUE );
assertEquals( 1, result.getChildren( "sub" ).length );
}
@Test( expected = NullPointerException.class )
public void nullValue()
{
//noinspection ConstantConditions
new Xpp3Dom( "top" ).setAttribute( null, "value" );
}
@Test( expected = NullPointerException.class )
public void nullAttribute()
{
//noinspection ConstantConditions
new Xpp3Dom( "root" ).setAttribute( "attr", null );
}
@Test
public void testEquals()
{
Xpp3Dom dom = new Xpp3Dom( "single" );
dom.addChild( new Xpp3Dom( "kid" ) );
Xpp3Dom other = new Xpp3Dom( "single" );
other.addChild( new Xpp3Dom( "kid2" ) );
assertEquals( dom, dom );
//noinspection ObjectEqualsNull
assertFalse( dom.equals( null ) );
assertFalse( dom.equals( new Xpp3Dom( (String) null ) ) );
assertFalse( dom.equals( other ) );
}
@Test
public void dominantWinsCollections()
throws XmlPullParserException
{
Xpp3Dom parent = build( "<root><entries><entry>uno</entry><entry>dos</entry></entries></root>" );
Xpp3Dom dominant = build( "<root><entries><entry>tres</entry></entries></root>" );
Xpp3Dom result = mergeXpp3Dom( dominant, parent );
Xpp3Dom items = result.getChild( "entries" );
assertEquals( 1, items.getChildCount() );
assertElemEquals( "tres", items.getChild( 0 ) );
}
@Test
public void combineChildrenAppendTest()
throws XmlPullParserException
{
Xpp3Dom parent =
build( "<root><entries><entry>uno</entry><entry>dos</entry><entry>tres</entry></entries></root>" );
Xpp3Dom child = build( "<root><entries combine.children=\"append\"><entry>quatro</entry></entries></root>" );
Xpp3Dom result = mergeXpp3Dom( child, parent );
Xpp3Dom items = result.getChild( "entries" );
assertEquals( 4, items.getChildCount() );
Xpp3Dom[] item = items.getChildren();
assertElemEquals( "uno", item[0] );
assertElemEquals( "dos", item[1] );
assertElemEquals( "tres", item[2] );
assertElemEquals( "quatro", item[3] );
}
@Test
public void unchangedWithFirstOrLastEmpty()
throws Exception
{
String configStr = "<root><entries><entry/><entry>test</entry><entry/></entries></root>";
Xpp3Dom dominant = build( configStr );
Xpp3Dom duplicatedDominant = build( configStr );
validateEntries( dominant );
Xpp3Dom result = mergeXpp3Dom( dominant, duplicatedDominant );
validateEntries( result );
}
private void validateEntries( Xpp3Dom result )
{
Xpp3Dom entries = result.getChild( "entries" );
assertEquals( 3, entries.getChildCount() );
assertXpp3Null( entries.getChild( 0 ) );
assertEquals( "test", entries.getChild( 1 ).getValue() );
assertXpp3Null( entries.getChild( 2 ) );
}
static void assertElemEquals( String value, Xpp3Dom element )
{
assertEquals( value, element.getValue() );
}
void assertXpp3Null( Xpp3Dom entry )
{
// Todo: When we used xpp3dom, all methods using this assert used to return null
assertEquals( "", entry.getValue() );
}
@Test
public void recessiveChildrenIncludedWhenDominantEmpty()
throws Exception
{
String dominant = "<root><baz>bazzy</baz></root>";
String recessive = "<root><bar>barry</bar></root>";
Xpp3Dom merged = mergeXpp3Dom( build( dominant ), build( recessive ) );
assertEquals( 2, merged.getChildCount() );
assertEquals( "bazzy", merged.getChild( "baz" ).getValue() );
assertEquals( "barry", merged.getChild( "bar" ).getValue() );
}
static Xpp3Dom build( String stringContent )
{
return Xpp3DomBuilder.build( new StringReader( stringContent ) );
}
@Test
public void duplicatedChildren()
throws IOException, XmlPullParserException
{
String dupes = "<root><baz>x</baz><baz>y</baz></root>";
assertEquals( "y", build( dupes ).getChild( "baz" ).getValue() );
}
}