1   package uba.db;
2   
3   import junit.framework.TestCase;
4   import uba.db.column.CharColumnSpecification;
5   import uba.db.column.ColumnConstraint;
6   import uba.db.column.IntegerColumnSpecification;
7   import uba.db.table.Row;
8   import uba.db.table.Table;
9   import uba.db.table.TableSchema;
10  import uba.db.table.TableSchemaBuilder;
11  import uba.db.table.io.TableReader;
12  
13  /***
14   * @version $Revision: 1.5 $
15   */
16  public abstract class TableReaderImplTest extends TestCase {
17      private Table emptyTable;
18      private Table employeeTable;
19      private Object[] testRowValues;
20  
21      /***
22       * Las sub-clases deben implementar este método para retorna la instancia
23       * concreta de {@link Table} a testear.
24       * 
25       * @param schema esquema que debe tener la tabla
26       *
27       * @throws Exception si no se pudo crear la tabla.
28       */
29      protected abstract Table createTable(TableSchema schema) throws Exception;
30  
31      /***
32       * @see junit.framework.TestCase#setUp()
33       */
34      protected void setUp() throws Exception {
35          super.setUp();
36  
37          testRowValues = new Object[] {
38                  new Object[] { new Integer(1), "Juan", new Integer(2000), new Integer(30) },
39                  new Object[] { new Integer(2), "Carlos", new Integer(2590),
40                          new Integer(28) },
41                  new Object[] { new Integer(3), "Menenedez", new Integer(500),
42                          new Integer(23) } };
43          createEmptyTable();
44          createEmployeeTable();
45      }
46  
47      private void createEmployeeTable() throws Exception {
48          TableSchema schema = new TableSchemaBuilder("Empleado")
49                  .addColumn(new IntegerColumnSpecification("eid"))
50                  .addColumn(new CharColumnSpecification("nombre", 20,
51                          ColumnConstraint.NOT_NULL))
52                  .addColumn(new IntegerColumnSpecification("salario",
53                          ColumnConstraint.NOT_NULL))
54                  .addColumn(new IntegerColumnSpecification("edad",
55                          ColumnConstraint.NOT_NULL)).addPrimaryKeyConstraintTo("eid")
56                  .build();
57          employeeTable = createTable(schema);
58  
59          employeeTable.insert((Object[]) testRowValues[0]);
60          employeeTable.insert((Object[]) testRowValues[1]);
61          employeeTable.insert((Object[]) testRowValues[2]);
62      }
63  
64      private void createEmptyTable() throws Exception {
65          TableSchema schema = new TableSchemaBuilder("vacia")
66                  .addColumn(new IntegerColumnSpecification("id")).build();
67  
68          emptyTable = createTable(schema);
69      }
70  
71      /***
72       * Test: cuando se hace {@link TableReader#hasMoreRows()} en una tabla vacía
73       * se debe retornar false.
74       */
75      public void testHasMoreRowsWhenEmpty() {
76          assertFalse(emptyTable.reader().hasMoreRows());
77      }
78  
79      /***
80       * Test: obtener las filas de una tabla.
81       */
82      public void testFetchRows() {
83          TableReader reader = employeeTable.reader();
84          for (int i = 0; reader.hasMoreRows(); i++) {
85              assertRowContainsValues(testRowValues[i], reader.fetchRow());
86          }
87          reader.close();
88      }
89  
90      private void assertRowContainsValues(Object value, Row row) {
91          Object[] array = (Object[]) value;
92          assertEquals(array.length, row.table().numberOfColumns());
93          for (int i = 0; i < array.length; i++) {
94              assertEquals(array[i], row.valueAt(i));
95          }
96      }
97  }