001    /**
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.krad.uif.util;
017    
018    import org.junit.Test;
019    import org.kuali.rice.krad.datadictionary.uif.UifDictionaryBeanBase;
020    
021    import java.util.HashMap;
022    import java.util.Map;
023    
024    import static junit.framework.Assert.*;
025    
026    /**
027     * Test class for {@link ExpressionUtils}
028     *
029     * @author Kuali Rice Team (rice.collab@kuali.org)
030     */
031    public class ExpressionUtilsTest {
032    
033        /**
034         * Tests the moving of expressions from the configurable expression graph to the property expressions map
035         *
036         * <p>
037         * Tests include nesting up to two levels and map properties
038         * </p>
039         */
040        @Test
041        public void testPopulatePropertyExpressionsFromGraph() {
042            Map<String, String> expressionGraph = new HashMap<String, String>();
043    
044            expressionGraph.put("property1", "@{expr1}");
045            expressionGraph.put("property2", "@{expr2}");
046            expressionGraph.put("property3['key1']", "@{key1expr}");
047            expressionGraph.put("property4.property1", "@{nexpr1}");
048            expressionGraph.put("property4.property4.property3['key2']", "@{nkey2expr}");
049    
050            MockConfigurable configurable = new MockConfigurable();
051            MockConfigurable configurable2 = new MockConfigurable();
052            MockConfigurable configurable3 = new MockConfigurable();
053    
054            configurable2.setProperty4(configurable3);
055            configurable.setProperty4(configurable2);
056    
057            configurable.setExpressionGraph(expressionGraph);
058    
059            ExpressionUtils.populatePropertyExpressionsFromGraph(configurable, false);
060    
061            assertEquals("Expression count not correct in root configurable", 3,
062                    configurable.getPropertyExpressions().size());
063            assertEquals("Expression not correct for property1", "@{expr1}", configurable.getPropertyExpression(
064                    "property1"));
065            assertEquals("Expression not correct for property2", "@{expr2}", configurable.getPropertyExpression(
066                    "property2"));
067            assertEquals("Expression not correct for map property3", "@{key1expr}", configurable.getPropertyExpression(
068                    "property3['key1']"));
069    
070            assertEquals("Expression count not correct in nested configurable", 1,
071                    configurable.getProperty4().getPropertyExpressions().size());
072            assertEquals("Expression not correct for nested property1", "@{nexpr1}",
073                    configurable.getProperty4().getPropertyExpression("property1"));
074    
075            assertEquals("Expression count not correct in two level nested configurable", 1,
076                    configurable.getProperty4().getProperty4().getPropertyExpressions().size());
077            assertEquals("Expression not correct for nested map property3", "@{nkey2expr}",
078                    configurable.getProperty4().getProperty4().getPropertyExpression("property3['key2']"));
079        }
080    
081        /**
082         * Test the population of refresh expression graphs by the expression utility method
083         */
084        @Test
085        public void testPopulatePropertyExpressionsFromGraph_RefreshGraphs() {
086            Map<String, String> expressionGraph = new HashMap<String, String>();
087    
088            expressionGraph.put("property1", "@{expr1}");
089            expressionGraph.put("property2", "@{expr2}");
090            expressionGraph.put("property3['key1']", "@{key1expr}");
091            expressionGraph.put("property4.property1", "@{nexpr1}");
092            expressionGraph.put("property4.property4.property3['key2']", "@{nkey2expr}");
093    
094            MockConfigurable configurable = new MockConfigurable();
095            MockConfigurable configurable2 = new MockConfigurable();
096            MockConfigurable configurable3 = new MockConfigurable();
097    
098            configurable2.setProperty4(configurable3);
099            configurable.setProperty4(configurable2);
100    
101            configurable.setExpressionGraph(expressionGraph);
102    
103            ExpressionUtils.populatePropertyExpressionsFromGraph(configurable, true);
104    
105            assertEquals("Refresh expression count not correct in root configurable", 5,
106                    configurable.getRefreshExpressionGraph().size());
107            assertEquals("Refresh expression count not correct in nested configurable", 2,
108                    configurable.getProperty4().getRefreshExpressionGraph().size());
109            assertEquals("Refresh expression count not correct in two level nested configurable", 1,
110                    configurable.getProperty4().getProperty4().getRefreshExpressionGraph().size());
111        }
112    
113        /**
114         * Mock class used to test expression handling
115         */
116        public class MockConfigurable extends UifDictionaryBeanBase {
117            private String property1;
118            private String property2;
119    
120            private Map<String, String> property3;
121            private MockConfigurable property4;
122    
123            public MockConfigurable() {
124                property3 = new HashMap<String, String>();
125            }
126    
127            public String getProperty1() {
128                return property1;
129            }
130    
131            public void setProperty1(String property1) {
132                this.property1 = property1;
133            }
134    
135            public String getProperty2() {
136                return property2;
137            }
138    
139            public void setProperty2(String property2) {
140                this.property2 = property2;
141            }
142    
143            public Map<String, String> getProperty3() {
144                return property3;
145            }
146    
147            public void setProperty3(Map<String, String> property3) {
148                this.property3 = property3;
149            }
150    
151            public MockConfigurable getProperty4() {
152                return property4;
153            }
154    
155            public void setProperty4(MockConfigurable property4) {
156                this.property4 = property4;
157            }
158        }
159    }