/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.metamodel;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.apache.metamodel.data.DataSet;
import org.apache.metamodel.data.DefaultRow;
import org.apache.metamodel.data.EmptyDataSet;
import org.apache.metamodel.data.InMemoryDataSet;
import org.apache.metamodel.data.Row;
import org.apache.metamodel.data.SimpleDataSetHeader;
import org.apache.metamodel.query.SelectItem;
import org.apache.metamodel.schema.Column;
import org.apache.metamodel.schema.ColumnType;
import org.apache.metamodel.schema.MutableColumn;
import org.apache.metamodel.schema.MutableRelationship;
import org.apache.metamodel.schema.MutableSchema;
import org.apache.metamodel.schema.MutableTable;
import org.apache.metamodel.schema.Schema;
import org.apache.metamodel.schema.TableType;
/**
* Convenient super-class to use for unittesting
*/
public abstract class MetaModelTestCase extends TestCase {
public static final String COLUMN_CONTRIBUTOR_COUNTRY = "country";
public static final String COLUMN_CONTRIBUTOR_NAME = "name";
public static final String COLUMN_CONTRIBUTOR_CONTRIBUTOR_ID = "contributor_id";
public static final String COLUMN_PROJECT_PROJECT_ID = "project_id";
public static final String COLUMN_PROJECT_NAME = "name";
public static final String COLUMN_PROJECT_LINES_OF_CODE = "lines_of_code";
public static final String COLUMN_PROJECT_PARENT_PROJECT_ID = "parent_project_id";
public static final String COLUMN_ROLE_PROJECT_ID = "project_id";
public static final String COLUMN_ROLE_CONTRIBUTOR_ID = "contributor_id";
public static final String COLUMN_ROLE_ROLE_NAME = "name";
public static final String COLUMN_PROJECT_CONTRIBUTOR_CONTRIBUTOR = "contributor";
public static final String COLUMN_PROJECT_CONTRIBUTOR_ROLE = "role";
public static final String COLUMN_PROJECT_CONTRIBUTOR_PROJECT = "project";
public static final String TABLE_PROJECT_CONTRIBUTOR = "project_contributor";
public static final String TABLE_ROLE = "role";
public static final String TABLE_PROJECT = "project";
public static final String TABLE_CONTRIBUTOR = "contributor";
/**
* Creates an example schema with three tables and a view:
* <ul>
* <li>contributor[contributor_id,name,country] (TABLE)</li>
* <li>project[project_id,name,lines_of_code,parent_project_id] (TABLE)</li>
* <li>role[contributor_id,project_id,role_name] (TABLE)</li>
* <li>project_contributor[contributor,project,role] (VIEW)</li>
* </ul>
* The example schema is good for testing purposes and possess various
* features of the schema model:
* <ul>
* <li>Relations between tables: one-Contributor-to-many-Role's and
* many-Role's-to-one-Project</li>
* <li>Recursive relations: A project can have a parent project</li>
* <li>Views: The ProjectContributor view</li>
* </ul>
*/
protected Schema getExampleSchema() {
MutableSchema schema = new MutableSchema("MetaModelSchema");
MutableTable table1 = new MutableTable(TABLE_CONTRIBUTOR, TableType.TABLE, schema);
Column column1 = new MutableColumn(COLUMN_CONTRIBUTOR_CONTRIBUTOR_ID, ColumnType.INTEGER, table1, 0, false)
.setIndexed(true).setPrimaryKey(true);
Column column2 = new MutableColumn(COLUMN_CONTRIBUTOR_NAME, ColumnType.VARCHAR, table1, 1, false);
Column column3 = new MutableColumn(COLUMN_CONTRIBUTOR_COUNTRY, ColumnType.VARCHAR, table1, 2, true);
table1.setColumns(column1, column2, column3);
MutableTable table2 = new MutableTable(TABLE_PROJECT, TableType.TABLE, schema);
Column column4 = new MutableColumn(COLUMN_PROJECT_PROJECT_ID, ColumnType.INTEGER, table2, 0, false)
.setPrimaryKey(true);
Column column5 = new MutableColumn(COLUMN_PROJECT_NAME, ColumnType.VARCHAR, table2, 1, false);
Column column6 = new MutableColumn(COLUMN_PROJECT_LINES_OF_CODE, ColumnType.BIGINT, table2, 2, true);
Column column7 = new MutableColumn(COLUMN_PROJECT_PARENT_PROJECT_ID, ColumnType.INTEGER, table2, 3, true);
table2.setColumns(column4, column5, column6, column7);
MutableTable table3 = new MutableTable(TABLE_ROLE, TableType.TABLE, schema);
Column column8 = new MutableColumn(COLUMN_ROLE_CONTRIBUTOR_ID, ColumnType.INTEGER, table3, 0, false)
.setPrimaryKey(true);
Column column9 = new MutableColumn(COLUMN_ROLE_PROJECT_ID, ColumnType.INTEGER, table3, 1, false)
.setPrimaryKey(true);
Column column10 = new MutableColumn(COLUMN_ROLE_ROLE_NAME, ColumnType.VARCHAR, table3, 2, false);
table3.setColumns(column8, column9, column10);
MutableTable table4 = new MutableTable(TABLE_PROJECT_CONTRIBUTOR, TableType.VIEW, schema);
Column column11 = new MutableColumn(COLUMN_PROJECT_CONTRIBUTOR_CONTRIBUTOR, ColumnType.VARCHAR, table4, 0,
false);
Column column12 = new MutableColumn(COLUMN_PROJECT_CONTRIBUTOR_PROJECT, ColumnType.VARCHAR, table4, 1, false);
Column column13 = new MutableColumn(COLUMN_PROJECT_CONTRIBUTOR_ROLE, ColumnType.VARCHAR, table4, 2, false);
ArrayList<Column> columnList = new ArrayList<Column>();
columnList.add(column11);
columnList.add(column12);
columnList.add(column13);
table4.setColumns(columnList);
// one-Contributor-to-many-Role's
MutableRelationship.createRelationship(new Column[] { column1 }, new Column[] { column8 });
// one-Project-to-many-Role's
MutableRelationship.createRelationship(new Column[] { column4 }, new Column[] { column9 });
// view relation [contributor -> contributor_name]
MutableRelationship.createRelationship(new Column[] { column2 }, new Column[] { column11 });
// view relation [project -> project_name]
MutableRelationship.createRelationship(new Column[] { column5 }, new Column[] { column12 });
// view relation [role -> role_name]
MutableRelationship.createRelationship(new Column[] { column10 }, new Column[] { column13 });
schema.setTables(table1, table2, table3, table4);
return schema;
}
protected static DataSet createDataSet(SelectItem[] selectItems, List<Object[]> data) {
if (data.isEmpty()) {
return new EmptyDataSet(selectItems);
}
SimpleDataSetHeader header = new SimpleDataSetHeader(selectItems);
List<Row> rows = new ArrayList<Row>();
for (Object[] objects : data) {
rows.add(new DefaultRow(header, objects));
}
return new InMemoryDataSet(header, rows);
}
private List<Object> _mocks = new ArrayList<Object>();
@Override
protected void setUp() throws Exception {
super.setUp();
_mocks.clear();
}
public <T extends Object> T createMock(Class<T> clazz) {
T mock = EasyMock.createMock(clazz);
_mocks.add(mock);
return mock;
}
public void verifyMocks() {
EasyMock.verify(_mocks.toArray());
}
public void replayMocks() {
EasyMock.replay(_mocks.toArray());
}
public void assertEquals(DataSet ds1, DataSet ds2) {
assertEquals(Arrays.toString(ds1.getSelectItems()), Arrays.toString(ds2.getSelectItems()));
boolean ds1next = true;
while (ds1next) {
ds1next = ds1.next();
boolean ds2next = ds2.next();
assertEquals("DataSet 1 next=" + ds1next, ds1next, ds2next);
if (ds1next) {
Row row1 = ds1.getRow();
Row row2 = ds2.getRow();
assertEquals(row1, row2);
}
}
}
protected File getTestResourceAsFile(String filename) {
return new File("src/test/resources/" + filename);
}
}