/*
 *
 *  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.flex.compiler.internal.codegen.externals;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.io.IOException;

import org.apache.flex.compiler.clients.ExternCConfiguration;
import org.apache.flex.compiler.internal.codegen.externals.reference.ClassReference;
import org.apache.flex.compiler.internal.codegen.externals.reference.MethodReference;
import org.apache.flex.compiler.internal.codegen.externals.utils.JSTypeUtils;

import org.junit.Test;

import com.google.javascript.rhino.JSDocInfo;
import com.google.javascript.rhino.JSTypeExpression;
import com.google.javascript.rhino.jstype.JSType;
import com.google.javascript.rhino.jstype.NamedType;

public class TestTypeExternals extends ExternalsTestBase
{
    @Test
    public void test_constructor() throws IOException
    {
        compile("constructor_members.js");

        ClassReference reference = model.getClassReference("Foo");
        assertTrue(reference.hasInstanceField("bar"));
        assertFalse(reference.hasInstanceField("foo"));
        assertTrue(reference.hasInstanceMethod("method1"));
        assertTrue(reference.hasInstanceMethod("method2"));
        assertTrue(model.hasConstant("bar"));
    }

    @SuppressWarnings("unused")
    @Test
    public void test_types() throws IOException
    {
        compile("types_param.js");

        ClassReference reference = model.getClassReference("Foo");

        JSType jsType1 = getJSType("test1", true, "arg1");
        JSType jsType2 = getJSType("test2", true, "arg1");
        JSType jsType3 = getJSType("test3", true, "arg1");
        JSType jsType4 = getJSType("test4", true, "arg1");
        JSType jsType5 = getJSType("test5", true, "arg1");
        JSType jsType6 = getJSType("test6", true, "arg1");

        assertTrue(jsType1.isString());
        assertTrue(jsType2.isUnionType());
        assertTrue(jsType3.isRecordType());
        assertTrue(jsType4.isUnionType());
        assertTrue(jsType5.isInstanceType());
        assertTrue(jsType6.isFunctionType());

        assertEquals("String",
                JSTypeUtils.toParamTypeString(reference.getStaticMethod("test1"), "arg1"));
        assertEquals("foo.bar.Baz",
                JSTypeUtils.toParamTypeString(reference.getStaticMethod("test2"), "arg1"));
        assertEquals("Object /* {myNum: number, myObject: ?} */",
                JSTypeUtils.toParamTypeString(reference.getStaticMethod("test3"), "arg1"));
        assertEquals("Number",
                JSTypeUtils.toParamTypeString(reference.getStaticMethod("test4"), "arg1"));
        assertEquals("Object",
                JSTypeUtils.toParamTypeString(reference.getStaticMethod("test5"), "arg1"));
        assertEquals("Function /* function (string, boolean): ? */",
                JSTypeUtils.toParamTypeString(reference.getStaticMethod("test6"), "arg1"));
    }

    private JSType getJSType(String methodName, boolean isStatic, String paramName)
    {
    	MethodReference method = null;
    	if(isStatic)
        {
            method = model.getClassReference("Foo").getStaticMethod(methodName);
        }
        else
        {
            method = model.getClassReference("Foo").getInstanceMethod(methodName);
        }
        JSDocInfo comment = method.getComment();
        JSTypeExpression parameterType = comment.getParameterType(paramName);
        JSType jsType = model.evaluate(parameterType);
        return jsType;
    }

    @Override
    protected void configure(ExternCConfiguration config) throws IOException
    {
    }
}
