001    package org.kuali.student.common.messagebuilder.impl;
002    
003    import java.util.ArrayList;
004    import java.util.List;
005    
006    import org.antlr.runtime.Token;
007    import org.antlr.runtime.tree.CommonTreeAdaptor;
008    import org.junit.Assert;
009    import org.junit.Before;
010    import org.junit.Test;
011    import org.kuali.student.common.messagebuilder.booleanmessage.ast.BooleanNode;
012    import org.kuali.student.common.messagebuilder.booleanmessage.ast.parsers.BooleanFunctionParser;
013    import org.kuali.student.common.messagebuilder.impl.BooleanOperators;
014    import org.kuali.student.common.messagebuilder.impl.SuccessMessageBuilder;
015    import org.kuali.student.common.messagebuilder.impl.exceptions.MessageBuilderException;
016    
017    public class SuccessMessageBuilderTest {
018            private final static CommonTreeAdaptor adapter = new CommonTreeAdaptor();
019            private SuccessMessageBuilder successMessageBuilder;
020    
021            @Before
022            public void setUp() throws Exception {
023                    BooleanOperators bo = new BooleanOperators();
024                    successMessageBuilder = new SuccessMessageBuilder(bo);
025            }
026            
027            @Test
028            public void testBuildSuccessMessageForSingleAndNode() throws Exception {
029                    // Rule: A AND B
030                    Token and = adapter.createToken(BooleanFunctionParser.AND, "*");
031                    Token a = adapter.createToken(BooleanFunctionParser.ALPHA, "A");
032                    Token b = adapter.createToken(BooleanFunctionParser.ALPHA, "B");
033                    
034                    BooleanNode andNode = new BooleanNode(and);
035                    
036                    BooleanNode aNode = new BooleanNode(a);
037                    aNode.setParent(andNode);
038                    aNode.setValue(Boolean.TRUE);
039                    aNode.setNodeMessage("MATH101");
040    
041                    BooleanNode bNode = new BooleanNode(b);
042                    bNode.setParent(andNode);
043                    bNode.setValue(Boolean.TRUE);
044                    bNode.setNodeMessage("MATH201");
045                    
046                    andNode.addChild(aNode); // left node
047                    andNode.addChild(bNode); // right node
048                    
049                    String msg = successMessageBuilder.buildSuccessMessage(andNode);
050                    
051                    Assert.assertEquals("MATH101 AND MATH201", msg);
052            }
053    
054            @Test
055            public void testBuildSuccessMessageForSingleOr1Node() throws Exception {
056                    // Rule: A OR B
057                    Token and = adapter.createToken(BooleanFunctionParser.OR, "+");
058                    Token a = adapter.createToken(BooleanFunctionParser.ALPHA, "A");
059                    Token b = adapter.createToken(BooleanFunctionParser.ALPHA, "B");
060                    
061                    // root node
062                    BooleanNode andNode = new BooleanNode(and);
063                    
064                    BooleanNode aNode = new BooleanNode(a);
065                    aNode.setParent(andNode);
066                    aNode.setValue(Boolean.TRUE);
067                    aNode.setNodeMessage("MATH101");
068    
069                    BooleanNode bNode = new BooleanNode(b);
070                    bNode.setParent(andNode);
071                    bNode.setValue(Boolean.FALSE);
072                    bNode.setNodeMessage("MATH201");
073                    
074                    andNode.addChild(aNode); // left node
075                    andNode.addChild(bNode); // right node
076                    
077                    String msg = successMessageBuilder.buildSuccessMessage(andNode);
078                    
079                    Assert.assertEquals("MATH101", msg);
080            }
081    
082            @Test
083            public void testBuildSuccessMessageForSingleOr2Node() throws Exception {
084                    // Rule: A OR B
085                    Token and = adapter.createToken(BooleanFunctionParser.OR, "+");
086                    Token a = adapter.createToken(BooleanFunctionParser.ALPHA, "A");
087                    Token b = adapter.createToken(BooleanFunctionParser.ALPHA, "B");
088                    
089                    // root node
090                    BooleanNode andNode = new BooleanNode(and);
091                    
092                    BooleanNode aNode = new BooleanNode(a);
093                    aNode.setParent(andNode);
094                    aNode.setValue(Boolean.TRUE);
095                    aNode.setNodeMessage("MATH101");
096    
097                    BooleanNode bNode = new BooleanNode(b);
098                    bNode.setParent(andNode);
099                    bNode.setValue(Boolean.TRUE);
100                    bNode.setNodeMessage("MATH201");
101                    
102                    andNode.addChild(aNode); // left node
103                    andNode.addChild(bNode); // right node
104                    
105                    String msg = successMessageBuilder.buildSuccessMessage(andNode);
106                    
107                    Assert.assertEquals("MATH101 OR MATH201", msg);
108            }
109    
110            @Test
111            public void testBuildSuccessMessageForListOfNodes() throws Exception {
112                    // Rule: A AND (B OR C)
113                    Token and = adapter.createToken(BooleanFunctionParser.AND, "*");
114                    Token or = adapter.createToken(BooleanFunctionParser.OR, "+");
115                    Token a = adapter.createToken(BooleanFunctionParser.ALPHA, "A");
116                    Token b = adapter.createToken(BooleanFunctionParser.ALPHA, "B");
117                    Token c = adapter.createToken(BooleanFunctionParser.ALPHA, "C");
118                    
119                    // root node
120                    BooleanNode andNode = new BooleanNode(and);
121                    BooleanNode orNode = new BooleanNode(or);
122                    orNode.setParent(andNode);
123                    orNode.setValue(Boolean.TRUE);
124                    
125                    BooleanNode aNode = new BooleanNode(a);
126                    aNode.setParent(andNode);
127                    aNode.setValue(Boolean.TRUE);
128                    aNode.setNodeMessage("MATH101");
129    
130                    BooleanNode bNode = new BooleanNode(b);
131                    bNode.setParent(orNode);
132                    bNode.setValue(Boolean.TRUE);
133                    bNode.setNodeMessage("MATH201");
134    
135                    BooleanNode cNode = new BooleanNode(c);
136                    cNode.setParent(orNode);
137                    cNode.setValue(Boolean.TRUE);
138                    cNode.setNodeMessage("MATH301");
139                    
140                    orNode.addChild(bNode); // left node
141                    orNode.addChild(cNode); // right node
142                    andNode.addChild(aNode); // left node
143                    andNode.addChild(orNode); // right node
144                    
145                    // List of nodes order is important for building success message
146                    List<BooleanNode> list = new ArrayList<BooleanNode>();
147                    list.add(cNode);
148                    list.add(bNode);
149                    list.add(orNode);
150                    list.add(aNode);
151                    list.add(andNode);
152    
153                    successMessageBuilder.buildSuccessMessage(list);
154                    
155                    Assert.assertEquals("MATH101 AND (MATH201 OR MATH301)", andNode.getNodeMessage());
156            }
157    
158            @Test
159            public void testBuildSuccessMessageForListOfNodes_Complex() throws Exception {
160                    // Rule: (A OR B) AND (C OR D)
161                    Token and = adapter.createToken(BooleanFunctionParser.AND, "*");
162                    Token or1 = adapter.createToken(BooleanFunctionParser.OR, "+");
163                    Token or2 = adapter.createToken(BooleanFunctionParser.OR, "+");
164                    Token a = adapter.createToken(BooleanFunctionParser.ALPHA, "A");
165                    Token b = adapter.createToken(BooleanFunctionParser.ALPHA, "B");
166                    Token c = adapter.createToken(BooleanFunctionParser.ALPHA, "C");
167                    Token d = adapter.createToken(BooleanFunctionParser.ALPHA, "D");
168                    
169                    // root node
170                    BooleanNode andNode = new BooleanNode(and);
171                    
172                    BooleanNode orNode1 = new BooleanNode(or1);
173                    orNode1.setParent(andNode);
174                    orNode1.setValue(Boolean.TRUE);
175    
176                    BooleanNode orNode2 = new BooleanNode(or2);
177                    orNode2.setParent(andNode);
178                    orNode2.setValue(Boolean.TRUE);
179                    
180                    BooleanNode aNode = new BooleanNode(a);
181                    aNode.setParent(orNode1);
182                    aNode.setValue(Boolean.TRUE);
183                    aNode.setNodeMessage("MATH101");
184    
185                    BooleanNode bNode = new BooleanNode(b);
186                    bNode.setParent(orNode1);
187                    bNode.setValue(Boolean.FALSE);
188                    bNode.setNodeMessage("MATH201");
189    
190                    BooleanNode cNode = new BooleanNode(c);
191                    cNode.setParent(orNode2);
192                    cNode.setValue(Boolean.FALSE);
193                    cNode.setNodeMessage("MATH301");
194                    
195                    BooleanNode dNode = new BooleanNode(d);
196                    dNode.setParent(orNode2);
197                    dNode.setValue(Boolean.TRUE);
198                    dNode.setNodeMessage("MATH401");
199    
200                    orNode1.addChild(aNode); // left node
201                    orNode1.addChild(bNode); // right node
202                    orNode2.addChild(cNode); // left node
203                    orNode2.addChild(dNode); // right node
204                    andNode.addChild(orNode1); // left node
205                    andNode.addChild(orNode2); // right node
206                    
207                    // List of nodes order is important for building success message
208                    List<BooleanNode> list = new ArrayList<BooleanNode>();
209                    list.add(aNode);
210                    list.add(bNode);
211                    list.add(cNode);
212                    list.add(dNode);
213                    list.add(orNode1);
214                    list.add(orNode2);
215                    list.add(andNode);
216    
217                    String successMsg = successMessageBuilder.buildSuccessMessage(list);
218    System.out.println("\n\nmsg="+successMsg);              
219                    
220                    Assert.assertEquals(successMsg, andNode.getNodeMessage());
221                    Assert.assertEquals("MATH101 AND MATH401", successMsg);
222            }
223    
224            @Test
225            public void testBuildSuccessMessageForListOfNodes_MultipleRootNodes() throws Exception {
226                    Token or = adapter.createToken(BooleanFunctionParser.OR, "+");
227                    Token and = adapter.createToken(BooleanFunctionParser.AND, "*");
228                    
229                    // root node1
230                    BooleanNode orNode = new BooleanNode(or);
231                    // root node1
232                    BooleanNode andNode = new BooleanNode(and);
233                    
234                    List<BooleanNode> list = new ArrayList<BooleanNode>();
235                    list.add(orNode);
236                    list.add(andNode);
237    
238                    try {
239                            successMessageBuilder.buildSuccessMessage(list);
240                            Assert.fail("buildSuccessMessage should have failed since list has 2 root nodes");
241                    } catch (MessageBuilderException e) {
242                            Assert.assertTrue(e.getMessage() != null);
243                            Assert.assertTrue(e.getMessage().contains("label=+"));
244                            Assert.assertTrue(e.getMessage().contains("label=*"));
245                    }
246            }
247    }