/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.update.tests.api;
import java.net.URL;

import org.eclipse.update.core.*;
import org.eclipse.update.core.model.CategoryModel;
import org.eclipse.update.core.model.SiteModel;
import org.eclipse.update.tests.UpdateManagerTestCase;

public class TestLocalSiteAPI extends UpdateManagerTestCase {
	
	/**
	 * Test the getFeatures()
	 */
	public TestLocalSiteAPI(String arg0) {
		super(arg0);
	}
	
	public void testFileParsing() throws Exception {

		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE,"siteTestLocalSite/"), null);
		IArchiveReference[] info = site.getArchives();
		
		if (info.length<=0){
			fail("no plugins in site: "+site.getURL().toExternalForm());
		}
		 
		boolean found1 = false;
		boolean found2 = false;
		String name1= "plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar";
		String name2 = "plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar";
		
		for (int i =0; i<info.length; i++){
			if (info[i].getPath().equals(name1)) found1 = true;
			if (info[i].getPath().equals(name2)) found2 = true;
		}
		
		if (!found1 || !found2){
			fail("Cannot find plugin : org.eclipse.update.core.tests.feature1.plugin2 version 5.0.0 and 5.0.1 on the site, by parsing file system");
		}
		

	}
	
	public void testBundleManifestParsing() throws Exception {

		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE,"siteTestLocalSite/"),null);
		IArchiveReference[] info = site.getArchives();
		
		if (info.length<=0){
			fail("no plugins in site: "+site.getURL().toExternalForm());
		}
		 
		boolean found1 = false;
		boolean found2 = false;
		boolean found3 = false;
		String name1= "plugins/org.eclipse.update.core.tests.bundleManifest_1.0.1.jar";
		String name2 = "plugins/org.eclipse.update.core.tests.bundleAndPluginManifestsBUNDLEPARSED_1.0.3.jar";
		String name3 = "plugins/org.eclipse.update.core.tests.bundleAndPluginManifests_1.0.3.jar";
		
		for (int i =0; i<info.length; i++){
			if (info[i].getPath().equals(name1)) found1 = true;
			if (info[i].getPath().equals(name2)) found2 = true;
			if (info[i].getPath().equals(name3)) found3 = true;
		}
		
		if (!found1 || !found2){
			fail("Cannot find plugin : org.eclipse.update.core.tests.feature1.plugin2 version 5.0.0 and 5.0.1 on the site, by parsing file system");
		}
		if (found3){
			fail("Plugin manifest parsed instead of bundle manifest.");
		}
		

	}
	
	
	public void testCategories() throws Exception {

		ISite site = SiteManager.getSite(SOURCE_FILE_SITE, null);
		
		ICategory category = new Category("category","Label of category");
		
		((SiteModel)site).addCategoryModel((CategoryModel)category);
		
		ICategory[] categories = site.getCategories();
		boolean found = false;
		for (int index = 0; index < categories.length; index++) {
			ICategory element = categories[index];
			if (element.getName().equals("category")) found = true;
		}
		if (!found) fail("cannot find category 'category' in site");

		ISiteFeatureReference ref = new SiteFeatureReference();
		ref.setSite(site);
		ref.addCategory(category);		
		categories = ref.getCategories();
		found = false;
		for (int index = 0; index < categories.length; index++) {
			ICategory element = categories[index];
			if (element.getName().equals("category")) found = true;
		}
		if (!found) fail("cannot find category 'category' in feature");
		
			}

}

