package org.marketcetera.util.unicode; import org.apache.commons.lang.ArrayUtils; import org.junit.Test; import org.marketcetera.util.except.I18NException; import org.marketcetera.util.test.TestCaseBase; import static org.junit.Assert.*; import static org.marketcetera.util.test.UnicodeData.*; import static org.marketcetera.util.unicode.Serialization.*; /** * @author tlerios@marketcetera.com * @since 0.6.0 * @version $Id: SerializationTest.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ public class SerializationTest extends TestCaseBase { private static final Serialization[] NO_SERIALIZATIONS= new Serialization[0]; private static void common (Serialization serialization, byte[] data, SignatureCharset sc) throws Exception { data=ArrayUtils.addAll(sc.getSignature().getMark(),data); Serialization[] candidates=new Serialization[] {serialization}; assertEquals(sc,getPrefixMatch(candidates,data)); assertEquals(COMBO,decode(candidates,data)); } private static void single (Serialization serialization, int count, byte[] data, SignatureCharset sc) throws Exception { Serialization[] candidates=new Serialization[] {serialization}; assertNotNull(serialization.getSignatureCharsets()); assertEquals(count,serialization.getSignatureCharsets().length); assertNull(decode(candidates,null)); common(serialization,data,sc); assertEquals((sc.getSignature()==Signature.NONE)?sc:null, getPrefixMatch(candidates,new byte[] {(byte)0x01})); } private static void multi (Serialization serialization, byte[] data1, SignatureCharset sc1, byte[] data2, SignatureCharset sc2, byte[] data3, SignatureCharset sc3) throws Exception { Serialization[] candidates=new Serialization[] {serialization}; assertNotNull(serialization.getSignatureCharsets()); assertEquals(3,serialization.getSignatureCharsets().length); assertNull(decode(candidates,null)); common(serialization,data1,sc1); common(serialization,data2,sc2); common(serialization,data3,sc3); assertEquals(serialization.getSignatureCharsets()[0], getPrefixMatch(candidates,new byte[] {(byte)0x01})); } @Test public void all() throws Exception { single(UTF8,1,COMBO_UTF8,SignatureCharset.UTF8_UTF8); single(UTF8N,1,COMBO_UTF8,SignatureCharset.NONE_UTF8); single(UTF16BE,1,COMBO_UTF16BE,SignatureCharset.NONE_UTF16BE); single(UTF16LE,1,COMBO_UTF16LE,SignatureCharset.NONE_UTF16LE); single(UTF32BE,1,COMBO_UTF32BE,SignatureCharset.NONE_UTF32BE); single(UTF32LE,1,COMBO_UTF32LE,SignatureCharset.NONE_UTF32LE); single(UTF16BE_REQ,1, COMBO_UTF16BE,SignatureCharset.UTF16BE_UTF16BE); single(UTF16LE_REQ,1, COMBO_UTF16LE,SignatureCharset.UTF16LE_UTF16LE); single(UTF32BE_REQ,1, COMBO_UTF32BE,SignatureCharset.UTF32BE_UTF32BE); single(UTF32LE_REQ,1, COMBO_UTF32LE,SignatureCharset.UTF32LE_UTF32LE); multi(UTF16, COMBO_UTF16BE,SignatureCharset.NONE_UTF16BE, COMBO_UTF16BE,SignatureCharset.UTF16BE_UTF16BE, COMBO_UTF16LE,SignatureCharset.UTF16LE_UTF16LE); multi(UTF32, COMBO_UTF32BE,SignatureCharset.NONE_UTF32BE, COMBO_UTF32BE,SignatureCharset.UTF32BE_UTF32BE, COMBO_UTF32LE,SignatureCharset.UTF32LE_UTF32LE); } @Test public void multiMatch() throws Exception { byte[] data=new byte[] {(byte)0x01}; assertNull(getPrefixMatch(NO_SERIALIZATIONS,data)); try { decode(NO_SERIALIZATIONS,data); fail(); } catch (I18NException ex) { assertEquals(ex.getDetail(),Messages.NO_SIGNATURE_MATCHES, ex.getI18NBoundMessage()); } assertEquals(SignatureCharset.NONE_UTF16BE,getPrefixMatch (new Serialization[] {UTF16,UTF32},data)); assertEquals(SignatureCharset.NONE_UTF32BE,getPrefixMatch (new Serialization[] {UTF32,UTF16},data)); assertEquals(SignatureCharset.UTF32LE_UTF32LE,getPrefixMatch (new Serialization[] {UTF16,UTF32}, Signature.UTF32LE.getMark())); assertEquals(SignatureCharset.UTF32LE_UTF32LE,getPrefixMatch (new Serialization[] {UTF32,UTF16}, Signature.UTF32LE.getMark())); } }