diff --git a/pom.xml b/pom.xml
index b57ab87..7ef578a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
fr.insee.pogues
pogues-model
- 1.15.2
+ 1.15.3
jar
Pogues Model
@@ -56,14 +56,14 @@
2.6.0
2.21.0
2.0.17
- 5.14.2
+ 5.14.3
1.5.3
2.11.0
2.25.3
- 3.5.4
+ 3.5.5
2.5.0
- 3.4.0
+ 3.5.0
1.12
diff --git a/src/main/resources/xsd/Questionnaire.xsd b/src/main/resources/xsd/Questionnaire.xsd
index 1ffd9ab..45c6288 100644
--- a/src/main/resources/xsd/Questionnaire.xsd
+++ b/src/main/resources/xsd/Questionnaire.xsd
@@ -666,12 +666,11 @@
to a single response.
-
+
- choiceType specifies whether the response options are defined by a static
- code list (CODE_LIST) or dynamically generated from a collected variable
- (VARIABLE). The default value is CODE_LIST.
+ 'choiceType' is a property for choice responses. It specifies whether the response options are defined by a
+ static code list (CODE_LIST) or dynamically generated from a collected variable (VARIABLE).
diff --git a/src/test/java/fr/insee/pogues/model/SuggesterTest.java b/src/test/java/fr/insee/pogues/model/SuggesterTest.java
new file mode 100644
index 0000000..99705f3
--- /dev/null
+++ b/src/test/java/fr/insee/pogues/model/SuggesterTest.java
@@ -0,0 +1,33 @@
+package fr.insee.pogues.model;
+
+import fr.insee.pogues.conversion.JSONDeserializer;
+import org.junit.jupiter.api.Test;
+
+import javax.xml.bind.JAXBException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class SuggesterTest {
+
+ @Test
+ void deserializeSuggesterChoiceType() throws JAXBException {
+ String json = """
+ {
+ "Child": [
+ {
+ "type": "QuestionType",
+ "Response": [
+ {
+ "choiceType": "SUGGESTER"
+ }
+ ]
+ }
+ ]
+ }
+ """;
+ Questionnaire questionnaire = new JSONDeserializer().deserializeString(json);
+ QuestionType question = (QuestionType) questionnaire.getChild().getFirst();
+ assertEquals(ChoiceTypeEnum.SUGGESTER, question.getResponse().getFirst().getChoiceType());
+ }
+
+}
diff --git a/src/test/java/fr/insee/pogues/model/UniqueChoiceVariableOptionsTest.java b/src/test/java/fr/insee/pogues/model/UniqueChoiceVariableOptionsTest.java
new file mode 100644
index 0000000..3921320
--- /dev/null
+++ b/src/test/java/fr/insee/pogues/model/UniqueChoiceVariableOptionsTest.java
@@ -0,0 +1,158 @@
+package fr.insee.pogues.model;
+
+import fr.insee.pogues.conversion.JSONDeserializer;
+import fr.insee.pogues.conversion.JSONSerializer;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
+
+import javax.xml.bind.JAXBException;
+import java.io.UnsupportedEncodingException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class UniqueChoiceVariableOptionsTest {
+
+ @Test
+ void serializeUcqVariable_withFilter() throws JAXBException, UnsupportedEncodingException, JSONException {
+ // Given
+ QuestionType question = new QuestionType();
+ question.setQuestionType(QuestionTypeEnum.SINGLE_CHOICE);
+ question.setOptionFilter("nvl($AGE$, 0) > 18");
+
+ ResponseType response = new ResponseType();
+ response.setVariableReference("id-loop-variable");
+ response.setChoiceType(ChoiceTypeEnum.VARIABLE);
+
+ question.getResponse().add(response);
+
+ Questionnaire questionnaire = new Questionnaire();
+ questionnaire.getChild().add(question);
+
+ // When
+ String json = new JSONSerializer(true).serialize(questionnaire);
+
+ // Then
+ String expectedJson = """
+ {
+ "Child": [
+ {
+ "type": "QuestionType",
+ "questionType": "SINGLE_CHOICE",
+ "OptionFilter": "nvl($AGE$, 0) > 18",
+ "Response": [
+ {
+ "VariableReference": "id-loop-variable",
+ "choiceType": "VARIABLE"
+ }
+ ]
+ }
+ ]
+ }
+ """;
+ JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.STRICT);
+ }
+
+ private final JSONDeserializer jsonDeserializer = new JSONDeserializer();
+
+ @Test
+ void testChoiceTypeVariableResponses() throws JAXBException {
+ String json = """
+ {
+ "Child": [
+ {
+ "type": "QuestionType",
+ "Response": [
+ {
+ "choiceType": "VARIABLE"
+ }
+ ]
+ }
+ ]
+ }
+ """;
+ JSONDeserializer deserializer = new JSONDeserializer();
+ Questionnaire questionnaire = deserializer.deserializeString(json);
+ assertEquals(ChoiceTypeEnum.VARIABLE, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType());
+ }
+
+ @Test
+ void deserializeUcqVariable() throws JAXBException {
+ String json = """
+ {
+ "Child": [
+ {
+ "type": "QuestionType",
+ "questionType": "SINGLE_CHOICE",
+ "Response": {
+ "choiceType": "VARIABLE",
+ "VariableReference": "id-loop-variable"
+ }
+ }
+ ]
+ }
+ """;
+
+ JSONDeserializer deserializer = new JSONDeserializer();
+ Questionnaire questionnaire = deserializer.deserializeString(json);
+
+ QuestionType question = (QuestionType) questionnaire.getChild().getFirst();
+ assertEquals(QuestionTypeEnum.SINGLE_CHOICE, question.getQuestionType());
+ assertEquals(ChoiceTypeEnum.VARIABLE, question.getResponse().getFirst().getChoiceType());
+ assertNull(question.getOptionFilter());
+ assertNotNull(question.getResponse());
+ assertFalse(question.getResponse().isEmpty()) ;
+ assertEquals("id-loop-variable", question.getResponse().getFirst().getVariableReference());
+ }
+
+ @Test
+ void deserializeUcqVariable_withFilter() throws JAXBException {
+ String json = """
+ {
+ "Child": [
+ {
+ "type": "QuestionType",
+ "questionType": "SINGLE_CHOICE",
+ "OptionFilter": "nvl($AGE$, 0) > 18",
+ "Response": {
+ "choiceType": "VARIABLE",
+ "VariableReference": "id-loop-variable"
+ }
+ }
+ ]
+ }
+ """;
+
+ JSONDeserializer deserializer = new JSONDeserializer();
+ Questionnaire questionnaire = deserializer.deserializeString(json);
+
+ QuestionType question = (QuestionType) questionnaire.getChild().getFirst();
+ assertEquals(QuestionTypeEnum.SINGLE_CHOICE, question.getQuestionType());
+ assertEquals(ChoiceTypeEnum.VARIABLE, question.getResponse().getFirst().getChoiceType());
+ assertEquals("nvl($AGE$, 0) > 18", question.getOptionFilter());
+ assertNotNull(question.getResponse());
+ assertFalse(question.getResponse().isEmpty()) ;
+ assertEquals("id-loop-variable", question.getResponse().getFirst().getVariableReference());
+ }
+
+ /** The response object is the same for choice responses and other types of responses (text, numeric, date etc.).
+ * So the 'choiceType' property must be null is absent. */
+ @Test
+ void responseWithoutChoiceType() throws JAXBException {
+ String json = """
+ {
+ "Child": [
+ {
+ "type": "QuestionType",
+ "Response": {}
+ }
+ ]
+ }
+ """;
+ Questionnaire questionnaire = jsonDeserializer.deserializeString(json);
+ QuestionType question = (QuestionType) questionnaire.getChild().getFirst();
+ assertNull(question.getResponse().getFirst().getChoiceType());
+ }
+
+}
diff --git a/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java b/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java
index a57275a..faae927 100644
--- a/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java
+++ b/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java
@@ -410,141 +410,6 @@ void testPairwiseSourceVariableReferences() throws JAXBException {
assertEquals("var-age-id", pairwiseQuestion.getSourceVariableReferences().getAge());
}
- @Test
- void testChoiceTypeVariableResponses() throws JAXBException {
- String json = """
- {
- "Child": [
- {
- "type": "QuestionType",
- "Response": [
- {
- "choiceType": "VARIABLE"
- }
- ]
- }
- ]
- }
- """;
- JSONDeserializer deserializer = new JSONDeserializer();
- Questionnaire questionnaire = deserializer.deserializeString(json);
- assertEquals(ChoiceTypeEnum.VARIABLE, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType());
- }
-
- @Test
- void testChoiceTypeSuggester() throws JAXBException {
- String json = """
- {
- "Child": [
- {
- "type": "QuestionType",
- "Response": [
- {
- "choiceType": "SUGGESTER"
- }
- ]
- }
- ]
- }
- """;
-
- JSONDeserializer deserializer = new JSONDeserializer();
- Questionnaire questionnaire = deserializer.deserializeString(json);
- assertEquals(ChoiceTypeEnum.SUGGESTER, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType());
- }
-
- @Test
- void testChoiceTypeDefaultValue() throws JAXBException {
- String json = """
- {
- "Child": [
- {
- "type": "QuestionType",
- "Response": [{}]
- }
- ]
- }
- """;
- JSONDeserializer deserializer = new JSONDeserializer();
- Questionnaire questionnaire = deserializer.deserializeString(json);
- assertEquals(ChoiceTypeEnum.CODE_LIST, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType());
- }
-
- @Test
- void testOptionFilter() throws JAXBException {
- String json = """
- {
- "Child": [
- {
- "type": "QuestionType",
- "OptionFilter": "nvl($AGE$, 0) > 18"
- }
- ]
- }
- """;
- JSONDeserializer deserializer = new JSONDeserializer();
- Questionnaire questionnaire = deserializer.deserializeString(json);
- assertEquals("nvl($AGE$, 0) > 18", ((QuestionType) questionnaire.getChild().getFirst()).getOptionFilter());
- }
-
- @Test
- void testVariableReferenceInResponse() throws JAXBException {
- String json = """
- {
- "Child": [
- {
- "type": "QuestionType",
- "Response": {
- "VariableReference": "id-loop-variable"
- }
- }
- ]
- }
- """;
- JSONDeserializer deserializer = new JSONDeserializer();
- Questionnaire questionnaire = deserializer.deserializeString(json);
- assertEquals(
- "id-loop-variable",
- ((QuestionType) questionnaire.getChild().getFirst())
- .getResponse().getFirst().getVariableReference());
- }
-
- @Test
- void testVariableResponsesFullConfiguration() throws JAXBException {
- String json = """
- {
- "Child": [
- {
- "type": "QuestionType",
- "questionType": "SINGLE_CHOICE",
- "OptionFilter": "nvl($AGE$, 0) > 18",
- "Response": {
- "choiceType": "VARIABLE",
- "VariableReference": "id-loop-variable"
- }
- }
- ]
- }
- """;
-
- JSONDeserializer deserializer = new JSONDeserializer();
- Questionnaire questionnaire = deserializer.deserializeString(json);
-
- QuestionType question =
- (QuestionType) questionnaire.getChild().getFirst();
-
-
- assertEquals(QuestionTypeEnum.SINGLE_CHOICE, question.getQuestionType());
- assertEquals(ChoiceTypeEnum.VARIABLE, question.getResponse().getFirst().getChoiceType());
- assertEquals("nvl($AGE$, 0) > 18", question.getOptionFilter());
- assertNotNull(question.getResponse());
- assertFalse(question.getResponse().isEmpty());
- assertEquals(
- "id-loop-variable",
- question.getResponse().getFirst().getVariableReference()
- );
- }
-
@Test
void testDeserializeVariableReferenceInExternalVariable() throws JAXBException {
diff --git a/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java b/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java
index e49ea9c..4e60ac4 100644
--- a/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java
+++ b/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java
@@ -676,45 +676,6 @@ void serializePairwiseSourceVariableReferences() throws JAXBException, Unsupport
JSONAssert.assertEquals(expectedJson, result, JSONCompareMode.STRICT);
}
- @Test
- void testSerializeVariableResponsesFullConfiguration() throws Exception {
- QuestionType question = new QuestionType();
- question.setQuestionType(QuestionTypeEnum.SINGLE_CHOICE);
- question.setOptionFilter("nvl($AGE$, 0) > 18");
-
- ResponseType response = new ResponseType();
- response.setVariableReference("id-loop-variable");
- response.setChoiceType(ChoiceTypeEnum.VARIABLE);
-
- question.getResponse().add(response);
-
- Questionnaire questionnaire = new Questionnaire();
- questionnaire.getChild().add(question);
-
- JSONSerializer serializer = new JSONSerializer(true);
- String json = serializer.serialize(questionnaire);
-
- String expectedJson = """
- {
- "Child": [
- {
- "type": "QuestionType",
- "questionType": "SINGLE_CHOICE",
- "OptionFilter": "nvl($AGE$, 0) > 18",
- "Response": [
- {
- "VariableReference": "id-loop-variable",
- "choiceType": "VARIABLE"
- }
- ]
- }
- ]
- }
- """;
-
- JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.STRICT);
- }
-
@Test
void testSerializeVariableReferenceInExternalVariable() throws Exception {