Subversion Repositories mkgmap

Rev

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

/*
 * Copyright (C) 2011.
 *
 * 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.typ;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.nio.channels.FileChannel;
import java.util.List;

import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.typ.ShapeStacking;
import uk.me.parabola.imgfmt.app.typ.TYPFile;
import uk.me.parabola.imgfmt.app.typ.TypData;
import uk.me.parabola.imgfmt.app.typ.TypLine;
import uk.me.parabola.imgfmt.app.typ.TypParam;
import uk.me.parabola.imgfmt.app.typ.TypPoint;
import uk.me.parabola.imgfmt.app.typ.TypPolygon;
import uk.me.parabola.imgfmt.sys.FileImgChannel;
import uk.me.parabola.mkgmap.srt.SrtTextReader;

import func.lib.ArrayImgWriter;
import func.lib.TestUtils;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

public class TypTextReaderTest {
        private TypTextReader tr;
        private static final int ORDER_SIZE = 5;

        @Before
        public void setUp() {
        }

        @Test
        public void testIdSection() {
                tr = makeTyp("[_id]\n" +
                                "FID=24\n" +
                                "ProductCode=2\n" +
                                "CodePage=1251\n" +
                                "[End]");

                TypParam param = tr.getData().getParam();
                assertEquals(24, param.getFamilyId());
                assertEquals(2, param.getProductId());
                assertEquals(1251, param.getCodePage());
        }

        @Test
        public void testStacking() {

                tr = makeTyp("[_drawOrder]\n" +
                                "Type=0x3,1\n" +
                                "Type=0x2,2\n" +
                                "Type=0x1,4\n" +
                                "Type=0x4,2\n" +
                                "Type=0x10402,2\n" +
                                "Type=0x10405,2\n" +
                                "[End]\n");

                ShapeStacking stacking = tr.getData().getStacking();

                ArrayImgWriter out = new ArrayImgWriter();
                stacking.write(out);

                byte[] buf = out.getBytes();
                assertEquals(3, buf[0]);

                assertEquals(0, buf[ORDER_SIZE]);
                assertEquals(2, buf[2 * ORDER_SIZE]);
                assertEquals(4, buf[3 * ORDER_SIZE]);
                assertEquals(0, buf[3 * ORDER_SIZE + 1]);
                assertEquals(4, buf[4 * ORDER_SIZE]);
                assertEquals((1<<2) + (1<<5), buf[4 * ORDER_SIZE + 1]);
        }

        @Test
        public void testPolygon() {
                tr = makeTyp("[_polygon]\n" +
                                "Type=0x2\n" +
                                "String1=0x04,Parking\n" +
                                "String2=0x03,Parkeergarage\n" +
                                "Xpm=\"0 0 2 0\"\n" +
                                "\"1 c #7BCAD5\"\n" +
                                "\"2 c #00008B\"\n" +
                                "[End]\n"
                );

                TypData data = tr.getData();
                List<TypPolygon> polygons = data.getPolygons();
                TypPolygon p = polygons.get(0);
                assertEquals(2, p.getType());
        }

        @Test
        public void testPolygonWithBitmap() {
                tr = makeTyp("[_polygon]\n" +
                        "Xpm=\"32 32 4 1\"\n" +
                                "\"! c #FFCC99\"\n" +
                                "\"  c none\"\n" +
                                "\"3 c #000000\"\n" +
                                "\"4 c none\"\n" +
                                "\"!     !!!     !!!     !!!     !!\"\n" +
                                "\"     !!!     !!!     !!!     !!!\"\n" +
                                "\"    !!!     !!!     !!!     !!! \"\n" +
                                "\"   !!!     !!!     !!!     !!!  \"\n" +
                                "\"  !!!     !!!     !!!     !!!   \"\n" +
                                "\" !!!     !!!     !!!     !!!    \"\n" +
                                "\"!!!     !!!     !!!     !!!     \"\n" +
                                "\"!!      !!      !!      !!      \"\n" +
                                "\"!     !!!     !!!     !!!     !!\"\n" +
                                "\"     !!!     !!!     !!!     !!!\"\n" +
                                "\"    !!!     !!!     !!!     !!! \"\n" +
                                "\"   !!!     !!!     !!!     !!!  \"\n" +
                                "\"  !!!     !!!     !!!     !!!   \"\n" +
                                "\" !!!     !!!     !!!     !!!    \"\n" +
                                "\"!!!     !!!     !!!     !!!     \"\n" +
                                "\"!!      !!      !!      !!      \"\n" +
                                "\"!     !!!     !!!     !!!     !!\"\n" +
                                "\"     !!!     !!!     !!!     !!!\"\n" +
                                "\"    !!!     !!!     !!!     !!! \"\n" +
                                "\"   !!!     !!!     !!!     !!!  \"\n" +
                                "\"  !!!     !!!     !!!     !!!   \"\n" +
                                "\" !!!     !!!     !!!     !!!    \"\n" +
                                "\"!!!     !!!     !!!     !!!     \"\n" +
                                "\"!!      !!      !!      !!      \"\n" +
                                "\"!     !!!     !!!     !!!     !!\"\n" +
                                "\"     !!!     !!!     !!!     !!!\"\n" +
                                "\"    !!!     !!!     !!!     !!! \"\n" +
                                "\"   !!!     !!!     !!!     !!!  \"\n" +
                                "\"  !!!     !!!     !!!     !!!   \"\n" +
                                "\" !!!     !!!     !!!     !!!    \"\n" +
                                "\"!!!     !!!     !!!     !!!     \"\n" +
                                "\"!!      !!      !!      !!      \"\n" +
                                "[End]\n");

                TypData data = tr.getData();
                List<TypPolygon> polygons = data.getPolygons();
                TypPolygon p = polygons.get(0);
                ArrayImgWriter out = new ArrayImgWriter();
                p.write(out, data.getEncoder());

                byte[] bytes = out.getBytes();
                assertEquals(135, bytes.length);
        }

        @Test
        public void testLineTwoColours() {
                TypTextReader tr = makeTyp("[_line]\n" +
                                "Type=0x00\n" +
                                "UseOrientation=Y\n" +
                                "LineWidth=2\n" +
                                "BorderWidth=1\n" +
                                "Xpm=\"0 0 2 0\"\n" +
                                "\"1 c #DDDDDD\"\n" +
                                "\"2 c #999999\"\n" +
                                "String1=0x04,Road\n" +
                                "String2=0x01,Route non-définie\n" +
                                "String3=0x03,Weg\n" +
                                "ExtendedLabels=Y\n" +
                                "FontStyle=SmallFont\n" +
                                "CustomColor=No\n" +
                                "[end]");

                TypData data = tr.getData();
                TypLine line = data.getLines().get(0);
                ImgFileWriter w = new ArrayImgWriter();
                line.write(w, data.getEncoder());
        }

        @Test
        public void testPointWithAlpha() {
                TestUtils.registerFile("hello");
                TypTextReader tr = makeTyp("[_point]\n" +
                                "Type=0x12\n" +
                                "SubType=0x01\n" +
                                ";23E6\n" +
                                ";size: 45\n" +
                                "String1=0x4,Mini round\n" +
                                "String2=0x1,Mini rond-point\n" +
                                "ExtendedLabels=N\n" +
                                "DayXpm=\"9 9 10 1\"\n" +
                                "\"$  c none\"\n" +
                                "\"%  c #808080\"  alpha=14\n" +
                                "\"&  c #808080\"\n" +
                                "\"'  c #808080\"  alpha=15\n" +
                                "\"(  c #808080\"  alpha=8\n" +
                                "\")  c #F0F7FF\"\n" +
                                "\"*  c #808080\"  alpha=4\n" +
                                "\"+  c #808080\"  alpha=11\n" +
                                "\",  c #808080\"  alpha=12\n" +
                                "\"-  c #808080\"  alpha=13\n" +
                                "\"$%&&&&&'$\"\n" +
                                "\"(&&&)&&&*\"\n" +
                                "\"&&)))))&&\"\n" +
                                "\"&&)&&&)&&\"\n" +
                                "\"&))&)&))&\"\n" +
                                "\"&&)&&&)&&\"\n" +
                                "\"&&)))))&&\"\n" +
                                "\"+&&&)&&&,\"\n" +
                                "\"$-&&&&&-$\"\n" +
                                "[end]"
                                );

                TypData data = tr.getData();
                TypPoint point = data.getPoints().get(0);
                ArrayImgWriter w = new ArrayImgWriter();
                point.write(w, data.getEncoder());
                System.out.println("size " + w.getSize());
                try (OutputStream os = new FileOutputStream("hello")) {
                        os.write(w.getBytes());
                } catch (IOException e) {
                        e.printStackTrace();
                }
                assertEquals(115, w.getBytes().length);

        }

        @Test
        public void testZeroColourBug() {
                String s = "[_point]\n" +
                                "Type=0x01e\n" +
                                "SubType=0x00\n" +
                                "String1=0x04,island\n" +
                                "DayXpm=\"5 5 1 1\"   Colormode=32\n" +
                                "\"!      c #000000\"  canalalpha=15\n" +
                                "\"!!!!!\"\n" +
                                "\"!!!!!\"\n" +
                                "\"!!!!!\"\n" +
                                "\"!!!!!\"\n" +
                                "\"!!!!!\"\n" +
                                "[end]";

                tr = makeTyp(s);
                TypData data = tr.getData();
                TypPoint point = data.getPoints().get(0);

                ArrayImgWriter w = new ArrayImgWriter();
                point.write(w, data.getEncoder());

                byte[] out = w.getBytes();

                assertEquals("width", 5, out[1]);
                assertEquals("height", 5, out[2]);
                assertEquals("number of colours", 1, out[3]);
        }

        /**
         * Basic test, reading from a file using most features.
         */

        @Test
        public void testFromFile() throws IOException, InterruptedException {
                Reader r = new BufferedReader(new FileReader("test/resources/typ/test.txt"));
                tr = new TypTextReader();
                tr.read("test.typ", r, Charset.defaultCharset().name());

                TestUtils.registerFile("ts__test.typ");
                RandomAccessFile raf = new RandomAccessFile("ts__test.typ", "rw");
                FileChannel channel = raf.getChannel();
                channel.truncate(0);

                try (FileImgChannel w = new FileImgChannel(channel); TYPFile typ = new TYPFile(w)) {
                        typ.setData(tr.getData());
                        typ.write();
                } finally {
                        raf.close();
                }
        }

        /**
         * Check that unknown sections don't throw an exception and are ignored without
         * affecting anything else.
         */

        @Test
        public void testIgnoreUnknownSections() {
                tr = makeTyp("[_unknown_section_name]\n" +
                                "Type=0x2\n" +
                                "String1=0x04,Parking\n" +
                                "String2=0x03,Parkeergarage\n" +
                                "OtherStuff=Unknown\n" +
                                "[End]\n" +
                                "[_id]\n" +
                                "FID=4455\n" +
                                "ProductCode=2\n" +
                                "CodePage=1251\n" +
                                "[End]"
                );

                TypData data = tr.getData();
                System.out.println(data);
                assertEquals(4455, data.getParam().getFamilyId());
        }

        private TypTextReader makeTyp(String in) {
                Reader r = new StringReader(in);

                TypTextReader tr = new TypTextReader();
                tr.read("string", r, "N/A");
                if (tr.getData().getSort() == null)
                        tr.getData().setSort(SrtTextReader.sortForCodepage(1252));
                return tr;
        }
}