/*
* 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.configuration.parse;
import java.io.File;
import java.util.Iterator;
import com.google.common.collect.Lists;
import org.apache.commons.lang.ClassUtils;
import org.fest.assertions.Assertions;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.*;
import org.novelang.ResourceTools;
import org.novelang.logger.Logger;
import org.novelang.logger.LoggerFactory;
import org.novelang.produce.DocumentRequest;
import org.novelang.produce.GenericRequest;
import org.novelang.produce.MalformedRequestException;
import org.novelang.testing.junit.MethodSupport;
/**
* Tests for {@link GenericParameters}, {@link DocumentGeneratorParameters}, {@link DaemonParameters}.
* Option names are hardcoded here in sort that we get warned if there is a change in
* implementation.
*
* @author Laurent Caillette
*/
public class ParametersTest {
@Test
public void voidDaemonParameters() throws ArgumentException {
final DaemonParameters parameters = new DaemonParameters( scratchDirectory ) ;
assertNull( parameters.getContentRoot() ) ;
assertNull( parameters.getLogDirectory() ) ;
assertNull( parameters.getTemporaryDirectory() ) ;
assertNull( parameters.getHttpDaemonPort() ) ;
assertFalse( parameters.getStyleDirectories().iterator().hasNext() );
assertNull( parameters.getHyphenationDirectory() ) ;
assertOnIterable( parameters.getFontDirectories() ) ;
}
@Test( expected = ArgumentException.class )
public void voidBatchParameters() throws ArgumentException {
new DocumentGeneratorParameters( scratchDirectory, NO_PARAMETERS ) ;
}
@Test( expected = ArgumentException.class )
public void missingLogDirectory() throws ArgumentException {
new DocumentGeneratorParameters(
scratchDirectory, new String[] { DASHED_LOG_DIR, "doesnotexist" } ) ;
}
@Test
public void style1() throws ArgumentException {
final String[] arguments = { DASHED_STYLE_DIRS, DIRECTORY_NAME_AAA } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertOnIterable( parameters.getStyleDirectories(), directoryAaa ) ;
assertOnIterable( parameters.getFontDirectories() ) ;
assertNull( parameters.getLogDirectory() ) ;
assertNull( parameters.getHyphenationDirectory() ) ;
}
@Test
public void contentRoot() throws ArgumentException {
final String[] arguments = { DASHED_CONTENTROOT, DIRECTORY_NAME_AAA } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertEquals( directoryAaa , parameters.getContentRoot() ) ;
assertOnIterable( parameters.getFontDirectories() ) ;
assertNull( parameters.getLogDirectory() ) ;
assertOnIterable( parameters.getStyleDirectories() ) ;
}
@Test
public void hyphenation() throws ArgumentException {
final String[] arguments = { DASHED_HYPHENATION_DIR, DIRECTORY_NAME_AAA } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertEquals( directoryAaa , parameters.getHyphenationDirectory() ) ;
assertOnIterable( parameters.getFontDirectories() ) ;
assertNull( parameters.getLogDirectory() ) ;
assertOnIterable( parameters.getStyleDirectories() ) ;
}
@Test
public void log() throws ArgumentException {
final String[] arguments = { DASHED_LOG_DIR, DIRECTORY_NAME_AAA } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertEquals( directoryAaa , parameters.getLogDirectory() ) ;
assertOnIterable( parameters.getFontDirectories() ) ;
assertNull( parameters.getHyphenationDirectory() ) ;
assertOnIterable( parameters.getStyleDirectories() ) ;
}
@Test
public void style2() throws ArgumentException {
final String[] arguments =
{ DASHED_STYLE_DIRS, DIRECTORY_NAME_AAA, DIRECTORY_NAME_BBB } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertOnIterable( parameters.getFontDirectories() ) ;
assertOnIterable( parameters.getStyleDirectories(), directoryAaa, directoryBbb ) ;
assertNull( parameters.getLogDirectory() ) ;
assertNull( parameters.getHyphenationDirectory() ) ;
}
@Test
public void fonts2() throws ArgumentException {
final String[] arguments =
{ DASHED_FONT_DIRS, DIRECTORY_NAME_AAA, DIRECTORY_NAME_BBB } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertOnIterable( parameters.getStyleDirectories() ) ;
assertOnIterable( parameters.getFontDirectories(), directoryAaa, directoryBbb ) ;
assertNull( parameters.getLogDirectory() ) ;
assertNull( parameters.getHyphenationDirectory() ) ;
}
@Test
public void fonts2AndStyle1() throws ArgumentException {
final String[] arguments = { DASHED_FONT_DIRS, DIRECTORY_NAME_AAA, DIRECTORY_NAME_BBB,
DASHED_STYLE_DIRS, DIRECTORY_NAME_CCC } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertOnIterable( parameters.getFontDirectories(), directoryAaa, directoryBbb ) ;
assertOnIterable( parameters.getStyleDirectories(), directoryCcc ) ;
assertNull( parameters.getLogDirectory() ) ;
assertNull( parameters.getHyphenationDirectory() ) ;
}
@Test
public void style1AndFonts2() throws ArgumentException {
final String[] arguments = { DASHED_STYLE_DIRS, DIRECTORY_NAME_AAA,
DASHED_FONT_DIRS, DIRECTORY_NAME_BBB, DIRECTORY_NAME_CCC } ;
final DaemonParameters parameters = new DaemonParameters( scratchDirectory, arguments ) ;
assertOnIterable( parameters.getStyleDirectories(), directoryAaa ) ;
assertOnIterable( parameters.getFontDirectories(), directoryBbb, directoryCcc ) ;
assertNull( parameters.getLogDirectory() ) ;
assertNull( parameters.getHyphenationDirectory() ) ;
}
@Test ( expected = ArgumentException.class )
public void badStyleDirectory() throws ArgumentException {
final String[] arguments = { DASHED_STYLE_DIRS, "xxx" } ;
new DaemonParameters( scratchDirectory, arguments ) ;
}
@Test
public void bugWithDocumentsConfusedWithFontDirectories() throws ArgumentException {
final String[] arguments = {
DASHED_FONT_DIRS,
DIRECTORY_NAME_AAA,
"--",
OUTPUT_FILE_NAME
} ;
final DocumentGeneratorParameters batchParameters = new DocumentGeneratorParameters( scratchDirectory, arguments ) ;
assertOnIterable( batchParameters.getFontDirectories(), directoryAaa ) ;
assertOnIterable(
batchParameters.getDocumentRequests(),
DOCUMENT_REQUEST
) ;
}
@Test
public void batchParametersWantDocumentRequests() {
final String[] arguments = NO_PARAMETERS;
try {
new DocumentGeneratorParameters( scratchDirectory, arguments ) ;
fail( "Exception should have been thrown" ) ;
} catch( ArgumentException e ) {
LOGGER.info( e.getHelpPrinter().asString( ClassUtils.getShortClassName( getClass() ), 80 ) );
}
}
@Test
public void temporaryDirectory() throws ArgumentException {
final String[] arguments = { DASHED_TEMPORARY_DIR, "my-temporary-directory" } ;
final DaemonParameters daemonParameters = new DaemonParameters( scratchDirectory, arguments ) ;
Assertions.assertThat( daemonParameters.getTemporaryDirectory() ).isNotNull() ;
}
// =======
// Fixture
// =======
private static final Logger LOGGER = LoggerFactory.getLogger( ParametersTest.class );
private static final String DASHED_CONTENTROOT = "--content-root" ;
private static final String DASHED_HYPHENATION_DIR = "--hyphenation-dir" ;
private static final String DASHED_STYLE_DIRS = "--style-dirs" ;
private static final String DASHED_FONT_DIRS = "--font-dirs" ;
private static final String DASHED_LOG_DIR = "--log-dir" ;
private static final String DASHED_TEMPORARY_DIR = "--temporary-dir" ;
private static< T > void assertOnIterable( final Iterable< T > actual, final T... expected ) {
final Iterator< T > iterator = actual.iterator() ;
for( final T expectedElement : expected ) {
final T actualElement = iterator.next() ;
assertEquals( expectedElement, actualElement ) ;
}
assertFalse( "Too many elements: " + Lists.newArrayList( actual ), iterator.hasNext() ) ;
}
private static final String DIRECTORY_NAME_DDD = "ddd";
private static final String DIRECTORY_NAME_AAA = "aaa";
private static final String DIRECTORY_NAME_BBB = "bbb";
private static final String DIRECTORY_NAME_CCC = "ccc";
private File scratchDirectory ;
private File directoryAaa ;
private File directoryBbb ;
private File directoryCcc ;
private static final String OUTPUT_FILE_NAME = "/this-is-not-a-directory-but-output-file.html" ;
private static final DocumentRequest DOCUMENT_REQUEST ;
static {
try {
DOCUMENT_REQUEST = ( DocumentRequest ) GenericRequest.parse( OUTPUT_FILE_NAME ) ;
} catch( MalformedRequestException e ) {
throw new RuntimeException( e ) ;
}
}
@Rule
public final MethodSupport methodSupport = new MethodSupport() {
@Override
protected void beforeStatementEvaluation() throws Exception {
scratchDirectory = getDirectory() ;
directoryAaa = ResourceTools.createDirectory( scratchDirectory, DIRECTORY_NAME_AAA ) ;
directoryBbb = ResourceTools.createDirectory( scratchDirectory, DIRECTORY_NAME_BBB ) ;
directoryCcc = ResourceTools.createDirectory( scratchDirectory, DIRECTORY_NAME_CCC ) ;
final File directoryCccDdd=ResourceTools.createDirectory( directoryCcc, DIRECTORY_NAME_DDD ) ;
assertTrue( directoryAaa.exists() ) ;
assertTrue( directoryBbb.exists() ) ;
assertTrue( directoryCcc.exists() ) ;
assertTrue( directoryCccDdd.exists() ) ;
}
} ;
private static final String[] NO_PARAMETERS = new String[ 0 ] ;
}