content: /*
   * CDDL HEADER START
   *
   * The contents of this file are subject to the terms of the Common Development
   * and Distribution License (the "License").
   * You may not use this file except in compliance with the License.
   *
   * You can obtain a copy of the license at
   * src/com/vodafone360/people/VODAFONE.LICENSE.txt or
   * http://github.com/360/360-Engine-for-Android
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   * When distributing Covered Code, include this CDDL HEADER in each file and
   * include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
   * If applicable, add the following below this CDDL HEADER, with the fields
   * enclosed by brackets "[]" replaced with your own identifying information:
   * Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   *
   * Copyright 2010 Vodafone Sales & Services Ltd.  All rights reserved.
   * Use is subject to license terms.
   */
  
  package com.vodafone360.people.tests.database;
  
  import java.util.ArrayList;
  import java.util.Random;
  
  import android.database.SQLException;
  import android.util.Log;
  
  import com.vodafone360.people.database.tables.ContactGroupsTable;
  import com.vodafone360.people.datatypes.Contact;
  import com.vodafone360.people.service.ServiceStatus;
  
  public abstract class ContactGroupsTableTest extends NowPlusTableTestCase {
  	private static final String LOG_TAG = "ContactGroupsTableTest";
  	
  	private final Long[][] testTable = { {1L,2L}, {13L,21L}, {31L,22L}, {1L,23L},
  								   {12L,21L}, {21L,52L}, {31L,92L}, {1L,25L},
  								   {12L,22L}, {21L,26L}, {41L,28L}, {1L,23L},
  								   {12L,23L}, {21L,28L}, {51L,24L}, {1L,26L} };
  	
  	public ContactGroupsTableTest() {
  		super();
  	}
  	
  	private ArrayList<Long> getUniqueIdListFromTestTable(){
  		ArrayList<Long> list = new ArrayList<Long>();
  		
  		for(int i=0; i<testTable.length;i++){
  			if( !list.contains(testTable[i][0]) ){
  				list.add(testTable[i][0]);
  			}
  		}
  		
  		return list;
  	}
  	
  	private ArrayList<Long> getEntriesWithId(Long id){
  		ArrayList<Long> ret = new ArrayList<Long>();
  		for(int i=0;i<testTable.length;i++){
  			if(testTable[i][0].equals(id)){
  				ret.add(testTable[i][1]);
  			}
  		}
  		return ret;
  	}
  	
  	private int countEntriesWithId(Long id){
  		int ret = 0;
  		for(int i=0;i<testTable.length;i++){
  			if(testTable[i][0].equals(id)){
  				ret++;
  			}
  		}
  		return ret;
  	}
  	
  	/**
  	 * creates table that will be tested in this suite
  	 */
  	private void createTable() {
  		try {
  			ContactGroupsTable.create( mTestDatabase.getWritableDatabase());
  		} catch (SQLException e) {
  			fail("An exception occurred when creating the table: " + e);
  		}
  	}
  	
  	public void testCreateGroupsTable(){
  		Log.i(LOG_TAG, "testCreateGroupsTable start");
  		try{
  			createTable();
  		}catch (Exception e) {
  			fail("An exception occurred when testCreate: " + e);
  		}
  		Log.i(LOG_TAG, "testCreateGroupsTable PASS");
  	}
  	
  	public void testAddContactsToGroups(){
  		Log.i(LOG_TAG, "testAddContactsToGroups start");
  		createTable();
  		for(int i=0; i<testTable.length;i++){
  			assertTrue("Failed adding contact to group at step "+i, 
  					ContactGroupsTable.addContactToGroup(testTable[i][0], testTable[i][1], mTestDatabase.getWritableDatabase()) );
  		}
  		ArrayList<Long> list = getUniqueIdListFromTestTable();
  		ArrayList<Long> testList = new ArrayList<Long>(); 
  		for(Long l:list){
  			testList.clear();
  			assertTrue("Failed fetching contact groups for id "+l, 
  			ContactGroupsTable.fetchContactGroups(l, testList, mTestDatabase.getWritableDatabase()) );
  			if(testList.size()!=countEntriesWithId(l)){
  				fail("In and Out table are different");
  			}
  			ArrayList<Long> compareList = getEntriesWithId(l);
  			if(!testList.containsAll(compareList)|| !compareList.containsAll(testList)){
  				fail("Collection of IDs aren't the same");
  			}
  		}
  		
  		//deleting contacts from groups
  		ArrayList<Long> groupList = null;
  		Long ContactId = null;
  		for(Long l: list){
  			groupList = getEntriesWithId(l);
  			if(groupList.size()>1){
  				ContactId = l;
  				break;
  			}
  		}
  		if(ContactId == null){
  			fail("Test data does not containg user with more than one group.");
  		}
  		testList.clear();
  		assertTrue("Failed deleteContactFromGroup", 
  				ContactGroupsTable.deleteContactFromGroup(ContactId, groupList.get(0), mTestDatabase.getWritableDatabase() ));
  		assertTrue("Failed fetchContactGroups after deleteContactFromGroup",
  				ContactGroupsTable.fetchContactGroups(ContactId, testList, mTestDatabase.getWritableDatabase()) );
  		if(testList.contains(groupList.get(0))){
  			fail("Database contains contact for group relation which has been deleted");
  		}
  		
  		//deleting contacts
  		testList.clear();
  		Long id = list.get(0);
  		assertTrue("Failed deleteContact",
  				ContactGroupsTable.deleteContact(id, mTestDatabase.getWritableDatabase()) );
  		assertTrue("Failed fetchContactGroups after deleteContact",
  				ContactGroupsTable.fetchContactGroups(id, testList, mTestDatabase.getWritableDatabase()) );
  		if(testList.size()> 0 ){
  			fail("Contact should be deleted");
  		}
  		
  		Log.i(LOG_TAG, "testAddContactsToGroups PASS");
  	}
  	
  	public void testModyficationsContactsToGroups(){
  		Log.i(LOG_TAG, "testModyficationsContactsToGroups start");
  		createTable();
  		for(int i=0; i<testTable.length;i++){
  			assertTrue("Failed adding contact to group at step "+i, 
  					ContactGroupsTable.addContactToGroup(testTable[i][0], testTable[i][1], mTestDatabase.getWritableDatabase()) );
  		}
  		
  		ArrayList<Long> list = getUniqueIdListFromTestTable();
  		ArrayList<Long> groupList = null;
  		Long ContactId = null;
  		for(Long l: list){
  			groupList = getEntriesWithId(l);
  			if(groupList.size()>1){
  				ContactId = l;
  				break;
  			}
  		}
  		if(ContactId == null){
  			fail("Test data does not containg user with more than one group.");
  		}
  		Random r = new Random();
  		r.setSeed(System.currentTimeMillis());
  		
  		groupList.add( r.nextLong() );
  		groupList.add( r.nextLong() );
  		
  		Contact c= new Contact();
  		c.localContactID = ContactId;
  		c.groupList = groupList;
  		
  		ServiceStatus status = ContactGroupsTable.modifyContact(c, mTestDatabase.getWritableDatabase());
  		if(status != ServiceStatus.SUCCESS){
  			fail("Faild on modifyContact");
  		}
  		
  		ArrayList<Long> testList = new ArrayList<Long>(); 
  		assertTrue("Failed fetchContactGroups after modifyContact",
  				ContactGroupsTable.fetchContactGroups(ContactId, testList, mTestDatabase.getWritableDatabase()) );
  		if( !testList.containsAll(groupList)|| !groupList.containsAll(testList) ){
  			fail("List after modyfyContact are different");
  		}
  		
  		Log.i(LOG_TAG, "testModyficationsContactsToGroups PASS");
  	}
  	
  }
  