diff --git a/sefht.geany b/sefht.geany index 522e02befd137f3d3cafc9517271772adb87a00c..6490eb613de2620da9684d422f26bda7719c2b4d 100644 --- a/sefht.geany +++ b/sefht.geany @@ -28,7 +28,7 @@ long_line_behaviour=1 long_line_column=72 [files] -current_page=35 +current_page=42 FILE_NAME_0=139;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2FREADME;0;8 FILE_NAME_1=134;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitignore;0;8 FILE_NAME_2=1737;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fconfigure.ac;0;8 @@ -71,7 +71,7 @@ FILE_NAME_38=924;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fpr FILE_NAME_39=18;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Flog.h;0;4 FILE_NAME_40=20;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fmacro.h;0;8 FILE_NAME_41=20;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fsefht.h;0;8 -FILE_NAME_42=2902;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2FMakefile.am;0;8 +FILE_NAME_42=702;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2FMakefile.am;0;8 FILE_NAME_43=218;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Fno_test.sh.in;0;8 FILE_NAME_44=23;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_cms.c;0;8 FILE_NAME_45=24;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_data.c;0;8 @@ -81,11 +81,12 @@ FILE_NAME_48=5714;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp FILE_NAME_49=24;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_attr.c;0;8 FILE_NAME_50=4221;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text.c;0;8 FILE_NAME_51=994;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text_mark.c;0;8 -FILE_NAME_52=10556;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8 -FILE_NAME_53=536;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8 -FILE_NAME_54=201;YAML;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitlab-ci.yml;0;4 -FILE_NAME_55=71;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Fupload.sh.in;0;8 -FILE_NAME_56=806;Sh;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Frelease.sh.in;0;4 +FILE_NAME_52=2177;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8 +FILE_NAME_53=10866;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator_tag.c;0;8 +FILE_NAME_54=536;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8 +FILE_NAME_55=201;YAML;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitlab-ci.yml;0;4 +FILE_NAME_56=71;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Fupload.sh.in;0;8 +FILE_NAME_57=806;Sh;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Frelease.sh.in;0;4 [VTE] last_dir=/home/jonathan/Documents/projects/prgm/internet/web/SeFHT/tests diff --git a/tests/Makefile.am b/tests/Makefile.am index 77fffb1f02345f77604016c71132b865fbf37592..0429773fcc4fb4851d1e96b9d4709702c0b8849b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -20,6 +20,7 @@ check_PROGRAMS += sefht_text_fragment_test check_PROGRAMS += sefht_text_test check_PROGRAMS += sefht_text_mark_test check_PROGRAMS += sefht_validator_test +check_PROGRAMS += sefht_validator_tag_test XFAIL_TESTS = XFAIL_TESTS += sefht_fragment_test @@ -89,3 +90,7 @@ sefht_text_mark_test_LDADD += $(LDADD) sefht_validator_test_SOURCES = test_validator.c sefht_validator_test_LDADD = sefht_validator_test_LDADD += $(LDADD) + +sefht_validator_tag_test_SOURCES = test_validator_tag.c +sefht_validator_tag_test_LDADD = +sefht_validator_tag_test_LDADD += $(LDADD) diff --git a/tests/test_validator.c b/tests/test_validator.c index 3a04cedd4004a5dbd34b4c44cbd2204fa5dcf007..2f1c2f745f5f8b3b15123c2ff7e1ba49e665089a 100644 --- a/tests/test_validator.c +++ b/tests/test_validator.c @@ -37,16 +37,6 @@ #include "macro.h" #include "status.h" -/* override HTML spec */ -#include "validator_html.h" -const struct HTML_TAG_DEFINITION HTML_[] = { - {"html"}, - {"aside"}, - {"html"}, - {"body"} -}; -#define HTML5 HTML_ - /* C file is needed, because we want to override SIZE_MAX */ #include "validator.c" @@ -58,9 +48,6 @@ START_TEST(test_validator_no_status) validator = SH_Validator_new (NULL); ck_assert_ptr_ne (NULL, validator); - ck_assert_int_eq (0, validator->tag_n); - ck_assert_int_eq (TAG_ERR, validator->last_tag); - SH_Validator_free (validator); } END_TEST @@ -75,9 +62,6 @@ START_TEST(test_validator_with_status) ck_assert_ptr_ne (NULL, validator); ck_assert_int_eq (status.status, SUCCESS); - ck_assert_int_eq (0, validator->tag_n); - ck_assert_int_eq (TAG_ERR, validator->last_tag); - SH_Validator_free (validator); } END_TEST @@ -90,22 +74,6 @@ START_TEST(test_validator_spec_no_status) validator = SH_Validator_new_html5 (NULL); ck_assert_ptr_ne (NULL, validator); - ck_assert_ptr_ne (NULL, validator->tags); - ck_assert_int_eq (3, validator->tag_n); - ck_assert_int_eq (3, validator->last_tag); - - ck_assert_int_eq (1, validator->tags[0].id); - ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name); - ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name); - - ck_assert_int_eq (2, validator->tags[1].id); - ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name); - ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name); - - ck_assert_int_eq (3, validator->tags[2].id); - ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name); - ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name); - /* cleanup */ SH_Validator_free (validator); } @@ -122,260 +90,6 @@ START_TEST(test_validator_spec_with_status) ck_assert_ptr_ne (NULL, validator); ck_assert_int_eq (SUCCESS, status.status); - ck_assert_ptr_ne (NULL, validator->tags); - ck_assert_int_eq (3, validator->tag_n); - ck_assert_int_eq (3, validator->last_tag); - - ck_assert_int_eq (1, validator->tags[0].id); - ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name); - ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name); - - ck_assert_int_eq (2, validator->tags[1].id); - ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name); - ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name); - - ck_assert_int_eq (3, validator->tags[2].id); - ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name); - ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name); - - /* cleanup */ - SH_Validator_free (validator); -} -END_TEST - -START_TEST(test_validator_tag_register_no_status) -{ - struct SH_Validator * validator; - const char * tag1 = "html"; - const char * tag2 = "head"; - const char * tag3 = "article"; - const char * tag4 = "p"; - const char * tag5 = "img"; - char * tagN; - Tag tag; - Tag tag_; - - /* setup */ - validator = SH_Validator_new (NULL); - ck_assert_ptr_ne (NULL, validator); - - /* test - register */ - tag = SH_Validator_register_tag (validator, tag1, NULL); - ck_assert_int_eq (1, tag); - - ck_assert_int_eq (validator->tag_n, 1); - ck_assert_int_eq (validator->last_tag, tag); - - ck_assert_int_eq (validator->tags[0].id, tag); - ck_assert_str_eq (validator->tags[0].name, tag1); - - /* test - duplicate registration */ - tag_ = SH_Validator_register_tag (validator, tag1, NULL); - ck_assert_int_eq (tag_, tag); - - ck_assert_int_eq (validator->tag_n, 1); - ck_assert_int_eq (validator->last_tag, tag); - - ck_assert_int_eq (validator->tags[0].id, tag); - ck_assert_str_eq (validator->tags[0].name, tag1); - - /* test - order */ - tag = SH_Validator_register_tag (validator, tag3, NULL); - ck_assert_int_eq (tag, 2); - - tag = SH_Validator_register_tag (validator, tag4, NULL); - ck_assert_int_eq (tag, 3); - - tag = SH_Validator_register_tag (validator, tag5, NULL); - ck_assert_int_eq (tag, 4); - - ck_assert_int_eq (validator->tag_n, 4); - - ck_assert_str_eq (validator->tags[0].name, tag3); - ck_assert_str_eq (validator->tags[1].name, tag1); - ck_assert_str_eq (validator->tags[2].name, tag5); - ck_assert_str_eq (validator->tags[3].name, tag4); - - /* test - overflow detection */ - /* make method fail by filling with garbage until - * upper boundary is reached */ - - /* ensure enough space inside string*/ - /* log10 +1 = number length */ - /* +3 "tag" */ - /* +1 '\0' */ - /* = +5 */ - tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5, - sizeof (char)); - - /* fill with garbage */ - do - { - sprintf (tagN, "tag%zu", validator->tag_n); - } - while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL)); - - free (tagN); - - /* test overflow #1 */ - tag = SH_Validator_register_tag (validator, tag2, NULL); - ck_assert_int_eq (TAG_ERR, tag); - - ck_assert_int_eq (validator->tag_n, 10); - - /* test overflow #2 */ - validator->tag_n = 1; - validator->last_tag = TAG_MAX; - - tag = SH_Validator_register_tag (validator, tag2, NULL); - ck_assert_int_eq (TAG_ERR, tag); - - ck_assert_int_eq (validator->tag_n, 1); - ck_assert_int_eq (validator->last_tag, TAG_MAX); - - /* cleanup */ - /* also free garbage created for overflow test */ - validator->tag_n = 10; - SH_Validator_free (validator); -} - -START_TEST(test_validator_tag_register_with_status) -{ - struct SH_Status status; - struct SH_Validator * validator; - const char * tag1 = "html"; - const char * tag2 = "head"; - const char * tag3 = "article"; - const char * tag4 = "p"; - const char * tag5 = "img"; - char * tagN; - Tag tag; - Tag tag_; - - /* setup */ - validator = SH_Validator_new (NULL); - ck_assert_ptr_ne (NULL, validator); - - /* test - register */ - _status_preinit (status); - tag = SH_Validator_register_tag (validator, tag1, &status); - ck_assert_int_eq (1, tag); - ck_assert_int_eq (SUCCESS, status.status); - - ck_assert_int_eq (validator->tag_n, 1); - ck_assert_int_eq (validator->last_tag, tag); - - ck_assert_int_eq (validator->tags[0].id, tag); - ck_assert_str_eq (validator->tags[0].name, tag1); - - /* test - duplicate registration */ - _status_preinit (status); - tag_ = SH_Validator_register_tag (validator, tag1, &status); - ck_assert_int_eq (tag_, tag); - ck_assert_int_eq (SUCCESS, status.status); - - ck_assert_int_eq (validator->tag_n, 1); - ck_assert_int_eq (validator->last_tag, tag); - - ck_assert_int_eq (validator->tags[0].id, tag); - ck_assert_str_eq (validator->tags[0].name, tag1); - - /* test - order */ - _status_preinit (status); - tag = SH_Validator_register_tag (validator, tag3, &status); - ck_assert_int_eq (tag, 2); - ck_assert_int_eq (status.status, SUCCESS); - - _status_preinit (status); - tag = SH_Validator_register_tag (validator, tag4, &status); - ck_assert_int_eq (tag, 3); - ck_assert_int_eq (status.status, SUCCESS); - - _status_preinit (status); - tag = SH_Validator_register_tag (validator, tag5, &status); - ck_assert_int_eq (tag, 4); - ck_assert_int_eq (status.status, SUCCESS); - - ck_assert_int_eq (validator->tag_n, 4); - - ck_assert_str_eq (validator->tags[0].name, tag3); - ck_assert_str_eq (validator->tags[1].name, tag1); - ck_assert_str_eq (validator->tags[2].name, tag5); - ck_assert_str_eq (validator->tags[3].name, tag4); - - /* test - overflow detection */ - /* make method fail by filling with garbage until - * upper boundary is reached */ - - /* ensure enough space inside string*/ - /* log10 +1 = number length */ - /* +3 "tag" */ - /* +1 '\0' */ - /* = +5 */ - tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5, - sizeof (char)); - - /* fill with garbage */ - do - { - sprintf (tagN, "tag%zu", validator->tag_n); - } - while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL)); - - free (tagN); - - /* test overflow #1 */ - _status_preinit (status); - tag = SH_Validator_register_tag (validator, tag2, &status); - ck_assert_int_eq (TAG_ERR, tag); - ck_assert_int_eq (E_DOMAIN, status.status); - - ck_assert_int_eq (validator->tag_n, 10); - - /* test overflow #2 */ - validator->tag_n = 1; - validator->last_tag = TAG_MAX; - - _status_preinit (status); - tag = SH_Validator_register_tag (validator, tag2, &status); - ck_assert_int_eq (TAG_ERR, tag); - ck_assert_int_eq (E_DOMAIN, status.status); - - ck_assert_int_eq (validator->tag_n, 1); - ck_assert_int_eq (validator->last_tag, TAG_MAX); - - /* cleanup */ - /* also free garbage created for overflow test */ - validator->tag_n = 10; - SH_Validator_free (validator); -} - -START_TEST(test_validator_tag_check) -{ - struct SH_Validator * validator; - const char * tag1 = "html"; - const char * tag2 = "html"; - const char * tag3 = "head"; - Tag tag; - bool result; - - /* setup */ - validator = SH_Validator_new (NULL); - ck_assert_ptr_ne (NULL, validator); - - tag = SH_Validator_register_tag (validator, tag1, NULL); - ck_assert_int_ne (TAG_ERR, tag); - - /* test */ - result = SH_Validator_check_tag (validator, tag1); - ck_assert_int_eq (TRUE, result); - - result = SH_Validator_check_tag (validator, tag2); - ck_assert_int_eq (TRUE, result); - - result = SH_Validator_check_tag (validator, tag3); - ck_assert_int_eq (FALSE, result); - /* cleanup */ SH_Validator_free (validator); } @@ -395,9 +109,6 @@ Suite * validator_suite (void) tcase_add_test (tc_core, test_validator_with_status); tcase_add_test (tc_core, test_validator_spec_no_status); tcase_add_test (tc_core, test_validator_spec_with_status); - tcase_add_test (tc_core, test_validator_tag_register_no_status); - tcase_add_test (tc_core, test_validator_tag_register_with_status); - tcase_add_test (tc_core, test_validator_tag_check); suite_add_tcase (s, tc_core); return s; diff --git a/tests/test_validator_tag.c b/tests/test_validator_tag.c new file mode 100644 index 0000000000000000000000000000000000000000..635c11902718f91210f541afd8a088731c1d9af1 --- /dev/null +++ b/tests/test_validator_tag.c @@ -0,0 +1,421 @@ +/* + * test_validator_tag.c + * + * Copyright 2023 Jonathan Schöbel <jonathan@xn--schbel-yxa.info> + * + * 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 <math.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> + + +/* lower SIZE_MAX as we try to reach it */ +#include <limits.h> +#undef SIZE_MAX +#define SIZE_MAX 10 * sizeof (struct tag_info) + +#include "macro.h" +#include "status.h" + +/* override HTML spec */ +#include "validator_html.h" +const struct HTML_TAG_DEFINITION HTML_[] = { + {"html"}, + {"aside"}, + {"html"}, + {"body"} +}; +#define HTML5 HTML_ + +/* C file is needed, because we want to override SIZE_MAX */ +#include "validator.c" + + +START_TEST(test_validator_no_status) +{ + struct SH_Validator * validator; + + validator = SH_Validator_new (NULL); + ck_assert_ptr_ne (NULL, validator); + + ck_assert_int_eq (0, validator->tag_n); + ck_assert_int_eq (TAG_ERR, validator->last_tag); + + SH_Validator_free (validator); +} +END_TEST + +START_TEST(test_validator_with_status) +{ + struct SH_Status status; + struct SH_Validator * validator; + + _status_preinit (status); + validator = SH_Validator_new (&status); + ck_assert_ptr_ne (NULL, validator); + ck_assert_int_eq (status.status, SUCCESS); + + ck_assert_int_eq (0, validator->tag_n); + ck_assert_int_eq (TAG_ERR, validator->last_tag); + + SH_Validator_free (validator); +} +END_TEST + +START_TEST(test_validator_spec_no_status) +{ + struct SH_Validator * validator; + + /* test */ + validator = SH_Validator_new_html5 (NULL); + ck_assert_ptr_ne (NULL, validator); + + ck_assert_ptr_ne (NULL, validator->tags); + ck_assert_int_eq (3, validator->tag_n); + ck_assert_int_eq (3, validator->last_tag); + + ck_assert_int_eq (1, validator->tags[0].id); + ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name); + ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name); + + ck_assert_int_eq (2, validator->tags[1].id); + ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name); + ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name); + + ck_assert_int_eq (3, validator->tags[2].id); + ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name); + ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name); + + /* cleanup */ + SH_Validator_free (validator); +} +END_TEST + +START_TEST(test_validator_spec_with_status) +{ + struct SH_Status status; + struct SH_Validator * validator; + + /* test */ + _status_preinit (status); + validator = SH_Validator_new_html5 (&status); + ck_assert_ptr_ne (NULL, validator); + ck_assert_int_eq (SUCCESS, status.status); + + ck_assert_ptr_ne (NULL, validator->tags); + ck_assert_int_eq (3, validator->tag_n); + ck_assert_int_eq (3, validator->last_tag); + + ck_assert_int_eq (1, validator->tags[0].id); + ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name); + ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name); + + ck_assert_int_eq (2, validator->tags[1].id); + ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name); + ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name); + + ck_assert_int_eq (3, validator->tags[2].id); + ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name); + ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name); + + /* cleanup */ + SH_Validator_free (validator); +} +END_TEST + +START_TEST(test_validator_tag_register_no_status) +{ + struct SH_Validator * validator; + const char * tag1 = "html"; + const char * tag2 = "head"; + const char * tag3 = "article"; + const char * tag4 = "p"; + const char * tag5 = "img"; + char * tagN; + Tag tag; + Tag tag_; + + /* setup */ + validator = SH_Validator_new (NULL); + ck_assert_ptr_ne (NULL, validator); + + /* test - register */ + tag = SH_Validator_register_tag (validator, tag1, NULL); + ck_assert_int_eq (1, tag); + + ck_assert_int_eq (validator->tag_n, 1); + ck_assert_int_eq (validator->last_tag, tag); + + ck_assert_int_eq (validator->tags[0].id, tag); + ck_assert_str_eq (validator->tags[0].name, tag1); + + /* test - duplicate registration */ + tag_ = SH_Validator_register_tag (validator, tag1, NULL); + ck_assert_int_eq (tag_, tag); + + ck_assert_int_eq (validator->tag_n, 1); + ck_assert_int_eq (validator->last_tag, tag); + + ck_assert_int_eq (validator->tags[0].id, tag); + ck_assert_str_eq (validator->tags[0].name, tag1); + + /* test - order */ + tag = SH_Validator_register_tag (validator, tag3, NULL); + ck_assert_int_eq (tag, 2); + + tag = SH_Validator_register_tag (validator, tag4, NULL); + ck_assert_int_eq (tag, 3); + + tag = SH_Validator_register_tag (validator, tag5, NULL); + ck_assert_int_eq (tag, 4); + + ck_assert_int_eq (validator->tag_n, 4); + + ck_assert_str_eq (validator->tags[0].name, tag3); + ck_assert_str_eq (validator->tags[1].name, tag1); + ck_assert_str_eq (validator->tags[2].name, tag5); + ck_assert_str_eq (validator->tags[3].name, tag4); + + /* test - overflow detection */ + /* make method fail by filling with garbage until + * upper boundary is reached */ + + /* ensure enough space inside string*/ + /* log10 +1 = number length */ + /* +3 "tag" */ + /* +1 '\0' */ + /* = +5 */ + tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5, + sizeof (char)); + + /* fill with garbage */ + do + { + sprintf (tagN, "tag%zu", validator->tag_n); + } + while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL)); + + free (tagN); + + /* test overflow #1 */ + tag = SH_Validator_register_tag (validator, tag2, NULL); + ck_assert_int_eq (TAG_ERR, tag); + + ck_assert_int_eq (validator->tag_n, 10); + + /* test overflow #2 */ + validator->tag_n = 1; + validator->last_tag = TAG_MAX; + + tag = SH_Validator_register_tag (validator, tag2, NULL); + ck_assert_int_eq (TAG_ERR, tag); + + ck_assert_int_eq (validator->tag_n, 1); + ck_assert_int_eq (validator->last_tag, TAG_MAX); + + /* cleanup */ + /* also free garbage created for overflow test */ + validator->tag_n = 10; + SH_Validator_free (validator); +} + +START_TEST(test_validator_tag_register_with_status) +{ + struct SH_Status status; + struct SH_Validator * validator; + const char * tag1 = "html"; + const char * tag2 = "head"; + const char * tag3 = "article"; + const char * tag4 = "p"; + const char * tag5 = "img"; + char * tagN; + Tag tag; + Tag tag_; + + /* setup */ + validator = SH_Validator_new (NULL); + ck_assert_ptr_ne (NULL, validator); + + /* test - register */ + _status_preinit (status); + tag = SH_Validator_register_tag (validator, tag1, &status); + ck_assert_int_eq (1, tag); + ck_assert_int_eq (SUCCESS, status.status); + + ck_assert_int_eq (validator->tag_n, 1); + ck_assert_int_eq (validator->last_tag, tag); + + ck_assert_int_eq (validator->tags[0].id, tag); + ck_assert_str_eq (validator->tags[0].name, tag1); + + /* test - duplicate registration */ + _status_preinit (status); + tag_ = SH_Validator_register_tag (validator, tag1, &status); + ck_assert_int_eq (tag_, tag); + ck_assert_int_eq (SUCCESS, status.status); + + ck_assert_int_eq (validator->tag_n, 1); + ck_assert_int_eq (validator->last_tag, tag); + + ck_assert_int_eq (validator->tags[0].id, tag); + ck_assert_str_eq (validator->tags[0].name, tag1); + + /* test - order */ + _status_preinit (status); + tag = SH_Validator_register_tag (validator, tag3, &status); + ck_assert_int_eq (tag, 2); + ck_assert_int_eq (status.status, SUCCESS); + + _status_preinit (status); + tag = SH_Validator_register_tag (validator, tag4, &status); + ck_assert_int_eq (tag, 3); + ck_assert_int_eq (status.status, SUCCESS); + + _status_preinit (status); + tag = SH_Validator_register_tag (validator, tag5, &status); + ck_assert_int_eq (tag, 4); + ck_assert_int_eq (status.status, SUCCESS); + + ck_assert_int_eq (validator->tag_n, 4); + + ck_assert_str_eq (validator->tags[0].name, tag3); + ck_assert_str_eq (validator->tags[1].name, tag1); + ck_assert_str_eq (validator->tags[2].name, tag5); + ck_assert_str_eq (validator->tags[3].name, tag4); + + /* test - overflow detection */ + /* make method fail by filling with garbage until + * upper boundary is reached */ + + /* ensure enough space inside string*/ + /* log10 +1 = number length */ + /* +3 "tag" */ + /* +1 '\0' */ + /* = +5 */ + tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5, + sizeof (char)); + + /* fill with garbage */ + do + { + sprintf (tagN, "tag%zu", validator->tag_n); + } + while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL)); + + free (tagN); + + /* test overflow #1 */ + _status_preinit (status); + tag = SH_Validator_register_tag (validator, tag2, &status); + ck_assert_int_eq (TAG_ERR, tag); + ck_assert_int_eq (E_DOMAIN, status.status); + + ck_assert_int_eq (validator->tag_n, 10); + + /* test overflow #2 */ + validator->tag_n = 1; + validator->last_tag = TAG_MAX; + + _status_preinit (status); + tag = SH_Validator_register_tag (validator, tag2, &status); + ck_assert_int_eq (TAG_ERR, tag); + ck_assert_int_eq (E_DOMAIN, status.status); + + ck_assert_int_eq (validator->tag_n, 1); + ck_assert_int_eq (validator->last_tag, TAG_MAX); + + /* cleanup */ + /* also free garbage created for overflow test */ + validator->tag_n = 10; + SH_Validator_free (validator); +} + +START_TEST(test_validator_tag_check) +{ + struct SH_Validator * validator; + const char * tag1 = "html"; + const char * tag2 = "html"; + const char * tag3 = "head"; + Tag tag; + bool result; + + /* setup */ + validator = SH_Validator_new (NULL); + ck_assert_ptr_ne (NULL, validator); + + tag = SH_Validator_register_tag (validator, tag1, NULL); + ck_assert_int_ne (TAG_ERR, tag); + + /* test */ + result = SH_Validator_check_tag (validator, tag1); + ck_assert_int_eq (TRUE, result); + + result = SH_Validator_check_tag (validator, tag2); + ck_assert_int_eq (TRUE, result); + + result = SH_Validator_check_tag (validator, tag3); + ck_assert_int_eq (FALSE, result); + + /* cleanup */ + SH_Validator_free (validator); +} +END_TEST + +Suite * test_suite (void) +{ + Suite *s; + TCase *tc_core; + + s = suite_create ("Testsuite SeFHT Validator Tag"); + + /* Core test case */ + tc_core = tcase_create ("Core"); + + tcase_add_test (tc_core, test_validator_no_status); + tcase_add_test (tc_core, test_validator_with_status); + tcase_add_test (tc_core, test_validator_spec_no_status); + tcase_add_test (tc_core, test_validator_spec_with_status); + tcase_add_test (tc_core, test_validator_tag_register_no_status); + tcase_add_test (tc_core, test_validator_tag_register_with_status); + tcase_add_test (tc_core, test_validator_tag_check); + 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; +} +