package org.overture.interpreter.tests.stdlibs;
import java.util.Arrays;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.overture.interpreter.util.InterpreterUtil;
import org.overture.interpreter.utilities.stdlibs.CsvParser;
import org.overture.interpreter.utilities.stdlibs.CsvResult;
import org.overture.interpreter.utilities.stdlibs.CsvValueBuilder;
import org.overture.interpreter.values.BooleanValue;
import org.overture.interpreter.values.CharacterValue;
import org.overture.interpreter.values.IntegerValue;
import org.overture.interpreter.values.NilValue;
import org.overture.interpreter.values.RealValue;
import org.overture.interpreter.values.SeqValue;
import org.overture.interpreter.values.SetValue;
import org.overture.interpreter.values.TokenValue;
import org.overture.interpreter.values.TupleValue;
import org.overture.interpreter.values.Value;
import org.overture.interpreter.values.ValueList;
import org.overture.interpreter.values.ValueSet;
public class CsvParserTest
{
private CsvParser parser;
@Before
public void init()
{
parser = new CsvParser(new CsvValueBuilder()
{
@Override
public Value createValue(String value)
throws Exception
{
return InterpreterUtil.interpret(value);
}
});
}
@Test
public void nullCase()
{
CsvResult res = parser.parseValues(null);
assumeIncorrectData(CsvParser.INVALID_CSV_MSG, res.getErrorMsg());
Assert.assertEquals(Arrays.asList(), res.getValues());
}
@Test
public void emptyLine()
{
CsvResult res = parser.parseValues("");
assumeCorrectData(res.dataOk());
Assert.assertEquals(Arrays.asList(), res.getValues());
}
@Test
public void threeNats()
{
CsvResult res = parser.parseValues("1, 2, 3");
assumeCorrectData(res.dataOk());
Assert.assertEquals(Arrays.asList(new IntegerValue(1), new IntegerValue(2), new IntegerValue(3)),res.getValues());
}
@Test
public void boolCharRealNil() throws Exception
{
CsvResult res = parser.parseValues("true,'a', 4.3, nil");
assumeCorrectData(res.dataOk());
Assert.assertEquals(Arrays.asList(new BooleanValue(true), new CharacterValue('a'), new RealValue(4.3), new NilValue()), res.getValues());
}
@Test
public void twoEmptySets()
{
CsvResult res = parser.parseValues("{}, {}");
assumeCorrectData(res.dataOk());
Assert.assertEquals(Arrays.asList(new SetValue(), new SetValue()), res.getValues());
}
@Test
public void twoNatSets()
{
CsvResult res = parser.parseValues("{1,2},{3,4}");
assumeCorrectData(res.dataOk());
ValueSet leftValues = new ValueSet();
leftValues.add(new IntegerValue(1));
leftValues.add(new IntegerValue(2));
ValueSet rightValues = new ValueSet();
rightValues.add(new IntegerValue(3));
rightValues.add(new IntegerValue(4));
Assert.assertEquals(Arrays.asList(new SetValue(leftValues), new SetValue(rightValues)), res.getValues());
}
@Test
public void twoTuples()
{
CsvResult res = parser.parseValues("mk_(1,mk_token(\"x\")), mk_('a', nil)");
assumeCorrectData(res.dataOk());
ValueList leftVals = new ValueList();
leftVals.add(new IntegerValue(1));
leftVals.add(new TokenValue(new SeqValue("x")));
TupleValue leftTup = new TupleValue(leftVals);
ValueList rightVals = new ValueList();
rightVals.add(new CharacterValue('a'));
rightVals.add(new NilValue());
TupleValue rightTup = new TupleValue(rightVals);
Assert.assertEquals(Arrays.asList(leftTup, rightTup), res.getValues());
}
@Test
public void illegalValue()
{
CsvResult res = parser.parseValues("1,_,2");
assumeIncorrectData("Unexpected character '_' (code 0x5f)", res.getErrorMsg());
Assert.assertEquals(Arrays.asList(new IntegerValue(1)), res.getValues());
}
@Test
public void letAndNat()
{
CsvResult res = parser.parseValues("let a = 1, b = 2 in a + b, 5");
assumeCorrectData(res.dataOk());
Assert.assertEquals(Arrays.asList(new IntegerValue(3), new IntegerValue(5)), res.getValues());
}
private void assumeCorrectData(Boolean dataOk)
{
Assert.assertTrue("Expected data format to be correct", dataOk);
}
private void assumeIncorrectData(String expectedErrorMsg, String actualErrorMsg)
{
Assert.assertEquals(expectedErrorMsg, actualErrorMsg);
}
}