/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* 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 test;

import junit.framework.TestCase;
import test.stub.SoapInteropCompound2PortTypeStub;
import test.stub.databinding.org.soapinterop.Employee;
import test.stub.databinding.org.soapinterop.Person;
import test.stub.databinding.org.soapinterop.ResultEmployeeDocument;
import test.stub.databinding.org.soapinterop.XEmployeeDocument;

public class WMRound3Compound2InteropTest extends TestCase{

    SoapInteropCompound2PortTypeStub stub = null;
    XEmployeeDocument xEmpDoc = null;
    Employee emp = null;
    Person person = null;
    String name = "Gayan Asanka";
    boolean male = true;
    float personID = (float)456.3123;
    int id = 123456;
    double sal = 15000;
    ResultEmployeeDocument retEmpDoc = null;
    Employee retEmployee = null;


     public void setUp() throws Exception {
       stub = new SoapInteropCompound2PortTypeStub();
    }

    public void testEchoEmployee() throws Exception {
        person = Person.Factory.newInstance();
        person.setName(name);
        person.setMale(male);
        emp = Employee.Factory.newInstance();
        emp.setPerson(person);
        emp.setID(id);
        emp.setSalary(sal);
        xEmpDoc = XEmployeeDocument.Factory.newInstance();
        xEmpDoc.setXEmployee(emp);
        retEmpDoc = stub.echoEmployee(xEmpDoc);
        retEmployee = retEmpDoc.getResultEmployee();
        assertEquals(name,retEmployee.getPerson().getName());
        assertEquals(male,retEmployee.getPerson().getMale());
        assertEquals(id,retEmployee.getID());
        assertEquals(sal,retEmployee.getSalary(),0);

    }
}
