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