package net.jhorstmann.i18n.tools;
import antlr.RecognitionException;
import antlr.TokenStreamException;
import junit.framework.Assert;
import net.jhorstmann.i18n.tools.expr.ConstantExpression;
import net.jhorstmann.i18n.tools.expr.Expression;
import net.jhorstmann.i18n.tools.expr.NotExpression;
import net.jhorstmann.i18n.tools.expr.VariableExpression;
import net.jhorstmann.i18n.tools.expr.OrExpression;
import org.junit.Test;
import static net.jhorstmann.i18n.tools.PluralsParser.parseExpression;
import static net.jhorstmann.i18n.tools.PluralsParser.parsePluralForms;
import net.jhorstmann.i18n.tools.expr.TernaryExpression;
public class PluralParserTest {
@Test
public void testPluralForms() throws RecognitionException, TokenStreamException {
PluralForms pf = parsePluralForms("nplurals=2; plural=n == 1 ? 0 : 1;");
Assert.assertNotNull(pf);
Assert.assertEquals(2, pf.getNumPlurals());
Expression expr = pf.getExpression();
Assert.assertNotNull(expr);
Assert.assertTrue(expr.isBool());
Assert.assertEquals(1, expr.eval(0));
Assert.assertEquals(0, expr.eval(1));
Assert.assertEquals(1, expr.eval(2));
Assert.assertEquals("((n) == (1)) ? (0) : (1)", expr.toString());
}
@Test
public void testMissingSemicolon() throws RecognitionException, TokenStreamException {
PluralForms pf = parsePluralForms("nplurals=2; plural=n == 1 ? 0 : 1");
Assert.assertNotNull(pf);
Assert.assertEquals(2, pf.getNumPlurals());
Expression expr = pf.getExpression();
Assert.assertNotNull(expr);
Assert.assertTrue(expr.isBool());
}
@Test
public void testAdditionalSemicolon() throws RecognitionException, TokenStreamException {
PluralForms pf = parsePluralForms("nplurals=2; plural=n == 1 ? 0 : 1;;");
Assert.assertNotNull(pf);
Assert.assertEquals(2, pf.getNumPlurals());
Expression expr = pf.getExpression();
Assert.assertNotNull(expr);
Assert.assertTrue(expr.isBool());
}
@Test
public void testNumExpression() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("n");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof VariableExpression);
Assert.assertFalse(e.isBool());
Assert.assertEquals(0, e.eval(0));
Assert.assertEquals(1, e.eval(1));
Assert.assertEquals(2, e.eval(2));
Assert.assertEquals("n", e.toString());
}
@Test
public void testConstantExpression() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("123");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof ConstantExpression);
Assert.assertFalse(e.isBool());
Assert.assertEquals(123, e.eval(0));
Assert.assertEquals(123, e.eval(1));
Assert.assertEquals(123, e.eval(2));
Assert.assertEquals("123", e.toString());
}
@Test
public void testNotExpression() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("!0");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof NotExpression);
Assert.assertTrue(e.isBool());
Assert.assertEquals(1, e.eval(0));
Assert.assertEquals(1, e.eval(1));
Assert.assertEquals(1, e.eval(2));
Assert.assertEquals("!(0)", e.toString());
}
@Test
public void testNotExpression2() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("!(0)");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof NotExpression);
Assert.assertTrue(e.isBool());
Assert.assertEquals(1, e.eval(0));
Assert.assertEquals(1, e.eval(1));
Assert.assertEquals(1, e.eval(2));
Assert.assertEquals("!(0)", e.toString());
}
@Test
public void testNotExpression3() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("!(n==1)");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof NotExpression);
Assert.assertTrue(e.isBool());
Assert.assertEquals(1, e.eval(0));
Assert.assertEquals(0, e.eval(1));
Assert.assertEquals(1, e.eval(2));
Assert.assertEquals("!((n) == (1))", e.toString());
}
@Test
public void testOrExpression() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("n==0 || n==1");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof OrExpression);
Assert.assertTrue(e.isBool());
Assert.assertEquals(1, e.eval(0));
Assert.assertEquals(1, e.eval(1));
Assert.assertEquals(0, e.eval(2));
Assert.assertEquals("((n) == (0)) || ((n) == (1))", e.toString());
}
@Test
public void testOrExpression2() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("n==0 || n==1 || n==2");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof OrExpression);
Assert.assertTrue(e.isBool());
System.out.println(e.toString());
Assert.assertEquals(1, e.eval(0));
Assert.assertEquals(1, e.eval(1));
Assert.assertEquals(1, e.eval(2));
Assert.assertEquals(0, e.eval(3));
Assert.assertEquals("(((n) == (0)) || ((n) == (1))) || ((n) == (2))", e.toString());
}
@Test
public void testTernaryExpression() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("n==0 ? 0 : n==1 ? 1 : 0");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof TernaryExpression);
Assert.assertTrue(e.isBool());
System.out.println(e.toString());
Assert.assertEquals(0, e.eval(0));
Assert.assertEquals(1, e.eval(1));
Assert.assertEquals(0, e.eval(2));
Assert.assertEquals(0, e.eval(3));
Assert.assertEquals("((n) == (0)) ? (0) : (((n) == (1)) ? (1) : (0))", e.toString());
}
@Test
public void testTernaryExpression2() throws RecognitionException, TokenStreamException {
Expression e = parseExpression("n>0 ? n==1 ? 1 : 2 : 0");
Assert.assertNotNull(e);
Assert.assertTrue(e instanceof TernaryExpression);
Assert.assertFalse(e.isBool());
System.out.println(e.toString());
Assert.assertEquals(0, e.eval(0));
Assert.assertEquals(1, e.eval(1));
Assert.assertEquals(2, e.eval(2));
Assert.assertEquals(2, e.eval(3));
Assert.assertEquals("((n) > (0)) ? (((n) == (1)) ? (1) : (2)) : (0)", e.toString());
}
}