/*
 * 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.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import freemarker.template.Version;
import freemarker.test.TemplateTest;

/**
 * Test template names returned by special variables and relative path resolution in {@code ?interpret}-ed and
 * {@code ?eval}-ed parts.  
 */
public class InterpretAndEvalTemplateNameTest extends TemplateTest {

    @Test
    public void testInterpret230() throws IOException, TemplateException {
        testInterpret(Configuration.VERSION_2_3_0);
    }

    @Test
    public void testInterpret2326() throws IOException, TemplateException {
        testInterpret(Configuration.VERSION_2_3_26);
    }
    
    private void testInterpret(Version version) throws IOException, TemplateException {
        getConfiguration().setIncompatibleImprovements(version);
        
        for (String getTemplateNames : new String[] {
                "c=${.current_template_name}, m=${.main_template_name}",
                "c=${\".current_template_name\"?eval}, m=${\".main_template_name\"?eval}"
                }) {
            StringTemplateLoader tl = new StringTemplateLoader();
            tl.putTemplate(
                    "main.ftl",
                    getTemplateNames + " "
                    + "{<#include 'sub/t.ftl'>}");
            tl.putTemplate(
                    "sub/t.ftl",
                    getTemplateNames + " "
                    + "i{<@r'" + getTemplateNames + " {<#include \"a.ftl\">'?interpret />}} "
                    + "i{<@[r'" + getTemplateNames + " {<#include \"a.ftl\">','named_interpreted']?interpret />}}");
            tl.putTemplate("sub/a.ftl", "In sub/a.ftl, " + getTemplateNames);
            tl.putTemplate("a.ftl", "In a.ftl");
            
            getConfiguration().setTemplateLoader(tl);
            
            assertOutputForNamed("main.ftl",
                    "c=main.ftl, m=main.ftl "
                    + "{"
                        + "c=sub/t.ftl, m=main.ftl "
                        + "i{c=sub/t.ftl->anonymous_interpreted, m=main.ftl {In sub/a.ftl, c=sub/a.ftl, m=main.ftl}} "
                        + "i{c=sub/t.ftl->named_interpreted, m=main.ftl {In sub/a.ftl, c=sub/a.ftl, m=main.ftl}}"
                    + "}");
            
            assertOutputForNamed("sub/t.ftl",
                    "c=sub/t.ftl, m=sub/t.ftl "
                    + "i{c=sub/t.ftl->anonymous_interpreted, m=sub/t.ftl {In sub/a.ftl, c=sub/a.ftl, m=sub/t.ftl}} "
                    + "i{c=sub/t.ftl->named_interpreted, m=sub/t.ftl {In sub/a.ftl, c=sub/a.ftl, m=sub/t.ftl}}");
        }
    }
    
}
