/*
 * Copyright 2010 jglick.
 *
 * Licensed 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.
 * under the License.
 */

package org.netbeans.nbm.utils;

import org.netbeans.nbm.utils.ExamineManifest;
import java.io.File;
import java.io.PrintWriter;
import junit.framework.TestCase;
import org.apache.maven.plugin.logging.SystemStreamLog;

public class ExamineManifestTest extends TestCase
{
    
    public ExamineManifestTest( String testName )
    {
        super(testName);
    }

    public void testDependencyParsing()
            throws Exception
    {
        ExamineManifest em = new ExamineManifest( new SystemStreamLog() );
        File mf = File.createTempFile( "ExamineManifestTes", ".mf" );
        mf.deleteOnExit();
        PrintWriter w = new PrintWriter( mf );
        w.println( "OpenIDE-Module: org.netbeans.modules.nbjunit/1" );
        w.println( "OpenIDE-Module-Module-Dependencies: org.netbeans.insane/1, org.netbeans.libs.junit4 > 1.0" );
        w.flush();
        w.close();
        em.setManifestFile( mf );
        em.setPopulateDependencies( true );
        em.checkFile();
        assertEquals( "[org.netbeans.insane, org.netbeans.libs.junit4]", em.getDependencyTokens().toString() );
        assertEquals( "org.netbeans.modules.nbjunit", em.getModule() );
        assertEquals( "org.netbeans.modules.nbjunit/1", em.getModuleWithRelease() );
        em = new ExamineManifest( new SystemStreamLog() );
        mf.delete();
        w = new PrintWriter( mf );
        w.println( "Manifest-Version: 1.0" );
        w.flush();
        w.close();
        em.setManifestFile( mf );
        em.setPopulateDependencies( true );
        em.checkFile();
        assertEquals( null, em.getModule() );
        assertEquals( null, em.getModuleWithRelease() );
    }

    public void testBundles()
            throws Exception
    {
        ExamineManifest em = new ExamineManifest( new SystemStreamLog() );
        File mf = File.createTempFile( "ExamineManifestTest", ".mf" );
        mf.deleteOnExit();
        PrintWriter w = new PrintWriter( mf );
        w.println( "Bundle-SymbolicName: org.eclipse.jdt.core; singleton:=true" );
        w.println( "Bundle-Version: 3.1.0" );
        w.println( "Export-Package: org.eclipse.jdt.core," );
        w.println( " org.eclipse.jdt.internal.formatter.old;x-internal:=true" );
        w.println( "Require-Bundle: org.eclipse.equinox.registry;bundle-version=\"[3.4.0,4." );
        w.println( " 0.0)\",org.eclipse.equinox.common;bundle-version=\"[3.2.0,4.0.0)\"" );
        w.flush();
        w.close();
        em.setManifestFile( mf );
        em.setPopulateDependencies( true );
        em.checkFile();
        assertEquals( "org.eclipse.jdt.core", em.getModule() );
        assertEquals( "3.1.0", em.getSpecVersion() );
        assertTrue( em.hasPublicPackages() );
        assertEquals( "[org.eclipse.equinox.registry, org.eclipse.equinox.common]", em.getDependencyTokens().toString() );
    }

}
