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

import java.util.Iterator;

import junit.framework.TestCase;

import org.apache.axis2.wsdl.WSDLConstants;

public class OutOnlyAxisOperationTest extends TestCase {

    public void testGetChildren() {
        OutOnlyAxisOperation operation = new OutOnlyAxisOperation();
        AxisMessage message = new AxisMessage();
        operation.addMessage(message, WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
        for (Iterator it = operation.getChildren(); it.hasNext();) {
            AxisDescription o = (AxisDescription)it.next();
            if (message == o) { // Reference check is OK here
                return;
            }
        }
        fail(operation.getClass().getName() + ".getChildren() method did not " +
          "return the message that was added");
    }

}
