/*
* File: NumberRangeTest.java
*
* Copyright (C) 2012 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 or
* version 3 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.
*
*
* Author: Steve Ratcliffe
* Create date: 14 Dec 2012
*/
package main;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import uk.me.parabola.imgfmt.app.BitReader;
import uk.me.parabola.imgfmt.app.BitWriter;
import uk.me.parabola.imgfmt.app.net.NumberPreparer;
import uk.me.parabola.imgfmt.app.net.Numbers;
import uk.me.parabola.log.Logger;
import func.lib.NumberReader;
/**
*
* @author Steve Ratcliffe
*/
public class NumberRangeTest {
static protected Logger log = Logger.getLogger(NumberRangeTest.class);
private int bytesUsed;
public void testRandom() {
Random rand = new Random(8866028);
for (int iter = 0; iter < 1000000; iter++) {
List<String> sl = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
String n;
do {
String r1 = getRange(rand);
String r2 = getRange(rand);
n = String.format("%d,%s,%s", i, r1, r2);
} while (i == 0 && n.contains("N,-1,-1,N"));
sl.add(n);
if (rand.nextInt(3) > 1)
break;
}
if ((iter % 500000) == 0)
System.out.println("Done " + iter);
run(sl.toArray(new String[sl.size()]));
}
System.out.println("bytes used: " + bytesUsed);
}
private void run(String[] strings) {
List<Numbers> numbers = new ArrayList<Numbers>();
for (String s : strings) {
Numbers n = new Numbers(s);
n.setIndex(n.getNodeNumber());
numbers.add(n);
}
NumberPreparer np = new NumberPreparer(numbers);
BitWriter bitWriter = np.fetchBitStream();
bytesUsed += bitWriter.getLength();
// Now read it back in
byte[] bytes = new byte[bitWriter.getLength()];
System.arraycopy(bitWriter.getBytes(), 0, bytes, 0, bytes.length);
NumberReader nr = new NumberReader(new BitReader(bytes));
nr.setNumberOfNodes(numbers.get(numbers.size()-1).getIndex() + 1);
List<Numbers> list = nr.readNumbers(np.getSwapped());
// Have to fix up the node numbers
for (Numbers n : list) {
n.setNodeNumber(n.getIndex());
}
// Test that they are the same.
String orig = numbers.toString();
String calculated = list.toString();
if (!orig.equals(calculated)) {
System.out.printf("Fail: expecting: %s\n Got: %s\n", orig, calculated);
}
}
private String getRange(Random rand) {
char style = "NEEEOOOBB".charAt(rand.nextInt(9));
//if (style == 'N') style = 'B';
int max = 10;
int r = rand.nextInt(20);
if (r > 19) max = 200;
if (r > 17) max = 30;
int start = rand.nextInt(max)+1;
int end = rand.nextInt(max)+1;
if (style == 'O') {
start |= 1;
end |= 1;
} else if (style == 'E') {
start++; end++;
start &= ~1;
end &= ~1;
} else if (style == 'N') {
start = end = -1;
}
return String.format("%c,%d,%d", style, start, end);
}
public static void main(String[] args) {
(new NumberRangeTest()).testRandom();
}
}