Skip to content
Snippets Groups Projects
test_attr.c 15.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jonathan Schöbel's avatar
    Jonathan Schöbel committed
    /*
     * test_attr.c
     *
     * Copyright 2022 Jonathan Schöbel <jonathan@Ubermos-2019>
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2 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 General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
     * MA 02110-1301, USA.
     *
     *
     */
    
    
    #include <check.h>
    #include <stdlib.h>
    
    #include "status.h"
    
    #include "attr.c"
    
    
    START_TEST(test_attr1_no_status)
    {
    	struct SH_Attr * attr;
    	const char * name = "name";
    
    	attr = SH_Attr_new (name, NULL, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_ne (name, attr->name);
    	ck_assert_str_eq (name, attr->name);
    	ck_assert_ptr_eq (NULL, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr1_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	const char * name = "name";
    
    	_status_preinit (status);
    	attr = SH_Attr_new (name, NULL, &status);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (name, attr->name);
    	ck_assert_str_eq (name, attr->name);
    	ck_assert_ptr_eq (NULL, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr2_no_status)
    {
    	struct SH_Attr * attr;
    	const char * name = "name";
    	const char * value = "value";
    
    	attr = SH_Attr_new (name, value, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_ne (name, attr->name);
    	ck_assert_str_eq (name, attr->name);
    	ck_assert_ptr_ne (value, attr->value);
    	ck_assert_str_eq (value, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr2_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	const char * name = "name";
    	const char * value = "value";
    
    	_status_preinit (status);
    	attr = SH_Attr_new (name, value, &status);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (name, attr->name);
    	ck_assert_str_eq (name, attr->name);
    	ck_assert_ptr_ne (value, attr->value);
    	ck_assert_str_eq (value, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    
    START_TEST(test_attr_raw1_no_status)
    {
    	struct SH_Attr * attr;
    	char * name = strdup ("name");
    
    	attr = SH_Attr_raw_new (name, NULL, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_eq (name, attr->name);
    	ck_assert_ptr_eq (NULL, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr_raw1_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	char * name = strdup ("name");
    
    	_status_preinit (status);
    	attr = SH_Attr_raw_new (name, NULL, &status);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_eq (name, attr->name);
    	ck_assert_ptr_eq (NULL, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr_raw2_no_status)
    {
    	struct SH_Attr * attr;
    	char * name = strdup ("name");
    	char * value = strdup ("value");
    
    	attr = SH_Attr_raw_new (name, value, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_eq (name, attr->name);
    	ck_assert_ptr_eq (value, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr_raw2_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	char * name = strdup ("name");
    	char * value = strdup ("value");
    
    	_status_preinit (status);
    	attr = SH_Attr_raw_new (name, value, &status);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_eq (name, attr->name);
    	ck_assert_ptr_eq (value, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    
    START_TEST(test_attr_copy1_no_status)
    {
    	struct SH_Attr * attr;
    	struct SH_Attr * copy;
    	const char * name = "name";
    
    	attr = SH_Attr_new (name, NULL, NULL);
    
    	copy = SH_Attr_copy (attr, NULL);
    	ck_assert_ptr_ne (NULL, copy);
    	ck_assert_ptr_ne (attr->name, copy->name);
    	ck_assert_str_eq (attr->name, copy->name);
    	ck_assert_ptr_eq (NULL, copy->value);
    
    	SH_Attr_free (attr);
    	SH_Attr_free (copy);
    }
    END_TEST
    
    START_TEST(test_attr_copy1_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	struct SH_Attr * copy;
    	const char * name = "name";
    
    	attr = SH_Attr_new (name, NULL, NULL);
    
    	_status_preinit (status);
    	copy = SH_Attr_copy (attr, &status);
    	ck_assert_ptr_ne (NULL, copy);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (attr->name, copy->name);
    	ck_assert_str_eq (attr->name, copy->name);
    	ck_assert_ptr_eq (NULL, copy->value);
    
    	SH_Attr_free (attr);
    	SH_Attr_free (copy);
    }
    END_TEST
    
    START_TEST(test_attr_copy2_no_status)
    {
    	struct SH_Attr * attr;
    	struct SH_Attr * copy;
    	const char * name = "name";
    	const char * value = "value";
    
    	attr = SH_Attr_new (name, value, NULL);
    
    	copy = SH_Attr_copy (attr, NULL);
    	ck_assert_ptr_ne (NULL, copy);
    	ck_assert_ptr_ne (attr->name, copy->name);
    	ck_assert_str_eq (attr->name, copy->name);
    	ck_assert_ptr_ne (attr->value, copy->value);
    	ck_assert_str_eq (attr->value, copy->value);
    
    	SH_Attr_free (attr);
    	SH_Attr_free (copy);
    }
    END_TEST
    
    START_TEST(test_attr_copy2_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	struct SH_Attr * copy;
    	const char * name = "name";
    	const char * value = "value";
    
    	attr = SH_Attr_new (name, value, NULL);
    
    	_status_preinit (status);
    	copy = SH_Attr_copy (attr, &status);
    	ck_assert_ptr_ne (NULL, copy);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (attr->name, copy->name);
    	ck_assert_str_eq (attr->name, copy->name);
    	ck_assert_ptr_ne (attr->value, copy->value);
    	ck_assert_str_eq (attr->value, copy->value);
    
    	SH_Attr_free (attr);
    	SH_Attr_free (copy);
    }
    END_TEST
    
    
    START_TEST(test_attr_name_no_status)
    {
    	struct SH_Attr * attr;
    	const char * name1 = "name1";
    	const char * name2 = "name2";
    	char * name;
    	bool result;
    
    	attr = SH_Attr_new (name1, NULL, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_ne (name1, attr->name);
    	ck_assert_str_eq (name1, attr->name);
    
    	name = SH_Attr_get_name (attr, NULL);
    	ck_assert_ptr_ne (NULL, name);
    	ck_assert_ptr_ne (name1, name);
    	ck_assert_str_eq (name1, name);
    	free (name);
    
    	result = SH_Attr_set_name (attr, name2, NULL);
    	ck_assert_int_eq (TRUE, result);
    	ck_assert_ptr_ne (name2, attr->name);
    	ck_assert_str_eq (name2, attr->name);
    
    	name = SH_Attr_get_name (attr, NULL);
    	ck_assert_ptr_ne (NULL, name);
    	ck_assert_ptr_ne (name2, name);
    	ck_assert_str_eq (name2, name);
    	free (name);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr_name_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	const char * name1 = "name1";
    	const char * name2 = "name2";
    	char * name;
    	bool result;
    
    	_status_preinit (status);
    	attr = SH_Attr_new (name1, NULL, &status);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (name1, attr->name);
    	ck_assert_str_eq (name1, attr->name);
    
    	_status_preinit (status);
    	name = SH_Attr_get_name (attr, &status);
    	ck_assert_ptr_ne (NULL, name);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (name1, name);
    	ck_assert_str_eq (name1, name);
    	free (name);
    
    	_status_preinit (status);
    	result = SH_Attr_set_name (attr, name2, &status);
    	ck_assert_int_eq (TRUE, result);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (name2, attr->name);
    	ck_assert_str_eq (name2, attr->name);
    
    	_status_preinit (status);
    	name = SH_Attr_get_name (attr, &status);
    	ck_assert_ptr_ne (NULL, name);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (name2, name);
    	ck_assert_str_eq (name2, name);
    	free (name);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    
    START_TEST(test_attr_name_raw)
    {
    	struct SH_Attr * attr;
    	char * name1 = strdup ("name1");
    	char * name2 = strdup ("name2");
    	const char * name;
    
    	attr = SH_Attr_raw_new (name1, NULL, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_eq (name1, attr->name);
    
    	name = SH_Attr_raw_get_name (attr);
    	ck_assert_ptr_ne (NULL, name);
    	ck_assert_ptr_eq (name1, name);
    
    	SH_Attr_raw_set_name (attr, name2);
    	ck_assert_ptr_eq (name2, attr->name);
    
    	name = SH_Attr_raw_get_name (attr);
    	ck_assert_ptr_ne (NULL, name);
    	ck_assert_ptr_eq (name2, name);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    
    START_TEST(test_attr_value_no_status)
    {
    	struct SH_Attr * attr;
    	const char * name = "name";
    	const char * value1 = "value1";
    	const char * value2 = "value2";
    	char * value;
    	bool result;
    
    	attr = SH_Attr_new (name, NULL, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_eq (NULL, attr->value);
    
    	value = SH_Attr_get_value (attr, NULL);
    	ck_assert_ptr_eq (NULL, value);
    
    
    	result = SH_Attr_has_value (attr);
    	ck_assert_int_eq (FALSE, result);
    
    
    	result = SH_Attr_set_value (attr, value1, NULL);
    	ck_assert_int_eq (TRUE, result);
    	ck_assert_ptr_ne (value1, attr->value);
    	ck_assert_str_eq (value1, attr->value);
    
    	value = SH_Attr_get_value (attr, NULL);
    	ck_assert_ptr_ne (NULL, value);
    	ck_assert_ptr_ne (value1, value);
    	ck_assert_str_eq (value1, value);
    	free (value);
    
    
    	result = SH_Attr_has_value (attr);
    	ck_assert_int_eq (TRUE, result);
    
    
    	result = SH_Attr_set_value (attr, value2, NULL);
    	ck_assert_int_eq (TRUE, result);
    	ck_assert_ptr_ne (value2, attr->value);
    	ck_assert_str_eq (value2, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    START_TEST(test_attr_value_with_status)
    {
    	struct SH_Status status;
    	struct SH_Attr * attr;
    	const char * name = "name";
    	const char * value1 = "value1";
    	const char * value2 = "value2";
    	char * value;
    	bool result;
    
    	_status_preinit (status);
    	attr = SH_Attr_new (name, NULL, &status);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_eq (NULL, attr->value);
    
    	_status_preinit (status);
    	value = SH_Attr_get_value (attr, &status);
    	ck_assert_ptr_eq (NULL, value);
    	ck_assert (succeed (&status));
    
    	_status_preinit (status);
    	result = SH_Attr_set_value (attr, value1, &status);
    	ck_assert_int_eq (TRUE, result);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (value1, attr->value);
    	ck_assert_str_eq (value1, attr->value);
    
    	_status_preinit (status);
    	value = SH_Attr_get_value (attr, &status);
    	ck_assert_ptr_ne (NULL, value);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (value1, value);
    	ck_assert_str_eq (value1, value);
    	free (value);
    
    	_status_preinit (status);
    	result = SH_Attr_set_value (attr, value2, &status);
    	ck_assert_int_eq (TRUE, result);
    	ck_assert (succeed (&status));
    	ck_assert_ptr_ne (value2, attr->value);
    	ck_assert_str_eq (value2, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    
    START_TEST(test_attr_value_raw)
    {
    	struct SH_Attr * attr;
    	char * name = strdup ("name");
    	char * value1 = strdup ("value1");
    	char * value2 = strdup ("value2");
    	const char * value;
    
    	bool result;
    
    
    	attr = SH_Attr_raw_new (name, NULL, NULL);
    	ck_assert_ptr_ne (NULL, attr);
    	ck_assert_ptr_eq (NULL, attr->value);
    
    	value = SH_Attr_raw_get_value (attr);
    	ck_assert_ptr_eq (NULL, value);
    
    
    	result = SH_Attr_has_value (attr);
    	ck_assert_int_eq (FALSE, result);
    
    
    	SH_Attr_raw_set_value (attr, value1);
    	ck_assert_ptr_eq (value1, attr->value);
    
    	value = SH_Attr_raw_get_value (attr);
    	ck_assert_ptr_ne (NULL, value);
    	ck_assert_ptr_eq (value1, value);
    
    
    	result = SH_Attr_has_value (attr);
    	ck_assert_int_eq (TRUE, result);
    
    
    	SH_Attr_raw_set_value (attr, value2);
    	ck_assert_ptr_eq (value2, attr->value);
    
    	SH_Attr_free (attr);
    }
    END_TEST
    
    
    START_TEST(test_attr_equal)
    {
    	struct
    	{
    		struct
    		{
    			char * name;
    			char * value;
    		} _[2];
    		bool result;
    	} tests[] =
    	{
    		{{{"name", NULL}, {"name", NULL}}, TRUE},
    		{{{"name", "value"}, {"name", NULL}}, FALSE},
    		{{{"name", "value"}, {"name", "value"}}, TRUE},
    		{{{"name", "value1"}, {"name", "value2"}}, FALSE},
    		{{{"name1", NULL}, {"name2", NULL}}, FALSE},
    		{{{"name1", "value"}, {"name2", NULL}}, FALSE},
    		{{{"name1", "value"}, {"name2", "value"}}, FALSE},
    		{{{"name1", "value1"}, {"name2", "value2"}}, FALSE}
    	};
    	const size_t size = sizeof (tests) / sizeof (tests[0]);
    	size_t index;
    
    	for (index = 0; index < size; index++)
    	{
    		struct SH_Attr * attr1;
    		struct SH_Attr * attr2;
    		bool result;
    
    		attr1 = SH_Attr_new (tests[index]._[0].name,
    		                     tests[index]._[0].value, NULL);
    		ck_assert_ptr_ne (NULL, attr1);
    
    		attr2 = SH_Attr_new (tests[index]._[1].name,
    		                     tests[index]._[1].value, NULL);
    		ck_assert_ptr_ne (NULL, attr2);
    
    		result = SH_Attr_is_equal (attr1, attr2);
    		ck_assert_int_eq (result, tests[index].result);
    
    		result = SH_Attr_is_equal (attr2, attr1);
    		ck_assert_int_eq (result, tests[index].result);
    
    		result = Attr_is_equal (attr1, attr2);
    		ck_assert_int_eq (result, tests[index].result);
    
    		result = Attr_is_equal (attr2, attr1);
    		ck_assert_int_eq (result, tests[index].result);
    
    		SH_Attr_free (attr1);
    		SH_Attr_free (attr2);
    	}
    }
    
    
    START_TEST(test_attr_equal_name)
    {
    	struct
    	{
    		struct
    		{
    			char * name;
    			char * value;
    		} _[2];
    		bool result;
    	} tests[] =
    	{
    		{{{"name", NULL}, {"name", NULL}}, TRUE},
    		{{{"name", "value"}, {"name", NULL}}, TRUE},
    		{{{"name", "value"}, {"name", "value"}}, TRUE},
    		{{{"name", "value1"}, {"name", "value2"}}, TRUE},
    		{{{"name1", NULL}, {"name2", NULL}}, FALSE},
    		{{{"name1", "value"}, {"name2", NULL}}, FALSE},
    		{{{"name1", "value"}, {"name2", "value"}}, FALSE},
    		{{{"name1", "value1"}, {"name2", "value2"}}, FALSE}
    	};
    	const size_t size = sizeof (tests) / sizeof (tests[0]);
    	size_t index;
    
    	for (index = 0; index < size; index++)
    	{
    		struct SH_Attr * attr1;
    		struct SH_Attr * attr2;
    		bool result;
    
    		attr1 = SH_Attr_new (tests[index]._[0].name,
    		                     tests[index]._[0].value, NULL);
    		ck_assert_ptr_ne (NULL, attr1);
    
    		attr2 = SH_Attr_new (tests[index]._[1].name,
    		                     tests[index]._[1].value, NULL);
    		ck_assert_ptr_ne (NULL, attr2);
    
    		result = SH_Attr_is_equal_name (attr1, attr2);
    		ck_assert_int_eq (result, tests[index].result);
    
    		result = SH_Attr_is_equal_name (attr2, attr1);
    		ck_assert_int_eq (result, tests[index].result);
    
    		result = Attr_is_equal_name (attr1, attr2);
    		ck_assert_int_eq (result, tests[index].result);
    
    		result = Attr_is_equal_name (attr2, attr1);
    		ck_assert_int_eq (result, tests[index].result);
    
    		SH_Attr_free (attr1);
    		SH_Attr_free (attr2);
    	}
    }
    
    
    Jonathan Schöbel's avatar
    Jonathan Schöbel committed
    Suite * test_suite (void)
    {
    	Suite *s;
    	TCase *tc_core;
    
    	s = suite_create ("Testsuite SeFHT Attr");
    
    	/* Core test case */
    	tc_core = tcase_create ("Core");
    
    	tcase_add_test (tc_core, test_attr1_no_status);
    	tcase_add_test (tc_core, test_attr1_with_status);
    	tcase_add_test (tc_core, test_attr2_no_status);
    	tcase_add_test (tc_core, test_attr2_with_status);
    
    
    	tcase_add_test (tc_core, test_attr_raw1_no_status);
    	tcase_add_test (tc_core, test_attr_raw1_with_status);
    	tcase_add_test (tc_core, test_attr_raw2_no_status);
    	tcase_add_test (tc_core, test_attr_raw2_with_status);
    
    
    	tcase_add_test (tc_core, test_attr_copy1_no_status);
    	tcase_add_test (tc_core, test_attr_copy1_with_status);
    	tcase_add_test (tc_core, test_attr_copy2_no_status);
    	tcase_add_test (tc_core, test_attr_copy2_with_status);
    
    
    	tcase_add_test (tc_core, test_attr_name_no_status);
    	tcase_add_test (tc_core, test_attr_name_with_status);
    
    	tcase_add_test (tc_core, test_attr_name_raw);
    
    	tcase_add_test (tc_core, test_attr_value_no_status);
    	tcase_add_test (tc_core, test_attr_value_with_status);
    
    	tcase_add_test (tc_core, test_attr_value_raw);
    
    	tcase_add_test (tc_core, test_attr_equal);
    
    	tcase_add_test (tc_core, test_attr_equal_name);
    
    Jonathan Schöbel's avatar
    Jonathan Schöbel committed
    	suite_add_tcase (s, tc_core);
    
    	return s;
    }
    
    int main (void)
    {
    	int number_failed;
    	Suite *s;
    	SRunner *sr;
    
    	s = test_suite ();
    	sr = srunner_create (s);
    
    	srunner_run_all (sr, CK_NORMAL);
    	number_failed = srunner_ntests_failed (sr);
    	srunner_free (sr);
    
    	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
    }