/*
* 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.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());
os.close();
} 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 {
Reader r = new BufferedReader(new FileReader("test/resources/typ/test.txt"));
tr = new TypTextReader();
tr.read("test.typ", r);
TestUtils.registerFile("ts__test.typ");
RandomAccessFile raf = new RandomAccessFile("ts__test.typ", "rw");
FileChannel channel = raf.getChannel();
channel.truncate(0);
FileImgChannel w = new FileImgChannel(channel);
try (TYPFile typ = new TYPFile(w)) {
typ.setData(tr.getData());
typ.write();
}
}
/**
* 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);
if (tr.getData().getSort() == null)
tr.getData().setSort(SrtTextReader.sortForCodepage(1252));
return tr;
}
}