From: <dm...@us...> - 2010-09-17 11:22:36
|
Revision: 3578 http://bigdata.svn.sourceforge.net/bigdata/?rev=3578&view=rev Author: dmacgbr Date: 2010-09-17 11:22:28 +0000 (Fri, 17 Sep 2010) Log Message: ----------- Add some unit tests Modified Paths: -------------- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/ArrayBindingSet.java branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/HashBindingSet.java branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/solutions/MemorySortOp.java branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestAll.java branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/solutions/TestMemorySortOp.java Added Paths: ----------- branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestArrayBindingSet.java branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestHashBindingSet.java branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestIBindingSet.java Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/ArrayBindingSet.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/ArrayBindingSet.java 2010-09-17 10:44:01 UTC (rev 3577) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/ArrayBindingSet.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -435,10 +435,8 @@ for(int i=0; i<nbound; i++) { -// if (!o.isBound(vars[i])) -// return false; - - if (!vals[i].equals(o.get(vars[i]))) + IConstant<?> o_val = o.get ( vars [ i ] ) ; + if ( null == o_val || !vals[i].equals( o_val )) return false; } Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/HashBindingSet.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/HashBindingSet.java 2010-09-17 10:44:01 UTC (rev 3577) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/HashBindingSet.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -283,8 +283,8 @@ // if (!o.isBound(vars[i])) // return false; - - if (!val.equals(o.get(var))) + IConstant<?> o_val = o.get ( var ) ; + if (null == o_val || !val.equals(o_val)) return false; } Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/solutions/MemorySortOp.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/solutions/MemorySortOp.java 2010-09-17 10:44:01 UTC (rev 3577) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/solutions/MemorySortOp.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -88,10 +88,6 @@ // sort. Arrays.sort(all, comparator); - // update counters. - stats.unitsOut.add(all.length); - stats.chunksOut.increment(); - // write output and flush. sink.add(all); sink.flush(); Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestAll.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestAll.java 2010-09-17 10:44:01 UTC (rev 3577) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestAll.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -65,7 +65,8 @@ suite.addTestSuite(TestConstant.class); // test binding set impls. - suite.addTestSuite(TestBindingSet.class); + suite.addTestSuite(TestArrayBindingSet.class); + suite.addTestSuite(TestHashBindingSet.class); // unit tests for ctor existence and deep copy semantics suite.addTestSuite(TestDeepCopy.class); Added: branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestArrayBindingSet.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestArrayBindingSet.java (rev 0) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestArrayBindingSet.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -0,0 +1,110 @@ +/* + +Copyright (C) SYSTAP, LLC 2006-2008. All rights reserved. + +Contact: + SYSTAP, LLC + 4501 Tower Road + Greensboro, NC 27410 + lic...@bi... + +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; version 2 of the License. + +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 + +*/ +/* + * Created on Jun 19, 2008 + */ + +package com.bigdata.bop; + + +/** + * Unit tests for {@link ArrayBindingSet}. + * + * Note: + * a) these tests assume that the values held for a given key are not cloned, + * i.e. comparison is done by '==' and not '.equals' + * b) keys with the same 'name' are a unique object. + * + * @author <a href="mailto:dm...@us...">David MacMillan</a> + * @version $Id$ + */ +public class TestArrayBindingSet extends TestIBindingSet +{ + /** + * + */ + public TestArrayBindingSet () {} + + /** + * @param name + */ + public TestArrayBindingSet ( String name ) { super ( name ) ; } + + /** + * Unit test for {@link ArrayBindingSet#ArrayBindingSet(ArrayBindingSet)} + */ + public void testConstructorArrayBindingSet () + { + try { assertTrue ( null != new ArrayBindingSet ( null ) ) ; fail ( "IllegalArgumentException expected, copy from was null" ) ; } + catch ( IllegalArgumentException e ) {} + + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + IVariable<?> vars [] = new IVariable [] { var1, var2 } ; + IConstant<?> vals [] = new IConstant [] { val1, val2 } ; + + assertEqual ( new ArrayBindingSet ( new ArrayBindingSet ( vars, vals ) ), vars, vals ) ; + } + + /** + * Unit test for {@link ArrayBindingSet#ArrayBindingSet(IVariable[],IConstant[])} + */ + public void testConstructorVariablesConstants () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + IVariable<?> vars [] = new IVariable [] { var1, var2 } ; + IConstant<?> vals [] = new IConstant [] { val1, val2 } ; + + try { assertTrue ( null != new ArrayBindingSet ( null, vals ) ) ; fail ( "IllegalArgumentException expected, vars was null" ) ; } + catch ( IllegalArgumentException e ) {} + + try { assertTrue ( null != new ArrayBindingSet ( vars, null ) ) ; fail ( "IllegalArgumentException expected, vals was null" ) ; } + catch ( IllegalArgumentException e ) {} + + try { assertTrue ( null != new ArrayBindingSet ( vars, new IConstant [] { val1 } ) ) ; fail ( "IllegalArgumentException expected, vars and vals were different sizes" ) ; } + catch ( IllegalArgumentException e ) {} + + assertEqual ( new ArrayBindingSet ( vars, vals ), vars, vals ) ; + } + + /** + * Unit test for {@link ArrayBindingSet#ArrayBindingSet(int)} + */ + public void testConstructorInt () + { + try { assertTrue ( null != new ArrayBindingSet ( -1 ) ) ; fail ( "IllegalArgumentException expected, capacity was negative" ) ; } + catch ( IllegalArgumentException e ) {} + + assertEqual ( new ArrayBindingSet ( 2 ), new IVariable [] {}, new IConstant [] {} ) ; + } + + @Override protected IBindingSet newBindingSet ( IVariable<?> vars [], IConstant<?> vals [] ) { return new ArrayBindingSet ( vars, vals ) ; } + @Override protected IBindingSet newBindingSet ( int size ) { return new ArrayBindingSet ( size ) ; } +} \ No newline at end of file Added: branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestHashBindingSet.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestHashBindingSet.java (rev 0) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestHashBindingSet.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -0,0 +1,128 @@ +/* + +Copyright (C) SYSTAP, LLC 2006-2008. All rights reserved. + +Contact: + SYSTAP, LLC + 4501 Tower Road + Greensboro, NC 27410 + lic...@bi... + +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; version 2 of the License. + +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 + +*/ +/* + * Created on Jun 19, 2008 + */ + +package com.bigdata.bop; + + +/** + * Unit tests for {@link HashBindingSet}. + * + * Note: + * a) these tests assume that the values held for a given key are not cloned, + * i.e. comparison is done by '==' and not '.equals' + * b) keys with the same 'name' are a unique object. + * + * @author <a href="mailto:dm...@us...">David MacMillan</a> + * @version $Id$ + */ +public class TestHashBindingSet extends TestIBindingSet +{ + + /** + * + */ + public TestHashBindingSet () {} + + /** + * @param name + */ + public TestHashBindingSet ( String name ) { super ( name ) ; } + + /** + * Unit test for {@link HashBindingSet#HashBindingSet()} + */ + public void testConstructorHashBindingSet () + { + assertTrue ( null != new HashBindingSet () ) ; + } + + /** + * Unit test for {@link HashBindingSet#HashBindingSet(HashBindingSet)} + */ + public void testConstructorHashBindingSetHashBindingSet () + { + // TODO what is our philosophy on argument validation? +// try { assertTrue ( null != new HashBindingSet ( null ) ) ; fail ( "IllegalArgumentException expected, copy from was null" ) ; } +// catch ( IllegalArgumentException e ) {} + + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + IVariable<?> vars [] = new IVariable [] { var1, var2 } ; + IConstant<?> vals [] = new IConstant [] { val1, val2 } ; + + assertEqual ( new HashBindingSet ( new HashBindingSet ( vars, vals ) ), vars, vals ) ; + } + + /** + * Unit test for {@link HashBindingSet#HashBindingSet(IBindingSet)} + */ + public void testConstructorHashBindingSetIBindingSet () + { + // TODO what is our philosophy on argument validation? +// try { assertTrue ( null != new HashBindingSet ( null ) ) ; fail ( "IllegalArgumentException expected, copy from was null" ) ; } +// catch ( IllegalArgumentException e ) {} + + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + IVariable<?> vars [] = new IVariable [] { var1, var2 } ; + IConstant<?> vals [] = new IConstant [] { val1, val2 } ; + + assertEqual ( new HashBindingSet ( new ArrayBindingSet ( vars, vals ) ), vars, vals ) ; + } + + /** + * Unit test for {@link HashBindingSet#HashBindingSet(IVariable[],IConstant[])} + */ + public void testConstructorVariablesConstants () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + IVariable<?> vars [] = new IVariable [] { var1, var2 } ; + IConstant<?> vals [] = new IConstant [] { val1, val2 } ; + + try { assertTrue ( null != new HashBindingSet ( null, vals ) ) ; fail ( "IllegalArgumentException expected, vars was null" ) ; } + catch ( IllegalArgumentException e ) {} + + try { assertTrue ( null != new HashBindingSet ( vars, null ) ) ; fail ( "IllegalArgumentException expected, vals was null" ) ; } + catch ( IllegalArgumentException e ) {} + + try { assertTrue ( null != new HashBindingSet ( vars, new IConstant [] { val1 } ) ) ; fail ( "IllegalArgumentException expected, vars and vals were different sizes" ) ; } + catch ( IllegalArgumentException e ) {} + + assertEqual ( new HashBindingSet ( vars, vals ), vars, vals ) ; + } + + @Override protected IBindingSet newBindingSet ( IVariable<?> vars [], IConstant<?> vals [] ) { return new HashBindingSet ( vars, vals ) ; } + @Override protected IBindingSet newBindingSet ( int size ) { return new HashBindingSet () ; } +} \ No newline at end of file Added: branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestIBindingSet.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestIBindingSet.java (rev 0) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/TestIBindingSet.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -0,0 +1,327 @@ +/* + +Copyright (C) SYSTAP, LLC 2006-2008. All rights reserved. + +Contact: + SYSTAP, LLC + 4501 Tower Road + Greensboro, NC 27410 + lic...@bi... + +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; version 2 of the License. + +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 + +*/ +/* + * Created on Jun 19, 2008 + */ + +package com.bigdata.bop; + +import java.util.Iterator; +import java.util.Map; + +import junit.framework.TestCase2; + +/** + * Unit tests for {@link IBindingSet}. + * + * Note: + * a) these tests assume that the values held for a given key are not cloned, + * i.e. comparison is done by '==' and not '.equals' + * b) keys with the same 'name' are a unique object. + * + * @author <a href="mailto:dm...@us...">David MacMillan</a> + * @version $Id$ + */ +public abstract class TestIBindingSet extends TestCase2 { + + /** + * + */ + public TestIBindingSet () {} + + /** + * @param name + */ + public TestIBindingSet ( String name ) { super ( name ) ; } + + /** + * Unit test for {@link IBindingSet#isBound(IVariable)} + */ + public void testIsBound () + { + Var<?> a = Var.var ( "a" ) ; + Var<?> b = Var.var ( "b" ) ; + Var<?> c = Var.var ( "a" ) ; + + IBindingSet bs = newBindingSet ( new IVariable [] { a }, new IConstant [] { new Constant<Integer> ( 1 ) } ) ; + + assertTrue ( "bound expected, same variable", bs.isBound ( a ) ) ; + assertFalse ( "not bound expected", bs.isBound ( b ) ) ; + assertTrue ( "bound expected, equivalent variable", bs.isBound ( c ) ) ; + } + + /** + * Unit test for {@link IBindingSet#set(IVariable,IConstant)} + */ + public void testSet () + { + Var<?> var = Var.var ( "a" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + + IBindingSet bs = newBindingSet ( 2 ) ; + + try { bs.set ( null, val1 ) ; fail ( "IllegalArgumentException expected, var was null" ) ; } + catch ( IllegalArgumentException e ) {} + + try { bs.set ( var, null ) ; fail ( "IllegalArgumentException expected, val was null" ) ; } + catch ( IllegalArgumentException e ) {} + + bs.set ( var, val1 ) ; + assertTrue ( val1 == bs.get ( var ) ) ; + + bs.set ( var, val2 ) ; + assertTrue ( val2 == bs.get ( var ) ) ; + } + + /** + * Unit test for {@link IBindingSet#get(IVariable)} + */ + public void testGet () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + + IBindingSet bs = newBindingSet ( new IVariable [] { var1 }, new IConstant [] { val1 } ) ; + + try { bs.get ( null ) ; fail ( "IllegalArgumentException expected, var was null" ) ; } + catch ( IllegalArgumentException e ) {} + + assertTrue ( val1 == bs.get ( var1 ) ) ; + assertTrue ( null == bs.get ( var2 ) ) ; + } + + /** + * Unit test for {@link IBindingSet#clear(IVariable)} + */ + public void testClear () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + + IBindingSet bs = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + + try { bs.clear ( null ) ; fail ( "IllegalArgumentException expected, var was null" ) ; } + catch ( IllegalArgumentException e ) {} + + bs.clear ( var1 ) ; + assertTrue ( null == bs.get ( var1 ) ) ; + assertTrue ( val2 == bs.get ( var2 ) ) ; + + bs.clear ( var2 ) ; + assertTrue ( null == bs.get ( var2 ) ) ; + assertTrue ( 0 == bs.size () ) ; + } + + /** + * Unit test for {@link IBindingSet#clearAll()} + */ + public void testClearAll () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + + IBindingSet bs = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + + bs.clearAll () ; + assertTrue ( null == bs.get ( var1 ) ) ; + assertTrue ( null == bs.get ( var2 ) ) ; + assertTrue ( 0 == bs.size () ) ; + } + + /** + * Unit test for {@link IBindingSet#size()} + */ + public void testSize () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + + IBindingSet bs = newBindingSet ( 2 ) ; + + assertTrue ( 0 == bs.size () ) ; + + bs.set ( var1, val1 ) ; + bs.set ( var2, val2 ) ; + assertTrue ( 2 == bs.size () ) ; + + bs.clear ( var2 ) ; + assertTrue ( 1 == bs.size () ) ; + } + + /** + * Unit test for {@link IBindingSet#iterator()} + */ + public void testIterator () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + + IBindingSet bs = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + + int n = 0 ; + for ( Iterator<Map.Entry<IVariable,IConstant>> i = bs.iterator (); i.hasNext (); ) + { + Map.Entry<IVariable,IConstant> e = i.next () ; + IVariable<?> var = e.getKey () ; + + if ( var1 == var ) assertTrue ( "wrong value", val1 == e.getValue () ) ; + else if ( var2 == var ) assertTrue ( "wrong value", val2 == e.getValue () ) ; + else fail ( "unexpected variable: " + var ) ; + + try { i.remove () ; fail ( "UnsupportedOperationException expected, iterator remove" ) ; } + catch ( UnsupportedOperationException ex ) {} + n++ ; + } + assertTrue ( "wrong count", 2 == n ) ; + } + + /** + * Unit test for {@link IBindingSet#vars()} + */ + public void testVars () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + + IBindingSet bs = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + + int n = 0 ; + for ( Iterator<IVariable> i = bs.vars (); i.hasNext (); ) + { + IVariable<?> var = i.next () ; + + if ( var1 != var && var2 != var ) + fail ( "unexpected variable: " + var ) ; + + try { i.remove () ; fail ( "UnsupportedOperationException expected, iterator remove" ) ; } + catch ( UnsupportedOperationException e ) {} + n++ ; + } + assertTrue ( "wrong count", 2 == n ) ; + } + + /** + * Unit test for {@link IBindingSet#copy(IVariable[])} + */ + public void testCopy () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Var<?> var3 = Var.var ( "c" ) ; + Var<?> var4 = Var.var ( "d" ) ; + Var<?> var5 = Var.var ( "e" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + Constant<Integer> val3 = new Constant<Integer> ( 3 ) ; + Constant<Integer> val4 = new Constant<Integer> ( 4 ) ; + Constant<Integer> val5 = new Constant<Integer> ( 5 ) ; + + IBindingSet bs = newBindingSet ( new IVariable [] { var1, var2, var3, var4, var5 } + , new IConstant [] { val1, val2, val3, val4, val5 } + ) ; + + IBindingSet bs2 = bs.copy ( new IVariable [] { var1, var3, var5 } ) ; + + assertTrue ( 3 == bs2.size () ) ; + for ( IVariable<?> v : new IVariable [] { var1, var3, var5 } ) + assertTrue ( bs2.get ( v ).equals ( bs.get ( v ) ) ) ; + } + + /** + * Unit test for {@link IBindingSet#equals(Object)} + */ + public void testEquals () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Var<?> var3 = Var.var ( "c" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + Constant<Integer> val3 = new Constant<Integer> ( 3 ) ; + + IBindingSet bs1 = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + IBindingSet bs2 = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + IBindingSet bs3 = newBindingSet ( new IVariable [] { var2, var1 }, new IConstant [] { val2, val1 } ) ; + IBindingSet bs4 = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val3 } ) ; + IBindingSet bs5 = newBindingSet ( new IVariable [] { var1, var3 }, new IConstant [] { val1, val3 } ) ; + IBindingSet bs6 = newBindingSet ( new IVariable [] { var1, var2, var3 }, new IConstant [] { val1, val2, val3 } ) ; + IBindingSet bs7 = newBindingSet ( new IVariable [] { var1 }, new IConstant [] { val1 } ) ; + + assertTrue ( "expected equal: same bindings, same order", bs1.equals ( bs2 ) ) ; + assertTrue ( "expected equal: same bindings, different order", bs1.equals ( bs3 ) ) ; + assertTrue ( "expected not equal: different value", !bs1.equals ( bs4 ) ) ; + assertTrue ( "expected not equal: different variable", !bs1.equals ( bs5 ) ) ; + assertTrue ( "expected not equal: subsetOf ( this, that )", !bs1.equals ( bs6 ) ) ; + assertTrue ( "expected not equal: subsetOf ( that, this )", !bs1.equals ( bs7 ) ) ; + } + + /** + * Unit test for {@link IBindingSet#hashCode()} + */ + public void testHashCode () + { + Var<?> var1 = Var.var ( "a" ) ; + Var<?> var2 = Var.var ( "b" ) ; + Constant<Integer> val1 = new Constant<Integer> ( 1 ) ; + Constant<Integer> val2 = new Constant<Integer> ( 2 ) ; + + IBindingSet bs1 = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + IBindingSet bs2 = newBindingSet ( new IVariable [] { var1, var2 }, new IConstant [] { val1, val2 } ) ; + IBindingSet bs3 = newBindingSet ( new IVariable [] { var2, var1 }, new IConstant [] { val2, val1 } ) ; + IBindingSet bs4 = newBindingSet ( new IVariable [] { var2 }, new IConstant [] { val2 } ) ; + + assertTrue ( "expected equal: same bindings, same order", bs1.hashCode () == bs2.hashCode () ) ; + assertTrue ( "expected equal: same bindings, different order", bs1.hashCode () == bs3.hashCode () ) ; + + // + // After mutation. Not sure that this really proves anything, although in most cases I guess that + // the original value of bs1.hasCode () will not equal the subsequent value or that of bs4.hashCode () + // + bs1.clear ( var1 ) ; + assertTrue ( "expected equal: same bindings after mutation", bs1.hashCode () == bs4.hashCode () ) ; + } + + protected abstract IBindingSet newBindingSet ( IVariable<?> vars [], IConstant<?> vals [] ) ; + protected abstract IBindingSet newBindingSet ( int size ) ; + + protected void assertEqual ( IBindingSet actual, IVariable<?> vars [], IConstant<?> vals [] ) + { + assertTrue ( "wrong size", actual.size () == vars.length ) ; + for ( int i = 0; i < vars.length; i++ ) + assertTrue ( "wrong value", vals [ i ] == actual.get ( vars [ i ] ) ) ; + } +} \ No newline at end of file Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/solutions/TestMemorySortOp.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/solutions/TestMemorySortOp.java 2010-09-17 10:44:01 UTC (rev 3577) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/bop/solutions/TestMemorySortOp.java 2010-09-17 11:22:28 UTC (rev 3578) @@ -27,11 +27,24 @@ package com.bigdata.bop.solutions; -import com.bigdata.bop.solutions.ISortOrder; -import com.bigdata.bop.solutions.MemorySortOp; - import junit.framework.TestCase2; +import com.bigdata.bop.ArrayBindingSet; +import com.bigdata.bop.BOp; +import com.bigdata.bop.BOpContext; +import com.bigdata.bop.Constant; +import com.bigdata.bop.IBindingSet; +import com.bigdata.bop.IConstant; +import com.bigdata.bop.IVariable; +import com.bigdata.bop.NV; +import com.bigdata.bop.Var; +import com.bigdata.bop.engine.BOpStats; +import com.bigdata.bop.engine.MockRunningQuery; +import com.bigdata.bop.engine.TestQueryEngine; +import com.bigdata.relation.accesspath.IAsynchronousIterator; +import com.bigdata.relation.accesspath.IBlockingBuffer; +import com.bigdata.relation.accesspath.ThickAsynchronousIterator; + /** * Unit tests for the {@link MemorySortOp}. * @@ -43,26 +56,137 @@ /** * */ - public TestMemorySortOp() { - } + public TestMemorySortOp () {} /** * @param name */ - public TestMemorySortOp(String name) { - super(name); + public TestMemorySortOp ( String name ) + { + super ( name ) ; } - /** - * @todo unit tests for the in-memory sort operator. These tests should not - * focus on SPARQL semantics. Instead, just test the ability to impose - * the appropriate {@link ISortOrder}[] on some in-memory binding - * sets. - */ - public void test_something() { + public void testEval () + { + IVariable<?> x = Var.var ( "x" ) ; + IVariable<?> y = Var.var ( "y" ) ; + IConstant<String> a = new Constant<String> ( "a" ) ; + IConstant<String> b = new Constant<String> ( "b" ) ; + IConstant<String> c = new Constant<String> ( "c" ) ; + IConstant<String> d = new Constant<String> ( "d" ) ; + IConstant<String> e = new Constant<String> ( "e" ) ; - fail("write tests"); + ISortOrder<?> sors [] = new ISortOrder [] { new SortOrder ( x, true ), new SortOrder ( y, false ) } ; + + SortOp query = new MemorySortOp ( new BOp [] {} + , NV.asMap ( new NV [] { new NV ( MemorySortOp.Annotations.BOP_ID, 1 ) + , new NV ( MemorySortOp.Annotations.COMPARATOR, new StringComparatorOp ( sors ) ) + } + ) + ) ; + + // + // the test data + // + IBindingSet data [] = new IBindingSet [] + { + new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { a, a } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { a, e } ) + , new ArrayBindingSet ( new IVariable<?> [] { x }, new IConstant [] { c } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { d, a } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { d, b } ) + , new ArrayBindingSet ( new IVariable<?> [] {}, new IConstant [] {} ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { a, c } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { b, d } ) + , new ArrayBindingSet ( new IVariable<?> [] { y }, new IConstant [] { a } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { b, b } ) + } ; + + // + // the expected solutions + // + IBindingSet expected [] = new IBindingSet [] + { + new ArrayBindingSet ( new IVariable<?> [] { y }, new IConstant [] { a } ) + , new ArrayBindingSet ( new IVariable<?> [] {}, new IConstant [] {} ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { a, e } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { a, c } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { a, a } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { b, d } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { b, b } ) + , new ArrayBindingSet ( new IVariable<?> [] { x }, new IConstant [] { c } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { d, b } ) + , new ArrayBindingSet ( new IVariable<?> [] { x, y }, new IConstant [] { d, a } ) + } ; + + BOpStats stats = query.newStats () ; + + IAsynchronousIterator<IBindingSet[]> source = new ThickAsynchronousIterator<IBindingSet[]> ( new IBindingSet [][] { data } ) ; + + IBlockingBuffer<IBindingSet[]> sink = query.newBuffer ( stats ) ; + + BOpContext<IBindingSet> context = new BOpContext<IBindingSet> ( new MockRunningQuery ( null/* fed */ + , null/* indexManager */ + ) + , -1/* partitionId */ + , stats + , source + , sink + , null/* sink2 */ + ) ; + + query.eval ( context ).run () ; + + TestQueryEngine.assertSameSolutions ( expected, sink.iterator () ) ; + + assertEquals ( 1, stats.chunksIn.get () ) ; + assertEquals ( 10, stats.unitsIn.get () ) ; + assertEquals ( 10, stats.unitsOut.get () ) ; + assertEquals ( 1, stats.chunksOut.get () ) ; + } + + /////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + @SuppressWarnings("serial") + private class StringComparatorOp extends ComparatorOp + { + public StringComparatorOp ( ISortOrder<?> sors [] ) + { + super ( new BOp [] {}, NV.asMap ( new NV [] { new NV ( ComparatorOp.Annotations.ORDER, sors ) } ) ) ; + _sors = sors ; + } + + public int compare ( IBindingSet o1, IBindingSet o2 ) + { + for ( ISortOrder<?> sor : _sors ) + { + int ret = compare ( sor, o1, o2 ) ; + if ( 0 != ret ) + return ret ; + } + return 0 ; + } + + private int compare ( ISortOrder<?> sor, IBindingSet lhs, IBindingSet rhs ) + { + int compare = 0 ; + + IConstant<?> lhsv = lhs.get ( sor.getVariable () ) ; + IConstant<?> rhsv = rhs.get ( sor.getVariable () ) ; + + if ( null == lhsv && null == rhsv ) + return 0 ; + else if ( null == lhsv ) + compare = -1 ; + else if ( null == rhsv ) + compare = 1 ; + else + compare = lhsv.toString ().compareTo ( rhsv.toString () ) ; + + return compare * ( sor.isAscending () ? 1 : -1 ) ; + } + private ISortOrder<?> [] _sors = null ; } - -} +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |