diff --git a/src/csds_parser.c b/src/csds_parser.c
index 47c074ce6bf0a933206520eb3de46b21d2938281..b266dc1e4ec42676d05e22c4016948ba2ea6dbf6 100644
--- a/src/csds_parser.c
+++ b/src/csds_parser.c
@@ -146,89 +146,6 @@ void parser_read_file(const char *file_name, struct csds_parser *params) {
   fclose(file);
 }
 
-/**
- * @brief Set or update a parameter using a compressed format.
- *
- * The compressed format allows a value to be given as a single
- * string and has the format "section:parameter:value", with all
- * names as would be given in the parameter file.
- *
- * @param params Structure that holds the parameters.
- * @param namevalue the parameter name and value as described.
- */
-void parser_set_param(struct csds_parser *params, const char *namevalue) {
-
-  /* Get the various parts. */
-  char name[PARSER_MAX_LINE_SIZE];
-  char value[PARSER_MAX_LINE_SIZE];
-  char section[PARSER_MAX_LINE_SIZE];
-  name[0] = '\0';
-  value[0] = '\0';
-
-  /* Name is part until second colon. */
-  const char *p1 = strchr(namevalue, ':');
-  if (p1 != NULL) {
-
-    /* Section is first part until a colon. */
-    memcpy(section, namevalue, p1 - namevalue);
-    section[p1 - namevalue] = ':';
-    section[p1 - namevalue + 1] = '\0';
-
-    const char *p2 = strchr(p1 + 1, ':');
-    if (p2 != NULL) {
-      memcpy(name, namevalue, p2 - namevalue);
-      name[p2 - namevalue] = '\0';
-
-      /* Value is rest after second colon. */
-      p2++;
-      strcpy(value, p2);
-    }
-  }
-
-  /* Sanity check. */
-  if (strlen(name) == 0 || strlen(value) == 0 || strchr(value, ':') != NULL)
-    error(
-        "Cannot parse compressed parameter string: '%s', check syntax "
-        "should be section:parameter:value",
-        namevalue);
-
-  /* And update or set. */
-  int updated = 0;
-  for (int i = 0; i < params->paramCount; i++) {
-    if (strcmp(name, params->data[i].name) == 0) {
-      message("Value of '%s' changed from '%s' to '%s'", params->data[i].name,
-              params->data[i].value, value);
-      strcpy(params->data[i].value, trim_both(value));
-      updated = 1;
-    }
-  }
-  if (!updated) {
-    /* Is this a new section? */
-    int newsection = 1;
-    for (int i = 0; i < params->sectionCount; i++) {
-      if (strcmp(section, params->section[i].name) == 0) {
-        newsection = 0;
-        break;
-      }
-    }
-    if (newsection) {
-      strcpy(params->section[params->sectionCount].name, section);
-      params->sectionCount++;
-      if (params->sectionCount == PARSER_MAX_NO_OF_SECTIONS)
-        error("Too many sections, current maximum is %d.",
-              params->sectionCount);
-    }
-
-    strcpy(params->data[params->paramCount].name, name);
-    strcpy(params->data[params->paramCount].value, value);
-    params->data[params->paramCount].used = 0;
-    params->data[params->paramCount].is_default = 0;
-    params->paramCount++;
-    if (params->paramCount == PARSER_MAX_NO_OF_PARAMS)
-      error("Too many parameters, current maximum is %d.", params->paramCount);
-  }
-}
-
 /**
  * @brief Counts the number of white spaces that prefix a string.
  *
@@ -350,7 +267,6 @@ static void parse_line(char *line, struct csds_parser *params) {
  * @param params Structure to be written to
  *
  */
-
 static void parse_value(char *line, struct csds_parser *params) {
   static int inSection = 0;
   static char section[PARSER_MAX_LINE_SIZE]; /* Keeps track of current section
@@ -420,8 +336,6 @@ static void parse_value(char *line, struct csds_parser *params) {
        * section. */
       strcpy(params->data[params->paramCount].name, tmpStr);
       strcpy(params->data[params->paramCount].value, token);
-      params->data[params->paramCount].used = 0;
-      params->data[params->paramCount].is_default = 0;
       if (params->paramCount == PARSER_MAX_NO_OF_PARAMS - 1) {
         error(
             "Maximal number of parameters in parameter file reached. Aborting "
@@ -480,8 +394,6 @@ static void parse_section_param(char *line, int *isFirstParam,
 
   strcpy(params->data[params->paramCount].name, paramName);
   strcpy(params->data[params->paramCount].value, token);
-  params->data[params->paramCount].used = 0;
-  params->data[params->paramCount].is_default = 0;
   if (params->paramCount == PARSER_MAX_NO_OF_PARAMS - 1) {
     error("Maximal number of parameters in parameter file reached. Aborting !");
   } else {
@@ -492,50 +404,26 @@ static void parse_section_param(char *line, int *isFirstParam,
 // Retrieve parameter value from structure. TYPE is the data type, float, int
 // etc. FMT the format required for that data type, i.e. %f, %d etc. and DESC
 // a one word description of the type, "float", "int" etc.
-#define PARSER_GET_VALUE(TYPE, FMT, DESC)                                      \
-  static int get_param_##TYPE(struct csds_parser *params, const char *name,    \
-                              TYPE *def, TYPE *result) {                       \
-    char str[PARSER_MAX_LINE_SIZE];                                            \
-    for (int i = 0; i < params->paramCount; i++) {                             \
-      if (strcmp(name, params->data[i].name) == 0) {                           \
-        /* Check that exactly one number is parsed, capture junk. */           \
-        if (sscanf(params->data[i].value, " " FMT "%s ", result, str) != 1) {  \
-          error("Tried parsing " DESC                                          \
-                " '%s' but found '%s' with "                                   \
-                "illegal trailing characters '%s'.",                           \
-                params->data[i].name, params->data[i].value, str);             \
-        }                                                                      \
-        /* Ensure same behavior if called multiple times for same parameter */ \
-        if (params->data[i].is_default && def == NULL)                         \
-          error(                                                               \
-              "Tried parsing %s again but cannot parse a default "             \
-              "parameter as mandatory",                                        \
-              name);                                                           \
-        if (params->data[i].is_default && *def != *result)                     \
-          error(                                                               \
-              "Tried parsing %s again but cannot parse a parameter with "      \
-              "two different default value (" FMT "!=" FMT ")",                \
-              name, *def, *result);                                            \
-        /* This parameter has been used */                                     \
-        params->data[i].used = 1;                                              \
-        return 1;                                                              \
-      }                                                                        \
-    }                                                                          \
-    if (def == NULL)                                                           \
-      error("Cannot find '%s' in the structure, in file '%s'.", name,          \
-            params->fileName);                                                 \
-    return 0;                                                                  \
-  }
-
-// Set a parameter to a value and save for dumping.
-#define PARSER_SAVE_VALUE(PREFIX, TYPE, FMT)                      \
-  static void save_param_##PREFIX(struct csds_parser *params,     \
-                                  const char *name, TYPE value) { \
-    char str[PARSER_MAX_LINE_SIZE];                               \
-    sprintf(str, "%s:" FMT, name, value);                         \
-    parser_set_param(params, str);                                \
-    params->data[params->paramCount - 1].used = 1;                \
-    params->data[params->paramCount - 1].is_default = 0;          \
+#define PARSER_GET_VALUE(TYPE, FMT, DESC)                                     \
+  static int get_param_##TYPE(struct csds_parser *params, const char *name,   \
+                              TYPE *def, TYPE *result) {                      \
+    char str[PARSER_MAX_LINE_SIZE];                                           \
+    for (int i = 0; i < params->paramCount; i++) {                            \
+      if (strcmp(name, params->data[i].name) == 0) {                          \
+        /* Check that exactly one number is parsed, capture junk. */          \
+        if (sscanf(params->data[i].value, " " FMT "%s ", result, str) != 1) { \
+          error("Tried parsing " DESC                                         \
+                " '%s' but found '%s' with "                                  \
+                "illegal trailing characters '%s'.",                          \
+                params->data[i].name, params->data[i].value, str);            \
+        }                                                                     \
+        return 1;                                                             \
+      }                                                                       \
+    }                                                                         \
+    if (def == NULL)                                                          \
+      error("Cannot find '%s' in the structure, in file '%s'.", name,         \
+            params->fileName);                                                \
+    return 0;                                                                 \
   }
 
 /* Instantiations. */
@@ -544,12 +432,6 @@ PARSER_GET_VALUE(int, "%d", "int");
 PARSER_GET_VALUE(float, "%f", "float");
 PARSER_GET_VALUE(double, "%lf", "double");
 PARSER_GET_VALUE(longlong, "%lld", "long long");
-PARSER_SAVE_VALUE(char, char, "%c");
-PARSER_SAVE_VALUE(int, int, "%d");
-PARSER_SAVE_VALUE(float, float, "%g");
-PARSER_SAVE_VALUE(double, double, "%g");
-PARSER_SAVE_VALUE(longlong, longlong, "%lld");
-PARSER_SAVE_VALUE(string, const char *, "%s");
 
 /**
  * @brief Retrieve integer parameter from structure.
@@ -629,14 +511,7 @@ void parser_get_param_string(struct csds_parser *params, const char *name,
 
   for (int i = 0; i < params->paramCount; i++) {
     if (!strcmp(name, params->data[i].name)) {
-      if (params->data[i].is_default)
-        error(
-            "Tried parsing %s again but cannot parse a "
-            "default parameter as mandatory",
-            name);
       strcpy(retParam, params->data[i].value);
-      /* this parameter has been used */
-      params->data[i].used = 1;
       return;
     }
   }
@@ -656,8 +531,6 @@ int parser_get_opt_param_int(struct csds_parser *params, const char *name,
                              int def) {
   int result = 0;
   if (get_param_int(params, name, &def, &result)) return result;
-  save_param_int(params, name, def);
-  params->data[params->paramCount - 1].is_default = 1;
   return def;
 }
 
@@ -673,8 +546,6 @@ char parser_get_opt_param_char(struct csds_parser *params, const char *name,
                                char def) {
   char result = 0;
   if (get_param_char(params, name, &def, &result)) return result;
-  save_param_char(params, name, def);
-  params->data[params->paramCount - 1].is_default = 1;
   return def;
 }
 
@@ -690,8 +561,6 @@ float parser_get_opt_param_float(struct csds_parser *params, const char *name,
                                  float def) {
   float result = 0;
   if (get_param_float(params, name, &def, &result)) return result;
-  save_param_float(params, name, def);
-  params->data[params->paramCount - 1].is_default = 1;
   return def;
 }
 
@@ -707,8 +576,6 @@ double parser_get_opt_param_double(struct csds_parser *params, const char *name,
                                    double def) {
   double result = 0;
   if (get_param_double(params, name, &def, &result)) return result;
-  save_param_double(params, name, def);
-  params->data[params->paramCount - 1].is_default = 1;
   return def;
 }
 
@@ -724,8 +591,6 @@ long long parser_get_opt_param_longlong(struct csds_parser *params,
                                         const char *name, long long def) {
   long long result = 0;
   if (get_param_longlong(params, name, &def, &result)) return result;
-  save_param_longlong(params, name, def);
-  params->data[params->paramCount - 1].is_default = 1;
   return def;
 }
 
@@ -743,20 +608,9 @@ void parser_get_opt_param_string(struct csds_parser *params, const char *name,
   for (int i = 0; i < params->paramCount; i++) {
     if (!strcmp(name, params->data[i].name)) {
       strcpy(retParam, params->data[i].value);
-
-      /* Ensure same behavior if called multiple times for same parameter */
-      if (params->data[i].is_default && strcmp(def, retParam) != 0)
-        error(
-            "Tried parsing %s again but cannot parse a parameter with "
-            "two different default values ('%s' != '%s')",
-            name, def, retParam);
-      /* this parameter has been used */
-      params->data[i].used = 1;
       return;
     }
   }
-  save_param_string(params, name, def);
-  params->data[params->paramCount - 1].is_default = 1;
   strcpy(retParam, def);
 }
 
@@ -775,11 +629,6 @@ void parser_get_opt_param_string(struct csds_parser *params, const char *name,
                                                                       \
     for (int i = 0; i < params->paramCount; i++) {                    \
       if (!strcmp(name, params->data[i].name)) {                      \
-        if (params->data[i].is_default && required)                   \
-          error(                                                      \
-              "Tried parsing %s again but cannot parse a default "    \
-              "parameter as mandatory",                               \
-              name);                                                  \
         char *cp = cpy;                                               \
         strcpy(cp, params->data[i].value);                            \
         cp = trim_both(cp);                                           \
@@ -806,12 +655,6 @@ void parser_get_opt_param_string(struct csds_parser *params, const char *name,
                     "illegal " DESC " characters '%s'.",              \
                     name, p, str);                                    \
             }                                                         \
-            if (params->data[i].is_default && tmp_value != values[k]) \
-              error(                                                  \
-                  "Tried parsing %s again but cannot parse a "        \
-                  "parameter with two different default value "       \
-                  "(" FMT "!=" FMT ")",                               \
-                  name, tmp_value, values[k]);                        \
             values[k] = tmp_value;                                    \
           } else {                                                    \
             error(                                                    \
@@ -821,7 +664,6 @@ void parser_get_opt_param_string(struct csds_parser *params, const char *name,
           }                                                           \
           if (k < nval - 1) p = strtok(NULL, ",");                    \
         }                                                             \
-        params->data[i].used = 1;                                     \
         return 1;                                                     \
       }                                                               \
     }                                                                 \
@@ -831,33 +673,12 @@ void parser_get_opt_param_string(struct csds_parser *params, const char *name,
     return 0;                                                         \
   }
 
-// Set values of a default parameter so they will be saved correctly.
-#define PARSER_SAVE_ARRAY(TYPE, FMT)                                          \
-  static int save_param_##TYPE##_array(                                       \
-      struct csds_parser *params, const char *name, int nval, TYPE *values) { \
-    /* Save values against the parameter. */                                  \
-    char str[PARSER_MAX_LINE_SIZE];                                           \
-    int k = sprintf(str, "%s: [", name);                                      \
-    for (int i = 0; i < nval - 1; i++)                                        \
-      k += sprintf(&str[k], FMT ", ", values[i]);                             \
-    sprintf(&str[k], FMT "]", values[nval - 1]);                              \
-    parser_set_param(params, str);                                            \
-    params->data[params->paramCount - 1].used = 1;                            \
-    params->data[params->paramCount - 1].is_default = 0;                      \
-    return 0;                                                                 \
-  }
-
 /* Instantiations. */
 PARSER_GET_ARRAY(char, "%c", "char");
 PARSER_GET_ARRAY(int, "%d", "int");
 PARSER_GET_ARRAY(float, "%f", "float");
 PARSER_GET_ARRAY(double, "%lf", "double");
 PARSER_GET_ARRAY(longlong, "%lld", "long long");
-PARSER_SAVE_ARRAY(char, "%c");
-PARSER_SAVE_ARRAY(int, "%d");
-PARSER_SAVE_ARRAY(float, "%g");
-PARSER_SAVE_ARRAY(double, "%g");
-PARSER_SAVE_ARRAY(longlong, "%lld");
 
 /**
  * @brief Retrieve char array parameter from structure.
@@ -886,8 +707,6 @@ void parser_get_param_char_array(struct csds_parser *params, const char *name,
 int parser_get_opt_param_char_array(struct csds_parser *params,
                                     const char *name, int nval, char *values) {
   if (get_param_char_array(params, name, 0, nval, values) != 1) {
-    save_param_char_array(params, name, nval, values);
-    params->data[params->paramCount - 1].is_default = 1;
     return 0;
   }
   return 1;
@@ -920,8 +739,6 @@ void parser_get_param_int_array(struct csds_parser *params, const char *name,
 int parser_get_opt_param_int_array(struct csds_parser *params, const char *name,
                                    int nval, int *values) {
   if (get_param_int_array(params, name, 0, nval, values) != 1) {
-    save_param_int_array(params, name, nval, values);
-    params->data[params->paramCount - 1].is_default = 1;
     return 0;
   }
   return 1;
@@ -955,8 +772,6 @@ int parser_get_opt_param_float_array(struct csds_parser *params,
                                      const char *name, int nval,
                                      float *values) {
   if (get_param_float_array(params, name, 0, nval, values) != 1) {
-    save_param_float_array(params, name, nval, values);
-    params->data[params->paramCount - 1].is_default = 1;
     return 0;
   }
   return 1;
@@ -990,8 +805,6 @@ int parser_get_opt_param_double_array(struct csds_parser *params,
                                       const char *name, int nval,
                                       double *values) {
   if (get_param_double_array(params, name, 0, nval, values) != 1) {
-    save_param_double_array(params, name, nval, values);
-    params->data[params->paramCount - 1].is_default = 1;
     return 0;
   }
   return 1;
@@ -1026,8 +839,6 @@ int parser_get_opt_param_longlong_array(struct csds_parser *params,
                                         const char *name, int nval,
                                         long long *values) {
   if (get_param_longlong_array(params, name, 0, nval, values) != 1) {
-    save_param_longlong_array(params, name, nval, values);
-    params->data[params->paramCount - 1].is_default = 1;
     return 0;
   }
   return 1;
@@ -1046,6 +857,5 @@ void parser_print_params(const struct csds_parser *params) {
   for (int i = 0; i < params->paramCount; i++) {
     printf("Parameter name: %s\n", params->data[i].name);
     printf("Parameter value: %s\n", params->data[i].value);
-    printf("Parameter used: %i\n", params->data[i].used);
   }
 }
diff --git a/src/csds_parser.h b/src/csds_parser.h
index 107d392c47d2c4a28bde2cd75137d518978065e6..efdf9cc19d2e02f004f0c1745a9c97bb9059c6df 100644
--- a/src/csds_parser.h
+++ b/src/csds_parser.h
@@ -39,8 +39,6 @@
 struct parameter {
   char name[PARSER_MAX_LINE_SIZE];
   char value[PARSER_MAX_LINE_SIZE];
-  int used;
-  int is_default;
 };
 
 struct section {
@@ -60,7 +58,6 @@ struct csds_parser {
 void parser_init(const char *file_name, struct csds_parser *params);
 void parser_read_file(const char *file_name, struct csds_parser *params);
 void parser_print_params(const struct csds_parser *params);
-void parser_set_param(struct csds_parser *params, const char *desc);
 
 char parser_get_param_char(struct csds_parser *params, const char *name);
 int parser_get_param_int(struct csds_parser *params, const char *name);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 77a62e3f52b9326e80e81ea757a6964a364e1d76..90d84839d2ad5c94d78d6615cb09fa2c10719ac8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -28,11 +28,11 @@ AM_CFLAGS += $(PYTHON_EXTRA_COMPILER_FLAG)
 
 # List of programs and scripts to run in the test suite
 TESTS = testLogfileHeader testLogfileReader testTimeArray testQuickSort testVirtualReality
-TESTS += testHashmap testInterpolation
+TESTS += testHashmap testInterpolation testParser
 
 # List of test programs to compile
 check_PROGRAMS = testLogfileHeader testLogfileReader testTimeArray testQuickSort testVirtualReality
-check_PROGRAMS += testHashmap testInterpolation
+check_PROGRAMS += testHashmap testInterpolation testParser
 
 # Rebuild tests when CSDS is updated.
 $(check_PROGRAMS): ../src/.libs/libcsds.a ../src/.libs/libcsds_writer.a
@@ -45,6 +45,7 @@ testQuickSort_SOURCES = testQuickSort.c
 testVirtualReality_SOURCES = testVirtualReality.c
 testHashmap_SOURCES = testHashmap.c
 testInterpolation_SOURCES = testInterpolation.c
+testParser_SOURCES = testParser.c
 
 # Files necessary for distribution
 EXTRA_DIST = 
diff --git a/tests/testParser.c b/tests/testParser.c
new file mode 100644
index 0000000000000000000000000000000000000000..a776119642ef46b3d85e963dd4186d4a32d357ce
--- /dev/null
+++ b/tests/testParser.c
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * This file is part of CSDS.
+ * Copyright (c) 2019 Loic Hausammann (loic.hausammann@epfl.ch)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ ******************************************************************************/
+
+/* Local headers */
+#include "csds_definitions.h"
+#include "csds_parser.h"
+
+/* Standard headers */
+#include <assert.h>
+#include <math.h>
+#include <string.h>
+
+int main(void) {
+
+  struct csds_parser parser;
+  parser_init("test_parser.yml", &parser);
+  parser_read_file("test_parser.yml", &parser);
+  parser_print_params(&parser);
+
+  /* scalar reader */
+  assert(parser_get_param_char(&parser, "Test:char") == 'c');
+  assert(parser_get_param_int(&parser, "Test:int") == 10);
+  float ftest = parser_get_param_float(&parser, "Test:float");
+  assert(fabsf(ftest - 0.2f) < 1e-6);
+  assert(parser_get_param_double(&parser, "Test:double") == 0.2);
+  assert(parser_get_param_longlong(&parser, "Test:longlong") == 1254108);
+
+  char ret_param[CSDS_STRING_SIZE];
+  parser_get_param_string(&parser, "Test:string", ret_param);
+  assert(strcmp(ret_param, "test") == 0);
+
+  /* Optional scalar reader (failed) */
+  assert(parser_get_opt_param_char(&parser, "Test:test", 'd') == 'd');
+  assert(parser_get_opt_param_int(&parser, "Test:test", 2) == 2);
+  ftest = parser_get_opt_param_float(&parser, "Test:test", 0.1);
+  assert(fabsf(ftest - 0.1f) < 1e-6);
+  assert(parser_get_opt_param_double(&parser, "Test:test", 0.1) == 0.1);
+  assert(parser_get_opt_param_longlong(&parser, "Test:test", 1) == 1);
+
+  parser_get_opt_param_string(&parser, "Test:test", ret_param, "test1");
+  assert(strcmp(ret_param, "test1") == 0);
+
+  /* Optional scalar reader (pass) */
+  assert(parser_get_opt_param_char(&parser, "Test:char", 'd') == 'c');
+  assert(parser_get_opt_param_int(&parser, "Test:int", 1) == 10);
+  ftest = parser_get_opt_param_float(&parser, "Test:float", 0.1);
+  assert(fabsf(ftest - 0.2f) < 1e-6);
+  assert(parser_get_opt_param_double(&parser, "Test:double", 0.1) == 0.2);
+  assert(parser_get_opt_param_longlong(&parser, "Test:longlong", 1) == 1254108);
+
+  parser_get_opt_param_string(&parser, "Test:string", ret_param, "test1");
+  assert(strcmp(ret_param, "test") == 0);
+
+  /* Array reader */
+  const int nval = 3;
+  char c[nval];
+  int i[nval];
+  float f[nval];
+  double d[nval];
+  long long l[nval];
+
+  parser_get_param_char_array(&parser, "Test:char_array", nval, c);
+  parser_get_param_int_array(&parser, "Test:int_array", nval, i);
+  parser_get_param_float_array(&parser, "Test:float_array", nval, f);
+  parser_get_param_double_array(&parser, "Test:double_array", nval, d);
+  parser_get_param_longlong_array(&parser, "Test:longlong_array", nval, l);
+
+  /* Check the values */
+  assert(c[0] == 'a');
+  assert(c[1] == 'b');
+  assert(c[2] == 'c');
+
+  for (int k = 0; k < nval; k++) {
+    int m = k + 1;
+    assert(i[k] == m);
+    assert(fabsf(f[k] - m * 0.1f) < 1e-6);
+    assert(fabs(d[k] - m * 0.1) < 1e-12);
+    if (k == 0) {
+      assert(l[k] == 1234567890);
+    } else {
+      assert(l[k] == m);
+    }
+  }
+
+  /* Optional array reader (failed) */
+  c[0] = 'e';
+  c[1] = 'f';
+  c[2] = 'g';
+  i[0] = 3;
+  i[1] = 4;
+  i[2] = 5;
+  f[0] = 0.3;
+  f[1] = 0.4;
+  f[2] = 0.5;
+  d[0] = 0.3;
+  d[1] = 0.4;
+  d[2] = 0.5;
+  l[0] = 9876543210;
+  l[1] = 4;
+  l[2] = 5;
+
+  parser_get_opt_param_char_array(&parser, "Test:test", nval, c);
+  parser_get_opt_param_int_array(&parser, "Test:test", nval, i);
+  parser_get_opt_param_float_array(&parser, "Test:test", nval, f);
+  parser_get_opt_param_double_array(&parser, "Test:test", nval, d);
+  parser_get_opt_param_longlong_array(&parser, "Test:test", nval, l);
+
+  /* Check the values */
+  assert(c[0] == 'e');
+  assert(c[1] == 'f');
+  assert(c[2] == 'g');
+
+  for (int k = 0; k < nval; k++) {
+    int m = k + nval;
+    assert(i[k] == m);
+    assert(fabsf(f[k] - m * 0.1f) < 1e-6);
+    assert(fabs(d[k] - m * 0.1) < 1e-12);
+    if (k == 0) {
+      assert(l[k] == 9876543210);
+    } else {
+      assert(l[k] == m);
+    }
+  }
+
+  /* Optional array reader (success) */
+  c[0] = 'e';
+  c[1] = 'f';
+  c[2] = 'g';
+
+  i[0] = 3;
+  i[1] = 4;
+  i[2] = 5;
+
+  f[0] = 0.3;
+  f[1] = 0.4;
+  f[2] = 0.5;
+
+  d[0] = 0.3;
+  d[1] = 0.4;
+  d[2] = 0.5;
+
+  l[0] = 9876543210;
+  l[1] = 4;
+  l[2] = 5;
+
+  parser_get_opt_param_char_array(&parser, "Test:char_array", nval, c);
+  parser_get_opt_param_int_array(&parser, "Test:int_array", nval, i);
+  parser_get_opt_param_float_array(&parser, "Test:float_array", nval, f);
+  parser_get_opt_param_double_array(&parser, "Test:double_array", nval, d);
+  parser_get_opt_param_longlong_array(&parser, "Test:longlong_array", nval, l);
+
+  /* Check the values */
+  assert(c[0] == 'a');
+  assert(c[1] == 'b');
+  assert(c[2] == 'c');
+
+  for (int k = 0; k < nval; k++) {
+    int m = k + 1;
+    assert(i[k] == m);
+    assert(fabsf(f[k] - m * 0.1f) < 1e-6);
+    assert(fabs(d[k] - m * 0.1) < 1e-12);
+    if (k == 0) {
+      assert(l[k] == 1234567890);
+    } else {
+      assert(l[k] == m);
+    }
+  }
+}
diff --git a/tests/testQuickSort.c b/tests/testQuickSort.c
index f2056bcb3eb3379127fc61bd801dc21037d0e047..48ff7f870cfb31936110da5a5e89f0fca80296a9 100644
--- a/tests/testQuickSort.c
+++ b/tests/testQuickSort.c
@@ -1,4 +1,3 @@
-
 /*******************************************************************************
  * This file is part of CSDS.
  * Copyright (c) 2019 Loic Hausammann (loic.hausammann@epfl.ch)
diff --git a/tests/test_parser.yml b/tests/test_parser.yml
new file mode 100644
index 0000000000000000000000000000000000000000..49ce4ae525d88268ee535cf8bb39c2ca8736cde6
--- /dev/null
+++ b/tests/test_parser.yml
@@ -0,0 +1,12 @@
+Test:
+  float: 0.2
+  int: 10
+  string: test
+  double: 0.2
+  char: c
+  longlong: 1254108
+  char_array: [a, b, c]
+  int_array: [1, 2, 3]
+  float_array: [0.1, 0.2, 0.3]
+  double_array: [0.1, 0.2, 0.3]
+  longlong_array: [1234567890, 2, 3]