/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright 2013 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.plugin.services.connections.mondrian;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import mondrian.olap.Axis;
import mondrian.olap.Dimension;
import mondrian.olap.Hierarchy;
import mondrian.olap.Level;
import mondrian.olap.Member;
import mondrian.olap.Result;
import org.apache.commons.collections.ListUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
public class MDXMetaDataTest {
private static final int COLUMN_SIZE = 3;
private static final int ROW_SIZE = 2;
private static final String HIERARCHY_NAME = "hierarchy";
private static final String LEVEL_NAME = "level";
private static final String DIMENSION_NAME = "dimension";
private static final String MEMBER_NAME = "member name";
private static final String MEMBER_CAPTION = "member caption";
@Test
public void testMetadataFromEmptyAxis() {
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( new Axis[0] );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
checkEmptyResult( metadata );
}
@Test
public void testMetadataFromNullAxis() {
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( new Axis[] { null, null } );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
checkEmptyResult( metadata );
}
@Test
public void testMetadataForNullPositions() {
Axis axColumn = mockAxis( null );
Axis axRow = mockAxis( null );
Axis[] axes = new Axis[] { axColumn, axRow };
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( axes );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
checkEmptyResult( metadata );
}
@Test
public void testMetadataForEmptyPositions() {
Axis axColumn = mockAxis( ListUtils.EMPTY_LIST );
Axis axRow = mockAxis( ListUtils.EMPTY_LIST );
Axis[] axes = new Axis[] { axColumn, axRow };
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( axes );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
checkEmptyResult( metadata );
}
@Test
@SuppressWarnings( { "rawtypes", "unchecked" } )
public void testMetadataExtendedColumnNames() {
List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );
Axis axColumn = mockAxis( positions );
Axis axRow = mockAxis( positions );
Axis[] axes = new Axis[] { axColumn, axRow };
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( axes );
MDXMetaData metadata = new MDXMetaData( nativeResultSet, true );
checkColumnHeaders( positions, metadata.getColumnHeaders() );
checkRowHeaders( positions, metadata.getRowHeaders() );
checkRowHeaderNames( positions, metadata.getRowHeaderNames() );
}
@Test
@SuppressWarnings( { "rawtypes", "unchecked" } )
public void testMetadataWithoutExtendedColumnNames() {
List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );
Axis axColumn = mockAxis( positions );
Axis axRow = mockAxis( positions );
Axis[] axes = new Axis[] { axColumn, axRow };
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( axes );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
Object[][] columnHeaders = metadata.getColumnHeaders();
checkExtendedColumnHeaders( positions, columnHeaders );
checkExtendedRowHeaders( positions, metadata.getRowHeaders() );
checkExtendedRowHeaderNames( positions, metadata.getRowHeaderNames() );
}
@Test
public void testGetEmptyColumnName() {
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( new Axis[0] );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
String columnName = metadata.getColumnName( -1 );
assertEquals( StringUtils.EMPTY, columnName );
columnName = metadata.getColumnName( metadata.getRowHeaderNames().length + 1 );
assertEquals( StringUtils.EMPTY, columnName );
}
@Test
@SuppressWarnings( "rawtypes" )
public void testGetColumnName() {
List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );
Axis axColumn = mockAxis( positions );
Axis axRow = mockAxis( positions );
Axis[] axes = new Axis[] { axColumn, axRow };
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( axes );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
String columnName = metadata.getColumnName( 0 );
assertEquals( metadata.getRowHeaderNames()[0], columnName );
}
@Test
@SuppressWarnings( "rawtypes" )
public void testGetColumnCount() {
List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );
Axis axColumn = mockAxis( positions );
Axis axRow = mockAxis( positions );
Axis[] axes = new Axis[] { axColumn, axRow };
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( axes );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
int columnCount = metadata.getColumnCount();
assertEquals( positions.size(), columnCount );
}
@Test
public void testGetZeroColumnCount() {
Result nativeResultSet = mock( Result.class );
when( nativeResultSet.getAxes() ).thenReturn( new Axis[0] );
MDXMetaData metadata = new MDXMetaData( nativeResultSet );
int columnCount = metadata.getColumnCount();
assertEquals( 0, columnCount );
when( nativeResultSet.getAxes() ).thenReturn( new Axis[] { null } );
metadata = new MDXMetaData( nativeResultSet );
columnCount = metadata.getColumnCount();
assertEquals( 0, columnCount );
Axis axColumn = mockAxis( null );
when( nativeResultSet.getAxes() ).thenReturn( new Axis[] { axColumn } );
metadata = new MDXMetaData( nativeResultSet );
columnCount = metadata.getColumnCount();
assertEquals( 0, columnCount );
}
private void checkEmptyResult( MDXMetaData metadata ) {
assertEquals( 0, metadata.getColumnHeaders().length );
assertEquals( 0, metadata.getRowHeaders().length );
assertEquals( 0, metadata.getRowHeaderNames().length );
}
@SuppressWarnings( "unchecked" )
private void checkColumnHeaders( List<Member> positions, Object[][] columnHeaders ) {
assertNotNull( columnHeaders );
assertTrue( columnHeaders.length > 0 );
for ( int i = 0; i < columnHeaders.length; i++ ) {
for ( int j = 0; j < columnHeaders[i].length; j++ ) {
List<Member> row = (List<Member>) positions.get( j );
Member memberExpected = (Member) row.get( i );
assertEquals( memberExpected.getCaption(), columnHeaders[i][j] );
}
}
}
@SuppressWarnings( "unchecked" )
private void checkExtendedColumnHeaders( List<Member> positions, Object[][] columnHeaders ) {
assertNotNull( columnHeaders );
assertTrue( columnHeaders.length > 0 );
for ( int i = 0; i < columnHeaders.length; i++ ) {
for ( int j = 0; j < columnHeaders[i].length; j++ ) {
List<Member> row = (List<Member>) positions.get( j );
String expectedValue;
if ( ( i == columnHeaders.length - 1 ) ) {
Member memberExpected = (Member) row.get( i - 1 );
expectedValue = memberExpected.getHierarchy().getCaption();
} else {
Member memberExpected = (Member) row.get( i );
expectedValue = memberExpected.getCaption();
}
assertEquals( expectedValue, columnHeaders[i][j] );
}
}
}
@SuppressWarnings( "unchecked" )
private void checkRowHeaders( List<Member> positions, Object[][] rowHeaders ) {
assertNotNull( rowHeaders );
assertTrue( rowHeaders.length > 0 );
for ( int i = 0; i < rowHeaders.length; i++ ) {
for ( int j = 0; j < rowHeaders[i].length; j++ ) {
List<Member> row = (List<Member>) positions.get( i );
Member memberExpected = (Member) row.get( j );
assertEquals( memberExpected.getCaption(), rowHeaders[i][j] );
}
}
}
@SuppressWarnings( "unchecked" )
private void checkExtendedRowHeaders( List<Member> positions, Object[][] rowHeaders ) {
assertNotNull( rowHeaders );
assertTrue( rowHeaders.length > 0 );
for ( int i = 0; i < rowHeaders.length; i++ ) {
for ( int j = 0; j < rowHeaders[i].length; j++ ) {
List<Member> row = (List<Member>) positions.get( i );
String expectedValue;
if ( ( j == rowHeaders.length - 1 ) ) {
Member memberExpected = (Member) row.get( j - 1 );
expectedValue = memberExpected.getHierarchy().getCaption();
} else {
Member memberExpected = (Member) row.get( j );
expectedValue = memberExpected.getCaption();
}
assertEquals( expectedValue, rowHeaders[i][j] );
}
}
}
@SuppressWarnings( "unchecked" )
private void checkRowHeaderNames( List<Member> positions, String[] names ) {
assertNotNull( names );
assertTrue( names.length > 0 );
for ( int i = 0; i < names.length; i++ ) {
List<Member> row = (List<Member>) positions.get( 0 );
Member member = (Member) row.get( i );
String expectedName =
"[" + member.getDimension().getName() + "].[" + member.getHierarchy().getName() + "].["
+ member.getLevel().getName() + "]";
assertEquals( expectedName, names[i] );
}
}
@SuppressWarnings( "unchecked" )
private void checkExtendedRowHeaderNames( List<Member> positions, String[] names ) {
assertNotNull( names );
assertTrue( names.length > 0 );
for ( int i = 0; i < names.length; i++ ) {
String expectedValue;
List<Member> row = (List<Member>) positions.get( 0 );
if ( ( i == row.size() ) ) {
Member member = (Member) row.get( row.size() - 1 );
expectedValue = member.getHierarchy().getName() + "{" + i + "}";
} else {
Member member = (Member) row.get( i );
expectedValue = member.getHierarchy().getCaption();
}
assertEquals( expectedValue, names[i] );
}
}
@SuppressWarnings( { "unchecked", "rawtypes" } )
private Axis mockAxis( List positions ) {
Axis ax = mock( Axis.class );
when( ax.getPositions() ).thenReturn( positions );
return ax;
}
private Hierarchy mockHierarchy( String name, String caption ) {
String hierarchyCaption = HIERARCHY_NAME + caption;
String hierarchyName = HIERARCHY_NAME + name;
Hierarchy hierarchy = mock( Hierarchy.class );
when( hierarchy.getCaption() ).thenReturn( hierarchyCaption );
when( hierarchy.getName() ).thenReturn( hierarchyName );
return hierarchy;
}
private Level mockLevel( String name ) {
Level level = mock( Level.class );
when( level.getName() ).thenReturn( LEVEL_NAME + name );
return level;
}
private Dimension mockDimension( String name ) {
Dimension dimension = mock( Dimension.class );
when( dimension.getName() ).thenReturn( DIMENSION_NAME + name );
return dimension;
}
private Member mockMember( String caption, String name ) {
Level level = mockLevel( name );
Dimension dimension = mockDimension( name );
Hierarchy hierarchy = mockHierarchy( name, caption );
Member member = mock( Member.class );
when( member.getCaption() ).thenReturn( caption );
when( member.getHierarchy() ).thenReturn( hierarchy );
when( member.getDimension() ).thenReturn( dimension );
when( member.getLevel() ).thenReturn( level );
return member;
}
private List<Member> mockRow( int rowSize, String additionalName ) {
List<Member> rows = new ArrayList<Member>( rowSize );
for ( int i = 0; i < rowSize; i++ ) {
rows.add( mockMember( MEMBER_CAPTION + i + additionalName, MEMBER_NAME + i + additionalName ) );
}
return rows;
}
private List<List<Member>> mockPositions( int positionsSize, int rowSize ) {
List<List<Member>> positions = new ArrayList<List<Member>>( positionsSize );
for ( int i = 0; i < positionsSize; i++ ) {
positions.add( mockRow( rowSize, String.valueOf( i ) ) );
}
return positions;
}
}