package annis.sqlgen; import annis.model.AnnisNode; import annis.model.Annotation; import annis.model.Edge; import annis.model.Edge.EdgeType; import static annis.sqlgen.TableAccessStrategy.COMPONENT_TABLE; import static annis.sqlgen.TableAccessStrategy.NODE_TABLE; import static annis.sqlgen.TableAccessStrategy.RANK_TABLE; import static annis.test.TestUtils.uniqueInt; import static annis.test.TestUtils.uniqueString; import java.sql.ResultSet; import java.sql.SQLException; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.Test; import static org.mockito.BDDMockito.given; import org.mockito.Mock; import static org.mockito.MockitoAnnotations.initMocks; public class AomAnnotateSqlGeneratorTest { // object under test private AomAnnotateExtractor generator; // dependencies @Mock private TableAccessStrategy tableAccessStrategy; // test data @Mock private ResultSet resultSet; // node table test data private static final long ID = uniqueInt(); private static final long TEXT_REF = uniqueInt(); private static final long CORPUS_REF = uniqueInt(); private static final String NODE_NAMESPACE = uniqueString("NAMESPACE"); private static final String NODE_NAME = uniqueString("NAME"); private static final long LEFT = uniqueInt(); private static final long RIGHT = uniqueInt(); private static final long TOKEN_INDEX = uniqueInt(); private static final long LEFT_TOKEN = uniqueInt(); private static final long RIGHT_TOKEN = uniqueInt(); private static final String SPAN = uniqueString("SPAN"); // rank and component table test data private static final long PRE = uniqueInt(); private static final EdgeType EDGETYPE = EdgeType.UNKNOWN; private static final String EDGE_NAMESPACE = uniqueString("NAMESPACE"); private static final String EDGE_NAME = uniqueString("NAME"); private static final long PARENT = uniqueInt(); private static final long NODE_REF = uniqueInt(); // annotation test tables private static final String NAMESPACE = "NAMESPACE"; private static final String NAME = "NAME"; private static final String VALUE = "VALUE"; @Before public void setup() { initMocks(this); generator = new AomAnnotateExtractor(); } @Test public void shouldMapNode() throws SQLException { // given stubNodeResultSet(); // when AnnisNode actual = generator.mapNode(resultSet, tableAccessStrategy, null); // then AnnisNode expected = new AnnisNode(ID, CORPUS_REF, TEXT_REF, LEFT, RIGHT, NODE_NAMESPACE, NODE_NAME, TOKEN_INDEX, SPAN, LEFT_TOKEN, RIGHT_TOKEN); assertThat(actual, is(expected)); } @Test public void shouldMapNodeWithToken() throws SQLException { // given stubNodeResultSet(); given(resultSet.wasNull()).willReturn(true); // when AnnisNode node = generator.mapNode(resultSet, tableAccessStrategy, null); // then assertThat(node.isToken(), is(false)); } @Test public void shouldMapNodeWithoutToken() throws SQLException { // given stubNodeResultSet(); given(resultSet.wasNull()).willReturn(false); // when AnnisNode node = generator.mapNode(resultSet, tableAccessStrategy, null); // then assertThat(node.isToken(), is(true)); } @Test public void shouldMapEdge() throws SQLException { // given stubEdgeResultSet(); // when Edge actual = generator.mapEdge(resultSet, tableAccessStrategy); // then Edge expected = createDefaultEdge(); assertThat(actual, is(expected)); } @Test public void shouldMapEdgeWithRoot() throws SQLException { // given stubEdgeResultSet(); given(resultSet.wasNull()).willReturn(true); // when Edge actual = generator.mapEdge(resultSet, tableAccessStrategy); // then Edge expected = createDefaultEdge(); expected.setSource(null); assertThat(actual, is(expected)); } @Test public void shouldMapAnnotation() throws SQLException { // given String table = uniqueString(); stubDefaultAnnotation(table); // when Annotation actual = generator.mapAnnotation(resultSet, tableAccessStrategy, table); // then Annotation expected = new Annotation(NAMESPACE, NAME, VALUE); assertThat(actual, is(expected)); } @Test public void shouldMapEmptyAnnotation() throws SQLException { // given String table = uniqueString(); stubDefaultAnnotation(table); given(resultSet.wasNull()).willReturn(true); // when Annotation actual = generator.mapAnnotation(resultSet, tableAccessStrategy, table); // then assertThat(actual, is(nullValue())); } private void stubNodeResultSet() throws SQLException { stubLongColumn(NODE_TABLE, "id", ID); stubLongColumn(NODE_TABLE, "corpus_ref", CORPUS_REF); stubLongColumn(NODE_TABLE, "text_ref", TEXT_REF); stubLongColumn(NODE_TABLE, "left", LEFT); stubLongColumn(NODE_TABLE, "right", RIGHT); stubStringColumn(NODE_TABLE, "namespace", NODE_NAMESPACE); stubStringColumn(NODE_TABLE, "name", NODE_NAME); stubLongColumn(NODE_TABLE, "token_index", TOKEN_INDEX); stubStringColumn(NODE_TABLE, "span", SPAN); stubLongColumn(NODE_TABLE, "left_token", LEFT_TOKEN); stubLongColumn(NODE_TABLE, "right_token", RIGHT_TOKEN); } private void stubEdgeResultSet() throws SQLException { stubLongColumn(RANK_TABLE, "pre", PRE); stubLongColumn(RANK_TABLE, "node_ref", NODE_REF); stubLongColumn(RANK_TABLE, "parent", PARENT); stubStringColumn(RANK_TABLE, "edge_type", EDGETYPE.getTypeChar()); stubStringColumn(COMPONENT_TABLE, "namespace", EDGE_NAMESPACE); stubStringColumn(COMPONENT_TABLE, "name", EDGE_NAME); } private Edge createDefaultEdge() { Edge expected = new Edge(); expected.setPre(PRE); expected.setEdgeType(EDGETYPE); expected.setNamespace(EDGE_NAMESPACE); expected.setName(EDGE_NAME); expected.setSource(new AnnisNode(PARENT)); expected.setDestination(new AnnisNode(NODE_REF)); return expected; } private void stubDefaultAnnotation(String table) throws SQLException { stubStringColumn(table, "namespace", NAMESPACE); stubStringColumn(table, "name", NAME); stubStringColumn(table, "value", VALUE); } private void stubStringColumn(String table, final String column, final String value) throws SQLException { String prefix = uniqueString(); given(tableAccessStrategy.columnName(table, column)).willReturn( prefix + column); given(resultSet.getString(prefix + column)).willReturn(value); } private void stubLongColumn(String table, final String column, final Long value) throws SQLException { String prefix = uniqueString(); given(tableAccessStrategy.columnName(table, column)).willReturn( prefix + column); given(resultSet.getLong(prefix + column)).willReturn(value); } }