Subversion Repositories mkgmap

Rev

Rev 2451 | 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: 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());
                }
        }
}