/* * 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); } } }