Subversion Repositories mkgmap

Rev

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

/*
 * Copyright (C) 2009.
 *
 * 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.imgfmt.app.labelenc;

import java.util.Arrays;

import org.junit.Test;

import static org.junit.Assert.*;

public class CodeFunctionsTest {
        /**
         * Quick check of the ascii 6 bit format conversion.
         */

        @Test
        public void testFormat6() {
                CodeFunctions functions = CodeFunctions.createEncoderForLBL(6, 0);
                assertEquals("code page", 0, functions.getCodepage());
                assertEquals("encoding type", 6, functions.getEncodingType());
                CharacterEncoder enc = functions.getEncoder();

                EncodedText etext = enc.encodeText("hello world");
                byte[] ctext = etext.getCtext();
                int len = etext.getLength();

                // This was determined from the behaviour of the existing code, and not
                // from first principles.
                assertEquals("encoded length", 9, len);
                byte[] foo = {
                                0x20, 0x53, 0xc, 0x3c, 0x5, 0xffffffcf, 0x48, 0xffffffc1, 0x3f,
                };
                assertArrayEquals("encoded text", foo, Arrays.copyOf(ctext, len));
        }

        @Test
        public void testAscii() {
                CodeFunctions f = CodeFunctions.createEncoderForLBL("ascii");
                assertEquals("code page", 0, f.getCodepage());
                assertEquals("encoding type", 6, f.getEncodingType());
        }

        /**
         * Transliteration when going to ascii in format 6.  This was originally
         * the only place where transliteration was available.
         */

        @Test
        public void testTransliterate6() {
                CodeFunctions functions = CodeFunctions.createEncoderForLBL(6, 0);

                CharacterEncoder encoder = functions.getEncoder();
                Transliterator transliterator = new TableTransliterator("ascii");
                EncodedText text = encoder.encodeText(transliterator.transliterate("Körnerstraße, Velkomezeříčská, Skólavörðustigur"));

                CharacterDecoder decoder = functions.getDecoder();
                byte[] ctext = text.getCtext();
                for (int i = 0; i < text.getLength(); i++) {
                        decoder.addByte(ctext[i]);
                }
                decoder.addByte(0xff);
                String result = decoder.getText().getText();
                assertEquals("transliterated text", "KORNERSTRASSE, VELKOMEZERICSKA, SKOLAVORDUSTIGUR", result);
        }

        /**
        * Transliteration when going to ascii in format 6.  This was originally
        * the only place where transliteration was available.
        */

        @Test
        public void testTransliterateLatin() {
                CodeFunctions functions = CodeFunctions.createEncoderForLBL("latin1");

                CharacterEncoder encoder = functions.getEncoder();
                Transliterator transliterator = new TableTransliterator("latin1");
                EncodedText text = encoder.encodeText(transliterator.transliterate("Körnerstraße, Velkomezeříčská, Skólavörðustigur"));

                CharacterDecoder decoder = functions.getDecoder();
                byte[] ctext = text.getCtext();
                for (int i = 0; i < text.getLength(); i++) {
                        decoder.addByte(ctext[i]);
                }

                String result = decoder.getText().getText();
                assertEquals("transliterated text", "Körnerstraße, Velkomezerícská, Skólavörðustigur", result);
        }

        /**
         * Backward compatibility test.
         */

        @Test
        public void testLatin1() {
                CodeFunctions functions = CodeFunctions.createEncoderForLBL("latin1");
                assertEquals("code page", 1252, functions.getCodepage());
                assertEquals("encoding type", 9, functions.getEncodingType());

                StringBuilder sb = new StringBuilder();
                for (char c = 1; c < 256; c++) {
                        sb.append(c);
                }

                CharacterEncoder encoder = functions.getEncoder();
                EncodedText text = encoder.encodeText(sb.toString());

                // This encoder appends a null byte.
                assertEquals("length of encoded text", 256, text.getLength());

                for (int i = 1; i < 256; i++) {
                        // The following characters do not display on my GPS.  This covers
                        // the region where windows-1252 differs from iso 8859 so we don't
                        // really know which it is meant to be.
                        if (i >= 0x80 && i <= 0xbf)
                                continue;
                        assertEquals("character", i, text.getCtext()[i-1] & 0xff);
                }
        }
}