Skip to content
Snippets Groups Projects
Commit 3ae39083 authored by Dominik Loidolt's avatar Dominik Loidolt
Browse files

add test for cmp_guess.c

parent 8172dc3a
No related branches found
No related tags found
1 merge request!2added feature to guess the compression configuration
......@@ -3,11 +3,11 @@ SOURCEDIR =
INCLUDES = -I../../include
PATH +=
CFLAGS := -O0 -W -Wall -Wextra -std=gnu99 -Werror -pedantic -g3\
-fprofile-arcs -ftest-coverage\
-fanalyzer
-fprofile-arcs -ftest-coverage
CPPFLAGS := -D__MAIN__ $(INCLUDES) -I$(SOURCEDIR)
LDFLAGS := -lcunit
SOURCES := $(wildcard *.c) ../../lib/cmp_tool_lib.c ../../lib/cmp_support.c
SOURCES := $(wildcard *.c) ../../lib/cmp_tool_lib.c ../../lib/cmp_guess.c\
../../lib/cmp_support.c ../../lib/cmp_icu.c ../../lib/cmp_data_types.c
OBJECTS := $(patsubst %.c, $(BUILDDIR)/%.o, $(subst $(SOURCEDIR)/,, $(SOURCES)))
TARGET := test_cmp_tool
......@@ -21,6 +21,5 @@ coverage: all
genhtml --rc lcov_branch_coverage=1 --branch-coverage coverage.info --output-directory out
#firefox out/index.html
clean:
rm -r $(TARGET) *.gcno *.gcda coverage.info out/ tmp_stderr.log
......@@ -13,9 +13,7 @@
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* @brief command line tool for PLATO ICU/RDCU compression/decompression
* @see README.md
* @see Data Compression User Manual PLATO-UVIE-PL-UM-0001
* @brief unit tests for cmp_tool_lib.c
*/
#include <stdio.h>
......@@ -28,13 +26,14 @@
#include <CUnit/Console.h>
#include "../../include/cmp_tool_lib.h"
#include "../../include/cmp_guess.h"
#define PROGRAM_NAME "cmp_tool"
/* TODO */
/* used to redirect stdout to file */
int fd;
/* TODO */
/* used to redirect stdout to file */
fpos_t pos;
/* @brief The init cmp_tool test suite cleanup functionr. Redirect stdout to
......@@ -172,7 +171,7 @@ void test_read_file8(void)
CU_ASSERT_EQUAL(buf[i], 0);
}
}
CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples parameter.\n");
CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples or cmp_size parameter.\n");
free(s);
/* tests read 0 words in */
......@@ -185,7 +184,7 @@ void test_read_file8(void)
for (i = 0; i < 33; ++i) {
CU_ASSERT_EQUAL(buf[i], 0);
}
CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples parameter.\n");
CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples or cmp_size parameter.\n");
free(s);
/* TODO; tests read in 0 empty file */
......@@ -258,6 +257,240 @@ void test_read_file8(void)
}
#define CMP_TEST_SAMPLES 5
void test_cmp_guess(void)
{
struct cmp_cfg cfg = {0};
uint16_t data[CMP_TEST_SAMPLES] = {2,4,6,8,10};
uint16_t data_exp[CMP_TEST_SAMPLES] = {2,4,6,8,10};
uint16_t model[CMP_TEST_SAMPLES] = {4,6,8,10,12};
uint16_t model_exp[CMP_TEST_SAMPLES] = {4,6,8,10,12};
uint32_t cmp_size;
int level;
/* test 1d-diff mode */
cfg.input_buf = data;
cfg.model_buf = NULL;
cfg.samples = CMP_TEST_SAMPLES;
cfg.cmp_mode = MODE_DIFF_MULTI;
level = 2;
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_TRUE(cmp_size);
CU_ASSERT_EQUAL(cmp_size, 25);
CU_ASSERT_EQUAL(cfg.cmp_mode, MODE_DIFF_MULTI);
CU_ASSERT_EQUAL(cfg.golomb_par, 1);
CU_ASSERT_EQUAL(cfg.spill, 2);
/* CU_ASSERT_EQUAL(cfg.model_value, ); model_value is not needed */
CU_ASSERT_EQUAL(cfg.round, 0);
CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 2);
CU_ASSERT_EQUAL(cfg.ap1_spill, 2);
CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3);
CU_ASSERT_EQUAL(cfg.ap2_spill, 2);
CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES);
/* CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES); model is
* not used*/
CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES);
CU_ASSERT_EQUAL(cfg.buffer_length, 2);
/* test model mode */
memset(&cfg, 0, sizeof(struct cmp_cfg));
cfg.input_buf = data;
cfg.model_buf = model;
cfg.samples = CMP_TEST_SAMPLES;
cfg.cmp_mode = MODE_MODEL_ZERO;
level =3;
cmp_guess_set_model_updates(12);
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_TRUE(cmp_size);
CU_ASSERT_EQUAL(cmp_size, 20);
CU_ASSERT_EQUAL(cfg.cmp_mode, 1);
CU_ASSERT_EQUAL(cfg.golomb_par, 2);
CU_ASSERT_EQUAL(cfg.spill, 22);
CU_ASSERT_EQUAL(cfg.model_value, 12);
CU_ASSERT_EQUAL(cfg.round, 0);
CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 1);
CU_ASSERT_EQUAL(cfg.ap1_spill, 8);
CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3);
CU_ASSERT_EQUAL(cfg.ap2_spill, 35);
CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES);
CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES);
CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES);
CU_ASSERT_EQUAL(cfg.buffer_length, 2);
/* test diff mode without model buffer*/
cmp_guess_set_model_updates(CMP_GUESS_N_MODEL_UPDATE_DEF);
memset(&cfg, 0, sizeof(struct cmp_cfg));
cfg.input_buf = data;
cfg.model_buf = model;
cfg.samples = CMP_TEST_SAMPLES;
cfg.cmp_mode = MODE_DIFF_MULTI;
level = 3;
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_TRUE(cmp_size);
CU_ASSERT_EQUAL(cmp_size, 20);
CU_ASSERT_EQUAL(cfg.cmp_mode, MODE_DIFF_MULTI);
CU_ASSERT_EQUAL(cfg.golomb_par, 2);
CU_ASSERT_EQUAL(cfg.spill, 5);
CU_ASSERT_EQUAL(cfg.model_value, 11);
CU_ASSERT_EQUAL(cfg.round, 0);
CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 1);
CU_ASSERT_EQUAL(cfg.ap1_spill, 2);
CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3);
CU_ASSERT_EQUAL(cfg.ap2_spill, 2);
CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES);
CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES);
CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES);
CU_ASSERT_EQUAL(cfg.buffer_length, 2);
/* error test cfg = NULL */
level = 2;
cmp_size = cmp_guess(NULL, level);
CU_ASSERT_FALSE(cmp_size);
/* error test unknown guess_level */
level = 4;
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_FALSE(cmp_size);
/* error test model mode without model buffer*/
memset(&cfg, 0, sizeof(struct cmp_cfg));
cfg.input_buf = NULL;
cfg.model_buf = NULL;
cfg.samples = CMP_TEST_SAMPLES;
cfg.cmp_mode = MODE_DIFF_MULTI;
level = 2;
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_FALSE(cmp_size);
/* error test model mode without model buffer*/
memset(&cfg, 0, sizeof(struct cmp_cfg));
cfg.input_buf = data;
cfg.model_buf = NULL;
cfg.samples = CMP_TEST_SAMPLES;
cfg.cmp_mode = MODE_MODEL_MULTI;
level = 2;
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_FALSE(cmp_size);
/* error test not supported cmp_mode */
memset(&cfg, 0, sizeof(struct cmp_cfg));
cfg.input_buf = data;
cfg.model_buf = model;
cfg.samples = CMP_TEST_SAMPLES;
cfg.cmp_mode = 5;
level = 2;
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_FALSE(cmp_size);
/* error test samples = 0 */
memset(&cfg, 0, sizeof(struct cmp_cfg));
cfg.input_buf = data;
cfg.model_buf = model;
cfg.samples = 0;
cfg.cmp_mode = MODE_MODEL_MULTI;
level = 2;
cmp_size = cmp_guess(&cfg, level);
CU_ASSERT_FALSE(cmp_size);
}
void test_cmp_guess_model_value(void)
{
uint16_t model_value;
model_value = cmp_guess_model_value(0);
CU_ASSERT_EQUAL(model_value, 8);
model_value = cmp_guess_model_value(1);
CU_ASSERT_EQUAL(model_value, 8);
model_value = cmp_guess_model_value(2);
CU_ASSERT_EQUAL(model_value, 8);
model_value = cmp_guess_model_value(3);
CU_ASSERT_EQUAL(model_value, 10);
model_value = cmp_guess_model_value(4);
CU_ASSERT_EQUAL(model_value, 10);
model_value = cmp_guess_model_value(5);
CU_ASSERT_EQUAL(model_value, 10);
model_value = cmp_guess_model_value(6);
CU_ASSERT_EQUAL(model_value, 11);
model_value = cmp_guess_model_value(10);
CU_ASSERT_EQUAL(model_value, 11);
model_value = cmp_guess_model_value(11);
CU_ASSERT_EQUAL(model_value, 11);
model_value = cmp_guess_model_value(12);
CU_ASSERT_EQUAL(model_value, 12);
model_value = cmp_guess_model_value(20);
CU_ASSERT_EQUAL(model_value, 12);
model_value = cmp_guess_model_value(21);
CU_ASSERT_EQUAL(model_value, 12);
model_value = cmp_guess_model_value(22);
CU_ASSERT_EQUAL(model_value, 13);
}
void test_cmp_mode_parse(void)
{
uint32_t cmp_mode = ~0;
int err;
/* error cases */
err = cmp_mode_parse(NULL, NULL);
CU_ASSERT_TRUE(err);
err = cmp_mode_parse(NULL, &cmp_mode);
CU_ASSERT_TRUE(err);
err = cmp_mode_parse("MODE_RAW", NULL);
CU_ASSERT_TRUE(err);
err = cmp_mode_parse("UNKNOWN", &cmp_mode);
CU_ASSERT_TRUE(err);
err = cmp_mode_parse("9999999999999999999", &cmp_mode);
CU_ASSERT_TRUE(err);
/* mode not defined*/
err = cmp_mode_parse("424212", &cmp_mode);
CU_ASSERT_TRUE(err);
/* normal operation */
err = cmp_mode_parse("MODE_RAW", &cmp_mode);
CU_ASSERT_FALSE(err);
CU_ASSERT_EQUAL(cmp_mode, MODE_RAW);
err = cmp_mode_parse("0", &cmp_mode);
CU_ASSERT_FALSE(err);
CU_ASSERT_EQUAL(cmp_mode, MODE_RAW);
err = cmp_mode_parse("0 \n", &cmp_mode);
CU_ASSERT_FALSE(err);
CU_ASSERT_EQUAL(cmp_mode, MODE_RAW);
err = cmp_mode_parse(" 2 ", &cmp_mode);
CU_ASSERT_FALSE(err);
CU_ASSERT_EQUAL(cmp_mode, 2);
err = cmp_mode_parse("MODE_DIFF_MULTI", &cmp_mode);
CU_ASSERT_FALSE(err);
CU_ASSERT_EQUAL(cmp_mode, MODE_DIFF_MULTI);
}
CU_ErrorCode cmp_tool_add_tests(CU_pSuite suite)
{
CU_pTest __attribute__((unused)) test;
......@@ -270,7 +503,10 @@ CU_ErrorCode cmp_tool_add_tests(CU_pSuite suite)
}
/* add the tests to the suite */
if ((NULL == CU_add_test(suite, "test of read_file8()", test_read_file8))) {
if ((NULL == CU_add_test(suite, "test of read_file8()", test_read_file8)) ||
(NULL == CU_add_test(suite, "test of cmp_mode_parse()", test_cmp_mode_parse))||
(NULL == CU_add_test(suite, "test of cmp_guess_model_value()", test_cmp_guess_model_value))||
(NULL == CU_add_test(suite, "test of cmp_guess()", test_cmp_guess))) {
CU_cleanup_registry();
return CU_get_error();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment