Rev 2386 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* 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 uk.me.parabola.imgfmt.Utils;
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
);
Writer w =
null;
try {
w =
new FileWriter(name
);
w.
append(content
);
} finally {
Utils.
closeFile(w
);
}
}
/**
* 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
);
}
}
}