/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.drools.template;
import org.drools.template.parser.Column;
import org.drools.template.parser.DefaultTemplateContainer;
import org.drools.template.parser.TemplateContainer;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.*;
import static org.junit.Assert.assertEquals;
public class DataProviderCompilerTest {
private static final StringBuffer EXPECTED_RULES = new StringBuffer();
static {
String head = "package org.kie.decisiontable;\n//generated from Decision Table\nglobal FeeResult result;\n\n";
String rule3_a = "rule \"Fee Schedule_3\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n";
String rule3_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Telex\",\n\n\n\t\t\tamount < 30000,\n\t\t\tccy == \"YEN\"\n\t\t)\n";
String rule3_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"62\", \"STANDARD\", 45));\nend\n\n";
String rule2_a = "rule \"Fee Schedule_2\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n";
String rule2_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Postage\",\n\n\n\n\t\t\tccy == \"YEN\"\n\t\t)\n";
String rule2_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"12\", \"STANDARD\", 40));\nend\n\n";
String rule1_a = "rule \"Fee Schedule_1\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n";
String rule1_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Commission\",\n\n\t\t\tentityBranch == \"Entity Branch 1\",\n\n\t\t\tccy == \"YEN\"\n\t\t)\n";
String rule1_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"15\", \"STANDARD\", 1600));\nend\n\n";
String rule0_a = "rule \"Fee Schedule_0\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n";
String rule0_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Commission\",\n\t\t\ttxParty == \"Party 1\",\n\n\n\t\t\tccy == \"USD\"\n\t\t)\n";
String rule0_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"1\", \"STANDARD\", 750));\nend\n\n\n";
EXPECTED_RULES.append(head);
EXPECTED_RULES.append(rule3_a).append(rule3_b).append(rule3_then);
EXPECTED_RULES.append(rule2_a).append(rule2_b).append(rule2_then);
EXPECTED_RULES.append(rule1_a).append(rule1_b).append(rule1_then);
EXPECTED_RULES.append(rule0_a).append(rule0_b).append(rule0_then);
}
private class TestDataProvider
implements
DataProvider {
private Iterator<String[]> iterator;
TestDataProvider(List<String[]> rows) {
this.iterator = rows.iterator();
}
public boolean hasNext() {
return iterator.hasNext();
}
public String[] next() {
return iterator.next();
}
}
private ArrayList<String[]> rows = new ArrayList<String[]>();
@Before
public void setUp() {
rows.add(new String[]{"1",
"STANDARD",
"FLAT",
null,
"SBLC",
"ISS",
"Commission",
"Party 1",
"USD",
null,
"750",
"dummy"});
rows.add(new String[]{"15",
"STANDARD",
"FLAT",
"Entity Branch 1",
"SBLC",
"ISS",
"Commission",
null,
"YEN",
null,
"1600",
"dummy"});
rows.add(new String[]{"12",
"STANDARD",
"FLAT",
null,
"SBLC",
"ISS",
"Postage",
null,
"YEN",
null,
"40",
"dummy"});
rows.add(new String[]{"62",
"STANDARD",
"FLAT",
null,
"SBLC",
"ISS",
"Telex",
null,
"YEN",
"< 30000",
"45",
"dummy"});
}
@Test
public void testCompiler() throws Exception {
TestDataProvider tdp = new TestDataProvider(rows);
final DataProviderCompiler converter = new DataProviderCompiler();
final String drl = converter.compile(tdp,
"/templates/rule_template_1.drl");
// System.out.println( drl );
assertEqualsIgnoreWhitespace(EXPECTED_RULES.toString(),
drl);
}
@Test
public void testCompileIndentedKeywords() throws Exception {
TestDataProvider tdp = new TestDataProvider( rows );
final DataProviderCompiler converter = new DataProviderCompiler();
final String drl = converter.compile( tdp,
"/templates/rule_template_indented.drl" );
assertEqualsIgnoreWhitespace( EXPECTED_RULES.toString(),
drl );
}
@Test
public void testCompilerMaps() throws Exception {
Collection<Map<String, Object>> maps = new ArrayList<Map<String, Object>>();
final ObjectDataCompiler converter = new ObjectDataCompiler();
InputStream templateStream =
this.getClass().getResourceAsStream("/templates/rule_template_1.drl");
TemplateContainer tc = new DefaultTemplateContainer(templateStream);
Column[] columns = tc.getColumns();
for (String[] row : rows) {
Map<String, Object> map = new HashMap<String, Object>();
for (int icol = 0; icol < columns.length; icol++) {
Object value = row[icol];
if (value != null) {
map.put(columns[icol].getName(),
value);
}
}
maps.add(map);
}
templateStream =
this.getClass().getResourceAsStream("/templates/rule_template_1.drl");
final String drl = converter.compile(maps,
templateStream);
// System.out.println( drl );
assertEqualsIgnoreWhitespace(EXPECTED_RULES.toString(),
drl);
}
public static class OBJ {
private final String FEE_SCHEDULE_ID;
private final String FEE_SCHEDULE_TYPE;
private final String FEE_MODE_TYPE;
private final String ENTITY_BRANCH;
private final String PRODUCT_TYPE;
private final String ACTIVITY_TYPE;
public final String FEE_TYPE;
public final String OWNING_PARTY;
public final String CCY;
public final String LC_AMOUNT;
public final String AMOUNT;
OBJ(String[] vals) {
FEE_SCHEDULE_ID = vals[0];
FEE_SCHEDULE_TYPE = vals[1];
FEE_MODE_TYPE = vals[2];
ENTITY_BRANCH = vals[3];
PRODUCT_TYPE = vals[4];
ACTIVITY_TYPE = vals[5];
FEE_TYPE = vals[6];
OWNING_PARTY = vals[7];
CCY = vals[8];
LC_AMOUNT = vals[9];
AMOUNT = vals[10];
}
public String getFEE_SCHEDULE_ID() {
return FEE_SCHEDULE_ID;
}
public String getFEE_SCHEDULE_TYPE() {
return FEE_SCHEDULE_TYPE;
}
public String getFEE_MODE_TYPE() {
return FEE_MODE_TYPE;
}
public String ENTITY_BRANCH() {
return ENTITY_BRANCH;
}
public String PRODUCT_TYPE() {
return PRODUCT_TYPE;
}
public String ACTIVITY_TYPE() {
return ACTIVITY_TYPE;
}
}
@Test
public void testCompilerObjs() throws Exception {
Collection<Object> objs = new ArrayList<Object>();
final ObjectDataCompiler converter = new ObjectDataCompiler();
final InputStream templateStream =
this.getClass().getResourceAsStream("/templates/rule_template_1.drl");
for (String[] row : rows) {
OBJ obj = new OBJ(row);
objs.add(obj);
}
final String drl = converter.compile(objs,
templateStream);
// System.out.println( drl );
assertEqualsIgnoreWhitespace(EXPECTED_RULES.toString(),
drl);
}
private static void assertEqualsIgnoreWhitespace(final String expected,
final String actual) {
final String cleanExpected = expected.replaceAll("\\s+",
"");
final String cleanActual = actual.replaceAll("\\s+",
"");
assertEquals(cleanExpected,
cleanActual);
}
}