/*
 * 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.StringReader;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.junit.Test;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import freemarker.test.TemplateTest;

public class TypeErrorMessagesTest extends TemplateTest {

    static final Document doc;
    static {
        try {
            DocumentBuilder docBuilder;
            docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            doc = docBuilder.parse(new InputSource(new StringReader(
                    "<a><b>123</b><c a='true'>1</c><c a='false'>2</c></a>")));
        } catch (Exception e) {
            throw new RuntimeException("Failed to build data-model", e);
        }
    }

    @Test
    public void testNumericalBinaryOperator() {
        assertErrorContains("${n - s}", "\"-\"", "right-hand", "number", "string");
        assertErrorContains("${s - n}", "\"-\"", "left-hand", "number", "string");
    }

    @Test
    public void testGetterMistake() {
        assertErrorContains("${bean.getX}", "${...}",
                "number", "string", "method", "obj.getSomething", "obj.something");
        assertErrorContains("${1 * bean.getX}", "right-hand",
                "number", "\\!string", "method", "obj.getSomething", "obj.something");
        assertErrorContains("<#if bean.isB></#if>", "condition",
                "boolean", "method", "obj.isSomething", "obj.something");
        assertErrorContains("<#if bean.isB></#if>", "condition",
                "boolean", "method", "obj.isSomething", "obj.something");
        assertErrorContains("${bean.voidM}",
                "string", "method", "\\!()");
        assertErrorContains("${bean.intM}",
                "string", "method", "obj.something()");
        assertErrorContains("${bean.intMP}",
                "string", "method", "obj.something(params)");
    }

    @Test
    public void testXMLTypeMismarches() throws Exception {
        assertErrorContains("${doc.a.c}",
                "used as string", "query result", "2", "multiple matches");
        assertErrorContains("${doc.a.c?boolean}",
                "used as string", "query result", "2", "multiple matches");
        assertErrorContains("${doc.a.d}",
                "used as string", "query result", "0", "no matches");
        assertErrorContains("${doc.a.d?boolean}",
                "used as string", "query result", "0", "no matches");
        
        assertErrorContains("${doc.a.c.@a}",
                "used as string", "query result", "2", "multiple matches");
        assertErrorContains("${doc.a.d.@b}",
                "used as string", "query result", "x", "no matches");
        
        assertErrorContains("${doc.a.b * 2}",
                "used as number", "text", "explicit conversion");
        assertErrorContains("<#if doc.a.b></#if>",
                "used as number", "text", "explicit conversion");

        assertErrorContains("${doc.a.d?nodeName}",
                "used as node", "query result", "0", "no matches");
        assertErrorContains("${doc.a.c?nodeName}",
                "used as node", "query result", "2", "multiple matches");
    }

    @Override
    protected Object createDataModel() {
        Map<String, Object> dataModel = createCommonTestValuesDataModel();
        dataModel.put("doc", doc);
        return dataModel;
    }

}
