package edu.uva.softwarecons.test;
import edu.uva.softwarecons.grammar.QuestionnaireBuilderVisitor;
import edu.uva.softwarecons.model.Form;
import edu.uva.softwarecons.model.expression.BinaryExpression;
import edu.uva.softwarecons.model.expression.literal.IdExpression;
import edu.uva.softwarecons.model.expression.logical.AndExpression;
import edu.uva.softwarecons.model.question.BasicQuestion;
import edu.uva.softwarecons.model.question.ElseQuestion;
import edu.uva.softwarecons.model.question.IfQuestion;
import edu.uva.softwarecons.model.question.Question;
import edu.uva.softwarecons.model.type.BooleanType;
import edu.uva.softwarecons.model.type.DateType;
import edu.uva.softwarecons.model.type.DecimalType;
import edu.uva.softwarecons.model.type.IntegerType;
import edu.uva.softwarecons.model.type.MoneyType;
import edu.uva.softwarecons.model.type.StringType;
import edu.uva.softwarecons.model.type.Type;
import edu.uva.softwarecons.util.FileReader;
import edu.uva.softwarecons.util.ParserBuilder;
import org.antlr.v4.runtime.tree.ParseTree;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.HashMap;
import static junit.framework.Assert.assertTrue;
/**
* Falconlabs
*
* @author Santiago Carrillo
* Date: 3/7/14
*/
public class QuestionnaireBuilderVisitorTest
{
private ParserBuilder parserBuilder;
private Form form;
private HashMap<String, BasicQuestion> questions;
private IfQuestion ifQuestion;
@Before
public void setUp()
{
parserBuilder = new ParserBuilder();
try
{
ParseTree tree =
parserBuilder.buildParseTree( FileReader.getFileContent( "questionnaire_builder_test.txt", "res" ) );
QuestionnaireBuilderVisitor questionnaireBuilderVisitor = new QuestionnaireBuilderVisitor();
form = (Form) questionnaireBuilderVisitor.visit( tree );
questions = new HashMap<String, BasicQuestion>();
for ( Question q : form.getQuestions() )
{
if ( new BasicQuestion( null, null, null ).equals( q ) )
{
BasicQuestion basicQuestion = (BasicQuestion) q;
questions.put( basicQuestion.getId(), basicQuestion );
}
else if ( new IfQuestion( null, null, null, null ).equals( q ) )
{
ifQuestion = (IfQuestion) q;
for ( Question question : ifQuestion.getQuestions() )
{
BasicQuestion basicQuestion1 = (BasicQuestion) question;
questions.put( basicQuestion1.getId(), basicQuestion1 );
}
ElseQuestion elseQuestion = ifQuestion.getElseQuestion();
for ( Question question : elseQuestion.getQuestions() )
{
BasicQuestion basicQuestion1 = (BasicQuestion) question;
questions.put( basicQuestion1.getId(), basicQuestion1 );
}
}
}
}
catch ( IOException e )
{
assert false : "Error reading the input file for the QuestionnaireBuilderTest";
}
}
@Test
public void formIdTest()
{
assertTrue( "TestFormId".equals( form.getId() ) );
}
@Test
public void booleanQuestionTest()
{
BasicQuestion question = questions.get( "booleanQuestion" );
validateQuestionInfo( question, "booleanQuestion", "\"booleanQuestion label\"", new BooleanType() );
}
@Test
public void dateQuestionTest()
{
BasicQuestion question = questions.get( "dateQuestion" );
validateQuestionInfo( question, "dateQuestion", "\"dateQuestion label\"", new DateType() );
}
@Test
public void decimalQuestionTest()
{
BasicQuestion question = questions.get( "decimalQuestion" );
validateQuestionInfo( question, "decimalQuestion", "\"decimalQuestion label\"", new DecimalType() );
}
@Test
public void integerQuestionTest()
{
BasicQuestion question = questions.get( "integerQuestion" );
validateQuestionInfo( question, "integerQuestion", "\"integerQuestion label\"", new IntegerType() );
}
@Test
public void moneyQuestionTest()
{
BasicQuestion question = questions.get( "moneyQuestion" );
validateQuestionInfo( question, "moneyQuestion", "\"moneyQuestion label\"", new MoneyType() );
}
@Test
public void stringQuestionTest()
{
BasicQuestion question = questions.get( "stringQuestion" );
validateQuestionInfo( question, "stringQuestion", "\"stringQuestion label\"", new StringType() );
}
@Test
public void ifQuestionTest()
{
BasicQuestion question = questions.get( "ifQuestion" );
validateQuestionInfo( question, "ifQuestion", "\"ifQuestion label\"", new StringType() );
}
@Test
public void elseQuestionTest()
{
BasicQuestion question = questions.get( "elseQuestion" );
validateQuestionInfo( question, "elseQuestion", "\"elseQuestion label\"", new StringType() );
}
@Test
public void ifExpressionTest()
{
assertTrue( ifQuestion.getExpression().equals( new AndExpression( null, null ) ) );
BinaryExpression expression = ( (BinaryExpression) ifQuestion.getExpression() );
assertTrue( expression.getLeftExpression().equals( new IdExpression( null ) ) );
assertTrue( expression.getRightExpression().equals( new IdExpression( null ) ) );
assertTrue( ifQuestion.getConditionText().equals( "booleanQuestion&&booleanQuestion" ) );
}
private void validateQuestionInfo( BasicQuestion question, String expectedId, String expectedText,
Type expectedType )
{
assertTrue( expectedId.equals( question.getId() ) );
assertTrue( expectedText.equals( question.getText() ) );
assertTrue( expectedType.equals( question.getType() ) );
}
}