/*
 * 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 freemarker.core;

import java.io.IOException;

import org.junit.Test;

import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import freemarker.test.TemplateTest;

public class HeaderParsingTest extends TemplateTest {

    private final Configuration cfgStripWS = new Configuration(Configuration.VERSION_2_3_21);
    private final Configuration cfgNoStripWS = new Configuration(Configuration.VERSION_2_3_21);
    {
        cfgNoStripWS.setWhitespaceStripping(false);
    }
    
    @Test
    public void test() throws IOException, TemplateException {
        assertOutput("<#ftl>text", "text", "text");
        assertOutput(" <#ftl> text", " text", " text");
        assertOutput("\n<#ftl>\ntext", "text", "text");
        assertOutput("\n \n\n<#ftl> \ntext", "text", "text");
        assertOutput("\n \n\n<#ftl>\n\ntext", "\ntext", "\ntext");
    }
    
    private void assertOutput(final String ftl, String expectedOutStripped, String expectedOutNonStripped)
            throws IOException, TemplateException {
        for (int i = 0; i < 4; i++) {
            String ftlPermutation = ftl;
            if ((i & 1) == 1) {
                ftlPermutation = ftlPermutation.replace("<#ftl>", "<#ftl encoding='utf-8'>");
            }
            if ((i & 2) == 2) {
                ftlPermutation = ftlPermutation.replace('<', '[').replace('>', ']');
            }
            
            setConfiguration(cfgStripWS);
            assertOutput(ftlPermutation, expectedOutStripped);
            setConfiguration(cfgNoStripWS);
            assertOutput(ftlPermutation, expectedOutNonStripped);
        }
    }
    
}
