package org.apache.maven.plugin.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 junit.framework.TestCase;
import org.apache.maven.scm.ChangeFile;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Edwin Punzalan
 * @version $Id$
 */
public class FileActivityComparatorTest
    extends TestCase
{
    private FileActivityComparator comparator;

    /** {@inheritDoc} */
    protected void setUp()
        throws Exception
    {
        comparator = new FileActivityComparator();
    }

    public void testCompareByNumberOfCommits()
    {
        List<ChangeFile> list1 = new ArrayList<ChangeFile>();
        list1.add( new ChangeFile( "anything" ) );

        List<ChangeFile> list2 = new ArrayList<ChangeFile>();

        assertTrue( "Test compare by commits, less than", comparator.compare( list1, list2 ) < 0 );

        list1 = new ArrayList<ChangeFile>();
        list1.add( new ChangeFile( "anything" ) );

        list2 = new ArrayList<ChangeFile>();
        list2.add( new ChangeFile( "one thing" ) );
        list2.add( new ChangeFile( "something") );

        assertTrue( "Test compare by commits, greater than", comparator.compare( list1, list2 ) > 0 );
    }

    public void testCompareByRevision()
    {
        List<ChangeFile> list1 = new ArrayList<ChangeFile>();
        list1.add( new ChangeFile( "changefile-1", "123" ) );
        list1.add( new ChangeFile( "changefile-1", "234" ) );

        List<ChangeFile> list2 = new ArrayList<ChangeFile>();
        list2.add( new ChangeFile( "changefile-2", "246" ) );
        list2.add( new ChangeFile( "changefile-2", "468" ) );

        assertTrue( "Test compare by revision, less than", comparator.compare( list1, list2 ) < 0 );

        list1 = new ArrayList<ChangeFile>();
        list1.add( new ChangeFile( "changefile-1", "246" ) );
        list1.add( new ChangeFile( "changefile-1", "468" ) );

        list2 = new ArrayList<ChangeFile>();
        list2.add( new ChangeFile( "changefile-2", "123" ) );
        list2.add( new ChangeFile( "changefile-2", "234" ) );

        assertTrue( "Test compare by revision, greater than", comparator.compare( list1, list2 ) > 0 );
    }

    public void testCompareByName()
    {
        List<ChangeFile> list1 = new ArrayList<ChangeFile>();
        list1.add( new ChangeFile( "changefile-1", "123" ) );
        list1.add( new ChangeFile( "changefile-1", "468" ) );

        List<ChangeFile> list2 = new ArrayList<ChangeFile>();
        list2.add( new ChangeFile( "changefile-2", "246" ) );
        list2.add( new ChangeFile( "changefile-2", "468" ) );

        assertTrue( "Test compare by name, less than", comparator.compare( list1, list2 ) < 0 );

        list1 = new ArrayList<ChangeFile>();
        list1.add( new ChangeFile( "changefile-1", "246" ) );
        list1.add( new ChangeFile( "changefile-1", "468" ) );

        list2 = new ArrayList<ChangeFile>();
        list2.add( new ChangeFile( "changefile-2", "123" ) );
        list2.add( new ChangeFile( "changefile-2", "234" ) );

        assertTrue( "Test compare by name, greater than", comparator.compare( list1, list2 ) > 0 );
    }
}
