/*
 *  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.directory.shared.ldap.model.schema.syntaxes.parser;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.text.ParseException;

import javax.naming.NamingException;

import com.mycila.junit.concurrent.Concurrency;
import com.mycila.junit.concurrent.ConcurrentJunitRunner;
import org.apache.directory.shared.ldap.model.schema.ObjectClass;
import org.apache.directory.shared.ldap.model.schema.ObjectClassTypeEnum;
import org.apache.directory.shared.ldap.model.schema.parsers.ObjectClassDescriptionSchemaParser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;


/**
 * Tests the ObjectClassDescriptionSchemaParser class.
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
@RunWith(ConcurrentJunitRunner.class)
@Concurrency()
public class ObjectClassDescriptionSchemaParserTest
{
    /** the parser instance */
    private ObjectClassDescriptionSchemaParser parser;


    @Before
    public void setUp() throws Exception
    {
        parser = new ObjectClassDescriptionSchemaParser();
    }


    @After
    public void tearDown() throws Exception
    {
        parser = null;
    }


    /**
     * Test numericoid
     * 
     * @throws ParseException
     */
    @Test
    public void testNumericOid() throws ParseException
    {
        SchemaParserTestUtils.testNumericOid( parser, "" );
    }


    /**
     * Tests NAME and its values
     * 
     * @throws ParseException
     */
    @Test
    public void testNames() throws ParseException
    {
        SchemaParserTestUtils.testNames( parser, "1.1", "" );
    }


    /**
     * Tests DESC
     * 
     * @throws ParseException
     */
    @Test
    public void testDescription() throws ParseException
    {
        SchemaParserTestUtils.testDescription( parser, "1.1", "" );
    }


    /**
     * Tests OBSOLETE
     * 
     * @throws ParseException
     */
    @Test
    public void testObsolete() throws ParseException
    {
        SchemaParserTestUtils.testObsolete( parser, "1.1", "" );
    }


    /**
     * Test SUP and its values.
     * 
     * @throws ParseException
     */
    @Test
    public void testSuperior() throws ParseException, NamingException
    {
        String value = null;
        ObjectClass objectClass = null;

        // no SUP
        value = "( 1.1 )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 0, objectClass.getSuperiorOids().size() );

        // SUP simple numericoid
        value = "( 1.1 SUP 1.2.3 )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "1.2.3", objectClass.getSuperiorOids().get( 0 ) );

        // SUP simple descr
        value = "( 1.1 SUP top )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );

        // SUP single numericoid
        value = "( 1.1 SUP ( 1.2.3.4.5 ) )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "1.2.3.4.5", objectClass.getSuperiorOids().get( 0 ) );

        // SUP single descr
        value = "( 1.1 SUP ( A-Z-0-9 ) )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "A-Z-0-9", objectClass.getSuperiorOids().get( 0 ) );

        // SUP multi numericoid
        value = "( 1.1 SUP ( 1.2.3 $ 1.2.3.4.5 ) )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 2, objectClass.getSuperiorOids().size() );
        assertEquals( "1.2.3", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( "1.2.3.4.5", objectClass.getSuperiorOids().get( 1 ) );

        // SUP multi descr
        value = "( 1.1 SUP ( top1 $ top2 ) )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 2, objectClass.getSuperiorOids().size() );
        assertEquals( "top1", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( "top2", objectClass.getSuperiorOids().get( 1 ) );

        // SUP multi mixed, tabs
        value = "\t(\t1.1\tSUP\t(\ttop1\t$\t1.2.3.4\t$\ttop2\t)\t)\t";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 3, objectClass.getSuperiorOids().size() );
        assertEquals( "top1", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( "1.2.3.4", objectClass.getSuperiorOids().get( 1 ) );
        assertEquals( "top2", objectClass.getSuperiorOids().get( 2 ) );

        // SUP multi mixed, no space
        value = "(1.1 SUP(TOP-1$1.2.3.4$TOP-2))";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 3, objectClass.getSuperiorOids().size() );
        assertEquals( "TOP-1", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( "1.2.3.4", objectClass.getSuperiorOids().get( 1 ) );
        assertEquals( "TOP-2", objectClass.getSuperiorOids().get( 2 ) );

        // SUP multi mixed many spaces
        value = "(          1.1          SUP          (          top1          $          1.2.3.4$top2          )          )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 3, objectClass.getSuperiorOids().size() );
        assertEquals( "top1", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( "1.2.3.4", objectClass.getSuperiorOids().get( 1 ) );
        assertEquals( "top2", objectClass.getSuperiorOids().get( 2 ) );

        // quoted value
        value = "( 1.1 SUP 'top' )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );

        // quoted value
        value = "( 1.1 SUP '1.2.3.4' )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "1.2.3.4", objectClass.getSuperiorOids().get( 0 ) );

        // no $ separator
        value = "( 1.1 SUP ( top1 top2 ) )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 2, objectClass.getSuperiorOids().size() );
        assertEquals( "top1", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( "top2", objectClass.getSuperiorOids().get( 1 ) );

        // invalid character
        value = "( 1.1 SUP 1.2.3.4.A )";
        try
        {
            objectClass = parser.parseObjectClassDescription( value );
            fail( "Exception expected, invalid SUP '1.2.3.4.A' (invalid character)" );
        }
        catch ( ParseException pe )
        {
            // expected
        }

        // empty sup
        value = "( 1.1 SUP )";
        try
        {
            objectClass = parser.parseObjectClassDescription( value );
            fail( "Exception expected, no SUP value" );
        }
        catch ( ParseException pe )
        {
            // expected
        }

        if ( !parser.isQuirksMode() )
        {
            // invalid start
            value = "( 1.1 SUP ( top1 $ -top2 ) )";
            try
            {
                objectClass = parser.parseObjectClassDescription( value );
                fail( "Exception expected, invalid SUP '-top' (starts with hypen)" );
            }
            catch ( ParseException pe )
            {
                // expected
            }
        }
    }


    /**
     * Tests kind (ABSTRACT, AUXILIARY, STRUCTURAL)
     * 
     * @throws ParseException
     */
    @Test
    public void testKind() throws ParseException
    {
        String value = null;
        ObjectClass objectClass = null;

        // DEFAULT is STRUCTURAL
        value = "( 1.1 )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );

        // ABSTRACT
        value = "( 1.1 ABSTRACT )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( ObjectClassTypeEnum.ABSTRACT, objectClass.getType() );

        // AUXILIARY, tab
        value = "\t(\t1.1\tAUXILIARY\t)\t";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( ObjectClassTypeEnum.AUXILIARY, objectClass.getType() );

        // STRUCTURAL, no space
        value = "(1.1 STRUCTURAL)";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );

        // STRUCTURAL, case-insensitive
        value = "(1.1 sTrUcTuRaL )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );

        // invalid
        value = "( 1.1 FOO )";
        try
        {
            objectClass = parser.parseObjectClassDescription( value );
            fail( "Exception expected, invalid KIND value" );
        }
        catch ( ParseException pe )
        {
            // expected
        }
    }


    /**
     * Test MUST and its values.
     * Very similar to SUP, so here are less test cases. 
     * 
     * @throws ParseException
     */
    @Test
    public void testMust() throws ParseException
    {
        String value = null;
        ObjectClass objectClass = null;

        // no MUST
        value = "( 1.1 )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 0, objectClass.getMustAttributeTypeOids().size() );

        // MUST simple numericoid
        value = "( 1.1 MUST 1.2.3 )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "1.2.3", objectClass.getMustAttributeTypeOids().get( 0 ) );

        // MUST multiple
        value = "(1.1 MUST(cn$sn\r$11.22.33.44.55         $  objectClass   ))";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 4, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "cn", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( "sn", objectClass.getMustAttributeTypeOids().get( 1 ) );
        assertEquals( "11.22.33.44.55", objectClass.getMustAttributeTypeOids().get( 2 ) );
        assertEquals( "objectClass", objectClass.getMustAttributeTypeOids().get( 3 ) );

        // MUST multiple, no $ separator
        value = "(1.1 MUST(cn sn\t'11.22.33.44.55'\n'objectClass'))";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 4, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "cn", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( "sn", objectClass.getMustAttributeTypeOids().get( 1 ) );
        assertEquals( "11.22.33.44.55", objectClass.getMustAttributeTypeOids().get( 2 ) );
        assertEquals( "objectClass", objectClass.getMustAttributeTypeOids().get( 3 ) );

        // no MUST values
        value = "( 1.1 MUST )";
        try
        {
            objectClass = parser.parseObjectClassDescription( value );
            fail( "Exception expected, no MUST value" );
        }
        catch ( ParseException pe )
        {
            // expected
        }

        if ( !parser.isQuirksMode() )
        {
            // invalid value
            value = "( 1.1 MUST ( c_n ) )";
            try
            {
                objectClass = parser.parseObjectClassDescription( value );
                fail( "Exception expected, invalid value c_n" );
            }
            catch ( ParseException pe )
            {
                // expected
            }
        }
    }


    /**
     * Test MAY and its values.
     * Very similar to SUP, so here are less test cases. 
     * 
     * @throws ParseException
     */
    @Test
    public void testMay() throws ParseException
    {
        String value = null;
        ObjectClass objectClass = null;

        // no MAY
        value = "( 1.1 )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 0, objectClass.getMayAttributeTypeOids().size() );

        // MAY simple numericoid
        value = "( 1.1 MAY 1.2.3 )";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 1, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "1.2.3", objectClass.getMayAttributeTypeOids().get( 0 ) );

        // MAY multiple
        value = "(1.1 MAY(cn$sn       $11.22.33.44.55\n$  objectClass   ))";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 4, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "cn", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "sn", objectClass.getMayAttributeTypeOids().get( 1 ) );
        assertEquals( "11.22.33.44.55", objectClass.getMayAttributeTypeOids().get( 2 ) );
        assertEquals( "objectClass", objectClass.getMayAttributeTypeOids().get( 3 ) );

        // MAY multiple, no $ separator, quoted
        value = "(1.1 MAY('cn' sn\t'11.22.33.44.55'\nobjectClass))";
        objectClass = parser.parseObjectClassDescription( value );
        assertEquals( 4, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "cn", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "sn", objectClass.getMayAttributeTypeOids().get( 1 ) );
        assertEquals( "11.22.33.44.55", objectClass.getMayAttributeTypeOids().get( 2 ) );
        assertEquals( "objectClass", objectClass.getMayAttributeTypeOids().get( 3 ) );

        if ( !parser.isQuirksMode() )
        {
            // invalid value
            value = "( 1.1 MAY ( c_n ) )";
            try
            {
                objectClass = parser.parseObjectClassDescription( value );
                fail( "Exception expected, invalid value c_n" );
            }
            catch ( ParseException pe )
            {
                // expected
            }
        }
    }


    /**
     * Test extensions.
     * 
     * @throws ParseException
     */
    @Test
    public void testExtensions() throws ParseException
    {
        SchemaParserTestUtils.testExtensions( parser, "1.1", "" );

    }


    /**
     * Test full object class description.
     * 
     * @throws ParseException
     */
    @Test
    public void testFull() throws ParseException, NamingException
    {
        String value = null;
        ObjectClass objectClass = null;

        value = "( 1.2.3.4.5.6.7.8.9.0 NAME ( 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789' 'test' ) DESC 'Descripton \u00E4\u00F6\u00FC\u00DF \u90E8\u9577' OBSOLETE SUP ( 2.3.4.5.6.7.8.9.0.1 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) STRUCTURAL MUST ( 3.4.5.6.7.8.9.0.1.2 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) MAY ( 4.5.6.7.8.9.0.1.2.3 $ abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 ) X-TEST-a ('test1-1' 'test1-2') X-TEST-b ('test2-1' 'test2-2') )";
        objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "1.2.3.4.5.6.7.8.9.0", objectClass.getOid() );
        assertEquals( 2, objectClass.getNames().size() );
        assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", objectClass.getNames().get( 0 ) );
        assertEquals( "test", objectClass.getNames().get( 1 ) );
        assertEquals( "Descripton \u00E4\u00F6\u00FC\u00DF \u90E8\u9577", objectClass.getDescription() );
        assertTrue( objectClass.isObsolete() );
        assertEquals( 2, objectClass.getSuperiorOids().size() );
        assertEquals( "2.3.4.5.6.7.8.9.0.1", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", objectClass
            .getSuperiorOids().get( 1 ) );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );
        assertEquals( 2, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "3.4.5.6.7.8.9.0.1.2", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", objectClass.getMustAttributeTypeOids()
            .get( 1 ) );
        assertEquals( 2, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "4.5.6.7.8.9.0.1.2.3", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", objectClass.getMayAttributeTypeOids()
            .get( 1 ) );
        assertEquals( 2, objectClass.getExtensions().size() );
        assertNotNull( objectClass.getExtensions().get( "X-TEST-a" ) );
        assertEquals( 2, objectClass.getExtensions().get( "X-TEST-a" ).size() );
        assertEquals( "test1-1", objectClass.getExtensions().get( "X-TEST-a" ).get( 0 ) );
        assertEquals( "test1-2", objectClass.getExtensions().get( "X-TEST-a" ).get( 1 ) );
        assertNotNull( objectClass.getExtensions().get( "X-TEST-b" ) );
        assertEquals( 2, objectClass.getExtensions().get( "X-TEST-b" ).size() );
        assertEquals( "test2-1", objectClass.getExtensions().get( "X-TEST-b" ).get( 0 ) );
        assertEquals( "test2-2", objectClass.getExtensions().get( "X-TEST-b" ).get( 1 ) );
    }


    /**
     * Test unique elements.
     * 
     * @throws ParseException
     */
    @Test
    public void testUniqueElements()
    {
        String[] testValues = new String[]
            { "( 1.1 NAME 'test1' NAME 'test2' )", "( 1.1 DESC 'test1' DESC 'test2' )", "( 1.1 OBSOLETE OBSOLETE )",
                "( 1.1 SUP test1 SUP test2 )", "( 1.1 STRUCTURAL STRUCTURAL )", "( 1.1 ABSTRACT ABSTRACT )",
                "( 1.1 AUXILIARY AUXILIARY )", "( 1.1 STRUCTURAL AUXILIARY AUXILIARY )",
                "( 1.1 MUST test1 MUST test2 )", "( 1.1 MAY test1 MAY test2 )", "( 1.1 X-TEST 'test1' X-TEST 'test2' )" };
        SchemaParserTestUtils.testUnique(parser, testValues);
    }


    /**
     * Ensure that element order is ignored
     * 
     * @throws ParseException
     */
    @Test
    public void testIgnoreElementOrder() throws ParseException, NamingException
    {
        String value = "( 2.5.6.6 STRUCTURAL MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) SUP top DESC 'RFC2256: a person' MUST ( sn $ cn ) NAME 'person' )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "2.5.6.6", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "person", objectClass.getNames().get( 0 ) );
        assertEquals( "RFC2256: a person", objectClass.getDescription() );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );
        assertEquals( 2, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "sn", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( "cn", objectClass.getMustAttributeTypeOids().get( 1 ) );
        assertEquals( 4, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "userPassword", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "telephoneNumber", objectClass.getMayAttributeTypeOids().get( 1 ) );
        assertEquals( "seeAlso", objectClass.getMayAttributeTypeOids().get( 2 ) );
        assertEquals( "description", objectClass.getMayAttributeTypeOids().get( 3 ) );
        assertEquals( 0, objectClass.getExtensions().size() );

    }


    ////////////////////////////////////////////////////////////////
    //          Some real-world object class definitions          //
    ////////////////////////////////////////////////////////////////

    @Test
    public void testRfcTop() throws ParseException, NamingException
    {
        String value = "( 2.5.6.0 NAME 'top' DESC 'top of the superclass chain' ABSTRACT MUST objectClass )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "2.5.6.0", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "top", objectClass.getNames().get( 0 ) );
        assertEquals( "top of the superclass chain", objectClass.getDescription() );
        assertEquals( 0, objectClass.getSuperiorOids().size() );
        assertEquals( ObjectClassTypeEnum.ABSTRACT, objectClass.getType() );
        assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "objectClass", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( 0, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( 0, objectClass.getExtensions().size() );
    }


    @Test
    public void testRfcPerson() throws ParseException, NamingException
    {
        String value = "( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "2.5.6.6", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "person", objectClass.getNames().get( 0 ) );
        assertEquals( "RFC2256: a person", objectClass.getDescription() );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );
        assertEquals( 2, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "sn", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( "cn", objectClass.getMustAttributeTypeOids().get( 1 ) );
        assertEquals( 4, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "userPassword", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "telephoneNumber", objectClass.getMayAttributeTypeOids().get( 1 ) );
        assertEquals( "seeAlso", objectClass.getMayAttributeTypeOids().get( 2 ) );
        assertEquals( "description", objectClass.getMayAttributeTypeOids().get( 3 ) );
        assertEquals( 0, objectClass.getExtensions().size() );
    }


    @Test
    public void testRfcSimpleSecurityObject() throws ParseException, NamingException
    {
        String value = "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "0.9.2342.19200300.100.4.19", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "simpleSecurityObject", objectClass.getNames().get( 0 ) );
        assertEquals( "RFC1274: simple security object", objectClass.getDescription() );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( ObjectClassTypeEnum.AUXILIARY, objectClass.getType() );
        assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "userPassword", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( 0, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( 0, objectClass.getExtensions().size() );
    }


    @Test
    public void testSunAlias() throws ParseException, NamingException
    {
        String value = "( 2.5.6.1 NAME 'alias' DESC 'Standard LDAP objectclass' SUP top ABSTRACT MUST aliasedObjectName X-ORIGIN 'RFC 2256' )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "2.5.6.1", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "alias", objectClass.getNames().get( 0 ) );
        assertEquals( "Standard LDAP objectclass", objectClass.getDescription() );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( ObjectClassTypeEnum.ABSTRACT, objectClass.getType() );
        assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "aliasedObjectName", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( 0, objectClass.getMayAttributeTypeOids().size() );

        assertEquals( 1, objectClass.getExtensions().size() );
        assertNotNull( objectClass.getExtensions().get( "X-ORIGIN" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-ORIGIN" ).size() );
        assertEquals( "RFC 2256", objectClass.getExtensions().get( "X-ORIGIN" ).get( 0 ) );
    }


    @Test
    public void testNovellDcObject() throws ParseException, NamingException
    {
        String value = "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' AUXILIARY MUST dc X-NDS_NAMING 'dc' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "1.3.6.1.4.1.1466.344", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "dcObject", objectClass.getNames().get( 0 ) );
        assertNull( objectClass.getDescription() );
        assertEquals( 0, objectClass.getSuperiorOids().size() );
        assertEquals( ObjectClassTypeEnum.AUXILIARY, objectClass.getType() );
        assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "dc", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( 0, objectClass.getMayAttributeTypeOids().size() );

        assertEquals( 3, objectClass.getExtensions().size() );
        assertNotNull( objectClass.getExtensions().get( "X-NDS_NAMING" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-NDS_NAMING" ).size() );
        assertEquals( "dc", objectClass.getExtensions().get( "X-NDS_NAMING" ).get( 0 ) );
        assertNotNull( objectClass.getExtensions().get( "X-NDS_NOT_CONTAINER" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-NDS_NOT_CONTAINER" ).size() );
        assertEquals( "1", objectClass.getExtensions().get( "X-NDS_NOT_CONTAINER" ).get( 0 ) );
        assertNotNull( objectClass.getExtensions().get( "X-NDS_NONREMOVABLE" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-NDS_NONREMOVABLE" ).size() );
        assertEquals( "1", objectClass.getExtensions().get( "X-NDS_NONREMOVABLE" ).get( 0 ) );
    }


    @Test
    public void testNovellList() throws ParseException, NamingException
    {
        String value = "( 2.16.840.1.113719.1.1.6.1.30 NAME 'List' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ eMailAddress $ mailboxLocation $ mailboxID $ owner $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Root Template]#member' )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "2.16.840.1.113719.1.1.6.1.30", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "List", objectClass.getNames().get( 0 ) );
        assertNull( objectClass.getDescription() );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "Top", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );
        assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "cn", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( 11, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "description", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "fullName", objectClass.getMayAttributeTypeOids().get( 10 ) );

        assertEquals( 5, objectClass.getExtensions().size() );
        assertNotNull( objectClass.getExtensions().get( "X-NDS_NAMING" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-NDS_NAMING" ).size() );
        assertEquals( "cn", objectClass.getExtensions().get( "X-NDS_NAMING" ).get( 0 ) );

        assertNotNull( objectClass.getExtensions().get( "X-NDS_NOT_CONTAINER" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-NDS_NOT_CONTAINER" ).size() );
        assertEquals( "1", objectClass.getExtensions().get( "X-NDS_NOT_CONTAINER" ).get( 0 ) );

        assertNotNull( objectClass.getExtensions().get( "X-NDS_NONREMOVABLE" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-NDS_NONREMOVABLE" ).size() );
        assertEquals( "1", objectClass.getExtensions().get( "X-NDS_NONREMOVABLE" ).get( 0 ) );

        // X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' )
        assertNotNull( objectClass.getExtensions().get( "X-NDS_CONTAINMENT" ) );
        assertEquals( 3, objectClass.getExtensions().get( "X-NDS_CONTAINMENT" ).size() );
        assertEquals( "Organization", objectClass.getExtensions().get( "X-NDS_CONTAINMENT" ).get( 0 ) );
        assertEquals( "organizationalUnit", objectClass.getExtensions().get( "X-NDS_CONTAINMENT" ).get( 1 ) );
        assertEquals( "domain", objectClass.getExtensions().get( "X-NDS_CONTAINMENT" ).get( 2 ) );

        // X-NDS_ACL_TEMPLATES '2#entry#[Root Template]#member'
        assertNotNull( objectClass.getExtensions().get( "X-NDS_ACL_TEMPLATES" ) );
        assertEquals( 1, objectClass.getExtensions().get( "X-NDS_ACL_TEMPLATES" ).size() );
        assertEquals( "2#entry#[Root Template]#member", objectClass.getExtensions().get( "X-NDS_ACL_TEMPLATES" ).get( 0 ) );
    }


    @Test
    public void testMicrosoftAds2000Locality() throws ParseException, NamingException
    {
        String value = "( 2.5.6.3 NAME 'locality' SUP top STRUCTURAL MUST (l ) MAY (st $ street $ searchGuide $ seeAlso ) )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "2.5.6.3", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "locality", objectClass.getNames().get( 0 ) );
        assertNull( objectClass.getDescription() );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );
        assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( "l", objectClass.getMustAttributeTypeOids().get( 0 ) );
        assertEquals( 4, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "st", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "street", objectClass.getMayAttributeTypeOids().get( 1 ) );
        assertEquals( "searchGuide", objectClass.getMayAttributeTypeOids().get( 2 ) );
        assertEquals( "seeAlso", objectClass.getMayAttributeTypeOids().get( 3 ) );
        assertEquals( 0, objectClass.getExtensions().size() );
    }


    @Test
    public void testMicrosoftAds2003Msieee() throws ParseException, NamingException
    {
        String value = "( 1.2.840.113556.1.5.240 NAME 'msieee80211-Policy' SUP top STRUCTURAL MAY (msieee80211-Data $ msieee80211-DataType $ msieee80211-ID ) )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "1.2.840.113556.1.5.240", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "msieee80211-Policy", objectClass.getNames().get( 0 ) );
        assertNull( objectClass.getDescription() );
        assertEquals( 1, objectClass.getSuperiorOids().size() );
        assertEquals( "top", objectClass.getSuperiorOids().get( 0 ) );
        assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getType() );
        assertEquals( 0, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( 3, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "msieee80211-Data", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "msieee80211-DataType", objectClass.getMayAttributeTypeOids().get( 1 ) );
        assertEquals( "msieee80211-ID", objectClass.getMayAttributeTypeOids().get( 2 ) );
        assertEquals( 0, objectClass.getExtensions().size() );
    }


    @Test
    public void testSiemensDirxX500Subschema() throws ParseException, NamingException
    {
        String value = "( 2.5.20.1 NAME 'x500subSchema' AUXILIARY MAY (dITStructureRules $ nameForms $ dITContentRules $ x500objectClasses $ x500attributeTypes $ matchingRules $ matchingRuleUse) )";
        ObjectClass objectClass = parser.parseObjectClassDescription( value );

        assertEquals( "2.5.20.1", objectClass.getOid() );
        assertEquals( 1, objectClass.getNames().size() );
        assertEquals( "x500subSchema", objectClass.getNames().get( 0 ) );
        assertNull( objectClass.getDescription() );
        assertEquals( 0, objectClass.getSuperiorOids().size() );
        assertEquals( ObjectClassTypeEnum.AUXILIARY, objectClass.getType() );
        assertEquals( 0, objectClass.getMustAttributeTypeOids().size() );
        assertEquals( 7, objectClass.getMayAttributeTypeOids().size() );
        assertEquals( "dITStructureRules", objectClass.getMayAttributeTypeOids().get( 0 ) );
        assertEquals( "matchingRuleUse", objectClass.getMayAttributeTypeOids().get( 6 ) );
        assertEquals( 0, objectClass.getExtensions().size() );
    }


    /**
     * Tests the multi-threaded use of a single parser.
     */
    @Test
    public void testMultiThreaded() throws ParseException
    {
        String[] testValues = new String[]
            {
                "( 1.1 )",
                "( 2.5.6.0 NAME 'top' DESC 'top of the superclass chain' ABSTRACT MUST objectClass )",
                "( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )",
                "( 2.16.840.1.113719.1.1.6.1.30 NAME 'List' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ eMailAddress $ mailboxLocation $ mailboxID $ owner $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Root Template]#member' )" };
        SchemaParserTestUtils.testMultiThreaded( parser, testValues );
    }


    /**
     * Tests quirks mode.
     */
    @Test
    public void testQuirksMode() throws ParseException, NamingException
    {
        SchemaParserTestUtils.testQuirksMode( parser, "" );

        try
        {
            String value = null;
            ObjectClass objectClass = null;

            parser.setQuirksMode( true );

            // ensure all other test pass in quirks mode
            testNumericOid();
            testNames();
            testDescription();
            testObsolete();
            testSuperior();
            testKind();
            testMust();
            testMay();
            testExtensions();
            testFull();
            testUniqueElements();
            testIgnoreElementOrder();
            testRfcTop();
            testRfcSimpleSecurityObject();
            testSunAlias();
            testNovellDcObject();
            testNovellList();
            testMicrosoftAds2000Locality();
            testMicrosoftAds2003Msieee();
            testSiemensDirxX500Subschema();
            testMultiThreaded();

            // NAME with special chars
            value = "( 1.2.3 NAME 't-e_s.t;' )";
            objectClass = parser.parseObjectClassDescription( value );
            assertEquals( 1, objectClass.getNames().size() );
            assertEquals( "t-e_s.t;", objectClass.getNames().get( 0 ) );

            // SUP with underscore
            value = "( 1.1 SUP te_st )";
            objectClass = parser.parseObjectClassDescription( value );
            assertEquals( 1, objectClass.getSuperiorOids().size() );
            assertEquals( "te_st", objectClass.getSuperiorOids().get( 0 ) );

            // MAY with underscore
            value = "( 1.1 MAY te_st )";
            objectClass = parser.parseObjectClassDescription( value );
            assertEquals( 1, objectClass.getMayAttributeTypeOids().size() );
            assertEquals( "te_st", objectClass.getMayAttributeTypeOids().get( 0 ) );

            // MUST with underscore
            value = "( 1.1 MUST te_st )";
            objectClass = parser.parseObjectClassDescription( value );
            assertEquals( 1, objectClass.getMustAttributeTypeOids().size() );
            assertEquals( "te_st", objectClass.getMustAttributeTypeOids().get( 0 ) );

            // Netscape object class 
            value = "( nsAdminGroup-oid NAME 'nsAdminGroup' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsAdminGroupName $ description $ nsConfigRoot $ nsAdminSIEDN ) X-ORIGIN 'Netscape' )";
            objectClass = parser.parseObjectClassDescription( value );
            assertEquals( "nsAdminGroup-oid", objectClass.getOid() );
            assertEquals( 1, objectClass.getNames().size() );
            assertEquals( "nsAdminGroup", objectClass.getNames().get( 0 ) );
        }
        finally
        {
            parser.setQuirksMode( false );
        }
    }

}
