/* * 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.decisiontable.parser; import org.drools.decisiontable.parser.LhsBuilder.FieldType; import org.junit.Test; import static org.junit.Assert.*; public class LhsBuilderTest { @Test public void testBuildItUp() throws Exception { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate(10, 1, "age"); builder.addTemplate(10, 2, "size != $param"); builder.addTemplate(10, 3, "date <"); builder.addCellValue(11, 1, "42"); builder.addCellValue(11, 2, "20"); builder.addCellValue(11, 3, "30"); assertEquals("Person(age == \"42\", size != 20, date < \"30\")", builder.getResult()); builder.clearValues(); builder.addCellValue(12, 2, "42" ); assertEquals("Person(size != 42)", builder.getResult()); } @Test public void testEmptyCells() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); assertFalse(builder.hasValues()); } @Test public void testClassicMode() { LhsBuilder builder = new LhsBuilder( 9, 1, "" ); builder.addTemplate( 10, 1, "Person(age < $param)"); builder.addCellValue( 11, 1, "42" ); assertEquals("Person(age < 42)", builder.getResult()); builder = new LhsBuilder( 9, 3, null ); builder.addTemplate( 10, 3, "Foo(bar == $param)"); builder.addTemplate( 10, 4, "eval(true)"); builder.addCellValue( 11, 3, "42" ); builder.addCellValue( 11, 4, "Y" ); assertEquals("Foo(bar == 42)\neval(true)", builder.getResult()); } @Test public void testForAllAndFucntion() { LhsBuilder builder = new LhsBuilder( 9, 1, "" ); builder.addTemplate( 10, 1, "forall(&&){Foo(bar != $)}"); builder.addCellValue( 11, 1, "42,43"); assertEquals("Foo(bar != 42) && Foo(bar != 43)", builder.getResult()); } @Test public void testForAllOr() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate( 10, 1, "forall(||){age < $}"); builder.addCellValue( 11, 1, "42"); assertEquals("Person(age < 42)", builder.getResult()); } @Test public void testForAllOrPrefix() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate( 10, 1, "age < 10 && forall(||){age < $}"); builder.addCellValue( 11, 1, "42"); assertEquals("Person(age < 10 && age < 42)", builder.getResult()); } @Test public void testForAllOrCSV() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate( 10, 1, "forall(||){age < $}"); builder.addCellValue( 11, 1, "42, 43, 44"); assertEquals("Person(age < 42 || age < 43 || age < 44)", builder.getResult()); } @Test public void testForAllAnd() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate(10, 1, "forall(&&){age < $}"); builder.addCellValue(11, 1, "42"); assertEquals("Person(age < 42)", builder.getResult()); } @Test public void testForAllAndCSV() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate(10, 1, "forall(&&){age < $}"); builder.addCellValue(11, 1, "42, 43, 44"); assertEquals("Person(age < 42 && age < 43 && age < 44)", builder .getResult()); } @Test public void testForAllAndForAllOrCSVMultiple() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate(10, 1, "forall(&&){age < $ || age == $}"); builder.addCellValue(11, 1, "42, 43, 44"); assertEquals( "Person(age < 42 || age == 42 && age < 43 || age == 43 && age < 44 || age == 44)", builder.getResult()); } @Test public void testForAllsAndForAllOrCSVMultiple() { LhsBuilder builder = new LhsBuilder( 9, 1, "Person" ); builder.addTemplate(10, 1, "forall(&&){age < $ || age == $} && forall(&&){age < $ || age == $}"); builder.addCellValue(11, 1, "42, 43, 44"); assertEquals( "Person(age < 42 || age == 42 && age < 43 || age == 43 && age < 44 || age == 44 && age < 42 || age == 42 && age < 43 || age == 43 && age < 44 || age == 44)", builder.getResult()); } @Test public void testIdentifyFieldTypes() { LhsBuilder builder = new LhsBuilder( 9, 1, "" ); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("age")); assertEquals(FieldType.OPERATOR_FIELD, builder.calcFieldType("age <")); assertEquals(FieldType.NORMAL_FIELD, builder.calcFieldType("age < $param")); assertEquals(FieldType.FORALL_FIELD, builder.calcFieldType("forall(||){age < $}")); assertEquals(FieldType.FORALL_FIELD, builder.calcFieldType("forall(&&){age < $}")); assertEquals(FieldType.FORALL_FIELD, builder.calcFieldType("forall(,){age < $}")); assertEquals(FieldType.FORALL_FIELD, builder.calcFieldType("forall(){age < $}")); assertEquals(FieldType.FORALL_FIELD, builder.calcFieldType("forall(){age < $} && forall(){age == $}")); assertEquals(FieldType.FORALL_FIELD, builder.calcFieldType("x && forall(){age < $} && forall(){age == $}")); assertEquals(FieldType.FORALL_FIELD, builder.calcFieldType("x && forall(){age < $} && forall(){age == $} && y")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("age < $para")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall{||}{age < $}")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall(){}")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall(){age < $")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall(){,")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall({})")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall({}){test})")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall(&&){{}})")); assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("forall(&&){{})")); } @Test public void testIdentifyColumnCorrectly() { LhsBuilder builder = new LhsBuilder( 9, 1, null ); assertFalse(builder.isMultipleConstraints()); //will be added to Foo builder = new LhsBuilder( 9, 1, "Foo" ); assertTrue(builder.isMultipleConstraints()); //will be added to eval builder = new LhsBuilder( 9, 1, "f:Foo() eval " ); assertTrue(builder.isMultipleConstraints()); // will just be verbatim builder = new LhsBuilder( 9, 1, "f: Foo()" ); assertTrue(builder.isMultipleConstraints()); } @Test public void testTypeConst3() { LhsBuilder builder = new LhsBuilder( 9, 1, "Type" ); builder.addTemplate( 10, 1, "flda"); builder.addTemplate( 10, 2, "fldb >"); builder.addTemplate( 10, 3, "fldc str[startsWith]"); builder.addCellValue( 11, 1, "good"); builder.addCellValue( 11, 2, "42"); builder.addCellValue( 11, 3, "abc"); assertEquals("Type(flda == \"good\", fldb > \"42\", fldc str[startsWith] \"abc\")", builder.getResult()); } @Test public void testTypeParConst2() { LhsBuilder builder = new LhsBuilder( 9, 1, "Type()" ); builder.addTemplate( 10, 1, "flda"); builder.addTemplate( 10, 2, "fldb >"); builder.addCellValue( 11, 1, "good"); builder.addCellValue( 11, 2, "42"); assertEquals("Type(flda == \"good\", fldb > \"42\")", builder.getResult()); } @Test public void testTypeConstFrom() { LhsBuilder builder = new LhsBuilder( 9, 1, "Type from $west" ); builder.addTemplate( 10, 1, "flda"); builder.addCellValue( 11, 1, "good"); assertEquals("Type(flda == \"good\") from $west", builder.getResult()); } @Test public void testTypeEvalExp2() { LhsBuilder builder = new LhsBuilder( 9, 1, "Type($a:a,$b:b) eval" ); builder.addTemplate( 10, 1, "$a > $param"); builder.addTemplate( 10, 2, "$b < $param"); builder.addCellValue( 11, 1, "1"); builder.addCellValue( 11, 2, "99"); assertEquals("Type($a:a,$b:b) eval($a > 1 && $b < 99)", builder.getResult()); } @Test public void testEvalExp2() { LhsBuilder builder = new LhsBuilder( 9, 1, "eval()" ); builder.addTemplate( 10, 1, "$a > $param"); builder.addTemplate( 10, 2, "$b < $param"); builder.addCellValue( 11, 1, "1"); builder.addCellValue( 11, 2, "99"); assertEquals("eval($a > 1 && $b < 99)", builder.getResult()); } @Test public void testTypeParPlain() { LhsBuilder builder = new LhsBuilder( 9, 1, null ); builder.addTemplate( 10, 1, "Type()"); builder.addCellValue( 11, 1, "x"); assertEquals("Type()", builder.getResult()); } }