// Path: src/main/java/com/exxeleron/qjava/QKeyedTable.java
// public class KeyValuePair {
// 
//     private int index;
// 
//     KeyValuePair(final int index) {
//         this.index = index;
//     }
// 
//     /**
//      * Returns index of the row.
//      * 
//      * @return {@link int}
//      */
//     public int getRowIndex() {
//         return index;
//     }
// 
//     /**
//      * Moves the row view to new index.
//      * 
//      * @param index
//      *            the index to set
//      */
//     public void setRowIndex( final int index ) {
//         if ( index < 0 || index > getRowsCount() ) {
//             throw new IndexOutOfBoundsException();
//         }
//         this.index = index;
//     }
// 
//     /**
//      * Returns key from given pair.
//      * 
//      * @return key
//      */
//     public QTable.Row getKey() {
//         return keys.get(index);
//     }
// 
//     /**
//      * Returns value from given pair.
//      * 
//      * @return value
//      */
//     public QTable.Row getValue() {
//         return values.get(index);
//     }
// }
// 
// Path: src/main/java/com/exxeleron/qjava/QTable.java
// public class Row implements Iterable<Object> {
// 
//     private int rowIndex;
// 
//     /**
//      * Creates row view for row with given index.
//      * 
//      * @param rowIndex
//      *            index of the row
//      */
//     Row(final int rowIndex) {
//         setRowIndex(rowIndex);
//     }
// 
//     /**
//      * Returns index of the row.
//      * 
//      * @return {@link int}
//      */
//     public int getRowIndex() {
//         return rowIndex;
//     }
// 
//     /**
//      * Moves the row view to new index.
//      * 
//      * @param rowIndex
//      *            the rowIndex to set
//      */
//     public void setRowIndex( final int rowIndex ) {
//         if ( rowIndex < 0 || rowIndex > rowsCount ) {
//             throw new IndexOutOfBoundsException();
//         }
//         this.rowIndex = rowIndex;
//     }
// 
//     /**
//      * Creates a copy of entire row and returns it as an {@link Object} array.
//      * 
//      * @return {@link Object}[] with copy of entire row
//      */
//     public Object[] toArray() {
//         final int length = getLength();
//         final Object[] row = new Object[length];
// 
//         for ( int i = 0; i < length; i++ ) {
//             row[i] = get(i);
//         }
// 
//         return row;
//     }
// 
//     /**
//      * Returns number of columns in the current {@link QTable}.
//      * 
//      * @return number of columns
//      */
//     public int getLength() {
//         return columns.length;
//     }
// 
//     /**
//      * Gets an object stored under specific index.
//      * 
//      * @param index
//      *            0 based index
//      * @return object
//      */
//     public Object get( final int index ) {
//         return Array.get(data[index], rowIndex);
//     }
// 
//     /**
//      * Sets an object stored under specific index.
//      * 
//      * @param index
//      *            0 based index
//      * @param value
//      *            value to be set
//      */
//     public void set( final int index, final Object value ) {
//         Array.set(data[index], rowIndex, value);
//     }
// 
//     @Override
//     public String toString() {
//         return Utils.arrayToString(columns) + "!" + Utils.arrayToString(toArray());
//     }
// 
//     /**
//      * <p>
//      * Returns an iterator over columns in a particular row in the table.
//      * </p>
//      * 
//      * <p>
//      * Note that the iterator returned by this method will throw an {@link UnsupportedOperationException} in
//      * response to its <code>remove</code> method.
//      * </p>
//      * 
//      * @see java.lang.Iterable#iterator()
//      */
//     public Iterator<Object> iterator() {
//         return new Iterator<Object>() {
// 
//             int index = 0;
// 
//             public boolean hasNext() {
//                 return index < getLength();
//             }
// 
//             public Object next() {
//                 if ( hasNext() ) {
//                     return Array.get(data[index++], rowIndex);
//                 } else {
//                     throw new NoSuchElementException();
//                 }
//             }
// 
//             public void remove() {
//                 throw new UnsupportedOperationException();
//             }
//         };
//     }
// 
// }


import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.reflect.Array;
import java.util.Iterator;
import org.junit.Test;
import com.exxeleron.qjava.QKeyedTable.KeyValuePair;
import com.exxeleron.qjava.QTable.Row;

        assertEquals(t.getRowsCount(), i);
    }

    @Test
    public void testQKeyedTable() {
        final QKeyedTable t = new QKeyedTable(getTestTable(), getTestTable(new String[] { "ff", "ii", "s" }));

        assertEquals(t, t);
        assertEquals(t.getKeys(), getTestTable());
        assertEquals(t.getValues(), getTestTable(new String[] { "ff", "ii", "s" }));

        assertTrue(t.hasColumn("f"));
        assertTrue(t.hasColumn("ff"));
        assertFalse(t.hasColumn("unknown"));
        
        assertEquals(0, t.getColumnIndex("f"));
        assertEquals(3, t.getColumnIndex("ff"));
        assertEquals(2, t.getColumnIndex("s"));
        
        try {
            t.getColumnIndex("unknown");
            fail("NullPointerException was expected");
        } catch ( NullPointerException e ) {
            assertTrue(true);
        } catch ( Exception e ) {
            fail("NullPointerException was expected");
        }

        int i = 0;
// Path: src/main/java/com/exxeleron/qjava/QKeyedTable.java
// public class KeyValuePair {
// 
//     private int index;
// 
//     KeyValuePair(final int index) {
//         this.index = index;
//     }
// 
//     /**
//      * Returns index of the row.
//      * 
//      * @return {@link int}
//      */
//     public int getRowIndex() {
//         return index;
//     }
// 
//     /**
//      * Moves the row view to new index.
//      * 
//      * @param index
//      *            the index to set
//      */
//     public void setRowIndex( final int index ) {
//         if ( index < 0 || index > getRowsCount() ) {
//             throw new IndexOutOfBoundsException();
//         }
//         this.index = index;
//     }
// 
//     /**
//      * Returns key from given pair.
//      * 
//      * @return key
//      */
//     public QTable.Row getKey() {
//         return keys.get(index);
//     }
// 
//     /**
//      * Returns value from given pair.
//      * 
//      * @return value
//      */
//     public QTable.Row getValue() {
//         return values.get(index);
//     }
// }
// 
// Path: src/main/java/com/exxeleron/qjava/QTable.java
// public class Row implements Iterable<Object> {
// 
//     private int rowIndex;
// 
//     /**
//      * Creates row view for row with given index.
//      * 
//      * @param rowIndex
//      *            index of the row
//      */
//     Row(final int rowIndex) {
//         setRowIndex(rowIndex);
//     }
// 
//     /**
//      * Returns index of the row.
//      * 
//      * @return {@link int}
//      */
//     public int getRowIndex() {
//         return rowIndex;
//     }
// 
//     /**
//      * Moves the row view to new index.
//      * 
//      * @param rowIndex
//      *            the rowIndex to set
//      */
//     public void setRowIndex( final int rowIndex ) {
//         if ( rowIndex < 0 || rowIndex > rowsCount ) {
//             throw new IndexOutOfBoundsException();
//         }
//         this.rowIndex = rowIndex;
//     }
// 
//     /**
//      * Creates a copy of entire row and returns it as an {@link Object} array.
//      * 
//      * @return {@link Object}[] with copy of entire row
//      */
//     public Object[] toArray() {
//         final int length = getLength();
//         final Object[] row = new Object[length];
// 
//         for ( int i = 0; i < length; i++ ) {
//             row[i] = get(i);
//         }
// 
//         return row;
//     }
// 
//     /**
//      * Returns number of columns in the current {@link QTable}.
//      * 
//      * @return number of columns
//      */
//     public int getLength() {
//         return columns.length;
//     }
// 
//     /**
//      * Gets an object stored under specific index.
//      * 
//      * @param index
//      *            0 based index
//      * @return object
//      */
//     public Object get( final int index ) {
//         return Array.get(data[index], rowIndex);
//     }
// 
//     /**
//      * Sets an object stored under specific index.
//      * 
//      * @param index
//      *            0 based index
//      * @param value
//      *            value to be set
//      */
//     public void set( final int index, final Object value ) {
//         Array.set(data[index], rowIndex, value);
//     }
// 
//     @Override
//     public String toString() {
//         return Utils.arrayToString(columns) + "!" + Utils.arrayToString(toArray());
//     }
// 
//     /**
//      * <p>
//      * Returns an iterator over columns in a particular row in the table.
//      * </p>
//      * 
//      * <p>
//      * Note that the iterator returned by this method will throw an {@link UnsupportedOperationException} in
//      * response to its <code>remove</code> method.
//      * </p>
//      * 
//      * @see java.lang.Iterable#iterator()
//      */
//     public Iterator<Object> iterator() {
//         return new Iterator<Object>() {
// 
//             int index = 0;
// 
//             public boolean hasNext() {
//                 return index < getLength();
//             }
// 
//             public Object next() {
//                 if ( hasNext() ) {
//                     return Array.get(data[index++], rowIndex);
//                 } else {
//                     throw new NoSuchElementException();
//                 }
//             }
// 
//             public void remove() {
//                 throw new UnsupportedOperationException();
//             }
//         };
//     }
// 
// }


// Path: src/test/java/com/exxeleron/qjava/TestCollections.java
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.reflect.Array;
import java.util.Iterator;
import org.junit.Test;
import com.exxeleron.qjava.QKeyedTable.KeyValuePair;
import com.exxeleron.qjava.QTable.Row;


        assertEquals(t.getRowsCount(), i);
    }

    @Test
    public void testQKeyedTable() {
        final QKeyedTable t = new QKeyedTable(getTestTable(), getTestTable(new String[] { "ff", "ii", "s" }));

        assertEquals(t, t);
        assertEquals(t.getKeys(), getTestTable());
        assertEquals(t.getValues(), getTestTable(new String[] { "ff", "ii", "s" }));

        assertTrue(t.hasColumn("f"));
        assertTrue(t.hasColumn("ff"));
        assertFalse(t.hasColumn("unknown"));
        
        assertEquals(0, t.getColumnIndex("f"));
        assertEquals(3, t.getColumnIndex("ff"));
        assertEquals(2, t.getColumnIndex("s"));
        
        try {
            t.getColumnIndex("unknown");
            fail("NullPointerException was expected");
        } catch ( NullPointerException e ) {
            assertTrue(true);
        } catch ( Exception e ) {
            fail("NullPointerException was expected");
        }

        int i = 0;
        final Iterator<KeyValuePair> it = t.iterator();