/**
 *
 * Copyright 2004 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 org.apache.ws.scout.registry;

import javax.xml.registry.CapabilityProfile;
import javax.xml.registry.JAXRException;

import junit.framework.TestCase;

/**
 * @version $Revision$ $Date$
 */
public class CapabilityProfileTest extends TestCase {
    private CapabilityProfile profile;

    public void testLevel() throws JAXRException {
        assertEquals(0, profile.getCapabilityLevel());
    }

    public void testVersion() throws JAXRException {
        assertEquals("1.0", profile.getVersion());
    }

    protected void setUp() throws Exception {
        super.setUp();
        profile = new CapabilityProfileImpl();
    }
}
