/*
* Copyright 2016 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hive.beeline;
import java.io.PrintStream;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.mockito.Matchers;
import static org.mockito.Mockito.when;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import static org.mockito.Mockito.mock;
public class TestTableOutputFormat {
public class BeelineMock extends BeeLine {
private String lastPrintedLine;
@Override
final void output(final ColorBuffer msg, boolean newline, PrintStream out) {
lastPrintedLine = msg.getMono();
super.output(msg, newline, out);
}
private String getLastPrintedLine() {
return lastPrintedLine;
}
}
private final String[][] mockRowData = {
{"key1", "aaa"},
{"key2", "bbbbb"},
{"key3", "ccccccccccccccccccccccccccc"},
{"key4", "ddddddddddddddd"}
};
private BeelineMock mockBeeline;
private ResultSet mockResultSet;
private TestBufferedRows.MockRow mockRow;
/**
* Test of print method, of class TableOutputFormat. There was an empty extra column after the
* last one.
*/
@Test
public final void testPrint() throws SQLException {
setupMockData();
BufferedRows bfRows = new BufferedRows(mockBeeline, mockResultSet);
TableOutputFormat instance = new TableOutputFormat(mockBeeline);
String expResult = "+-------+------------------------------+";
instance.print(bfRows);
String outPutResults = mockBeeline.getLastPrintedLine();
assertEquals(expResult, outPutResults);
}
private void setupMockData() throws SQLException {
mockBeeline = new BeelineMock();
mockResultSet = mock(ResultSet.class);
ResultSetMetaData mockResultSetMetaData = mock(ResultSetMetaData.class);
when(mockResultSetMetaData.getColumnCount()).thenReturn(2);
when(mockResultSetMetaData.getColumnLabel(1)).thenReturn("Key");
when(mockResultSetMetaData.getColumnLabel(2)).thenReturn("Value");
when(mockResultSet.getMetaData()).thenReturn(mockResultSetMetaData);
mockRow = new TestBufferedRows.MockRow();
// returns true as long as there is more data in mockResultData array
when(mockResultSet.next()).thenAnswer(new Answer<Boolean>() {
private int mockRowDataIndex = 0;
@Override
public Boolean answer(final InvocationOnMock invocation) {
if (mockRowDataIndex < mockRowData.length) {
mockRow.setCurrentRowData(mockRowData[mockRowDataIndex]);
mockRowDataIndex++;
return true;
} else {
return false;
}
}
});
when(mockResultSet.getString(Matchers.anyInt())).thenAnswer(new Answer<String>() {
@Override
public String answer(final InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
int index = ((Integer) args[0]);
return mockRow.getColumn(index);
}
});
}
}