/*
* Copyright (C) 2011 Laurent Caillette
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.novelang.opus.function.builtin;
import java.io.File;
import java.util.Iterator;
import com.google.common.collect.ImmutableList;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
/**
* Tests for {@link FileOrdering}.
*
* @author Laurent Caillette
*/
public class FileOrderingTest {
@Test
public void filenameOrdering() throws FileOrdering.CriteriaException {
final File fileX = new File( "a/a/x.novella" ) ;
final File fileY = new File( "a/a/y.novella" ) ;
final File fileZ = new File( "a/b/z.novella" ) ;
final Iterable< File > unsortedFiles = ImmutableList.of( fileY, fileZ, fileX ) ;
final Iterable< File > sortedFiles = new FileOrdering.ByAbsolutePath().sort( unsortedFiles ) ;
final Iterator< File > iterator = sortedFiles.iterator() ;
assertEquals( "" + sortedFiles, fileX, iterator.next() ) ;
assertEquals( "" + sortedFiles, fileY, iterator.next() ) ;
assertEquals( "" + sortedFiles, fileZ, iterator.next() ) ;
assertFalse( "" + sortedFiles, iterator.hasNext() ) ;
}
@Test
public void filenameOrderingWithDoubleInvert() throws FileOrdering.CriteriaException {
final File fileX = new File( "a/a/x.novella" ) ;
final File fileY = new File( "a/a/y.novella" ) ;
final File fileZ = new File( "a/b/z.novella" ) ;
final Iterable< File > unsortedFiles = ImmutableList.of( fileY, fileZ, fileX ) ;
final Iterable< File > sortedFiles =
new FileOrdering.ByAbsolutePath().inverse().inverse().sort( unsortedFiles ) ;
final Iterator< File > iterator = sortedFiles.iterator() ;
assertEquals( "" + sortedFiles, fileX, iterator.next() ) ;
assertEquals( "" + sortedFiles, fileY, iterator.next() ) ;
assertEquals( "" + sortedFiles, fileZ, iterator.next() ) ;
assertFalse( "" + sortedFiles, iterator.hasNext() ) ;
}
@Test
public void invertedFilenameOrdering() throws FileOrdering.CriteriaException {
final File fileX = new File( "a/a/x.novella" ) ;
final File fileY = new File( "a/a/y.novella" ) ;
final File fileZ = new File( "a/b/z.novella" ) ;
final Iterable< File > unsortedFiles = ImmutableList.of( fileY, fileZ, fileX ) ;
final Iterable< File > sortedFiles =
new FileOrdering.ByAbsolutePath().inverse().sort( unsortedFiles );
final Iterator< File > iterator = sortedFiles.iterator() ;
assertEquals( "" + sortedFiles, fileZ, iterator.next() ) ;
assertEquals( "" + sortedFiles, fileY, iterator.next() ) ;
assertEquals( "" + sortedFiles, fileX, iterator.next() ) ;
assertFalse( "" + sortedFiles, iterator.hasNext() ) ;
}
@Test
public void versionOrdering() throws FileOrdering.CriteriaException {
final File file_snapshot = new File( "a/SNAPSHOT.novella" ) ;
final File file_1_1_2 = new File( "b/1.1.2.novella" ) ;
final File file_1_0_0 = new File( "b/1.0.0.novella" ) ;
final File file_0_1_2 = new File( "a/0.2.1.novella" ) ;
final Iterable< File > unsortedFiles = ImmutableList.of(
file_1_0_0, file_0_1_2, file_snapshot, file_1_1_2 ) ;
final Iterable< File > sortedFiles = new FileOrdering.ByVersionNumber().sort( unsortedFiles ) ;
final Iterator< File > iterator = sortedFiles.iterator() ;
assertEquals( "" + sortedFiles, file_0_1_2, iterator.next() ) ;
assertEquals( "" + sortedFiles, file_1_0_0, iterator.next() ) ;
assertEquals( "" + sortedFiles, file_1_1_2, iterator.next() ) ;
assertEquals( "" + sortedFiles, file_snapshot, iterator.next() ) ;
assertFalse( "" + sortedFiles, iterator.hasNext() ) ;
}
@Test
public void invertedVersionOrdering() throws FileOrdering.CriteriaException {
final File file_snapshot = new File( "a/SNAPSHOT.novella" ) ;
final File file_1_1_2 = new File( "b/1.1.2.novella" ) ;
final File file_1_0_0 = new File( "b/1.0.0.novella" ) ;
final File file_0_1_2 = new File( "a/0.2.1.novella" ) ;
final Iterable< File > unsortedFiles = ImmutableList.of(
file_1_0_0, file_0_1_2, file_snapshot, file_1_1_2 ) ;
final Iterable< File > sortedFiles =
new FileOrdering.ByVersionNumber().inverse().sort( unsortedFiles ) ;
final Iterator< File > iterator = sortedFiles.iterator() ;
assertEquals( "" + sortedFiles, file_snapshot, iterator.next() ) ;
assertEquals( "" + sortedFiles, file_1_1_2, iterator.next() ) ;
assertEquals( "" + sortedFiles, file_1_0_0, iterator.next() ) ;
assertEquals( "" + sortedFiles, file_0_1_2, iterator.next() ) ;
assertFalse( "" + sortedFiles, iterator.hasNext() ) ;
}
@Test
public void badVersionFormat() {
final File bad1 = new File( "bad1.novella" ) ;
final File bad2 = new File( "bad2.novella" ) ;
final Iterable< File > unsortedFiles = ImmutableList.of( bad1, bad2 ) ;
try {
new FileOrdering.ByVersionNumber().sort( unsortedFiles ) ;
Assert.fail( "Exception not caught" ) ;
} catch ( FileOrdering.CriteriaException e ) {
final Iterator< FileOrdering.CriterionCreationException > exceptions =
e.getExceptions().iterator() ;
assertEquals( bad1, exceptions.next().getFile() ) ;
assertEquals( bad2, exceptions.next().getFile() ) ;
assertFalse( exceptions.hasNext() ) ;
}
}
}