/*
* Copyright (C) 2008 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 or
* version 2 as published by the Free Software Foundation.
*
* 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.
*/
/* Create date: 09-Aug-2009 */
package uk.me.parabola.mkgmap;
import java.io.File;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import static org.junit.Assert.*;
public class OptionsTest {
private static final String[] STD_SINGLE_OPTS = {
"pool", "ocean"
};
String PATH_SEP = System.getProperty("file.separator");
private final List<Option> found = new ArrayList<Option>();
private final List<String> options = new ArrayList<String>();
private final List<String> values = new ArrayList<String>();
/**
* You can have options with values separated by either a ':' or an
* equals sign.
*/
@Test
public void testOptionsWithValues() {
String s = "three=3\nfour:4\n";
readOptionsFromString(s);
assertEquals("correct number", 2, found.size());
assertArrayEquals("options", new String[] {
"three", "four"
}, options.toArray());
assertArrayEquals("values", new String[] {
"3", "4"
}, values.toArray());
}
/**
* Options do not need to have a value
*/
@Test
public void testOptionsWithoutValues() {
String s = "pool\nocean\n";
readOptionsFromString(s);
assertEquals("number of options found", 2, found.size());
assertArrayEquals("options", STD_SINGLE_OPTS, options.toArray());
checkEmptyValues();
}
/**
* Comments can appear as the first significant character of a line
* and cause the rest of the line to be skipped.
*/
@Test
public void testComments() {
String s = "pool\n" +
" # first comment\n" +
"# a whole line of comment \n" +
"ocean\n";
readOptionsFromString(s);
assertEquals("number of options found", 2, found.size());
assertArrayEquals("options", STD_SINGLE_OPTS, options.toArray());
checkEmptyValues();
}
/**
* An option can have a long value that is surrounded by braces. All
* leading and trailing white space is trimmed.
*/
@Test
public void testLongValues() {
final String OPT1 = "This is a much longer value\n" +
"that spans several\n" +
"lines\n";
final String OPT2 = " and here is another, note that there was no new" +
"line before the option name.";
String s = "pool {" + OPT1 + "}" +
"ocean {\n" + OPT2 + "}";
readOptionsFromString(s);
System.out.println(options);
System.out.println(values);
assertEquals("number of options found", 2, found.size());
assertArrayEquals("options", STD_SINGLE_OPTS, options.toArray());
assertEquals("first value", OPT1.trim(), values.get(0));
assertEquals("second value", OPT2.trim(), values.get(1));
}
/**
* Relative input filenames are relative to the directory of the args
* file.
* Note: does test work on windows?
*/
@Test
public void testRelativeFilenamesInFile() {
String s = "input-file: foo\n";
OptionProcessor proc = new MyOptionProcessor();
Options opts = new Options(proc);
Reader r = new StringReader(s);
opts.readOptionFile(r, "/bar/string.args");
String filename = values.get(0);
File file = new File(filename);
assertEquals("directory part", PATH_SEP + "bar", file.getParent());
assertEquals("file part", "foo", file.getName());
}
/**
* Absolute input filenames are unaffected by the directory that the
* args file is in.
* Note: does test work on windows?
*/
@Test
public void testAbsoluteFilenamesInFile() {
String s, exp_dir;
if (PATH_SEP.equals("\\")) {
s = "input-file: c:\\home\\foo\n";
exp_dir = "c:\\home";
}
else {
s = "input-file: /home/foo\n";
exp_dir = "/home";
}
OptionProcessor proc = new MyOptionProcessor();
Options opts = new Options(proc);
Reader r = new StringReader(s);
opts.readOptionFile(r, "/bar/string.args");
System.out.println(Arrays.toString(values.toArray()));
String filename = values.get(0);
File file = new File(filename);
assertEquals("directory part", exp_dir, file.getParent());
assertEquals("file part", "foo", file.getName());
}
private void checkEmptyValues() {
for (String s : values) {
assertEquals("value", "", s);
}
}
private void readOptionsFromString(String s) {
OptionProcessor proc = new MyOptionProcessor();
Options opts = new Options(proc);
Reader r = new StringReader(s);
opts.readOptionFile(r, "from-string");
}
private class MyOptionProcessor implements OptionProcessor {
public void processOption(Option opt) {
found.add(opt);
options.add(opt.getOption());
values.add(opt.getValue());
}
}
}