Subversion Repositories mkgmap

Rev

Rev 3408 | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2013.
 *
 * 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 uk.me.parabola.mkgmap.reader.osm.Element;
import uk.me.parabola.mkgmap.reader.osm.Way;
import static uk.me.parabola.imgfmt.app.net.AccessTagsAndBits.*;

import org.junit.Test;

import static org.junit.Assert.*;


public class AddAccessActionTest {
        private static final String ACCESSVAL = "no";

        /**
         * If there are no substitutions, then the exact same string is
         * used.
         */

        @Test
        public void testNoSub() {
                String value = "fred";
                Action act = new AddAccessAction(value, false);
                Element el = stdElement();
                act.perform(el);
                for (String accessTag : ACCESS_TAGS.keySet()) {
                        assertSame("a not changed", value, el.getTag(accessTag));
                }
        }

        /**
         * Simple test, substituting the whole string.
         */

        @Test
        public void testBareSubst() {
                Action act = new AddAccessAction("${access}", false);

                Element el = stdElement();
                act.perform(el);

                for (String accessTag : ACCESS_TAGS.keySet()) {
                        assertEquals("subst access", ACCESSVAL, el.getTag(accessTag));
                }
        }

        /**
         * If a substitution tag has no value then the value of the tag is not
         * changed by the action.
         */

        @Test
        public void testNoValue() {
                Action act = new AddAccessAction("${noexist}", true);
                Element el = stdElement();
                String val = "before";
                el.addTag("mkgmap:bicycle", val);
                act.perform(el);
                assertSame("no substitution", val, el.getTag("mkgmap:bicycle"));
        }

        /**
         * If modify is set to false each single access tag should only be set
         * if it is not already set.
         */

        @Test
        public void testNoOverwriteValue() {
                Action act = new AddAccessAction("${access}", false);
                Element el = stdElement();
                el.addTag("mkgmap:bicycle", "yes");
                act.perform(el);
                for (String accessTag : ACCESS_TAGS.keySet()) {
                        if ("mkgmap:bicycle".equals(accessTag))
                                assertEquals("no overwrite", "yes", el.getTag(accessTag));
                        else
                                assertEquals("no overwrite", "no", el.getTag(accessTag));
                }
        }
       
        /**
         * If modify is set to true all access tags should be set
         * no matter if they are set before.
         */

        @Test
        public void testOverwriteValue() {
                Action act = new AddAccessAction("${access}", true);
                Element el = stdElement();
                el.addTag("mkgmap:bicycle", "yes");
                act.perform(el);
                for (String accessTag : ACCESS_TAGS.keySet()) {
                        assertEquals("no overwrite", "no", el.getTag(accessTag));
                }
        }


        /**
         * The add/set commands now support alternatives just like the name command
         * has always done.
         * Several alternatives, but none match.
         */

        @Test
        public void testNoMatchingAlternatives() {
                AddAccessAction act = new AddAccessAction("${notset}", false);
                act.add("${hello}");
                act.add("${world}");

                Element el = stdElement();
                act.perform(el);

                for (String accessTag : ACCESS_TAGS.keySet())
                        assertNull(accessTag+"a not set", el.getTag(accessTag));
        }

        /**
         * Several alternatives and the first one matches.
         */

        @Test
        public void testFirstAlternativeMatches() {
                AddAccessAction act = new AddAccessAction("${access}", false);
                act.add("${hello}");
                act.add("${world}");

                Element el = stdElement();
                el.addTag("hello", "hello");
                act.perform(el);

                for (String accessTag : ACCESS_TAGS.keySet())
                        assertEquals(accessTag+" is set", ACCESSVAL, el.getTag(accessTag));
        }

        /**
         * Several alternatives and the second one matches.
         */

        @Test
        public void testSecondAlternativeMatches() {
                AddAccessAction act = new AddAccessAction("${hello}", false);
                act.add("${access}");
                act.add("${world}");

                Element el = stdElement();
                el.addTag("world", "world");
                act.perform(el);

                for (String accessTag : ACCESS_TAGS.keySet())
                        assertEquals(accessTag+" is set", ACCESSVAL, el.getTag(accessTag));
        }

        private Element stdElement() {
                Element el1 = new Way(1);
                el1.addTag("access", ACCESSVAL);
                el1.addTag("bicycle", "yes");
                el1.addTag("foot", "private");
                el1.addTag("highway", "track");
                return el1;
        }
}