/*
* 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: 15-Mar-2009 */
package uk.me.parabola.mkgmap;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import func.lib.TestUtils;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Tests for the command line argument processing.
* Arguments work like a script. You can set values multiple times
* on the command line and they take effect from the point they are
* set to the point they are set to something else. File that occur
* on the command line are processed with the options that are set at
* that point.
*
* Files that are processed at the end (overview map etc) are
* processed with the options that are in effect at the end of the
* command line.
*/
public class CommandArgsTest {
private static final String FILE1 = "00000001.osm";
private static final String FILE2 = "00000002.osm";
private static final String FILE3 = "00000003.osm";
private final ArgCollector proc = new ArgCollector();
private final CommandArgsReader carg = new CommandArgsReader(proc);
/**
* Test that the default mapnames are correct. Should start with 63240001
* and then increase by one for each file.
*/
@Test
public void testDefaultMapnames() {
carg.readArgs(new String[] {
"fred.osm", "bob.osm"
});
assertEquals("first file", "63240001", proc.getProperty(0, "mapname"));
assertEquals("second file", "63240002", proc.getProperty(1, "mapname"));
}
/**
* Test that if you have numeric names, then the mapname is set to the
* value in the filename.
*/
@Test
public void testNumericNames() {
carg.readArgs(new String[] {
FILE1, FILE2
});
assertEquals("first numeric name", "00000001", proc.getProperty(0, "mapname"));
assertEquals("first numeric name", "00000002", proc.getProperty(1, "mapname"));
}
/**
* Check that if you have numeric names, you can still override with a
* --mapname argument.
*/
@Test
public void testMapnameWithNumericFilenames() {
String SETNAME1 = "11110000";
String SETNAME2 = "22220000";
carg.readArgs(new String[]{
"--mapname=" + SETNAME1, FILE1,
"--mapname=" + SETNAME2, FILE2
});
ArgCollector.FileArgs arg = proc.getFileArg(0);
assertEquals("file name", FILE1, arg.name);
assertEquals("first file", SETNAME1, arg.getProperty("mapname"));
arg = proc.getFileArg(1);
assertEquals("file name", FILE2, arg.name);
assertEquals("second file", SETNAME2, arg.getProperty("mapname"));
}
/**
* An argument file is parsed a little differently from regular arguments
* as the code is reused with the style files.
*/
@Test
public void testArgumentFile() throws IOException {
String SETNAME1 = "11110000";
String SETNAME2 = "22220000";
String F1 = "VIC.osm.gz";
String F2 = "NSW.osm.gz";
String cfile = "family-id=3081\n" +
"product-id=2601\n" +
"overview-mapname=30810100\n" +
"net\n" +
"gmapsupp\n" +
"tdbfile\n" +
"mapname=" + SETNAME1 + "\n" +
"description=OSM-AU-Victoria\n" +
"country-name=Australia\n" +
"country-abbr=AUS\n" +
"region-name=Victoria\n" +
"region-abbr=VIC\n" +
"input-file=" + F1 + "\n" +
"mapname=" + SETNAME2 + "\n" +
"description {\nOSM-AU New South Wales}\n" +
"country-name=Australia\n" +
"country-abbr=AUS\n" +
"# Test that comments are ignored til EOL\n" +
"region-name=New-South-Wales\n" +
"region-abbr=NSW\n" +
"input-file=" + F2 + "\n";
TestUtils.registerFile("30810100.img");
TestUtils.registerFile("30810100.tdb");
createFile("args", cfile);
carg.readArgs(new String[] {
"-c", "args",
});
ArgCollector.FileArgs arg = proc.getFileArg(0);
assertEquals("file name", F1, arg.name);
assertEquals("first file", SETNAME1, arg.getMapname());
assertEquals("region-abbr", "VIC", arg.getProperty("region-abbr"));
arg = proc.getFileArg(1);
assertEquals("file name", F2, arg.name);
assertEquals("second file", SETNAME2, arg.getMapname());
assertEquals("region-abbr", "NSW", arg.getProperty("region-abbr"));
assertEquals("description", "OSM-AU New South Wales", arg.getProperty("description"));
}
/**
* Combinations of all mapname possibilities.
*/
@Test
public void testComplexMapname() {
String SETNAME = "12345678";
carg.readArgs(new String[] {
"fred.osm",
FILE1,
"--mapname=" + SETNAME,
FILE2,
FILE3,
"other.osm"
});
assertEquals("just default", "63240001", proc.getProperty(0, "mapname"));
assertEquals("numeric", "00000001", proc.getProperty(1, "mapname"));
assertEquals("with mapname", SETNAME, proc.getProperty(2, "mapname"));
assertEquals("continue after set", "12345679", proc.getProperty(3, "mapname"));
assertEquals("continue after set", "12345680", proc.getProperty(4, "mapname"));
}
/**
* Options can be switched off by prefixing them with 'no-'.
*/
@Test
public void testArgReset() {
carg.readArgs(new String[] {
"--keep-going",
FILE1,
"--no-keep-going",
FILE2,
"--keep-going",
FILE3,
});
assertEquals("first file has keep-going", "", proc.getProperty(0, "keep-going"));
assertEquals("second file does not have keep-going", null, proc.getProperty(1, "keep-going"));
assertEquals("third file does has keep-going", "", proc.getProperty(2, "keep-going"));
assertEquals("any option that was not present is null", null, proc.getProperty(1,
"invalid-option-does-not-exist"));
}
private void createFile(String name, String content) throws IOException {
TestUtils.registerFile(name);
try (Writer w = new FileWriter(name)){
w.append(content);
}
}
/**
* Argument processor that saves the filenames and the values of
* the arguments that are in scope for each argument.
*/
private static class ArgCollector implements ArgumentProcessor {
private class FileArgs {
private String name;
private Properties props;
public String getProperty(String key) {
return props.getProperty(key);
}
public String getMapname() {
return getProperty("mapname");
}
}
private final List<FileArgs> files = new ArrayList<FileArgs>();
public void processOption(String opt, String val) {
}
public void removeOption(String opt) {
}
public void processFilename(CommandArgs args, String filename) {
FileArgs fa = new FileArgs();
fa.name = filename;
fa.props = new Properties();
fa.props.putAll(args.getProperties());
files.add(fa);
}
public void endOptions(CommandArgs args) {
}
public void startOptions() {
}
public FileArgs getFileArg(int n) {
return files.get(n);
}
public String getProperty(int n, String key) {
return files.get(n).props.getProperty(key);
}
}
}