/* ======================================================================
   Parts Copyright 2006 University of Leeds, Oxford University, University of the Highlands and Islands.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

====================================================================== */

package org.bodington.servlet;

import java.util.Properties;

import org.bodington.server.BuildingServer;
import org.bodington.server.BuildingServerTest;
import org.bodington.servlet.facilities.Facility;
import org.bodington.servlet.facilities.Facility1Test;
import org.bodington.servlet.facilities.Facility2Test;

public class FacilityListTest extends BuildingServerTest
{

    /**
     * Test the parsing of the facilities.
     */
    public void testFacilityList() 
    {
        Properties props = BuildingServer.getInstance().getProperties();
        props.setProperty("buildingservlet.facility.default", "0,org.bodington.servlet.facilities.Facility");
        props.setProperty("buildingservlet.facility.first", "1,org.bodington.servlet.facilities.Facility1Test");
        props.setProperty("buildingservlet.facility.second", "2,org.bodington.servlet.facilities.Facility2Test");
        props.setProperty("buildingservlet.facilities","default,first,second");
        FacilityList facilityList = new FacilityList();
        assertTrue(facilityList.get("first") instanceof Facility1Test);
        assertTrue(facilityList.get(new Integer(2)) instanceof Facility2Test);
        assertTrue(facilityList.get("doesNotExist") instanceof Facility);
    }
    
    /**
     * Check that we don't fall apart if we are unconfigured
     */
    public void testFacilityListUnconfigured()
    {
        FacilityList facilityList = new FacilityList();
        assertNotNull(facilityList);
    }
    
    /**
     * Check that things work when we point to a class that doesn't exist.
     */
    public void testFacilityListMissingClass()
    {
        Properties props = BuildingServer.getInstance().getProperties();
        props.setProperty("buildingservlet.facility.default", "1,this.class.does.not.Exist");
        props.setProperty("buildingservlet.facilities","default");
        FacilityList facilityList = new FacilityList();
        assertNotNull(facilityList);
        assertNull(facilityList.get("default"));
    }
    
    /**
     * Check that we can deal with classes that aren't Facilities
     */
    public void testFacilityListWrongClass()
    {
        Properties props = BuildingServer.getInstance().getProperties();
        props.setProperty("buildingservlet.facility.default", "1,java.lang.String");
        props.setProperty("buildingservlet.facilities","default");
        FacilityList facilityList = new FacilityList();
        assertNotNull(facilityList);
        assertNull(facilityList.get("default"));
    }
    
    /**
     * Check that we handle badly formmated lines.
     */
    public void testFacilityListBadFormat()
    {
        Properties props = BuildingServer.getInstance().getProperties();
        props.setProperty("buildingservlet.facility.default", "I can't write a configuration line");
        props.setProperty("buildingservlet.facilities","default");
        FacilityList facilityList = new FacilityList();
        assertNotNull(facilityList);
        assertNull(facilityList.get("default"));
    }
    
    /**
     * Check that we deal with duplicate IDs.
     */
    public void testFacilityListDuplicateID()
    {
        Properties props = BuildingServer.getInstance().getProperties();
        props.setProperty("buildingservlet.facility.first", "1,org.bodington.servlet.facilities.Facility1Test");
        props.setProperty("buildingservlet.facility.second", "1,org.bodington.servlet.facilities.Facility2Test");
        props.setProperty("buildingservlet.facilities","first,second,second");
        FacilityList facilityList = new FacilityList();
        assertNotNull(facilityList);
        assertTrue(facilityList.get(new Integer(1)) instanceof Facility2Test);
        assertTrue(facilityList.get("first") instanceof Facility1Test);
        assertTrue(facilityList.get("second") instanceof Facility2Test);
    }
    
    /**
     * Check that we deal with missing properties
     */
    public void testFacilityListMissingFacility()
    {
        Properties props = BuildingServer.getInstance().getProperties();
        props.setProperty("buildingservlet.facility.first", "1,org.bodington.servlet.facilities.Facility1Test");
        props.setProperty("buildingservlet.facility.second", "2,org.bodington.servlet.facilities.Facility2Test");
        props.setProperty("buildingservlet.facilities","first,second,third");
        FacilityList facilityList = new FacilityList();
        assertNotNull(facilityList);
        assertFalse(facilityList.get(new Integer(1)) instanceof Facility2Test);
        assertTrue(facilityList.get("second") instanceof Facility2Test);
    }
    
    
}
