/****************************************************************
 * 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.james.mime4j.field;

import org.apache.james.mime4j.field.ContentTransferEncodingField;
import org.apache.james.mime4j.field.AbstractField;

import junit.framework.TestCase;

public class ContentTransferEncodingFieldTest extends TestCase {

    public void testGetEncoding() throws Exception {
        ContentTransferEncodingField f = null;
        
        f = (ContentTransferEncodingField) 
                    AbstractField.parse("Content-Transfer-Encoding: 8bit");
        assertEquals("8bit", f.getEncoding());
        
        f = (ContentTransferEncodingField) 
                    AbstractField.parse("Content-Transfer-Encoding:    BaSE64   ");
        assertEquals("base64", f.getEncoding());
        
        f = (ContentTransferEncodingField) 
                    AbstractField.parse("Content-Transfer-Encoding:       ");
        assertEquals("", f.getEncoding());
        
        f = (ContentTransferEncodingField) 
                    AbstractField.parse("Content-Transfer-Encoding:");
        assertEquals("", f.getEncoding());
    }
    
    public void testGetEncodingStatic() throws Exception {
        ContentTransferEncodingField f = null;
        
        f = (ContentTransferEncodingField) 
                    AbstractField.parse("Content-Transfer-Encoding: 8bit");
        assertEquals("8bit", ContentTransferEncodingField.getEncoding(f));
        
        f = null;
        assertEquals("7bit", ContentTransferEncodingField.getEncoding(f));
        
        f = (ContentTransferEncodingField) 
                    AbstractField.parse("Content-Transfer-Encoding:       ");
        assertEquals("7bit", ContentTransferEncodingField.getEncoding(f));
        
        f = (ContentTransferEncodingField) 
                    AbstractField.parse("Content-Transfer-Encoding:");
        assertEquals("7bit", ContentTransferEncodingField.getEncoding(f));
    }

}
