/** * Copyright 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.opengl.test.junit.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.lang.reflect.*; import java.nio.FloatBuffer; import java.util.Iterator; import java.util.List; import com.jogamp.opengl.GLContext; import com.jogamp.common.os.Platform; import com.jogamp.common.util.InterruptSource; public class MiscUtils { public static boolean atob(final String str, final boolean def) { try { return Boolean.parseBoolean(str); } catch (final Exception ex) { ex.printStackTrace(); } return def; } public static int atoi(final String str, final int def) { try { return Integer.parseInt(str); } catch (final Exception ex) { ex.printStackTrace(); } return def; } public static long atol(final String str, final long def) { try { return Long.parseLong(str); } catch (final Exception ex) { ex.printStackTrace(); } return def; } public static float atof(final String str, final float def) { try { return Float.parseFloat(str); } catch (final Exception ex) { ex.printStackTrace(); } return def; } public static String toHexString(final byte hex) { return "0x" + Integer.toHexString( hex & 0x000000FF ); } public static String toHexString(final short hex) { return "0x" + Integer.toHexString( hex & 0x0000FFFF ); } public static String toHexString(final int hex) { return "0x" + Integer.toHexString( hex ); } public static String toHexString(final long hex) { return "0x" + Long.toHexString( hex ); } public static void assertFloatBufferEquals(final String errmsg, final FloatBuffer expected, final FloatBuffer actual, final float delta) { if(null == expected && null == actual) { return; } final String msg = null != errmsg ? errmsg + " " : ""; if(null == expected) { throw new AssertionError(msg+"; Expected is null, but actual not: "+actual); } if(null == actual) { throw new AssertionError(msg+"; Actual is null, but expected not: "+expected); } if(expected.remaining() != actual.remaining()) { throw new AssertionError(msg+"; Expected has "+expected.remaining()+" remaining, but actual has "+actual.remaining()); } final int a0 = expected.position(); final int b0 = actual.position(); for(int i=0; i<expected.remaining(); i++) { final float ai = expected.get(a0 + i); final float bi = actual.get(b0 + i); final float daibi = Math.abs(ai - bi); if( daibi > delta ) { throw new AssertionError(msg+"; Expected @ ["+a0+"+"+i+"] has "+ai+", but actual @ ["+b0+"+"+i+"] has "+bi+", it's delta "+daibi+" > "+delta); } } } public static void assertFloatBufferNotEqual(final String errmsg, final FloatBuffer expected, final FloatBuffer actual, final float delta) { if(null == expected || null == actual) { return; } if(expected.remaining() != actual.remaining()) { return; } final String msg = null != errmsg ? errmsg + " " : ""; final int a0 = expected.position(); final int b0 = actual.position(); for(int i=0; i<expected.remaining(); i++) { final float ai = expected.get(a0 + i); final float bi = actual.get(b0 + i); final float daibi = Math.abs(ai - bi); if( daibi > delta ) { return; } } throw new AssertionError(msg+"; Expected and actual are equal."); } public static boolean setFieldIfExists(final Object instance, final String fieldName, final Object value) { try { final Field f = instance.getClass().getField(fieldName); if(value instanceof Boolean || f.getType().isInstance(value)) { f.set(instance, value); return true; } else { System.out.println(instance.getClass()+" '"+fieldName+"' field not assignable with "+value.getClass()+", it's a: "+f.getType()); } } catch (final IllegalAccessException ex) { throw new RuntimeException(ex); } catch (final NoSuchFieldException nsfe) { // OK - throw new RuntimeException(instance.getClass()+" has no '"+fieldName+"' field", nsfe); } return false; } public static class StreamDump extends InterruptSource.Thread { final InputStream is; final StringBuilder outString; final OutputStream outStream; final String prefix; final Object sync; volatile boolean eos = false; public StreamDump(final OutputStream out, final String prefix, final InputStream is, final Object sync) { this.is = is; this.outString = null; this.outStream = out; this.prefix = prefix; this.sync = sync; } public StreamDump(final StringBuilder sb, final String prefix, final InputStream is, final Object sync) { this.is = is; this.outString = sb; this.outStream = null; this.prefix = prefix; this.sync = sync; } public StreamDump(final StringBuilder sb, final InputStream is, final Object sync) { this.is = is; this.outString = sb; this.outStream = null; this.prefix = null; this.sync = sync; } public final boolean eos() { return eos; } @Override public void run() { synchronized ( sync ) { try { final BufferedReader in = new BufferedReader( new InputStreamReader(is) ); String line = null; while ((line = in.readLine()) != null) { if( null != outString ) { outString.append(line).append(Platform.getNewline()); } else if( null != outStream ) { if( null != prefix ) { outStream.write(prefix.getBytes()); } outStream.write(line.getBytes()); outStream.write(Platform.getNewline().getBytes()); outStream.flush(); } } } catch (final IOException ioe) { System.err.println("Caught "+ioe.getClass().getName()+": "+ioe.getMessage()); ioe.printStackTrace(); } finally { eos = true; sync.notifyAll(); } } } } public static void dumpSharedGLContext(final String prefix, final GLContext self) { int i = 0, j = 0; final GLContext master = self.getSharedMaster(); final int masterHash = null != master ? master.hashCode() : 0; System.err.println(prefix+": hash 0x"+Integer.toHexString(self.hashCode())+", \t(isShared "+self.isShared()+", created "+self.isCreated()+", master 0x"+Integer.toHexString(masterHash)+")"); { final List<GLContext> set = self.getCreatedShares(); for (final Iterator<GLContext> iter = set.iterator(); iter.hasNext(); ) { final GLContext c = iter.next(); System.err.println(" Created Ctx #"+(i++)+": hash 0x"+Integer.toHexString(c.hashCode())+", \t(created "+c.isCreated()+")"); } } { final List<GLContext> set = self.getDestroyedShares(); for (final Iterator<GLContext> iter = set.iterator(); iter.hasNext(); ) { final GLContext c = iter.next(); System.err.println(" Destroyed Ctx #"+(j++)+": hash 0x"+Integer.toHexString(c.hashCode())+", \t(created "+c.isCreated()+")"); } } System.err.println("\t Total created "+i+" + destroyed "+j+" = "+(i+j)); System.err.println(); } }