Subversion Repositories mkgmap

Rev

Rev 3408 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2014.
 *
 * 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.
 */


package uk.me.parabola.mkgmap.osmstyle.actions;

import java.util.Arrays;
import java.util.List;

import uk.me.parabola.mkgmap.reader.osm.Element;
import uk.me.parabola.mkgmap.reader.osm.Way;
import uk.me.parabola.mkgmap.scan.SyntaxException;

import org.junit.Test;

import static org.junit.Assert.*;

public class ConvertFilterTest {
        private final List<Data> simpleTests = Arrays.asList(
                        new Data("kmh=>mph", "100", "62"),
                        new Data("km/h=>mph", "100", "62"),
                        new Data("mph=>km/h", "60", "97"),
                        new Data("m=>ft", "10", "33"),
                        new Data("km=>ft", "10", "32808"),
                        new Data("ft=>m", "100", "30"),
                        new Data("mi=>km", "100", "161"),
                        new Data("knots=>mph", "20", "23")
        );

        /** This is not used by this filter, so no need to create a new one for each test */
        private final Element el = new Way(1);

        /**
         * Just test a whole bunch of different conversions.
         */

        @Test
        public void testConversions() {
                for (Data data : simpleTests) {
                        ConvertFilter f = new ConvertFilter(data.conv);
                        String result = f.doFilter(data.input, el);
                        assertEquals("Simple test for conversion " + data.conv, data.output, result);
                }
        }

        /**
         * If there is a unit on the input value, and that is the same as the default, then the conversion
         * should be between the units as stated.
         *
         * Separate test, since there is likely to be a different code path involved.
         */

        @Test
        public void testConvertWithUnitSameAsDefault() {
                ConvertFilter f = new ConvertFilter("m=>ft");
                assertEquals("328", f.doFilter("100m", el));
        }

        /**
         * If the value has a unit which is the same as the target unit, then the result will be the
         * input value (without the unit).
         */

        @Test
        public void testConvertWIthUnitSameAsTarget() {
                ConvertFilter f = new ConvertFilter("m=>ft");
                assertEquals("100", f.doFilter("100ft", el));
        }

        /**
         * Test the case where the input string has a unit specified that is neither the source nor the
         * target string in the conversion specifier.
         */

        @Test
        public void testConvertWithDifferentUnit() {
                ConvertFilter f = new ConvertFilter("km=>ft");
                assertEquals("33", f.doFilter("10m", el));
        }

        @Test
        public void testConvertNumberWithSpaces() {
                ConvertFilter f = new ConvertFilter("m=>ft");
                String s = f.doFilter(" 10 ", el);
                assertEquals("33", s);
        }

        @Test
        public void testConvertWithSpaces() {
                ConvertFilter f = new ConvertFilter("km/h=>mph");
                String s = f.doFilter(" 10 km/h ", el);
                assertEquals("6", s);
        }

        @Test(expected = SyntaxException.class)
        public void testUnrecognisable() {
                ConvertFilter f = new ConvertFilter("fjdkfjdk");
        }

        @Test
        public void testBadConversion() {
                ConvertFilter f = new ConvertFilter("kk=>ft");

                String in = "10m";
                assertEquals(in, f.doFilter(in, el));
        }

        @Test
        public void testValueNotNumber() {
                ConvertFilter f = new ConvertFilter("km=>m");

                String in = "x10m";
                assertEquals(in, f.doFilter(in, el));
        }

        @Test
        public void testUnknownUnit() {
                ConvertFilter f = new ConvertFilter("m=>ft");
                String in = "10abc";
                String s = f.doFilter(in, el);
                assertEquals(in, s);
        }

        /**
         * Converting between a distance and a speed for example.
         */

        @Test
        public void testIncompatibleConversion() {
                ConvertFilter f = new ConvertFilter("m=>mph");
                String in = "10m";
                String s = f.doFilter(in, el);
                assertEquals(in, s);
        }

        class Data {
                private final String conv;
                private final String input;
                private final String output;

                Data(String conv, String input, String output) {
                        this.conv = conv;
                        this.input = input;
                        this.output = output;
                }
        }
}