/* * Copyright (c) 2017 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.magma.datasource.spss; import java.io.File; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.obiba.magma.*; import org.obiba.magma.datasource.spss.support.SpssDatasourceFactory; import org.obiba.magma.datasource.spss.support.SpssDatasourceParsingException; import org.obiba.magma.support.DatasourceParsingException; import org.obiba.magma.support.EntitiesPredicate; import org.obiba.magma.support.VariableEntityBean; import org.obiba.magma.type.DateType; import org.obiba.magma.type.DecimalType; import org.obiba.magma.type.TextType; import static org.fest.assertions.api.Assertions.assertThat; import static org.junit.Assert.fail; public class SpssDatasourceTest { private SpssDatasourceFactory dsFactory; @Before public void before() { new MagmaEngine(); dsFactory = new SpssDatasourceFactory(); dsFactory.setName(SpssDatasourceFactory.DEFAULT_DATASOURCE_NAME); } @After public void after() { MagmaEngine.get().shutdown(); } @Test public void testCreateDatasourceWithValidFile() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); assertThat(SpssDatasourceFactory.DEFAULT_DATASOURCE_NAME).isEqualTo(ds.getName()); } @Test public void textCreateDatasourceWithInvalidFile() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); assertThat(SpssDatasourceFactory.DEFAULT_DATASOURCE_NAME).isEqualTo(ds.getName()); } @Test public void testCreateDatasourceWithTwoFiles() throws Exception { File file1 = getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav"); File file2 = getResourceFile("org/obiba/magma/datasource/spss/StringCategories.sav"); dsFactory.addFile(file1); dsFactory.addFile(file2); Datasource ds = dsFactory.create(); assertThat(SpssDatasourceFactory.DEFAULT_DATASOURCE_NAME).isEqualTo(ds.getName()); } @Test public void testInitilizeDatasourceWithValidFile() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(SpssDatasourceFactory.DEFAULT_DATASOURCE_NAME).isEqualTo(ds.getName()); } @Test(expected = DatasourceParsingException.class) public void testInitilizeDatasourceWithInvalidFile() throws Exception { dsFactory.setFile("org/obiba/magma/datasource/spss/DatabaseTest"); Datasource ds = dsFactory.create(); ds.initialise(); } @Test public void testGetValueTableDatasourceWithValidFile() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("DatabaseTest")).isNotNull(); } @Test public void testGetValueTableDatasourceWithColonFileName() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/Database:Test.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("DatabaseTest")).isNotNull(); } @Test public void testGetVariableFromValueTable() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("DatabaseTest").getVariable("race")).isNotNull(); } @Test public void testGetVariableFromValueTableWithFrenchChars() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/dictionnaire_variables-french-characters.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("dictionnaire_variables-french-characters").getVariable("ETATCIT4")).isNotNull(); } @Test(expected = NoSuchVariableException.class) public void testGetInvalidVariableFromValueTable() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("DatabaseTest").getVariable("blabla")).isNotNull(); } @Test(expected = NoSuchVariableException.class) public void testGetVariableInUpperCaseFromValueTable() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("DatabaseTest").getVariable("RACE")).isNotNull(); } @Test public void testGetDecimalVariableTypeFromValueTable() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/spss-variable-types.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("spss-variable-types").getVariable("VarDecimal").getValueType()) .isInstanceOf(DecimalType.class); } @Test public void testGetQYDVariableTypeFromValueTable() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/spss-variable-types.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("spss-variable-types").getVariable("VarQuarterly").getValueType()) .isInstanceOf(TextType.class); } @Test public void testGetCustomCurrencyVariableTypeFromValueTable() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/spss-variable-types.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.getValueTable("spss-variable-types").getVariable("VarCurrency").getValueType()) .isInstanceOf(TextType.class); } @Test public void testGetVariableEntitiesVariableEntityProvider() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); ValueTable valueTable = ds.getValueTable("DatabaseTest"); Set<VariableEntity> variableEntities = valueTable.getVariableEntities(); assertThat(variableEntities).hasSize(200); } @Test public void testGetValueSetForGivenEntity() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); ValueTable valueTable = ds.getValueTable("DatabaseTest"); Iterator<VariableEntity> iterator = valueTable.getVariableEntities().iterator(); if(iterator.hasNext()) { SpssValueSet valueSet = (SpssValueSet) valueTable.getValueSet(iterator.next()); Value value = valueSet.getValue(ds.getValueTable("DatabaseTest").getVariable("race")); assertThat(value).isNotNull(); assertThat(value.isNull()).isFalse(); Value expected = DecimalType.get().valueOf(4.0); assertThat(value.compareTo(expected)).isEqualTo(0); } } // TODO comment out until we find a large file. // @Test // public void testGetValueSetForGivenEntityLargeDatasource() throws Exception { // dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/large-file.sav")); // Datasource ds = dsFactory.create(); // ds.initialise(); // ValueTable valueTable = ds.getValueTable("large-file"); // Iterator<VariableEntity> iterator = valueTable.getVariableEntities().iterator(); // // if(iterator.hasNext()) { // SpssValueSet valueSet = (SpssValueSet) valueTable.getValueSet(iterator.next()); // Value value = valueSet.getValue(ds.getValueTable("large-file").getVariable("id")); // assertThat(value).isNotNull(); // assertThat(value.isNull()).isFalse(); // Value expected = TextType.get().valueOf("var001"); // assertThat(value.compareTo(expected)).isEqualTo(0); // } // } @Test public void testGetStringVariableCategories() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/StringCategories.sav")); Datasource ds = dsFactory.create(); ds.initialise(); Variable variable = ds.getValueTable("StringCategories").getVariable("var1"); assertThat(variable).isNotNull(); Set<Category> categories = variable.getCategories(); assertThat(categories).hasSize(4); Iterable<String> expectedNames = new HashSet<>(Arrays.asList(new String[] { "a", "b", "c", "d" })); for(Category category : categories) { assertThat(expectedNames).contains(category.getName()); } } @Test public void createUserDefinedEntityType() throws Exception { dsFactory.addFile(getResourceFile("org/obiba/magma/datasource/spss/StringCategories.sav")); dsFactory.setEntityType("Patate"); Datasource ds = dsFactory.create(); assertThat(ds).isNotNull(); ds.initialise(); ValueTable valueTable = ds.getValueTable("StringCategories"); assertThat(valueTable).isNotNull(); assertThat(valueTable.getEntityType()).isEqualTo("Patate"); } @Test public void readScientificNotationVarType() throws Exception { dsFactory.addFile(getResourceFile("org/obiba/magma/datasource/spss/ScientificNotationVar.sav")); dsFactory.setEntityType("Patate"); Datasource ds = dsFactory.create(); ds.initialise(); ValueTable valueTable = ds.getValueTable("ScientificNotationVar"); assertThat(valueTable).isNotNull(); Iterator<VariableEntity> iterator = valueTable.getVariableEntities().iterator(); if(iterator.hasNext()) { SpssValueSet valueSet = (SpssValueSet) valueTable.getValueSet(iterator.next()); Value value = valueSet.getValue(ds.getValueTable("ScientificNotationVar").getVariable("num")); assertThat(value).isNotNull(); assertThat(value.isNull()).isFalse(); Value expected = DecimalType.get().valueOf(1E+010); assertThat(value.compareTo(expected)).isEqualTo(0); } } @Test public void testCategoryWithLocale() throws Exception { dsFactory.addFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); dsFactory.setLocale("no"); Datasource ds = dsFactory.create(); ds.initialise(); Variable variable = ds.getValueTable("DatabaseTest").getVariable("race"); assertThat(variable).isNotNull(); for(Category category : variable.getCategories()) { assertThat(category.getAttribute("label").getLocale().getLanguage()).isEqualTo("no"); } } @Test public void testCategoryWithoutLocaleEntityTypeCharset() throws Exception { List<File> files = new ArrayList<>(); files.add(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = new SpssDatasource("spss", files, null, null, null); ds.initialise(); Variable variable = ds.getValueTable("DatabaseTest").getVariable("race"); assertThat(variable).isNotNull(); ValueTable valueTable = ds.getValueTable("DatabaseTest"); assertThat(valueTable).isNotNull(); assertThat(valueTable.getEntityType()).isEqualTo("Participant"); for(Category category : variable.getCategories()) { assertThat(category.getAttribute("label").isLocalised()).isFalse(); } } @Test public void testDuplicateIdentifier() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DuplicateIdentifier.sav")); Datasource ds = dsFactory.create(); ds.initialise(); ValueTable valueTable = ds.getValueTable("DuplicateIdentifier"); assertThat(valueTable.getVariableEntities().size()).isEqualTo(3); VariableValueSource vvs = valueTable.getVariableValueSource("VAR001"); assertThat(vvs.getVariable().isRepeatable()).isTrue(); Value v = vvs.getValue(valueTable.getValueSet(new VariableEntityBean("Participant", "2"))); assertThat(v.isSequence()).isTrue(); assertThat(v.asSequence().getSize()).isEqualTo(2); v = vvs.getValue(valueTable.getValueSet(new VariableEntityBean("Participant", "1"))); assertThat(v.isSequence()).isTrue(); assertThat(v.asSequence().getSize()).isEqualTo(1); } @Test public void testHasNoEntities() throws Exception { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/empty.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.hasEntities(new EntitiesPredicate.NonViewEntitiesPredicate())).isFalse(); } @Test public void testHasEntities() throws URISyntaxException { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/DatabaseTest.sav")); Datasource ds = dsFactory.create(); ds.initialise(); assertThat(ds.hasEntities(new EntitiesPredicate.NonViewEntitiesPredicate())).isTrue(); } @Test public void testInvalidVariableValueCharset() throws URISyntaxException { try { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/invalid-var-value.sav")); Datasource ds = dsFactory.create(); ds.initialise(); ValueTable valueTable = ds.getValueTable("invalid-var-value"); assertThat(valueTable).isNotNull(); Iterator<VariableEntity> iterator = valueTable.getVariableEntities().iterator(); if(iterator.hasNext()) { SpssValueSet valueSet = (SpssValueSet) valueTable.getValueSet(iterator.next()); valueSet.getValue(ds.getValueTable("invalid-var-value").getVariable("var1")); } } catch(SpssDatasourceParsingException e) { fail("Must have thrown DatasourceParsingException"); } } @Test public void testInvalidVariableCategoryValueCharset() throws URISyntaxException { try { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/invalid-category-value.sav")); Datasource ds = dsFactory.create(); ds.initialise(); } catch(DatasourceParsingException e) { assertThat(e.hasChildren()).isTrue(); for(DatasourceParsingException ch : e.getChildren()) { assertThat(ch.getMessage()).startsWith("Failed to create variable.") .contains("(Variable info: name='var1'").contains("(String with invalid characters"); } } } @Test public void testInvalidVariableCategoryNameCharset() throws URISyntaxException { try { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/invalid-category-name.sav")); Datasource ds = dsFactory.create(); ds.initialise(); fail("Must have thrown DatasourceParsingException"); } catch(DatasourceParsingException e) { assertThat(e.hasChildren()).isTrue(); for(DatasourceParsingException ch : e.getChildren()) { assertThat(ch.getMessage()).startsWith("Failed to create variable.") .contains("(Variable info: name='var1'").contains("String with invalid characters"); } } } @Test public void testInvalidEntityVariable() throws URISyntaxException { try { dsFactory.setFile(getResourceFile("org/obiba/magma/datasource/spss/invalid-entity-variable.sav")); Datasource ds = dsFactory.create(); ds.initialise(); ValueTable valueTable = ds.getValueTable("invalid-entity-variable"); assertThat(valueTable).isNotNull(); valueTable.getVariableEntities().iterator(); fail("Must have thrown DatasourceParsingException"); } catch(DatasourceParsingException e) { assertThat(e.hasChildren()).isTrue(); assertThat(e.getChildren().get(0).getMessage()).startsWith("Invalid characters in variable value") .contains("(Data info: variable='var1'").contains("String with invalid characters"); } } @Test public void testInvalidVariableAttribute() throws Exception { try { dsFactory.addFile(getResourceFile("org/obiba/magma/datasource/spss/invalid-variable-attribute.sav")); Datasource ds = dsFactory.create(); ds.initialise(); } catch(DatasourceParsingException e) { assertThat(e.hasChildren()).isTrue(); for(DatasourceParsingException ch : e.getChildren()) { assertThat(ch.getMessage()).startsWith("Failed to create variable value source.") .contains("(Variable info: name='var1'").contains("String with invalid characters"); } } } @Test public void testInvalidMissingValue() throws Exception { try { dsFactory.addFile(getResourceFile("org/obiba/magma/datasource/spss/invalid-missing-value.sav")); Datasource ds = dsFactory.create(); ds.initialise(); } catch(DatasourceParsingException e) { assertThat(e.hasChildren()).isTrue(); for(DatasourceParsingException ch : e.getChildren()) { assertThat(ch.getMessage()).startsWith("Failed to create variable.") .contains("(Variable info: name='var1'").contains("String with invalid characters"); } } } @Test public void testConvertADateToMagmaDate() throws Exception { dsFactory.addFile(getResourceFile("org/obiba/magma/datasource/spss/date-value-types.sav")); Datasource ds = dsFactory.create(); ds.initialise(); ValueTable valueTable = ds.getValueTable("date-value-types"); assertThat(valueTable).isNotNull(); Iterator<VariableEntity> iterator = valueTable.getVariableEntities().iterator(); if(iterator.hasNext()) { SpssValueSet valueSet = (SpssValueSet) valueTable.getValueSet(iterator.next()); assertThat(valueSet.getValue(valueTable.getVariable("var1")).compareTo(DateType.get().valueOf("2013-4-15"))) .isEqualTo(0); assertThat(valueSet.getValue(valueTable.getVariable("var2")).compareTo(DateType.get().valueOf("2012-12-30"))) .isEqualTo(0); assertThat(valueSet.getValue(valueTable.getVariable("var3")).compareTo(DateType.get().valueOf("2014-03-12"))) .isEqualTo(0); assertThat(valueSet.getValue(valueTable.getVariable("var4")).compareTo(DateType.get().valueOf("2010-09-23"))) .isEqualTo(0); assertThat(valueSet.getValue(valueTable.getVariable("var5")).compareTo(DateType.get().valueOf("2010-03-12"))) .isEqualTo(0); assertThat(valueSet.getValue(valueTable.getVariable("var6")).compareTo(DateType.get().valueOf("2010-02-12"))) .isEqualTo(0); } } @SuppressWarnings("ConstantConditions") private File getResourceFile(String resourcePath) throws URISyntaxException { return new File(getClass().getClassLoader().getResource(resourcePath).toURI()); } }