/*
 * 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 javax.el;

import java.util.List;

import javax.el.TesterEvaluationListener.Pair;

import org.junit.Assert;
import org.junit.Test;

public class TestELContext {

    /**
     * Tests that a null key results in an NPE as per EL Javadoc.
     */
    @Test(expected = NullPointerException.class)
    public void testGetContext() {
        ELContext elContext = new TesterELContext();
        elContext.getContext(null);
    }

    /**
     * Tests that a null key results in an NPE as per EL Javadoc.
     */
    @Test(expected = NullPointerException.class)
    public void testPutContext01() {
        ELContext elContext = new TesterELContext();
        elContext.putContext(null, new Object());
    }

    /**
     * Tests that a null context results in an NPE as per EL Javadoc.
     */
    @Test(expected = NullPointerException.class)
    public void testPutContext02() {
        ELContext elContext = new TesterELContext();
        elContext.putContext(Object.class, null);
    }

    /**
     * Tests that the context object will be added to the map with context
     * objects. The key is used as unique identifier of the context object in
     * the map.
     */
    @Test
    public void testPutContext03() {
        ELContext elContext = new TesterELContext();
        Assert.assertNull(elContext.getContext(String.class));
        elContext.putContext(String.class, "test");
        Assert.assertEquals("test", elContext.getContext(String.class));
        elContext.putContext(String.class, "test1");
        Assert.assertEquals("test1", elContext.getContext(String.class));
    }

    /**
     * Tests that propertyResolved will be set to true and the corresponding
     * listeners will be notified.
     */
    @Test
    public void testSetPropertyResolved() {
        ELContext elContext = new TesterELContext();

        TesterEvaluationListener listener = new TesterEvaluationListener();
        elContext.addEvaluationListener(listener);

        TesterBean bean = new TesterBean("test");

        elContext.setPropertyResolved(bean, "name");

        Assert.assertTrue(elContext.isPropertyResolved());

        List<Pair> events = listener.getResolvedProperties();
        Assert.assertEquals(1, events.size());
        Pair p = events.get(0);
        Assert.assertEquals(bean, p.getBase());
        Assert.assertEquals("name", p.getProperty());
    }

    /**
     * Tests that the corresponding listeners will be notified.
     */
    @Test
    public void testNotifyBeforeEvaluation() {
        ELContext elContext = new TesterELContext();

        TesterEvaluationListener listener = new TesterEvaluationListener();
        elContext.addEvaluationListener(listener);

        elContext.notifyBeforeEvaluation("before");

        List<String> events = listener.getBeforeEvaluationExpressions();
        Assert.assertEquals(1, events.size());
        Assert.assertEquals("before", events.get(0));
    }

    /**
     * Tests that the corresponding listeners will be notified.
     */
    @Test
    public void testNotifyAfterEvaluation() {
        ELContext elContext = new TesterELContext();

        TesterEvaluationListener listener = new TesterEvaluationListener();
        elContext.addEvaluationListener(listener);

        elContext.notifyAfterEvaluation("after");

        List<String> events = listener.getAfterEvaluationExpressions();
        Assert.assertEquals(1, events.size());
        Assert.assertEquals("after", events.get(0));
    }

    /**
     * Tests not compatible object and type.
     */
    @Test(expected = ELException.class)
    public void testConvertToType01() {
        ELContext elContext = new TesterELContext();
        elContext.convertToType("test", Integer.class);
    }

    /**
     * Tests that if there is no ELResolver the standard coercions will be
     * invoked.
     */
    @Test
    public void testConvertToType02() {
        ELContext elContext = new TesterELContext();
        boolean originalPropertyResolved = false;
        elContext.setPropertyResolved(originalPropertyResolved);

        Object result = elContext.convertToType("test", String.class);
        Assert.assertEquals("test", result);

        Assert.assertTrue(originalPropertyResolved == elContext
                .isPropertyResolved());
    }

    /**
     * Tests that if there is ELResolver it will handle the conversion. If this
     * resolver cannot return a result the standard coercions will be invoked.
     */
    @Test
    public void testConvertToType03() {
        ELContext elContext = new TesterELContext(new TesterELResolverOne());

        boolean originalPropertyResolved = false;
        elContext.setPropertyResolved(originalPropertyResolved);

        Object result = elContext.convertToType("1", String.class);
        Assert.assertEquals("ONE", result);
        Assert.assertTrue(originalPropertyResolved == elContext
                .isPropertyResolved());

        result = elContext.convertToType("test", String.class);
        Assert.assertEquals("test", result);
        Assert.assertTrue(originalPropertyResolved == elContext
                .isPropertyResolved());
    }
}
