/*
* TestingForm.java
*
* Copyright (C) 2008 Irving Bunton
* http://www.substanceofcode.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
// Expand to define logging define
@DLOGDEF@
// Expand to define test ui define
@DTESTUIDEF@
//#ifdef DTESTUI
package com.substanceofcode.testutil.presentation;
import java.lang.IllegalArgumentException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.lang.StringBuffer;
import com.substanceofcode.rssreader.businessentities.RssReaderSettings;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import com.substanceofcode.testlcdui.ChoiceGroup;
import com.substanceofcode.testlcdui.Form;
import com.substanceofcode.testlcdui.List;
import com.substanceofcode.testlcdui.TextBox;
import com.substanceofcode.testlcdui.TextField;
import com.substanceofcode.testlcdui.StringItem;
import javax.microedition.lcdui.Item;
import com.substanceofcode.rssreader.presentation.RssReaderMIDlet;
import com.substanceofcode.utils.EncodingUtil;
import com.substanceofcode.utils.CauseException;
//#ifdef DLOGGING
import net.sf.jlogmicro.util.logging.Logger;
import net.sf.jlogmicro.util.logging.LogManager;
import net.sf.jlogmicro.util.logging.Level;
//#endif
/**
* Show characters with different encodings to help show the presentation.
* Also, allow easy test of how it will look.
*
* @author Irving Bunton
*/
public class TestingForm extends Form implements CommandListener {
private RssReaderMIDlet m_midlet;
private Command m_tstEnc1Command;
private Command m_tstEnc2Command;
private Command m_backCommand;
//#ifdef DLOGGING
private Logger m_logger = Logger.getLogger("TestingForm");
private boolean m_fineLoggable = m_logger.isLoggable(Level.FINE);
private boolean m_finerLoggable = m_logger.isLoggable(Level.FINER);
private boolean m_finestLoggable = m_logger.isLoggable(Level.FINEST);
//#endif
/** Creates a new instance of TestingForm */
public TestingForm(RssReaderMIDlet midlet) {
super("Testing Form");
this.m_midlet = midlet;
this.m_tstEnc1Command = new Command("1 Encoding Test", Command.SCREEN, 1);
super.addCommand( m_tstEnc1Command );
this.m_tstEnc2Command = new Command("2 Encoding Test", Command.SCREEN, 1);
super.addCommand( m_tstEnc2Command );
this.m_backCommand = new Command("Back", Command.BACK, 5);
super.addCommand( m_backCommand );
this.setCommandListener( this );
}
/* Perform a test. */
private void performTest1() {
while (super.size() > 0) {super.delete(0);}
// TODO put in expected results and test descr
super.append(new StringItem("isConvWinUni()=",
new Boolean(EncodingUtil.isConvWinUni()).toString()));
super.append(new StringItem("JavaME encoding=",
System.getProperty("microedition.encoding")));
super.append(new StringItem("m_midpIso=",
new Boolean(EncodingUtil.m_midpIso).toString()));
super.append(new StringItem("getIsoEncoding()=",
EncodingUtil.getIsoEncoding()));
super.append(new StringItem("m_midpWin=",
new Boolean(EncodingUtil.m_midpWin).toString()));
super.append(new StringItem("getWinEncoding()=",
EncodingUtil.getWinEncoding()));
super.append(new StringItem("m_midpUni=",
new Boolean(EncodingUtil.m_midpUni).toString()));
super.append(new StringItem("m_hasWinEncoding=",
new Boolean(EncodingUtil.m_hasWinEncoding).toString()));
super.append(new StringItem("m_hasIso8859Encoding=",
new Boolean(EncodingUtil.m_hasIso8859Encoding).toString()));
appendEntityAlphaTest("Test with no data.", "", "");
appendEntityAlphaTest("Test with one entity.", "<", "<");
appendEntityAlphaTest("Test with one entity.",
"<>&" '",
"<>&\" '");
appendEntityAlphaTest("Test with one entity.",
" <> &" ",
" <> &\" ");
appendEntityAlphaTest("Test with one entity.", " < > &" ",
" < > &\" ");
appendEntityAlphaTest("Test with one amp replace.",
" &quot;backpack&quot;", "\"backpack\"");
appendEntityAlphaTest("Test with one entity.",
" < > ä ö ",
"");
String html = "ä Ä ö Ö < & > " +
"' "";
appendEntityAlphaTest("Test with one entity.", html,
"");
StringBuffer sbControl = new StringBuffer();
for (int ic = 0x80; ic <= 0x9f; ic++) {
sbControl.append((char)ic);
}
super.append("control(0)=\n" + sbControl.charAt(0) + "," + Integer.toHexString(sbControl.charAt(0)));
String control = sbControl.toString();
char[] cc = new char[sbControl.length()];
sbControl.getChars(0, cc.length, cc, 0);
String control2 = new String(cc);
super.append("control(0)=\n" + control.charAt(0) + "," + Integer.toHexString(control.charAt(0)));
super.append("control2(0)=\n" + control2.charAt(0) + "," + Integer.toHexString(control2.charAt(0)));
String cvControl = control;
try {
cvControl = new String(control.getBytes("ISO-8859_1"), "Cp1252");
} catch (UnsupportedEncodingException e) {
super.append("Conversion error for win contol string.");
}
super.append("cvControl(0)=\n" + cvControl.charAt(0) + "," + Integer.toHexString(cvControl.charAt(0)));
String ncontrol = EncodingUtil.replaceSpChars(cvControl, true, false,
false, false);
super.append("converted cvControl,ncontrol=\n" + ncontrol.charAt(0) + "," + Integer.toHexString(ncontrol.charAt(0)));
StringBuffer sbTst = new StringBuffer();
StringBuffer sbRes = new StringBuffer();
appendHashTest("Iso entities", EncodingUtil.getConvIso88591(), sbTst, sbRes);
// Convert from ISO to iso
String cvRes = EncodingUtil.replaceSpChars(sbRes.toString(),
false, false, false, false);
StringBuffer sbwTst = new StringBuffer();
StringBuffer sbwRes = new StringBuffer();
appendHashTest("cp1252 entities", EncodingUtil.getConvCp1252(), sbwTst, sbwRes);
// Convert from windows to windows
String cvwRes = EncodingUtil.replaceSpChars(sbwRes.toString(),
true, false, true, false);
appendEntitySpTest("Test with iso conv to iso midp phone.",
sbRes.toString(), false, false, false, cvRes);
// Convert from windows to windows . Given that windows uses
// ISO control characters, it should not match the other encoding.
appendEntitySpTest("Test with win conv to iso midp phone.",
sbwRes.toString(), true, false, false, cvRes);
appendEntitySpTest("Test with win conv to win midp phone.",
sbwRes.toString(), true, true, false, cvwRes);
// Convert from ISO to windows. Given that windows supports
// the ISO characters, it should match other decoding too.
appendEntitySpTest("Test with iso conv to windows midp phone.",
sbRes.toString(), false, true, false, cvwRes);
appendEntitySpTest("Test with iso sponly conv to iso midp phone.",
control, false, false, false, control);
// Convert from windows to windows . Given that windows uses
// ISO control characters, it should not match the other encoding.
appendEntitySpTest("Test with win sponly conv to iso midp phone.",
control, true, false, false, control);
appendEntitySpTest("Test with win sponly conv to win midp phone.",
control, true, true, false, control);
// Convert from ISO to windows. Given that windows supports
// the ISO characters, it should match other decoding too.
appendEntitySpTest("Test with iso sponly conv to windows midp phone.",
control, false, true, false, control);
String[] isoSp = EncodingUtil.getIsoSpecialEntities();
char[] isoSpVals =
{'-', // en dash
'-', // em dash
'\'', // left single quotation mark
'\'', // right single quotation mark
'\'', // single low-9 quotation mark
'\"', // left double quotation mark
'\"', // right double quotation mark
'\"'}; // double low-9 quotation mark
Hashtable isoConv = new Hashtable();
EncodingUtil.initEntVals(isoConv, isoSp, isoSpVals);
StringBuffer sbSp = new StringBuffer();
StringBuffer sbSpRes = new StringBuffer();
appendHashTest("Iso special entities", isoConv, sbSp, sbSpRes);
}
/* Perform a test. */
private void performTest2() {
while (super.size() > 0) {super.delete(0);}
Vector statExecs = EncodingUtil.getStatExcs();
for (int ic = 0; ic < statExecs.size(); ic++) {
Exception exc = (Exception)statExecs.elementAt(ic);
super.append(new StringItem("stat exc " + ic + "=",
exc.getMessage()));
}
appendEncTest("Test with has iso- encoding doc iso- encoding.",
true, "ISO-8859-1", true, "WINDOWS-1252",
"ISO-8859-1", "ISO-8859-1");
appendEncTest("Test with has iso- encoding doc iso encoding.",
true, "ISO-8859-1", true, "WINDOWS-1252",
"ISO8859_1", "ISO-8859-1");
appendEncTest("Test with has iso encoding doc iso encoding.",
true, "ISO8859_1", true, "WINDOWS-1252",
"ISO8859_1", "ISO8859_1");
appendEncTest("Test with has iso encoding doc iso- encoding.",
true, "ISO8859_1", true, "WINDOWS-1252",
"ISO-8859-1", "ISO8859_1");
appendEncTest("Test with has WINDOWS- encoding doc WINDOWS- encoding.",
true, "ISO8859_1", true, "WINDOWS-1252",
"WINDOWS-1252", "WINDOWS-1252");
appendEncTest("Test with has WINDOWS- encoding doc Cp encoding.",
true, "ISO8859_1", true, "WINDOWS-1252",
"Cp1252", "WINDOWS-1252");
appendEncTest("Test with has WINDOWS- encoding doc Cp- encoding.",
true, "ISO8859_1", true, "WINDOWS-1252",
"Cp-1252", "WINDOWS-1252");
appendEncTest("Test with has Cp encoding doc Cp encoding.",
true, "ISO8859_1", true, "Cp1252",
"Cp1252", "Cp1252");
appendEncTest("Test with has Cp encoding doc Cp encoding.",
true, "ISO8859_1", true, "Cp1252",
"Cp-1252", "Cp1252");
appendEncTest("Test with has Cp encoding doc WINDOWS- encoding.",
true, "ISO8859_1", true, "Cp1252",
"WINDOWS-1252", "Cp1252");
}
/* Test the encoding matches the actual encoding. */
private void appendEncTest(final String tstName,
final boolean hasIso8859Encoding,
final String isoEncoding, final boolean hasWinEncoding,
final String winEncoding, final String encoding,
final String expEncoding) {
String data = "ab";
ByteArrayInputStream bin = new ByteArrayInputStream( data.getBytes() );
EncodingUtil encUtl = new EncodingUtil(bin);
super.append("----------");
super.append(new StringItem("hasIso8859Encoding=",
new Boolean(hasIso8859Encoding).toString()));
super.append(new StringItem("isoEncoding=", isoEncoding));
super.append(new StringItem("hasWinEncoding=",
new Boolean(hasWinEncoding).toString()));
super.append(new StringItem("winEncoding=", winEncoding));
super.append(new StringItem("encoding=", encoding));
encUtl.getEncoding(hasIso8859Encoding, isoEncoding, hasWinEncoding,
winEncoding, "BIG-5", encoding);
super.append(new StringItem("(" + tstName + ") Exp Result:", "\n" +
expEncoding));
final String actEncoding = encUtl.getDocEncoding();
super.append(new StringItem("(" + tstName + ") Act Result: ", "\n" +
actEncoding));
super.append("\n" + new Boolean(actEncoding.equals(
expEncoding)).toString());
Vector excs = encUtl.getExcs();
for (int ic = 0; ic < excs.size(); ic++) {
Exception exc = (Exception)excs.elementAt(ic);
super.append(new StringItem("exc " + ic, "\n" +
exc.getMessage()));
}
}
private void appendHashTest(String tstName, Hashtable tst,
StringBuffer sbTst, StringBuffer sbRes) {
Enumeration etst = tst.keys();
for (;etst.hasMoreElements();) {
String ckey = (String)etst.nextElement();
sbTst.append("&" + ckey + "; ");
sbRes.append((String)tst.get(ckey) + " ");
}
appendEntityAlphaTest(tstName, sbTst.toString(), sbRes.toString());
}
private void buildCharEnts(String tstName, char[] tst,
StringBuffer sbTst) {
for (int ic = 0;ic < tst.length;ic++) {
char[] carr = new char[1];
String cval = new String(carr);
sbTst.append("&" + cval + "; ");
}
}
private void appendEntityAlphaTest(String tstName, String tst, String res) {
super.append(new StringItem(tstName, tst));
super.append(new StringItem("(" + tstName + ") Result:", "\n" + res));
String actres = EncodingUtil.replaceAlphaEntities(true, tst);
super.append(new StringItem("(" + tstName + ") Act Result: ", "\n" + actres));
super.append("\n" + new Boolean(actres.equals(res)).toString());
super.append("-------");
}
private void appendEntitySpTest(String tstName, String tst,
boolean isWindows, boolean midpWin,
boolean midpUni, String res) {
super.append(new StringItem(tstName, tst));
super.append(new StringItem("(" + tstName + ") Result:", "\n" + res));
String actres = EncodingUtil.replaceSpChars(tst,
isWindows, false, midpWin, midpUni);
super.append(new StringItem("(" + tstName + ") Act Result: ", "\n" + actres));
super.append("\n" + new Boolean(actres.equals(res)).toString());
super.append("-------");
}
public void commandAction(Command command, Displayable displayable) {
super.outputCmdAct(command, displayable);
if(command==m_backCommand) {
m_midlet.showBookmarkList();
while (super.size() > 0) {super.delete(0);}
} else if(command==m_tstEnc1Command) {
performTest1();
} else if(command==m_tstEnc2Command) {
performTest2();
}
}
}
//#endif