/*
 *  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
 *  
 *    https://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.api.ldap.model.schema;


import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;

/**
 * Unit tests class AttributeType.
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
@Execution(ExecutionMode.CONCURRENT)
public class AttributeTypeTest
{
    private AttributeType attributeType;


    /**
     * Initialize attribute type instances
     */
    @BeforeEach
    public void initAttributeTypes() throws Exception
    {
        attributeType = new AttributeType( "1.2.3.4" );
        attributeType.setNames( "name1", "name2" );
        attributeType.setDescription( "description" );
        attributeType.setObsolete( false );
        attributeType.setEqualityOid( "caseIgnoreMatch" );
        attributeType.setSuperiorOid( "2.3.4.5" );
    }


    @Test
    public void testToString() throws Exception
    {
        String string = attributeType.toString();

        assertNotNull( string );
        assertTrue( string.startsWith( "attributetype (" ) );
        assertTrue( string.contains( " NAME " ) );
        assertTrue( string.contains( "\n\tDESC " ) );
        assertTrue( string.contains( "\n\tSUP " ) );
        assertTrue( string.contains( "\n\tUSAGE" ) );
    }
}
