/*
* 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;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.junit.Test;
import org.obiba.magma.test.AbstractMagmaTest;
import org.obiba.magma.type.IntegerType;
import org.obiba.magma.type.TextType;
import static org.fest.assertions.api.Assertions.assertThat;
@SuppressWarnings({ "PMD.NcssMethodCount", "OverlyLongMethod" })
public class VariableTest extends AbstractMagmaTest {
@Test(expected = IllegalArgumentException.class)
public void testNullName() {
Variable.Builder.newVariable(null, IntegerType.get(), "entityType");
}
@Test(expected = IllegalArgumentException.class)
public void testNullValueType() {
Variable.Builder.newVariable("Name", null, "entityType");
}
@Test(expected = IllegalArgumentException.class)
public void testNullEntityType() {
Variable.Builder.newVariable("Name", IntegerType.get(), null);
}
@Test(expected = IllegalArgumentException.class)
public void testIllegalVariableName() {
Variable.Builder.newVariable("Name:WithColon", IntegerType.get(), "entityType");
}
@Test(expected = IllegalArgumentException.class)
public void testEmptyVariableName() {
Variable.Builder.newVariable("", IntegerType.get(), "entityType");
}
@Test
public void test_isMissingValue_TextType() {
Variable v = Variable.Builder.newVariable("name", TextType.get(), "entityType").addCategory("YES", null, false)
.addCategory("DNK", null, true).build();
assertThat(v.isMissingValue(TextType.get().valueOf("YES"))).isFalse();
// Accepts unknown categories
assertThat(v.isMissingValue(TextType.get().valueOf("No such category"))).isFalse();
assertThat(v.isMissingValue(TextType.get().valueOf("DNK"))).isTrue();
assertThat(v.isMissingValue(TextType.get().nullValue())).isTrue();
}
@Test
public void test_isMissingValue_IntegerType() {
Variable v = Variable.Builder.newVariable("name", IntegerType.get(), "entityType").addCategory("1", null, false)
.addCategory("8888", null, true).build();
assertThat(v.isMissingValue(IntegerType.get().valueOf(1))).isFalse();
// Accepts unknown categories
assertThat(v.isMissingValue(IntegerType.get().valueOf(2))).isFalse();
assertThat(v.isMissingValue(IntegerType.get().valueOf(8888))).isTrue();
assertThat(v.isMissingValue(IntegerType.get().nullValue())).isTrue();
}
@Test
public void test_isMissingValue_withoutCategories() {
Variable v = Variable.Builder.newVariable("name", IntegerType.get(), "entityType").build();
// Accepts unknown categories
assertThat(v.isMissingValue(IntegerType.get().valueOf(1))).isFalse();
assertThat(v.isMissingValue(IntegerType.get().nullValue())).isTrue();
}
@Test
public void testOverrideReplacesOnlyExistingAttributes() throws Exception {
Variable.Builder variableBuilder = Variable.Builder.newVariable("variable", TextType.get(), "Participant");
variableBuilder.addAttribute("A.1", "Hello");
variableBuilder.addAttribute("A.2", "World");
variableBuilder.addAttribute("A.3", "How goes?");
Variable variable = variableBuilder.build();
Variable.Builder overrideBuilder = Variable.Builder.newVariable("override", TextType.get(), "Participant");
overrideBuilder.addAttribute("A.2", "Earth");
overrideBuilder.addAttribute("A.3", "How goes?");
Variable override = overrideBuilder.build();
Variable.Builder derivedBuilder = Variable.Builder.sameAs(variable);
derivedBuilder.overrideWith(override);
Variable derived = derivedBuilder.build();
assertThat(derived.getAttribute("A.1").getValue()).isEqualTo(TextType.get().valueOf("Hello"));
assertThat(derived.getAttribute("A.2").getValue()).isEqualTo(TextType.get().valueOf("Earth"));
assertThat(derived.getAttribute("A.3").getValue()).isEqualTo(TextType.get().valueOf("How goes?"));
assertThat(derived.getAttributes()).hasSize(3);
}
@Test
public void testOverrideReplacesOnlyExistingAttributesWithLocales() throws Exception {
Variable.Builder variableBuilder = Variable.Builder.newVariable("variable", TextType.get(), "Participant");
variableBuilder.addAttribute("A.1", "Hello", Locale.CANADA);
variableBuilder.addAttribute("A.2", "World", Locale.CANADA);
variableBuilder.addAttribute("A.3", "How goes?", Locale.CANADA);
variableBuilder.addAttribute("A.4", "Saturn", Locale.CANADA);
variableBuilder.addAttribute("A.5", "Halifax", Locale.CANADA);
Variable variable = variableBuilder.build();
Variable.Builder overrideBuilder = Variable.Builder.newVariable("override", TextType.get(), "Participant");
overrideBuilder.addAttribute("A.2", "Earth", Locale.CANADA);
overrideBuilder.addAttribute("A.3", "How goes?", Locale.CANADA);
overrideBuilder.addAttribute("A.4", "Mars", Locale.CANADA); // Overrides Saturn.
overrideBuilder.addAttribute("A.5", "New York", Locale.US); // Does not override Halifax. Locale is different.
Variable override = overrideBuilder.build();
Variable.Builder derivedBuilder = Variable.Builder.sameAs(variable);
derivedBuilder.overrideWith(override);
Variable derived = derivedBuilder.build();
assertThat(derived.getAttribute("A.1").getValue()).isEqualTo(TextType.get().valueOf("Hello"));
assertThat(derived.getAttribute("A.2").getValue()).isEqualTo(TextType.get().valueOf("Earth"));
assertThat(derived.getAttribute("A.3").getValue()).isEqualTo(TextType.get().valueOf("How goes?"));
assertThat(derived.getAttribute("A.4").getValue()).isEqualTo(TextType.get().valueOf("Mars"));
assertThat(derived.getAttributes("A.5")).hasSize(2);
assertThat(derived.getAttributes()).hasSize(6);
}
@Test
public void testOverrideWithMinimalVariablesPresentInTheOverrideVariable() throws Exception {
Variable.Builder variableBuilder = Variable.Builder.newVariable("variable", IntegerType.get(), "Participant");
variableBuilder.mimeType("text/html");
variableBuilder.occurrenceGroup("group");
variableBuilder.unit("kg");
variableBuilder.repeatable();
variableBuilder.index(10);
Variable variable = variableBuilder.build();
Variable.Builder overrideBuilder = Variable.Builder.newVariable("override", TextType.get(), "Workstation");
Variable override = overrideBuilder.build();
Variable.Builder derivedBuilder = Variable.Builder.sameAs(variable);
derivedBuilder.overrideWith(override);
Variable derived = derivedBuilder.build();
// Overridden
assertThat(derived.getName()).isEqualTo("override");
assertThat(derived.getValueType()).isEqualTo(TextType.get());
assertThat(derived.getEntityType()).isEqualTo("Workstation");
// Not overridden
assertThat(derived.getMimeType()).isEqualTo("text/html");
assertThat(derived.getOccurrenceGroup()).isEqualTo("group");
assertThat(derived.getUnit()).isEqualTo("kg");
assertThat(derived.isRepeatable()).isFalse();
assertThat(derived.getIndex()).isEqualTo(0);
}
@Test
public void testOverrideWithSomeVariablesPresentInTheOverrideVariable() throws Exception {
Variable.Builder variableBuilder = Variable.Builder.newVariable("variable", IntegerType.get(), "Participant");
variableBuilder.mimeType("text/html");
variableBuilder.occurrenceGroup("group");
variableBuilder.unit("kg");
variableBuilder.repeatable();
Variable variable = variableBuilder.build();
Variable.Builder overrideBuilder = Variable.Builder.newVariable("override", TextType.get(), "Workstation");
overrideBuilder.mimeType("image/png");
overrideBuilder.occurrenceGroup("occurrenceGroup");
overrideBuilder.unit("cm");
Variable override = overrideBuilder.build();
Variable.Builder derivedBuilder = Variable.Builder.sameAs(variable);
derivedBuilder.overrideWith(override);
Variable derived = derivedBuilder.build();
// Overridden
assertThat(derived.getName()).isEqualTo("override");
assertThat(derived.getValueType()).isEqualTo(TextType.get());
assertThat(derived.getEntityType()).isEqualTo("Workstation");
assertThat(derived.getMimeType()).isEqualTo("image/png");
assertThat(derived.getOccurrenceGroup()).isEqualTo("occurrenceGroup");
assertThat(derived.getUnit()).isEqualTo("cm");
// Not overridden
assertThat(derived.isRepeatable()).isFalse();
}
@Test
public void testOverrideOfCategoryAttributes() throws Exception {
Category.Builder pnaBuilder = Category.Builder.newCategory("PNA").withCode("88").missing(true);
pnaBuilder.addAttribute("label", "Prefer not to answer", Locale.ENGLISH);
pnaBuilder.addAttribute("A.1", "Hello", Locale.ENGLISH);
Category pna = pnaBuilder.build();
Variable.Builder variableBuilder = Variable.Builder.newVariable("variable", IntegerType.get(), "Participant");
variableBuilder.addCategory(pna);
Variable variable = variableBuilder.build();
Category.Builder pnaOverrideBuilder = Category.Builder.newCategory("PNA").withCode("88").missing(true);
pnaOverrideBuilder.addAttribute("label", "Prefer not to answer", Locale.ENGLISH);
pnaOverrideBuilder.addAttribute("label", "Préfère ne pas répondre", Locale.FRENCH);
pnaOverrideBuilder.addAttribute("A.1", "World", Locale.ENGLISH);
pnaOverrideBuilder.addAttribute("A.2", "Earth");
Category pnaOverride = pnaOverrideBuilder.build();
Variable.Builder overrideBuilder = Variable.Builder.newVariable("override", TextType.get(), "Workstation");
overrideBuilder.addCategory(pnaOverride);
Variable override = overrideBuilder.build();
Variable.Builder derivedBuilder = Variable.Builder.sameAs(variable);
derivedBuilder.overrideWith(override);
Variable derived = derivedBuilder.build();
assertThat(derived.hasCategories()).isTrue();
List<Category> categories = new ArrayList<>(derived.getCategories());
assertThat(categories).hasSize(1);
Category category = categories.get(0);
assertThat(category.getAttribute("label", Locale.ENGLISH).getValue())
.isEqualTo(TextType.get().valueOf("Prefer not to answer"));
assertThat(category.getAttribute("label", Locale.FRENCH).getValue())
.isEqualTo(TextType.get().valueOf("Préfère ne pas répondre"));
assertThat(category.getAttribute("A.1", Locale.ENGLISH).getValue()).isEqualTo(TextType.get().valueOf("World"));
assertThat(category.getAttribute("A.2").getValue()).isEqualTo(TextType.get().valueOf("Earth"));
assertThat(category.getAttributes()).hasSize(4);
}
}