/*
* 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.parser;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
public class DefaultTemplateContainerTest {
@Test
public void testParseTemplate() {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_simple.drl" );
DefaultTemplateContainer t = new DefaultTemplateContainer( is );
assertEquals( "package This_is_a_ruleset;\n", t.getHeader() );
assertEquals( 1, t.getColumns().length );
assertEquals( "name", t.getColumns()[ 0 ].getName() );
Map<String, RuleTemplate> templates = t.getTemplates();
assertEquals( 1, templates.size() );
RuleTemplate template = templates.get( "template1" );
assertNotNull( template );
List<TemplateColumn> columns = template.getColumns();
assertEquals( 1, columns.size() );
TemplateColumn column = (TemplateColumn) columns.get( 0 );
assertEquals( "name", column.getName() );
String contents = template.getContents();
assertTrue( contents.startsWith( "rule \"How cool is @{name} @{row.rowNumber}\"" ) );
assertTrue( contents.endsWith( "then\nend\n" ) );
}
@Test
public void testParseTemplateNoPackage() {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_no_package.drl" );
DefaultTemplateContainer t = new DefaultTemplateContainer( is );
assertEquals( "",
t.getHeader() );
assertEquals( 1,
t.getColumns().length );
assertEquals( "name",
t.getColumns()[ 0 ].getName() );
Map<String, RuleTemplate> templates = t.getTemplates();
assertEquals( 1,
templates.size() );
RuleTemplate template = templates.get( "template1" );
assertNotNull( template );
List<TemplateColumn> columns = template.getColumns();
assertEquals( 1, columns.size() );
TemplateColumn column = (TemplateColumn) columns.get( 0 );
assertEquals( "name", column.getName() );
String contents = template.getContents();
assertTrue( contents.startsWith( "rule \"Rule_@{row.rowNumber}\"" ) );
assertTrue( contents.endsWith( "then\nend\n" ) );
}
@Test
public void testParseTemplateNoPackageWithImport() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1147099
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_no_package_with_import.drl" );
DefaultTemplateContainer t = new DefaultTemplateContainer( is );
assertEquals( "import org.drools.template.jdbc.Person;\n",
t.getHeader() );
assertEquals( 1,
t.getColumns().length );
assertEquals( "name",
t.getColumns()[ 0 ].getName() );
Map<String, RuleTemplate> templates = t.getTemplates();
assertEquals( 1,
templates.size() );
RuleTemplate template = templates.get( "template1" );
assertNotNull( template );
List<TemplateColumn> columns = template.getColumns();
assertEquals( 1, columns.size() );
TemplateColumn column = (TemplateColumn) columns.get( 0 );
assertEquals( "name", column.getName() );
String contents = template.getContents();
assertTrue( contents.startsWith( "rule \"Rule_@{row.rowNumber}\"" ) );
assertTrue( contents.endsWith( "then\nend\n" ) );
}
@Test
public void testParseTemplatePackageWithImport() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1147099
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_package_with_import.drl" );
DefaultTemplateContainer t = new DefaultTemplateContainer( is );
assertEquals( "package This_is_a_ruleset;\nimport org.drools.template.jdbc.Person;\n",
t.getHeader() );
assertEquals( 1,
t.getColumns().length );
assertEquals( "name",
t.getColumns()[ 0 ].getName() );
Map<String, RuleTemplate> templates = t.getTemplates();
assertEquals( 1,
templates.size() );
RuleTemplate template = templates.get( "template1" );
assertNotNull( template );
List<TemplateColumn> columns = template.getColumns();
assertEquals( 1, columns.size() );
TemplateColumn column = (TemplateColumn) columns.get( 0 );
assertEquals( "name", column.getName() );
String contents = template.getContents();
assertTrue( contents.startsWith( "rule \"Rule_@{row.rowNumber}\"" ) );
assertTrue( contents.endsWith( "then\nend\n" ) );
}
/*
* Smoke-test to verify it's possible to load a template containing
* indented keywords without exception
*/
@Test
public void testParseTemplateIndentedKeywords() {
InputStream is = DefaultTemplateContainerTest.class
.getResourceAsStream( "/templates/rule_template_indented.drl" );
new DefaultTemplateContainer( is );
}
@Test
public void testParseTemplateConditions() {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_conditions.drl" );
DefaultTemplateContainer t = new DefaultTemplateContainer( is );
assertEquals( "package This_is_a_ruleset;\n", t.getHeader() );
assertEquals( 1, t.getColumns().length );
assertEquals( "name", t.getColumns()[ 0 ].getName() );
Map<String, RuleTemplate> templates = t.getTemplates();
assertEquals( 1, templates.size() );
RuleTemplate template = (RuleTemplate) templates.get( "template1" );
assertNotNull( template );
List<TemplateColumn> columns = template.getColumns();
assertEquals( 1, columns.size() );
TemplateColumn templateColumn = (TemplateColumn) columns.get( 0 );
assertEquals( "name", templateColumn.getName() );
assertEquals( "== \"name1\"", templateColumn.getCondition() );
String contents = template.getContents();
assertTrue( contents.startsWith( "rule \"How cool is @{name} @{row.rowNumber}\"" ) );
assertTrue( contents.endsWith( "then\nend\n" ) );
}
@Test
public void testParseTemplateNoHeader() {
try {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid1.drl" );
new DefaultTemplateContainer( is );
fail( "DecisionTableParseException expected" );
} catch ( DecisionTableParseException expected ) {
assertEquals( "Missing header", expected.getMessage() );
}
}
@Test
public void testParseTemplateNoHeaderColumns() {
try {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid2.drl" );
new DefaultTemplateContainer( is );
fail( "DecisionTableParseException expected" );
} catch ( DecisionTableParseException expected ) {
assertEquals( "Missing header columns", expected.getMessage() );
}
}
@Test
public void testParseTemplateNoTemplates() {
try {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid3.drl" );
new DefaultTemplateContainer( is );
fail( "DecisionTableParseException expected" );
} catch ( DecisionTableParseException expected ) {
assertEquals( "Missing templates", expected.getMessage() );
}
}
@Test
public void testParseTemplateNoEndTemplate() {
try {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid4.drl" );
new DefaultTemplateContainer( is );
fail( "DecisionTableParseException expected" );
} catch ( DecisionTableParseException expected ) {
assertEquals( "Missing end template", expected.getMessage() );
}
}
@Test
public void testNullInputStream() {
try {
new DefaultTemplateContainer( (InputStream) null );
fail( "NullPointerException expected" );
} catch ( NullPointerException expected ) {
}
}
@Test
public void testInvalidTemplatePath() {
try {
new DefaultTemplateContainer( "invalid path" );
fail( "NullPointerException expected" );
} catch ( NullPointerException expected ) {
}
}
@Test
public void testParseComplexTemplate() {
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_complex.drl" );
DefaultTemplateContainer t = new DefaultTemplateContainer( is );
assertEquals( "package This_is_a_ruleset;\n", t.getHeader() );
Column[] columnList = t.getColumns();
assertEquals( 5, columnList.length );
assertEquals( "first_name", columnList[ 0 ].getName() );
assertEquals( "last_name", columnList[ 1 ].getName() );
assertEquals( "age", columnList[ 2 ].getName() );
assertEquals( "city", columnList[ 3 ].getName() );
assertEquals( "phone", columnList[ 4 ].getName() );
assertEquals( columnList[ 1 ], t.getColumn( "last_name" ) );
Map<String, RuleTemplate> templates = t.getTemplates();
assertEquals( 2, templates.size() );
RuleTemplate template = (RuleTemplate) templates.get( "template1" );
assertNotNull( template );
List<TemplateColumn> columns = template.getColumns();
assertEquals( 1, columns.size() );
TemplateColumn column = (TemplateColumn) columns.get( 0 );
assertEquals( "first_name", column.getName() );
String contents = template.getContents();
assertTrue( contents.startsWith( "rule \"How cool is @{first_name} @{row.rowNumber}\"" ) );
assertTrue( contents.endsWith( "then\nend\n" ) );
template = (RuleTemplate) templates.get( "template2" );
assertNotNull( template );
columns = template.getColumns();
assertEquals( 2, columns.size() );
column = (TemplateColumn) columns.get( 0 );
assertEquals( "first_name", column.getName() );
TemplateColumn column2 = (TemplateColumn) columns.get( 1 );
assertEquals( "last_name", column2.getName() );
contents = template.getContents();
assertTrue( contents.startsWith( "rule \"How uncool is @{first_name} @{row.rowNumber}\"" ) );
assertTrue( contents.endsWith( "then\nend\n" ) );
}
@Test
public void testParseTemplateWithComments() {
// BZ-1242010
InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_with_comment.drl" );
DefaultTemplateContainer t = new DefaultTemplateContainer( is );
Map<String, RuleTemplate> templates = t.getTemplates();
RuleTemplate template = (RuleTemplate) templates.get( "template1" );
List<TemplateColumn> columns = template.getColumns();
TemplateColumn templateColumn = (TemplateColumn) columns.get( 0 );
String contents = template.getContents();
assertTrue( contents.contains( "@{name}" ) );
assertFalse( contents.contains( "@{invalidName}" ) );
}
}