/*
 * 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.
 */


package org.apache.axis2.jaxws.description;

import junit.framework.TestCase;
import org.apache.axis2.jaxws.spi.ServiceDelegate;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.lang.reflect.Method;

/**
 * Directly test the Description classes built via annotations without a WSDL file.
 * These tests focus on combinations of the following:
 * - A generic service (no annotations)
 * - A generated service (annotations)
 * - An SEI
 */
public class AnnotationDescriptionTests extends TestCase {
    
    /* 
     * ========================================================================
     * ServiceDescription Tests
     * ========================================================================
     */
    public void testCreateService() {
        String namespaceURI= "http://ws.apache.org/axis2/tests";
        String localPart = "EchoServiceAnnotated";
        Service service = Service.create(null,  new QName(namespaceURI, localPart));
        ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service);
        ServiceDescription serviceDescription = serviceDelegate.getServiceDescription();
        String portLocalPart = "EchoServiceAnnotatedPort";
        QName portQName = new QName(namespaceURI, portLocalPart);
        DocumentLiteralWrappedProxy dlwp = service.getPort(portQName, DocumentLiteralWrappedProxy.class);
        
        // Validate that the Endpoint and EndpointInterface Descriptions were created correctly
        EndpointDescription endpointDescription = serviceDescription.getEndpointDescription(portQName);
        assertNotNull("Endpoint not created ", endpointDescription);
        EndpointInterfaceDescription endpointInterfaceDescription = endpointDescription.getEndpointInterfaceDescription();
        assertNotNull("EndpointInterface not created", endpointInterfaceDescription);
        // Verify we can get the same endpoint description based on the SEI class
        EndpointDescription[] fromSEIClass = serviceDescription.getEndpointDescription(DocumentLiteralWrappedProxy.class);
        assertEquals(1,fromSEIClass.length);
        assertEquals(endpointDescription, fromSEIClass[0]);
        
        // Test getOperation methods parameter validation
        OperationDescription[] operationResultArray = endpointInterfaceDescription.getOperation((QName) null);
        assertNull(operationResultArray);
        operationResultArray = endpointInterfaceDescription.getOperation(new QName("",""));
        assertNull(operationResultArray);
        OperationDescription operationResult = endpointInterfaceDescription.getOperation((Method) null);
        assertNull(operationResult);
        
        // Test getOperations(): Number of methods on SEI should match number of operationDescriptions
        Method[] seiMethods = DocumentLiteralWrappedProxy.class.getMethods();
        operationResultArray = endpointInterfaceDescription.getOperations();
        assertEquals("Number of SEI methods and operations did not match", seiMethods.length, operationResultArray.length);
        
        // Test getOperation(QName)
        // Verify @WebMethod.name is used if present.  See the SEI class annotations for more information
        // The SEI has @WebMethod annotations that override the name of "invokeAsync", so none should be found.
        QName javaMethodQName = new QName("", "invokeAsync");
        operationResultArray = endpointInterfaceDescription.getOperation(javaMethodQName);
        assertNull(operationResultArray);
        // The SEI has @WebMethod annotations that name three operations "invoke"
        javaMethodQName = new QName("", "invoke");
        operationResultArray = endpointInterfaceDescription.getOperation(javaMethodQName);
        assertNotNull(operationResultArray);
        assertEquals(3, operationResultArray.length);
        
        // Test getOperation(Method)
        // Verify an SEI method lookup works
        operationResult = endpointInterfaceDescription.getOperation(seiMethods[0]);
        assertNotNull(operationResult);
        // Verify a non-SEI method returns a null
        operationResult = endpointInterfaceDescription.getOperation(this.getClass().getMethods()[0]);
        assertNull(operationResult);
    }
    
       
    /*
     * TO TEST
     * - Invalid namespace.  TNS in annotation doesn't match one from getPort
     * - Multiple service.getPort() calls with same SEI and different QName, and that serviceDesc.getEndpointDesc(Class) returns multielement array
     * - Test service.getPort(..) with same QName; should return same descrpption
     */
/*    
    public void testValidServiceGetEndpoint() {
        QName validPortQname = new QName("http://ws.apache.org/axis2/tests", "EchoPort");
        EndpointDescription endpointDescription = serviceDescription.getEndpointDescription(validPortQname);
        assertNotNull("EndpointDescription should be found", endpointDescription);
    }
    
    public void testInvalidLocalpartServiceGetEndpoint() {
        QName validPortQname = new QName("http://ws.apache.org/axis2/tests", "InvalidEchoPort");
        EndpointDescription endpointDescription = serviceDescription.getEndpointDescription(validPortQname);
        assertNull("EndpointDescription should not be found", endpointDescription);
    }

    public void testInvalidNamespaceServiceGetEndpoint() {
        QName validPortQname = new QName("http://ws.apache.org/axis2/tests/INVALID", "EchoPort");
        EndpointDescription endpointDescription = serviceDescription.getEndpointDescription(validPortQname);
        assertNull("EndpointDescription should not be found", endpointDescription);
    }
*/    
}
