/* Copyright (C) 2006 Christian Schneider * * This file is part of Nomad. * * Nomad 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. * * Nomad 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 Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Created on Jun 14, 2006 */ package net.sf.nmedit.jpdl; /** * TODO implement test as JUnit test */ public class BitStreamTester { public static void main( String[] args ) { (new BitStreamTester()).runTests(); } public void runTests() { testPattern(1, 1); // (1)* pattern testPattern(2, 2); // (10)* pattern testPattern(2, 3); // (010)* pattern testGetInt(); testGetInt2(); testRandomGetAndSet(); testSetSize(); testPositionGetSet(); } void testPattern(long pattern, long pbits) { title("pattern fill"); description( "1. new BitStream()\n"+ "2. add 0..32+2 times bits from Pattern "+patternToString(pattern, pbits)+"\n"+ "3. goto 1"); expectedResult( "- BS should contain the specified number of bits\n"+ "- BS filled with the specified pattern"); for (int bits=0;bits<=32+2;bits++) { testPattern(bits, pattern, pbits); } } void fillPattern(BitStream bs, int bits, long pattern, long pbits ) { int shift = ((int)pbits)-1; for (int i=1;i<=bits;i++) { int b = (int)((pattern >>> shift)&1); bs.append(b,1); shift--; if (shift<0) shift = ((int)pbits)-1; } } private String patternToString( long pattern, long pbits ) { StringBuffer s = new StringBuffer(35); s.append('('); for (int i= ((int)pbits)-1;i>=0;i--) { s.append(Long.toString(((pattern>>>i)&1))); } s.append(")*"); return s.toString(); } void testPattern(int bits, long pattern, long pbits) { System.out.print("bits="+bits+": BS:"); BitStream bs = new BitStream(); fillPattern(bs, bits, pattern, pbits); /* int shift = ((int)pbits)-1; for (int i=1;i<=bits;i++) { int b = (int)((pattern >>> shift)&1); bs.append(b,1); shift--; if (shift<0) shift = ((int)pbits)-1; } */ println(bs); } void testGetInt() { title("getInt(X) test"); description( "tests what getInt(X) returns on an empty BitStream\n"+ "for X=-2..32+2:\n"+ " getInt(X)"); expectedResult( "- getInt(0) should return 0\n"+ "- getInt(X!=0) should fail"); for (int bits=-2;bits<=32+2;bits++) { System.out.print("getInt("+bits+")="); try { int result = (new BitStream()).getInt(bits); System.out.println("int("+result+")"); } catch (Exception e) { System.out.println("error("+e+")"); } } } void testGetInt2() { title("get/set test 2"); BitStream bs = new BitStream(); int pattern = 1<<2; int pbits = 3; fillPattern(bs, 64, pattern, pbits); bs.setPosition(pbits); if (bs.isAvailable(pbits) && bs.getInt(pbits)==pattern) { success(); } else { failed(); } } void testRandomGetAndSet() { title("Random Get and Set"); int tests = 1000000; description( "Performs "+tests+" tests:\n"+ "1. new BitStream()\n"+ "2. data, bits = random(), random()\n"+ "3. bs.append(data, bits)\n"+ "4. expect(bs.getInt(bits)==data)" ); for (int i=1;i<=tests;i++) { BitStream bs = new BitStream(); int data1 = (int) (Math.random()*0xFFFFFFFF); int data2 = (int) (Math.random()*0xFFFFFFFF); final int bits1 = Long.bitCount(data1); final int bits2 = Long.bitCount(data2); bs.append((int)data1, bits1); bs.append((int)data2, bits2); data1 &= (1<<bits1)-1; data2 &= (1<<bits2)-1; final int read1 = bs.getInt(bits1); final int read2 = bs.getInt(bits2); boolean ok_result = (read1==data1) && (read2==data2) && (bs.getSize()==bits1+bits2); if (!ok_result) { System.out.println("Test["+i+"] failed: {"); StringBuffer sb = new StringBuffer(); sb.append("bits1="+bits1+"\n"); sb.append("bits2="+bits2+"\n"); sb.append("data1="+data1+" ("+Long.toBinaryString(data1)+"b)\n"); sb.append("data2="+data2+" ("+Long.toBinaryString(data2)+"b)\n"); sb.append("read1="+read1+"\n"); sb.append("read2="+read2+"\n"); sb.append("size(BitStream)="+bs.getSize()); System.out.println(tab(sb.toString())); System.out.println("}"); return; } } success(); } void testSetSize() { title("setSize() test"); description("tests setSize() behaviour:\n"+ "for x=0..32+2:\n"+ tab( "new BitStream():\n"+ "append(0xFFFFFFFF, 32);\n"+ "append(0xFFFFFFFF, 32);\n"+ "setSize(32+x-16);")); expectedResult( "BitStream:\n"+ "- 32+x times 1 (one)\n"+ "- size(BitStream)==min(32+x,64)"); for (int i=0;i<=32+2;i++) { BitStream bs = new BitStream(); bs.append(0xFFFFFFFF, 32); bs.append(0xFFFFFFFF, 32); int x = 32+i-16; bs.setSize(x); //bs.append(0,32-i); System.out.print("x:"+x+" BS:"); println(bs); } } void testPositionGetSet() { title("get/set position"); BitStream bs = new BitStream(); bs.append(0,32); final int setpos = 5; bs.setPosition(setpos); if (bs.getPosition()==setpos) { success(); } else { failed(); } } void title(String title) { System.out.println(); StringBuffer hline = new StringBuffer(); for (int i=1;i<=60;i++) hline.append('='); System.out.println(hline); System.out.println("["+title+"]"); System.out.println(); } void description(String description) { System.out.println("{ description:"); System.out.println(tab(description)); System.out.println("}"); } void expectedResult(String result) { System.out.println("{ expected result:"); System.out.println(tab(result)); System.out.println("}"); } String tab(String text) { return tab(text, " "); } String tab(String text, String prefix) { return prefix+text.replaceAll("\\n", "\n"+prefix); } void println(BitStream bs) { print(bs); System.out.println(); } void print(BitStream bs) { final char SEPARATOR = ' '; if (bs.getSize()==0) { print8(bs); System.out.print(SEPARATOR); } else { while (bs.isAvailable(1)) { print8(bs); System.out.print(SEPARATOR); } } System.out.print(" /size(BitStream)="+bs.getSize()); } void print8(BitStream bs) { for(int i=8;i>=1;i--) print1(bs); } void print1(BitStream bs) { System.out.print(bs.isAvailable(1) ? Integer.toString(bs.getInt(1)) : "_"); } void success() { System.out.println("-> SUCCESS"); } void failed() { System.out.println("-> failed"); } }