package org.apache.maven.scm.provider.cvslib.command.changelog;

/*
 * 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 org.apache.maven.scm.ChangeSet;
import org.apache.maven.scm.ScmTestCase;
import org.apache.maven.scm.log.DefaultLog;
import org.apache.maven.scm.util.ConsumerUtils;

import java.io.File;
import java.util.Collection;
import java.util.Iterator;

/**
 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
 * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
 *
 */
public class CvsChangeLogConsumerTest
    extends ScmTestCase
{
    /**
     * file with test results to check against
     */
    private File testFile;

    /**
     * Initialize per test data
     *
     * @throws Exception when there is an unexpected problem
     */
    public void setUp()
        throws Exception
    {
        super.setUp();

        testFile = getTestFile( "/src/test/resources/cvslib/changelog/cvslog.txt" );
    }

    /**
     * Test of parse method
     *
     * @throws Exception when there is an unexpected problem
     */
    public void testParse()
        throws Exception
    {
        CvsChangeLogConsumer command = new CvsChangeLogConsumer( new DefaultLog(), null );
        ConsumerUtils.consumeFile( testFile, command );

        Collection<ChangeSet> entries = command.getModifications();
        assertEquals( "Wrong number of entries returned", 3, entries.size() );
        ChangeSet entry = null;
        for ( Iterator<ChangeSet> i = entries.iterator(); i.hasNext(); )
        {
            entry = i.next();
            assertTrue( "ChangeLogEntry erroneously picked up",
                        entry.toString().indexOf( "ChangeLogEntry.java" ) == -1 );
        }
    }
}
