@Test
public void testInit_IndexTableDoesNotExist() throws Exception{

    ConnectionManager connectionManager = mock(ConnectionManager.class);
    Connection connection = mock(Connection.class);
    Statement statement = mock(Statement.class);
    PreparedStatement preparedStatement = mock(PreparedStatement.class);
    java.sql.ResultSet tableCheckRs = mock(java.sql.ResultSet.class);
    java.sql.ResultSet journalModeRs = mock(java.sql.ResultSet.class);
    java.sql.ResultSet synchronousRs = mock(java.sql.ResultSet.class);
    when(tableCheckRs.next()).thenReturn(false); // <- simulates table does not already exist
    when(journalModeRs.next()).thenReturn(true).thenReturn(false);
    when(synchronousRs.next()).thenReturn(true).thenReturn(false);
    when(journalModeRs.getString(1)).thenReturn("DELETE");
    when(synchronousRs.getInt(1)).thenReturn(2);
    when(statement.executeQuery("SELECT 1 FROM sqlite_master WHERE type='table' AND name='cqtbl_features';")).thenReturn(tableCheckRs);
    when(statement.executeQuery("PRAGMA journal_mode;")).thenReturn(journalModeRs);
    when(statement.executeQuery("PRAGMA synchronous;")).thenReturn(synchronousRs);
    when(connection.prepareStatement("INSERT OR IGNORE INTO " + TABLE_NAME + " values(?, ?);")).thenReturn(preparedStatement);
    when(connectionManager.getConnection(any(SQLiteIndex.class), anyQueryOptions())).thenReturn(connection);
    when(connectionManager.isApplyUpdateForIndexEnabled(any(SQLiteIndex.class))).thenReturn(true);
    when(connection.createStatement()).thenReturn(statement);
    when(preparedStatement.executeBatch()).thenReturn(new int[] {2});
    // The objects to add
    Set<Car> initWithObjects = new HashSet<Car>(2);
    initWithObjects.add(new Car(1, "Ford", "Focus", Car.Color.BLUE, 5, 9000.50, Arrays.asList("abs", "gps"), Collections.emptyList()));
    initWithObjects.add(new Car(2, "Honda", "Civic", Car.Color.RED, 5, 5000.00, Arrays.asList("airbags"), Collections.emptyList()));
    SQLiteIndex<String, Car, Integer> carFeaturesOffHeapIndex = new SQLiteIndex<String, Car, Integer>(
            Car.FEATURES,
            OBJECT_TO_ID,
            ID_TO_OBJECT,
            ""
    );
    carFeaturesOffHeapIndex.init(wrappingObjectStore(initWithObjects), createQueryOptions(connectionManager));
    // Verify
    verify(statement, times(1)).executeQuery("PRAGMA journal_mode;");
    verify(statement, times(1)).executeQuery("PRAGMA synchronous;");
    verify(statement, times(1)).executeUpdate("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (objectKey INTEGER, value TEXT, PRIMARY KEY (objectKey, value)) WITHOUT ROWID;");
    verify(statement, times(1)).executeUpdate("CREATE INDEX IF NOT EXISTS " + INDEX_NAME + " ON " + TABLE_NAME + " (value);");
    verify(statement, times(6)).close();
    verify(preparedStatement, times(2)).setObject(1, 1);
    verify(preparedStatement, times(1)).setObject(1, 2);
    verify(preparedStatement, times(1)).setObject(2, "abs");
    verify(preparedStatement, times(1)).setObject(2, "gps");
    verify(preparedStatement, times(1)).setObject(2, "airbags");
    verify(preparedStatement, times(3)).addBatch();
    verify(preparedStatement, times(1)).executeBatch();
    verify(preparedStatement, times(1)).close();
    verify(connection, times(0)).close();
    Assert.assertEquals(carFeaturesOffHeapIndex.pragmaSynchronous, SQLiteConfig.SynchronousMode.FULL);
    Assert.assertEquals(carFeaturesOffHeapIndex.pragmaJournalMode, SQLiteConfig.JournalMode.DELETE);
    Assert.assertTrue(carFeaturesOffHeapIndex.canModifySyncAndJournaling);
}