package eu.stratosphere.sopremo.expressions; import java.io.IOException; import java.net.URL; import java.util.Arrays; import java.util.LinkedList; import junit.framework.Assert; import nl.jqno.equalsverifier.EqualsVerifier; import org.junit.Test; import eu.stratosphere.sopremo.io.JsonParser; import eu.stratosphere.sopremo.type.IJsonNode; import eu.stratosphere.sopremo.type.IntNode; import eu.stratosphere.sopremo.type.TextNode; public class PathExpressionTest extends EvaluableExpressionTest<PathExpression> { private static IJsonNode doc = getJsonNode(); private static IJsonNode getJsonNode() { try { final JsonParser parser = new JsonParser(new URL( getResourcePath("PathExpressionTest/test.json"))); // parser.setCodec(JsonUtil.OBJECT_MAPPER); return parser.readValueAsTree(); } catch (final IOException e) { e.printStackTrace(); } return null; } @Override protected PathExpression createDefaultInstance(final int index) { return new PathExpression(new ConstantExpression(IntNode.valueOf(index))); } @Test public void shouldReturnElementOfGivenPath() { final IJsonNode result = new PathExpression( new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry"), new ObjectAccess("GlossDef"), new ObjectAccess("GlossSeeAlso"), new ArrayAccess(1)).evaluate(doc, null, this.context); Assert.assertEquals(TextNode.valueOf("XML"), result); } @Test public void shouldAddNewExpression() { final PathExpression expr = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry")); expr.add(new ObjectAccess("ID")); final IJsonNode result = expr.evaluate(doc, null, this.context); Assert.assertEquals(TextNode.valueOf("SGML"), result); } @Test public void shouldRecognizeTruePrefix() { final PathExpression prefix = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv")); final boolean result = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry")).isPrefix(prefix); Assert.assertTrue(result); } @Test public void shouldRejectWrongPrefix() { final PathExpression prefix = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("title")); final boolean result = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry")).isPrefix(prefix); Assert.assertFalse(result); } @Test public void shouldRejectPrefixWithWrongLength() { final PathExpression prefix = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry")); final boolean result = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv")) .isPrefix(prefix); Assert.assertFalse(result); } @Test public void shouldReplaceRightFragment() { final PathExpression expr = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry"), new ObjectAccess("ID")); expr.replace(new ObjectAccess("ID"), new ObjectAccess("GlossSee")); final IJsonNode result = expr.evaluate(doc, null, this.context); Assert.assertEquals(TextNode.valueOf("markup"), result); } @Test public void shouldReplaceWholePath() { EvaluationExpression expr = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry"), new ObjectAccess("ID")); expr = expr.replace(new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList"), new ObjectAccess("GlossEntry"), new ObjectAccess("ID")), new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("title"))); final IJsonNode result = expr.evaluate(doc, null, this.context); Assert.assertEquals(TextNode.valueOf("example glossary"), result); } @Test public void shouldFindRightFragment() { final EvaluationExpression result = new PathExpression(new ObjectAccess("glossary"), new ObjectAccess("GlossDiv"), new ObjectAccess("GlossList")).getFragment(1); Assert.assertEquals(new ObjectAccess("GlossDiv"), result); } @Override protected void initVerifier(final EqualsVerifier<PathExpression> equalVerifier) { super.initVerifier(equalVerifier); equalVerifier.withPrefabValues(LinkedList.class, new LinkedList<Object>(), new LinkedList<Object>(Arrays.asList(new ObjectAccess("field")))); } }