/*
 * Copyright 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 org.apache.jdo.tck.extents;

import javax.jdo.Extent;

import org.apache.jdo.tck.pc.company.Employee;
import org.apache.jdo.tck.util.BatchTestRunner;

/**
 *<B>Title:</B> Has Subclasses is True
 *<BR>
 *<B>Keywords:</B> extent inheritance
 *<BR>
 *<B>Assertion ID:</B> A15.3-6.
 *<BR>
 *<B>Assertion Description: </B>
<code>Extent.hasSubclasses()</code> returns <code>true</code>
if the extent includes subclasses.

 */

public class HasSubclassesTrue extends ExtentTest {

    /** */
    private static final String ASSERTION_FAILED = 
        "Assertion A15.3-6 (HasSubclassesTrue) failed: ";
    
    /**
     * The <code>main</code> is called when the class
     * is directly executed from the command line.
     * @param args The arguments passed to the program.
     */
    public static void main(String[] args) {
        BatchTestRunner.run(HasSubclassesTrue.class);
    }

    /** */
    public void test() {
        Extent ex = getPM().getExtent (Employee.class, true);
        if (!ex.hasSubclasses()) {
            fail(ASSERTION_FAILED,
                 "ex.hasSubclasses() returned false, but extent was created with subclasses=true.");
        }
    }
}
