/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

/* $Id$ */

package org.apache.xmlgraphics.util;

import java.util.Iterator;

import org.apache.xmlgraphics.image.writer.ImageWriter;

import junit.framework.TestCase;

/**
 * Test for the Service class.
 */
public class ServiceTest extends TestCase {

    /**
     * Tests the mode where Service returns instances.
     * @throws Exception in case of an error
     */
    public void testWithInstances() throws Exception {
        Class cls = ImageWriter.class;
        boolean found = false;
        Object writer1 = null;
        Object writer2 = null;
        
        //First run: Find a writer implementation (one of the two must be available)
        Iterator iter = Service.providers(cls);
        while (iter.hasNext()) {
            Object obj = iter.next();
            assertNotNull(obj);
            String className = obj.getClass().getName(); 
            if ("org.apache.xmlgraphics.image.writer.internal.PNGImageWriter".equals(className)) {
                writer1 = obj;
                found = true;
                break;
            } else if ("org.apache.xmlgraphics.image.writer.imageio.ImageIOPNGImageWriter".equals(
                    className)) {
                writer2 = obj;
                found = true;
                break;
            }
        }
        assertTrue("None of the expected classes found", found);

        //Second run: verify that the same instances are returned
        iter = Service.providers(cls);
        while (iter.hasNext()) {
            Object obj = iter.next();
            assertNotNull(obj);
            String className = obj.getClass().getName(); 
            if ("org.apache.xmlgraphics.image.writer.internal.PNGImageWriter".equals(className)) {
                assertTrue(obj == writer1);
                break;
            } else if ("org.apache.xmlgraphics.image.writer.imageio.ImageIOPNGImageWriter".equals(
                    className)) {
                assertTrue(obj == writer2);
                break;
            }
        }
    }
    
    /**
     * Tests the mode where Service returns class names.
     * @throws Exception in case of an error
     */
    public void testWithClassNames() throws Exception {
        Class cls = ImageWriter.class;
        boolean found = true;
        Iterator iter = Service.providers(cls, false);
        while (iter.hasNext()) {
            Object obj = iter.next();
            assertNotNull(obj);
            assertTrue("Returned object must be a class name", obj instanceof String);
            if ("org.apache.xmlgraphics.image.writer.internal.PNGImageWriter".equals(obj)
                    || ("org.apache.xmlgraphics.image.writer.imageio.ImageIOPNGImageWriter".equals(
                                obj))) {
                found = true;
            }
        }
        assertTrue("None of the expected classes found", found);

        //Do it a second time to make sure the cache works as expected
        iter = Service.providers(cls, false);
        while (iter.hasNext()) {
            Object obj = iter.next();
            assertNotNull(obj);
            assertTrue("Returned object must be a class name", obj instanceof String);
        }
    }
    
}
