/*
* Copyright 2013 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.
* You may obtain a copy of the License at
*
* 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.workbench.models.commons.backend.rule;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.drools.workbench.models.datamodel.oracle.DataType;
import org.drools.workbench.models.datamodel.oracle.FieldAccessorsAndMutators;
import org.drools.workbench.models.datamodel.oracle.MethodInfo;
import org.drools.workbench.models.datamodel.oracle.ModelField;
import org.drools.workbench.models.datamodel.oracle.PackageDataModelOracle;
import org.drools.workbench.models.datamodel.rule.ActionFieldValue;
import org.drools.workbench.models.datamodel.rule.ActionInsertFact;
import org.drools.workbench.models.datamodel.rule.CompositeFieldConstraint;
import org.drools.workbench.models.datamodel.rule.FactPattern;
import org.drools.workbench.models.datamodel.rule.FieldNatureType;
import org.drools.workbench.models.datamodel.rule.RuleModel;
import org.drools.workbench.models.datamodel.rule.SingleFieldConstraint;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class RuleModelDRLPersistenceUnmarshallingI18NTest {
private PackageDataModelOracle dmo;
private Map<String, ModelField[]> packageModelFields = new HashMap<String, ModelField[]>();
private Map<String, String[]> projectJavaEnumDefinitions = new HashMap<String, String[]>();
private Map<String, List<MethodInfo>> projectMethodInformation = new HashMap<String, List<MethodInfo>>();
@Before
public void setUp() throws Exception {
dmo = mock( PackageDataModelOracle.class );
when( dmo.getProjectModelFields() ).thenReturn( packageModelFields );
when( dmo.getProjectJavaEnumDefinitions() ).thenReturn( projectJavaEnumDefinitions );
when( dmo.getProjectMethodInformation() ).thenReturn( projectMethodInformation );
}
@After
public void cleanUp() throws Exception {
packageModelFields.clear();
projectJavaEnumDefinitions.clear();
projectMethodInformation.clear();
}
private void addModelField( final String factName,
final String fieldName,
final String clazz,
final String type ) {
ModelField[] modelFields = new ModelField[ 1 ];
modelFields[ 0 ] = new ModelField( fieldName,
clazz,
ModelField.FIELD_CLASS_TYPE.TYPE_DECLARATION_CLASS,
ModelField.FIELD_ORIGIN.DECLARED,
FieldAccessorsAndMutators.BOTH,
type );
if ( packageModelFields.containsKey( factName ) ) {
final List<ModelField> existingModelFields = new ArrayList<ModelField>( Arrays.asList( packageModelFields.get( factName ) ) );
existingModelFields.add( modelFields[ 0 ] );
modelFields = existingModelFields.toArray( modelFields );
}
packageModelFields.put( factName,
modelFields );
}
@Test
public void testI18N_US_InsertFact() {
final String drl = "package org.test;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"then\n" +
"Applicant fact0 = new Applicant();\n" +
"fact0.setAge( 55 );\n" +
"insert( fact0 );\n" +
"end";
addModelField( "Applicant",
"age",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER );
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal( drl,
new ArrayList<String>(),
dmo );
assertNotNull( m );
assertEquals( 1,
m.rhs.length );
assertTrue( m.rhs[ 0 ] instanceof ActionInsertFact );
final ActionInsertFact aif = (ActionInsertFact) m.rhs[ 0 ];
assertEquals( "Applicant",
aif.getFactType() );
assertEquals( "fact0",
aif.getBoundName() );
assertEquals( 1,
aif.getFieldValues().length );
final ActionFieldValue afv = aif.getFieldValues()[ 0 ];
assertEquals( "age",
afv.getField() );
assertEquals( "55",
afv.getValue() );
assertEquals( DataType.TYPE_NUMERIC_INTEGER,
afv.getType() );
assertEquals( FieldNatureType.TYPE_LITERAL,
afv.getNature() );
}
@Test
public void testI18N_JP_InsertFact() {
final String drl = "package org.test;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"then\n" +
"帽子 fact0 = new 帽子();\n" +
"fact0.setサイズ( 55 );\n" +
"insert( fact0 );\n" +
"end";
addModelField( "帽子",
"サイズ",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER );
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal( drl,
new ArrayList<String>(),
dmo );
assertNotNull( m );
assertEquals( 1,
m.rhs.length );
assertTrue( m.rhs[ 0 ] instanceof ActionInsertFact );
final ActionInsertFact aif = (ActionInsertFact) m.rhs[ 0 ];
assertEquals( "帽子",
aif.getFactType() );
assertEquals( "fact0",
aif.getBoundName() );
assertEquals( 1,
aif.getFieldValues().length );
final ActionFieldValue afv = aif.getFieldValues()[ 0 ];
assertEquals( "サイズ",
afv.getField() );
assertEquals( "55",
afv.getValue() );
assertEquals( DataType.TYPE_NUMERIC_INTEGER,
afv.getType() );
assertEquals( FieldNatureType.TYPE_LITERAL,
afv.getNature() );
}
@Test
public void testI18N_US_BoundField() {
final String drl = "package org.test;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"Applicant( $a : age )\n" +
"then\n" +
"end";
addModelField( "Applicant",
"age",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER );
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal( drl,
new ArrayList<String>(),
dmo );
assertNotNull( m );
assertEquals( 1,
m.lhs.length );
assertTrue( m.lhs[ 0 ] instanceof FactPattern );
final FactPattern fp = (FactPattern) m.lhs[ 0 ];
assertEquals( "Applicant",
fp.getFactType() );
assertEquals( 1,
fp.getNumberOfConstraints() );
assertTrue( fp.getConstraint( 0 ) instanceof SingleFieldConstraint );
final SingleFieldConstraint sfc = (SingleFieldConstraint) fp.getConstraint( 0 );
assertEquals( "age",
sfc.getFieldName() );
assertEquals( DataType.TYPE_NUMERIC_INTEGER,
sfc.getFieldType() );
assertEquals( "$a",
sfc.getFieldBinding() );
}
@Test
public void testI18N_JP_BoundField() {
final String drl = "package org.test;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"Applicant( 製品番号 : age )\n" +
"then\n" +
"end";
addModelField( "Applicant",
"age",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER );
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal( drl,
new ArrayList<String>(),
dmo );
assertNotNull( m );
assertEquals( 1,
m.lhs.length );
assertTrue( m.lhs[ 0 ] instanceof FactPattern );
final FactPattern fp = (FactPattern) m.lhs[ 0 ];
assertEquals( "Applicant",
fp.getFactType() );
assertEquals( 1,
fp.getNumberOfConstraints() );
assertTrue( fp.getConstraint( 0 ) instanceof SingleFieldConstraint );
final SingleFieldConstraint sfc = (SingleFieldConstraint) fp.getConstraint( 0 );
assertEquals( "age",
sfc.getFieldName() );
assertEquals( DataType.TYPE_NUMERIC_INTEGER,
sfc.getFieldType() );
assertEquals( "製品番号",
sfc.getFieldBinding() );
}
}