/*******************************************************************************
 * Copyright (c) 04.05.2012 Aaron Digulla.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Aaron Digulla - initial API and implementation and/or initial documentation
 *******************************************************************************/

package m4e;

import static org.junit.Assert.*;
import m4e.patch.ImportDependenciesPatchTest;
import org.junit.Test;

class PatchCmdTest {

    @Test
    public void testGoogleInject() throws Exception {
        
        def tool = new PatchCmd()
        tool.target = CommonTestCode.newFile( 'testGoogleInject' )
        tool.init()
        
        tool.loadPatches( 'data/input/googleInject.patch' )
        
        def pom = Pom.load( ImportDependenciesPatchTest.EXPECTED_GOOGLE_INJECT_POM )
        tool.patchPom( pom )
        
        XmlFormatter.format( pom )
        
        assertEquals( '''\
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.eclipse.orbit</groupId>
  <artifactId>orbit.com.google.inject</artifactId>
  <version>3.0.0</version>
  <name>guice supplied by Eclipse Orbit</name>
  <description>Guice is a lightweight dependency injection framework for Java 5 and above
    Converted with MT4E 0.13 (27.04.2012)</description>
  <url>http://code.google.com/p/google-guice/</url>
  <properties>
    <mt4e.osgi.importPackage>javax.inject;version="1.0.0"</mt4e.osgi.importPackage>
    <mt4e.osgi.exportPackage>com.google.inject;version="1.3";uses:="com.google.inject,  com.google.inject.binder,  com.google.inject.spi,  com.google.inject.matcher,  javax.inject",com.google.inject.binder;version="1.3";uses:="com.google.inject",com.google.inject.internal;version="1.3";x-internal:="true",com.google.inject.matcher;version="1.3",com.google.inject.name;version="1.3";uses:="com.google.inject",com.google.inject.spi;version="1.3";uses:="com.google.inject.binder,com.google.inject.matcher,com.google.inject",com.google.inject.util;version="1.3";uses:="com.google.inject.util,  com.google.inject.spi,  javax.inject,  com.google.inject"</mt4e.osgi.exportPackage>
  </properties>
  <dependencies>
  </dependencies>
  <profiles>
    <profile>
      <id>m4e.orbit</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <dependencies>
        <dependency>
          <groupId>org.eclipse.orbit</groupId>
          <artifactId>orbit.javax.inject</artifactId>
          <version>[1.0.0,)</version>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>m4e.maven-central</id>
      <dependencies>
        <dependency>
          <groupId>javax.inject</groupId>
          <artifactId>javax.inject</artifactId>
          <version>1</version>
        </dependency>
      </dependencies>
    </profile>
  </profiles>
</project>
''',
            pom.toString() )
    }
    
    @Test
    public void testBatikPDFExports() throws Exception {
        
        File root = CommonTestCode.prepareRepo( new File( 'data/input/batikPDFExports' ), 'testBatikPDFExports' )
        File repo = new File( root, 'm2repo' )

        def tool = new PatchCmd( target: repo )
        tool.run( 'patch', repo.absolutePath, 'data/input/batikPDFExports.patch' )
        
        tool.importExportDB.file = new File( root, 'importExportDB' )
        tool.importExportDB.save()
        
        def actual = tool.importExportDB.file.getText( 'UTF-8' )
        assertEquals( '''\
P org.apache.batik:org.apache.batik.pdf:1.6.0.v201105071520
E org.apache.avalon.framework
E org.apache.avalon.framework.activity
E org.apache.avalon.framework.configuration
E org.apache.avalon.framework.container
E org.apache.fop.apps
E org.apache.fop.fo
E org.apache.fop.fonts
E org.apache.fop.fonts.apps
E org.apache.fop.fonts.base14
E org.apache.fop.fonts.truetype
E org.apache.fop.fonts.type1
E org.apache.fop.image
E org.apache.fop.image.analyser
E org.apache.fop.pdf
E org.apache.fop.render.pdf
E org.apache.fop.render.ps
E org.apache.fop.svg
E org.apache.fop.util
I org.apache.batik.bridge
I org.apache.batik.dom.svg
I org.apache.batik.dom.util
I org.apache.batik.ext.awt
I org.apache.batik.ext.awt.g2d
I org.apache.batik.gvt
I org.apache.batik.gvt.renderer
I org.apache.batik.gvt.text
I org.apache.batik.transcoder
I org.apache.batik.transcoder.image
I org.apache.batik.transcoder.keys
I org.apache.batik.util
I org.w3c.dom
P org.apache.batik:org.apache.batik.transcoder:1.6.0.v201011041432
E org.apache.batik.transcoder
E org.apache.batik.transcoder.image
E org.apache.batik.transcoder.image.resources
E org.apache.batik.transcoder.keys
E org.apache.batik.transcoder.print
E org.apache.batik.transcoder.svg2svg
E org.apache.batik.transcoder.wmf
E org.apache.batik.transcoder.wmf.tosvg
P org.apache.batik:org.apache.batik.util:1.6.0.v201011041432
E org.apache.batik
E org.apache.batik.i18n
E org.apache.batik.util
E org.apache.batik.util.io
E org.apache.batik.util.resources
''',
            actual)

        assertEquals( '[org.apache.commons.io, org.apache.commons.io.output, org.apache.commons.logging, org.apache.commons.logging.impl]', Arrays.toString( tool.importExportDB.infos[ 'org.apache.batik:org.apache.batik.pdf:1.6.0.v201105071520' ]?.deletions ) )
        
        def pom = Pom.load( new File( repo, 'org/eclipse/orbit/orbit.org.apache.batik.pdf/1.6.0/orbit.org.apache.batik.pdf-1.6.0.pom' ) )        
        
        assertEquals( '''\
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.eclipse.orbit</groupId>
  <artifactId>orbit.org.apache.batik.pdf</artifactId>
  <version>1.6.0</version>
  <name>Apache Batik PDF supplied by Eclipse Orbit</name>
  <description>Converted with MT4E 0.13 (27.04.2012)</description>
  <properties>
    <mt4e.osgi.importPackage>org.apache.batik.bridge;version="[1.6.0,1.7.0)",org.apache.batik.dom.svg;version="[1.6.0,1.7.0)",org.apache.batik.dom.util;version="[1.6.0,1.7.0)",org.apache.batik.ext.awt;version="[1.6.0,1.7.0)",org.apache.batik.ext.awt.g2d;version="[1.6.0,1.7.0)",org.apache.batik.gvt;version="[1.6.0,1.7.0)",org.apache.batik.gvt.renderer;version="[1.6.0,1.7.0)",org.apache.batik.gvt.text;version="[1.6.0,1.7.0)",org.apache.batik.transcoder;version="[1.6.0,1.7.0)",org.apache.batik.transcoder.image;version="[1.6.0,1.7.0)",org.apache.batik.transcoder.keys;version="[1.6.0,1.7.0)",org.apache.batik.util;version="[1.6.0,1.7.0)",org.w3c.dom</mt4e.osgi.importPackage>
    <mt4e.osgi.exportPackage>org.apache.avalon.framework,org.apache.avalon.framework.activity,org.apache.avalon.framework.configuration,org.apache.avalon.framework.container,org.apache.fop.apps,org.apache.fop.fo,org.apache.fop.fonts,org.apache.fop.fonts.apps,org.apache.fop.fonts.base14,org.apache.fop.fonts.truetype,org.apache.fop.fonts.type1,org.apache.fop.image,org.apache.fop.image.analyser,org.apache.fop.pdf,org.apache.fop.render.pdf,org.apache.fop.render.ps,org.apache.fop.svg,org.apache.fop.util</mt4e.osgi.exportPackage>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.eclipse.orbit</groupId>
      <artifactId>orbit.org.apache.batik.transcoder</artifactId>
      <version>[1.6.0,)</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.orbit</groupId>
      <artifactId>orbit.org.apache.batik.util</artifactId>
      <version>[1.6.0,)</version>
    </dependency>
  </dependencies>
</project>
''',
            pom.toString() )
    }
}
