/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit.emulation.hibernate3.ast.fromClause; import java.util.*; import mockit.emulation.hibernate3.ast.*; import static mockit.emulation.hibernate3.ast.fromClause.FromJoin.*; import static org.junit.Assert.*; import org.junit.*; public final class FromClauseTest { private List<Object[]> tuples; @Test(expected = QuerySyntaxException.class) public void parseIncompleteClause() { FromClause.parse(new Tokens("from ")); } public static class Entity { Entity parent; List<Object> children = new LinkedList<Object>(); Entity(Entity parent) { this.parent = parent; } public Entity getParent() { return parent; } public List<?> getChildren() { return children; } } @Test(expected = RuntimeException.class) public void columnIndexForUnknownAlias() { FromClause from = FromClause.parse(new Tokens("from Entity e")); matches(from, new Entity(null)); from.columnIndex("x"); } private void matches(FromClause from, Object... entities) { tuples = from.matches(Arrays.asList(entities)); } @Test(expected = RuntimeException.class) public void columnIndexForUnknownPathElement() { FromClause from = FromClause.parse(new Tokens("from Entity e join x.parent p")); matches(from, new Entity(null)); from.columnIndex("e"); } @Test public void parseAndMatchBasicClause() { String hql = "from Entity e"; FromClause from = FromClause.parse(new Tokens(hql)); assertEquals(1, from.ranges.size()); FromClassOrOuterQueryPath range = from.ranges.get(0); assertFalse(range.isFQName); assertEquals("Entity", range.entityClassName); assertEquals("e", range.alias); assertNull(range.join); assertFound(from, "e", new Entity(null)); assertEquals(1, tuples.get(0).length); from = FromClause.parse(new Tokens(hql)); assertNotFound(from, "e", new Object()); } private void assertFound(FromClause from, String alias, Object entity) { matches(from, entity); assertEquals(1, tuples.size()); assertEquals(0, from.columnIndex(alias)); assertSame(entity, tuples.get(0)[0]); } private void assertNotFound(FromClause from, String alias, Object entity) { matches(from, entity); assertEquals(0, from.columnIndex(alias)); assertEquals(0, tuples.size()); } @Test public void parseAndMatchWithJoin() { FromClause from = FromClause.parse(new Tokens("from Entity e join e.parent p")); assertEquals(1, from.ranges.size()); FromClassOrOuterQueryPath range = from.ranges.get(0); assertFalse(range.isFQName); assertEquals("Entity", range.entityClassName); assertEquals("e", range.alias); FromJoin join = range.join; assertNotNull(join); assertSame(JoinType.Inner, join.type); assertEquals("p", join.pathAndAlias.alias); assertEquals("e", join.pathAndAlias.pathElements[0]); assertEquals("parent", join.pathAndAlias.pathElements[1]); assertNull(join.nextJoin); assertNotFound(from, "e", new Entity(null)); assertFound(from, "e", new Entity(new Entity(null))); assertEquals(2, tuples.get(0).length); } @Ignore @Test public void parseAndMatchWithTwoRanges() { String hql = "from Entity e1, java.lang.Object e2"; FromClause from = FromClause.parse(new Tokens(hql)); assertEquals(2, from.ranges.size()); FromClassOrOuterQueryPath range1 = from.ranges.get(0); assertEquals("e1", range1.alias); FromClassOrOuterQueryPath range2 = from.ranges.get(1); assertTrue(range2.isFQName); assertEquals("e2", range2.alias); assertEquals("java.lang.Object", range2.entityClassName); Object e1 = new Entity(null); Object e2 = new Object(); matches(from, e1, e2); assertSame(e1, tuples.get(0)[0]); assertSame(e2, tuples.get(0)[1]); from = FromClause.parse(new Tokens(hql)); matches(from, e1); assertEquals(0, tuples.size()); from = FromClause.parse(new Tokens(hql)); matches(from, e2); assertEquals(0, tuples.size()); from = FromClause.parse(new Tokens(hql)); matches(from, ""); assertEquals(0, tuples.size()); } @Test public void parseAndMatchWithTwoInnerJoins() { String hql = "from Entity e join e.parent p join p.parent p2"; FromClause from = FromClause.parse(new Tokens(hql)); assertEquals(1, from.ranges.size()); FromJoin join1 = from.ranges.get(0).join; assertNotNull(join1); assertNotNull(join1.nextJoin); Entity e = new Entity(null); matches(from, e); assertEquals(0, tuples.size()); from = FromClause.parse(new Tokens(hql)); e = new Entity(new Entity(null)); matches(from, e); assertEquals(0, tuples.size()); from = FromClause.parse(new Tokens(hql)); Entity p2 = new Entity(null); Entity p = new Entity(p2); e = new Entity(p); matches(from, e); Object[] tuple = tuples.get(0); assertSame(e, tuple[0]); assertSame(p, tuple[1]); assertSame(p2, tuple[2]); } @Test public void parseAndMatchWithInnerJoinOnCollection() { FromClause from = FromClause.parse(new Tokens("from Entity e inner join e.children c")); assertEquals(1, from.ranges.size()); Entity e = new Entity(null); matches(from, e); assertEquals(0, tuples.size()); e.children = null; matches(from, e); assertEquals(0, tuples.size()); e = new Entity(null); Object c = new Object(); e.children.add(c); matches(from, e); assertSame(e, tuples.get(0)[0]); assertSame(c, tuples.get(0)[1]); Object c2 = new Object(); e.children.add(c2); matches(from, e); assertSame(e, tuples.get(0)[0]); assertSame(c, tuples.get(0)[1]); assertSame(e, tuples.get(1)[0]); assertSame(c2, tuples.get(1)[1]); } @Test public void matchWithJoinOnCollectionFollowedByOtherJoin() { FromClause from = FromClause.parse(new Tokens("from Entity e join e.children as c join c.parent AS p")); Entity entity = new Entity(new Entity(null)); Entity parent = new Entity(null); entity.children.add(new Entity(parent)); matches(from, entity); Object[] tuple = tuples.get(0); assertSame(entity, tuple[0]); assertSame(entity.children.get(0), tuple[1]); assertSame(parent, tuple[2]); } }