Subversion Repositories mkgmap

Rev

Rev 3408 | 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 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.
 *
 *
 * Author: Steve Ratcliffe
 * Create date: 29-Nov-2008
 */

package uk.me.parabola.mkgmap.general;

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

import uk.me.parabola.imgfmt.app.Area;
import uk.me.parabola.imgfmt.app.Coord;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;

public class LineClipperTest {

        /**
         * This is the example as given on the referenced web page.
         * We now use integers instead of floats so the 101.425 from the
         * example is just 101 here.
         */

        @Test
        public void testExampleClip() {
                Area a = new Area(60, 70, 150, 230);
                Coord[] co = {
                                new Coord(20, 30),
                                new Coord(160, 280),
                };

                List<List<Coord>> listList = LineClipper.clip(a, Arrays.asList(co));
                assertTrue("list should be empty", !listList.isEmpty());

                Coord[] result = {
                                new Coord(60, 101),
                                new Coord(132, 230)
                };
                assertArrayEquals("example result", result, listList.get(0).toArray());
        }

        /**
         * Test an original line that enters the area, leaves it and then goes back
         * into the area.  This should give two lines in the result set.
         */

        @Test
        public void testListClip() {
                // Add your code here
                Area a = new Area(100, 100, 200, 200);
                List<Coord> l = Arrays.asList(new Coord(20, 30),
                                new Coord(40, 60),
                                new Coord(102, 110),
                                new Coord(150, 150),
                                new Coord(210, 220),
                                new Coord(190, 135)
                                );
                List<List<Coord>> list = LineClipper.clip(a, l);

                // There should be exactly two lines
                assertEquals("should be two lines", 2, list.size());

                // No empty lists
                for (List<Coord> lco : list)
                        assertTrue("empty list", !lco.isEmpty());

                // Check values
                Coord[] firstExpectedLine = {
                                new Coord(100, 108),
                                new Coord(102, 110),
                                new Coord(150, 150),
                                new Coord(193, 200)
                };
                assertArrayEquals(firstExpectedLine, list.get(0).toArray());
                Coord[] secondExpectedLine = {
                                new Coord(200, 178),
                                new Coord(190, 135)
                };
                assertArrayEquals(secondExpectedLine, list.get(1).toArray());
        }

        /**
         * If all the lines are inside, then it should just return null to indicate that.
         */

        @Test
        public void testAllInside() {
                Area a = new Area(100, 100, 200, 200);
                List<Coord> l = Arrays.asList(
                                new Coord(102, 110),
                                new Coord(150, 150),
                                new Coord(190, 195)
                                );
                List<List<Coord>> list = LineClipper.clip(a, l);
                assertNull("all lines inside", list);
        }
}