/*
* 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.csv;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.obiba.magma.Category;
import org.obiba.magma.NoSuchValueSetException;
import org.obiba.magma.NoSuchVariableException;
import org.obiba.magma.Value;
import org.obiba.magma.ValueSequence;
import org.obiba.magma.ValueSet;
import org.obiba.magma.ValueTable;
import org.obiba.magma.Variable;
import org.obiba.magma.VariableEntity;
import org.obiba.magma.datasource.csv.support.Quote;
import org.obiba.magma.datasource.csv.support.Separator;
import org.obiba.magma.support.DatasourceParsingException;
import org.obiba.magma.support.EntitiesPredicate;
import org.obiba.magma.support.VariableEntityBean;
import org.obiba.magma.test.AbstractMagmaTest;
import org.obiba.magma.type.IntegerType;
import org.obiba.magma.type.TextType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableMap;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.obiba.core.util.FileUtil.getFileFromResource;
import static org.obiba.magma.datasource.csv.CsvValueTable.DEFAULT_ENTITY_TYPE;
@SuppressWarnings({ "PMD.NcssMethodCount", "OverlyLongMethod", "ResultOfMethodCallIgnored", "OverlyCoupledClass" })
@edu.umd.cs.findbugs.annotations.SuppressWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE")
public class CsvDatasourceTest extends AbstractMagmaTest {
private static final Logger log = LoggerFactory.getLogger(CsvDatasourceTest.class);
@Test
public void test_separators() {
assertThat(Quote.fromString("'")).isEqualTo(Quote.SINGLE);
assertThat(Quote.fromString("\"")).isEqualTo(Quote.DOUBLE);
assertThat(Quote.fromString("|").getCharacter()).isEqualTo('|');
assertThat(Separator.fromString(",")).isEqualTo(Separator.COMMA);
assertThat(Separator.fromString(";")).isEqualTo(Separator.SEMICOLON);
assertThat(Separator.fromString(":")).isEqualTo(Separator.COLON);
assertThat(Separator.fromString("\t")).isEqualTo(Separator.TAB);
assertThat(Separator.fromString("|").getCharacter()).isEqualTo('|');
}
@Test
public void test_supports_any_separator() {
File samples = getFileFromResource("org/obiba/magma/datasource/csv/separators");
CsvDatasource ds = new CsvDatasource("variables")
.addValueTable("variables", new File(samples, "variables.csv"), new File(samples, "sample-comma.csv"));
ds.initialise();
ValueTable reference = ds.getValueTable("variables");
Map<String, String> separators = ImmutableMap.<String, String>builder() //
.put("sample-comma.csv", ",") //
.put("sample-semicolon.csv", ";") //
.put("sample-colon.csv", ":") //
.put("sample-tab.csv", "tab") //
.put("sample-pipe.csv", "|") //
.put("sample-space.csv", " ").build();
File[] files = samples.listFiles();
assertThat(files).isNotNull();
//noinspection ConstantConditions
for(File sample : files) {
String fileName = sample.getName();
if(!separators.containsKey(fileName)) continue;
CsvDatasource datasource = new CsvDatasource("csv-datasource");
datasource.setSeparator(Separator.fromString(separators.get(fileName)));
datasource.addValueTable(reference, sample);
datasource.initialise();
ValueTable valueTable = datasource.getValueTable(reference.getName());
assertThat(valueTable.getVariableEntities()).hasSize(16);
for(Variable v : valueTable.getVariables()) {
for(ValueSet vs : valueTable.getValueSets()) {
valueTable.getVariableValueSource(v.getName()).getValue(vs);
}
}
datasource.dispose();
}
}
@Test
public void test_table_variable_read() {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Table1", //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/data.csv"));
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
ValueTable table = datasource.getValueTable("Table1");
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo("Participant");
Variable var = table.getVariable("var1");
assertThat(var).isNotNull();
assertThat(var.getValueType().getName()).isEqualTo("text");
assertThat(var.getEntityType()).isEqualTo("Participant");
assertThat(var.getMimeType()).isNull();
assertThat(var.getUnit()).isNull();
assertThat(var.getOccurrenceGroup()).isNull();
assertThat(var.isRepeatable()).isFalse();
assertThat(var.getCategories()).hasSize(4);
for(Category category : var.getCategories()) {
String label = category.getAttribute("label", Locale.ENGLISH).getValue().toString();
String categoryName = category.getName();
switch(categoryName) {
case "Y":
assertThat(label).isEqualTo("yes");
break;
case "N":
assertThat(label).isEqualTo("no");
break;
case "PNA":
assertThat(label).isEqualTo("prefer not to answer");
break;
case "DNK":
assertThat(label).isEqualTo("don't know");
break;
default:
fail();
break;
}
}
assertThat(var.getAttributes()).hasSize(3);
assertThat(var.hasAttribute("label")).isTrue();
assertThat(var.getAttribute("label", Locale.ENGLISH).getValue().toString()).isEqualTo("Hello I'm variable one");
assertThat(var.getAttribute("ns1", "attr").getValue().toString()).isEqualTo("ns1");
assertThat(var.getAttribute("ns2", "attr", Locale.ENGLISH).getValue().toString()).isEqualTo("ns2");
}
@Test
public void test_table_data_read() {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Table1", //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/data.csv"));
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
ValueTable table = datasource.getValueTable("Table1");
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo("Participant");
Variable var = table.getVariable("var1");
for(ValueSet valueSet : table.getValueSets()) {
String identifier = valueSet.getVariableEntity().getIdentifier();
Value value = table.getValue(var, valueSet);
log.debug("var1[{}]={}", identifier, value);
assertThat(value.getValueType().getName()).isEqualTo("text");
switch(identifier) {
case "1":
assertThat(value.getValue()).isEqualTo("Y");
break;
case "2":
assertThat(value.getValue()).isEqualTo("N");
break;
case "3":
assertThat(value.getValue()).isEqualTo("PNA");
break;
case "4":
assertThat(value.getValue()).isEqualTo("DNK");
break;
default:
fail();
break;
}
}
}
@Test
public void test_reading_data_only_table_has_only_one_table() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
}
@Test
public void test_reading_data_with_multilines() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Multilines", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/multilines/data.csv"));
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
ValueTable table = datasource.getValueTable("Multilines");
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo("Participant");
assertThat(table.getVariableEntities().size()).isEqualTo(4);
Variable var1 = table.getVariable("var1");
assertThat(var1.isRepeatable()).isTrue();
Variable var2 = table.getVariable("var2");
assertThat(var2.isRepeatable()).isTrue();
for(ValueSet valueSet : table.getValueSets()) {
String identifier = valueSet.getVariableEntity().getIdentifier();
Value value1 = table.getValue(var1, valueSet);
log.info("var1[{}]={}", identifier, value1);
assertThat(value1.isSequence()).isTrue();
Value value2 = table.getValue(var2, valueSet);
log.info("var2[{}]={}", identifier, value2);
assertThat(value2.isSequence()).isTrue();
}
ValueSet vs1 = table.getValueSet(new VariableEntityBean("Participant", "1"));
Value value1 = table.getValue(var1, vs1);
assertThat(value1.toString()).isEqualTo("\"Y\",\"N\"");
Value value2 = table.getValue(var2, vs1);
assertThat(value2.toString()).isEqualTo("\"11\",\"21\"");
assertThat(value2.asSequence().getSize()).isEqualTo(2);
Value value = value2.asSequence().get(0);
assertThat(value).isNotNull();
assertThat(value.isNull()).isFalse();
assertThat(value.isSequence()).isFalse();
assertThat(Integer.parseInt(value.toString())).isEqualTo(11);
value = value2.asSequence().get(1);
assertThat(value).isNotNull();
assertThat(value.isNull()).isFalse();
assertThat(value.isSequence()).isFalse();
assertThat(Integer.parseInt(value.toString())).isEqualTo(21);
}
@Test
public void test_reading_data_only_table_is_not_null() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
assertThat(datasource.getValueTable("TableDataOnly")).isNotNull();
}
@Test
public void test_reading_data_only_table_entity_type_is_default_participant() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
ValueTable table = datasource.getValueTable("TableDataOnly");
assertThat(table.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
}
@Test
public void test_reading_data_only_favourite_ice_cream_variable_exists() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
ValueTable table = datasource.getValueTable("TableDataOnly");
assertThat(table.getVariable("FavouriteIcecream")).isNotNull();
}
@Test
public void test_reading_single_data_only_table_null_ice_cream_value() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
ValueTable table = datasource.getValueTable("TableDataOnly");
Variable favouriteIcecream = table.getVariable("FavouriteIcecream");
for(ValueSet valueSet : table.getValueSets()) {
String identifier = valueSet.getVariableEntity().getIdentifier();
Value value = table.getValue(favouriteIcecream, valueSet);
if("1".equals(identifier) || "2".equals(identifier)) {
assertThat(value.isNull()).isTrue();
}
}
}
@Test
public void test_reading_data_only_value_type_is_text() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
ValueTable table = datasource.getValueTable("TableDataOnly");
for(Variable variable : table.getVariables()) {
assertThat(variable.getValueType().getName()).isEqualTo(TextType.get().getName());
}
}
@Test
public void test_value_table_get_variable_entities() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
assertThat(datasource.getValueTable("TableDataOnly").getVariableEntities()).hasSize(4);
}
@Test
public void test_value_table_get_variables() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/data.csv"));
datasource.initialise();
ValueTable valueTable = datasource.getValueTable("TableDataOnly");
assertThat(valueTable.getVariables()).hasSize(5);
assertThat(valueTable.getVariableCount()).isEqualTo(5);
}
@Test
public void test_refTable_data_read() {
CsvDatasource refDatasource = new CsvDatasource("csv-datasource1").addValueTable("Table1", //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/data.csv"));
refDatasource.initialise();
ValueTable refTable = refDatasource.getValueTable("Table1");
CsvDatasource datasource = new CsvDatasource("csv-datasource2").addValueTable(refTable, //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/data2.csv"));
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
ValueTable table = datasource.getValueTable("Table1");
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo("Participant");
Variable var = table.getVariable("var2");
for(ValueSet valueSet : table.getValueSets()) {
String identifier = valueSet.getVariableEntity().getIdentifier();
Value value = table.getValue(var, valueSet);
log.debug("var2[{}]={}", identifier, value);
assertThat(value.getValueType().getName()).isEqualTo("integer");
switch(identifier) {
case "5":
assertThat(value.getValue()).isEqualTo(15l);
break;
case "6":
assertThat(value.getValue()).isEqualTo(16l);
break;
case "7":
assertThat(value.getValue()).isEqualTo(17l);
break;
case "8":
assertThat(value.getValue()).isEqualTo(18l);
break;
default:
fail();
break;
}
}
}
// Variable Tests
@Test
public void test_reading_variables_confirm_var_metadata() throws Exception {
String tableName = "TableVariablesOnly";
CsvDatasource datasource = new TempTableBuilder(tableName)
.addVariables(getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"))
.addData(getFileFromResource("org/obiba/magma/datasource/csv/Table1/data.csv"))
.buildCsvDatasource("csv-datasource");
ValueTable table = datasource.getValueTable(tableName);
Variable variable = table.getVariable("var2");
assertThat(variable.getValueType().getName()).isEqualTo(IntegerType.get().getName());
assertThat(variable.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
assertThat(variable.getAttribute("label", Locale.ENGLISH).getValue().toString())
.isEqualTo("Hello I'm variable two");
assertThat(variable.getMimeType()).isNull();
datasource.dispose();
}
@Test
public void test_reading_variables_get_variables() throws Exception {
String tableName = "TableVariablesOnly";
CsvDatasource datasource = new TempTableBuilder(tableName)
.addVariables(getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"))
.addData(getFileFromResource("org/obiba/magma/datasource/csv/Table1/data.csv"))
.buildCsvDatasource("csv-datasource");
ValueTable valueTable = datasource.getValueTable(tableName);
assertThat(valueTable.getVariables()).hasSize(2);
assertThat(valueTable.getVariableCount()).isEqualTo(2);
}
@Test
public void test_reading_variables_get_variables_without_data() throws Exception {
String tableName = "TableVariablesOnly";
CsvDatasource datasource = new TempTableBuilder(tableName)
.addVariables(getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"))
.buildCsvDatasource("csv-datasource");
ValueTable valueTable = datasource.getValueTable(tableName);
assertThat(valueTable.getVariables()).isEmpty();
assertThat(valueTable.getVariableCount()).isEqualTo(0);
}
@Test
public void test_repeatable_data_read() {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Participants", //
getFileFromResource("org/obiba/magma/datasource/csv/Participants/variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Participants/data.csv"));
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
ValueTable table = datasource.getValueTable("Participants");
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
Variable var = table.getVariable("Admin.Action.actionType");
assertThat(var.isRepeatable()).isTrue();
int count = 0;
for(ValueSet valueSet : table.getValueSets()) {
count++;
if(count == 1) {
String identifier = valueSet.getVariableEntity().getIdentifier();
Value value = table.getValue(var, valueSet);
log.info("Admin.Action.actionType[{}]={}", identifier, value);
assertThat(value.getValueType().getName()).isEqualTo("text");
assertThat(value.isSequence()).isTrue();
assertThat(value.asSequence().getSize()).isEqualTo(33);
}
}
assertThat(count).isEqualTo(2);
}
@Test
public void test_multiline_data_read() {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Participants", //
getFileFromResource("org/obiba/magma/datasource/csv/Participants/variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Participants/data.csv"));
datasource.setQuote(Quote.DOUBLE);
datasource.setSeparator(Separator.COMMA);
datasource.setCharacterSet("UTF-8");
datasource.setFirstRow(1);
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
ValueTable table = datasource.getValueTable("Participants");
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
Variable var = table.getVariable("Admin.Action.comment");
assertThat(var.isRepeatable()).isTrue();
int count = 0;
for(ValueSet valueSet : table.getValueSets()) {
count++;
String identifier = valueSet.getVariableEntity().getIdentifier();
Value value = table.getValue(var, valueSet);
log.info("Admin.Action.comment[{}]={}", identifier, value);
assertThat(value).isNotNull();
assertThat(value.getValueType().getName()).isEqualTo("text");
assertThat(value.isSequence()).isTrue();
ValueSequence seq = value.asSequence();
if(count == 1) {
assertThat(seq.getSize()).isEqualTo(33);
assertThat(seq.get(22).toString()).isEqualTo("sample collection by Val\ndata entry by Evan");
} else if(count == 2) {
assertThat(seq.get(5).toString()).isEqualTo("Unable to draw from left arm due to vein rolling upon puncture. " +
"Ct refused puncture to right arm. Saliva kit complete");
}
}
assertThat(count).isEqualTo(2);
}
@Test
public void test_charSet() {
test_charSet("Drugs-iso.csv", "ISO-8859-1");
test_charSet("Drugs-utf8.csv", "UTF-8");
}
public void test_charSet(String filename, String encoding) {
log.info("Test {}", encoding);
CsvDatasource datasource = new CsvDatasource("csv-datasource")
.addValueTable("Drugs", getFileFromResource("org/obiba/magma/datasource/csv/medications/" + filename), "Drug");
datasource.setQuote(Quote.DOUBLE);
datasource.setSeparator(Separator.COMMA);
datasource.setCharacterSet(encoding);
datasource.setFirstRow(1);
datasource.initialise();
ValueTable table = datasource.getValueTable("Drugs");
Variable var = table.getVariable("MEDICATION");
assertCharSetValue(table, var, "02335204",
"PREVNAR 13 (CORYNEBACTERIUM DIPHTHERIAE CRM-197 PROTEIN 34\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 14 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 18C 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 19F 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 23F 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 4 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 6B 4.4\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 9V 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 3 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 5 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 6A 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 7F 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYP 19A 2.2\u00b5G, PNEUMOCOCCAL POLYSACCHARIDE SEROTYPE 1 2.2\u00b5G)");
assertCharSetValue(table, var, "01918346", "COUMADIN TAB 2.5MG (WARFARIN SODIUM 2.5MG)");
}
private void assertCharSetValue(ValueTable table, Variable var, String identifier, String expected) {
Value value = table.getValue(var, table.getValueSet(new VariableEntityBean("Drug", identifier)));
log.info("{} : {}", identifier, value.toString());
assertThat(value.toString()).isEqualTo(expected);
}
@SuppressWarnings("ReuseOfLocalVariable")
@Test
public void test_escaped_characters() {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Table1", //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/escaped-variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/escaped-data.csv"));
datasource.initialise();
ValueTable table = datasource.getValueTable("Table1");
Variable name = table.getVariable("name");
Variable children = table.getVariable("children");
assertEmperors(datasource, table, name, children);
VariableEntity entity1 = new VariableEntityBean(DEFAULT_ENTITY_TYPE, "1");
Value value = table.getValue(name, table.getValueSet(entity1));
assertThat(value.isSequence()).isFalse();
assertThat((String) value.getValue()).isEqualTo("Julius\nCaesar");
value = table.getValue(children, table.getValueSet(entity1));
assertThat(value.isSequence()).isTrue();
ValueSequence valueSequence = value.asSequence();
assertThat((String) valueSequence.get(0).getValue()).isEqualTo("Julia");
assertThat((String) valueSequence.get(1).getValue()).isEqualTo("Caesarion");
assertThat((String) valueSequence.get(2).getValue()).isEqualTo("Gaius\\\\Julius Caesar \"Octavianus\"");
assertThat(valueSequence.get(3).isNull()).isTrue();
assertThat((String) valueSequence.get(4).getValue()).isEqualTo("Marcus Junius\" Brutus");
VariableEntity entity2 = new VariableEntityBean(DEFAULT_ENTITY_TYPE, "2");
value = table.getValue(name, table.getValueSet(entity2));
assertThat(value.isSequence()).isFalse();
assertThat((String) value.getValue()).isEqualTo("Cleopatra\\\\\"VII");
value = table.getValue(children, table.getValueSet(entity2));
assertThat(value.isSequence()).isTrue();
valueSequence = value.asSequence();
assertThat((String) valueSequence.get(0).getValue()).isEqualTo("Ptolemy XV");
assertThat(valueSequence.get(1).isNull()).isTrue();
assertThat((String) valueSequence.get(2).getValue()).isEqualTo("Caesarion");
assertThat((String) valueSequence.get(3).getValue()).isEqualTo("Alexander Helios");
assertThat((String) valueSequence.get(4).getValue()).isEqualTo("Cleopatra Selene");
assertThat((String) valueSequence.get(5).getValue()).isEqualTo("Ptolemy XVI Philadelphus");
value = table.getValue(name, table.getValueSet(new VariableEntityBean(DEFAULT_ENTITY_TYPE, "3")));
assertThat(value.isSequence()).isFalse();
assertThat((String) value.getValue()).isEqualTo("Clau\\dius");
try {
table.getValue(name, table.getValueSet(new VariableEntityBean(DEFAULT_ENTITY_TYPE, "4")));
} catch(NoSuchValueSetException e) {
fail("Should not throw NoSuchValueSetException for Participant 4");
}
try {
table.getValue(name, table.getValueSet(new VariableEntityBean(DEFAULT_ENTITY_TYPE, "6")));
fail("Should throw NoSuchValueSetException for Participant 5");
} catch(NoSuchValueSetException e) {
}
}
@SuppressWarnings("ReuseOfLocalVariable")
@Test
public void test_end_of_line() throws IOException {
File dataFile = File.createTempFile("magma", "test-eol");
dataFile.deleteOnExit();
FileUtils.writeStringToFile(dataFile, "entity_id,Name,\"Complete name\"\n" + //
"1,Augustus,\"GAIVS IVLIVS \nCAESAR OCTAVIANVS\"\n" + //
"2,Tiberius,\"TIBERIVS IVLIVS CAESAR AVGVSTVS\"\r" + //
"3,Caligula,\"GAIVS IVLIVS CAESAR AVGVSTVS GERMANICVS\"\r\n" + //
"4,Claudius,\"TIBERIVS CLAVDIVS CAESAR AVGVSTVS GERMANICVS\"\n\n" + //
"5,Nero,\"NERO CLAVDIVS CAESAR AVGVSTVS GERMANICVS\"", "utf-8");
CsvDatasource datasource = new CsvDatasource("csv-datasource")
.addValueTable("Table1", dataFile, DEFAULT_ENTITY_TYPE);
datasource.initialise();
assertThat(datasource.getValueTableNames()).hasSize(1);
ValueTable table = datasource.getValueTable("Table1");
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
assertEolVariable(table, "Name");
assertEolVariable(table, "Complete name");
assertEolValue(table, "1", "Augustus", "GAIVS IVLIVS \nCAESAR OCTAVIANVS");
assertEolValue(table, "2", "Tiberius", "TIBERIVS IVLIVS CAESAR AVGVSTVS");
assertEolValue(table, "3", "Caligula", "GAIVS IVLIVS CAESAR AVGVSTVS GERMANICVS");
assertEolValue(table, "4", "Claudius", "TIBERIVS CLAVDIVS CAESAR AVGVSTVS GERMANICVS");
assertEolValue(table, "5", "Nero", "NERO CLAVDIVS CAESAR AVGVSTVS GERMANICVS");
}
private void assertEolVariable(ValueTable table, String name) {
Variable variable = table.getVariable(name);
assertThat(variable).isNotNull();
assertThat(variable.getName()).isEqualTo(name);
assertThat(variable.getValueType().getName()).isEqualTo("text");
assertThat(variable.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
assertThat(variable.getMimeType()).isNull();
assertThat(variable.getUnit()).isNull();
assertThat(variable.getOccurrenceGroup()).isNull();
assertThat(variable.isRepeatable()).isFalse();
}
@SuppressWarnings("ReuseOfLocalVariable")
private void assertEolValue(ValueTable table, String entityId, String name, String completeName) {
VariableEntity entity = new VariableEntityBean(DEFAULT_ENTITY_TYPE, entityId);
Value value = table.getValue(table.getVariable("Name"), table.getValueSet(entity));
assertThat(value.isSequence()).isFalse();
assertThat((String) value.getValue()).isEqualTo(name);
value = table.getValue(table.getVariable("Complete name"), table.getValueSet(entity));
assertThat(value.isSequence()).isFalse();
assertThat((String) value.getValue()).isEqualTo(completeName);
}
static void assertEmperors(CsvDatasource datasource, ValueTable table, Variable name, Variable children) {
assertThat(datasource.getValueTableNames()).hasSize(1);
assertThat(table).isNotNull();
assertThat(table.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
assertThat(name).isNotNull();
assertThat(name.getValueType().getName()).isEqualTo("text");
assertThat(name.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
assertThat(name.getMimeType()).isNull();
assertThat(name.getUnit()).isNull();
assertThat(name.getOccurrenceGroup()).isNull();
assertThat(name.isRepeatable()).isFalse();
assertThat(children).isNotNull();
assertThat(children.getValueType().getName()).isEqualTo("text");
assertThat(children.getEntityType()).isEqualTo(DEFAULT_ENTITY_TYPE);
assertThat(children.getMimeType()).isNull();
assertThat(children.getUnit()).isNull();
assertThat(children.getOccurrenceGroup()).isNull();
assertThat(children.isRepeatable()).isTrue();
}
@Test
public void test_OPAL_1811() throws Exception {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("TableDataOnly", //
null, //
getFileFromResource("org/obiba/magma/datasource/csv/TableDataOnly/study3.csv"));
datasource.initialise();
}
@Test(expected = DatasourceParsingException.class)
public void test_fail_getting_reader() {
CsvDatasource datasource = new CsvDatasource("bozo").addValueTable(new File("tata"));
datasource.initialise();
}
@Test(expected = DatasourceParsingException.class)
public void test_missing_name_header() {
File samples = getFileFromResource("org/obiba/magma/datasource/csv/exceptions");
File variables = new File(samples, "missing-name-variables.csv");
CsvDatasource ds = new CsvDatasource("variables").addValueTable("variables", variables, (File) null);
ds.initialise();
}
@Test(expected = DatasourceParsingException.class)
public void test_missing_value_type_header() {
File samples = getFileFromResource("org/obiba/magma/datasource/csv/exceptions");
File variables = new File(samples, "missing-valueType-variables.csv");
CsvDatasource ds = new CsvDatasource("variables").addValueTable("variables", variables, (File) null);
ds.initialise();
}
@Test(expected = DatasourceParsingException.class)
public void test_missing_entity_type_header() {
File samples = getFileFromResource("org/obiba/magma/datasource/csv/exceptions");
File variables = new File(samples, "missing-entityType-variables.csv");
CsvDatasource ds = new CsvDatasource("variables").addValueTable("variables", variables, (File) null);
ds.initialise();
}
@Test
public void test_has_no_entities_on_empty_file() {
File empty = getFileFromResource("org/obiba/magma/datasource/csv/empty.csv");
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("NoEntities", empty, (File) null);
datasource.initialise();
assertThat(datasource.hasEntities(new EntitiesPredicate.NonViewEntitiesPredicate())).isFalse();
}
@Test
public void test_has_no_entities() {
File samples = getFileFromResource("org/obiba/magma/datasource/csv/separators");
File variables = new File(samples, "variables.csv");
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("HasEntities", variables, (File) null);
datasource.initialise();
assertThat(datasource.hasEntities(new EntitiesPredicate.NonViewEntitiesPredicate())).isFalse();
}
@Test
public void test_has_entities() {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Table1", //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/data.csv"));
datasource.initialise();
assertThat(datasource.hasEntities(new EntitiesPredicate.NonViewEntitiesPredicate())).isTrue();
}
@Test
public void test_import_data_for_subset_of_variables_OPAL_2243() throws IOException {
CsvDatasource datasource = new CsvDatasource("csv-datasource").addValueTable("Table1", //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/variables.csv"), //
getFileFromResource("org/obiba/magma/datasource/csv/Table1/data-with-only-one-variable.csv"));
datasource.initialise();
ValueTable table = datasource.getValueTable("Table1");
assertThat(table.getVariables()).hasSize(1);
assertThat(table.getVariableCount()).isEqualTo(1);
assertThat(table.getVariable("var2")).isNotNull();
try {
table.getVariable("var1");
fail("Should throw NoSuchVariableException");
} catch(NoSuchVariableException ignored) {
}
assertThat(table.getVariableEntities()).hasSize(4);
}
}