Skip to content

Commit 82a9fff

Browse files
committed
Added tests for util functions
1 parent 5cd526e commit 82a9fff

File tree

2 files changed

+272
-16
lines changed

2 files changed

+272
-16
lines changed

INCHI-1-SRC/INCHI_BASE/src/util.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,7 @@ int num_of_H(inp_ATOM *at, int iat)
11131113
int i, n, num_explicit_H = 0;
11141114
inp_ATOM *a = at + iat;
11151115

1116+
// TODO: remove this and add assignment instead?
11161117
if (!el_number_H)
11171118
{
11181119
el_number_H = EL_NUMBER_H;

INCHI-1-TEST/tests/test_unit/test_util.cpp

Lines changed: 271 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,6 @@ TEST(util_testing, test_dotify_non_printable_chars)
384384
EXPECT_STREQ(test_string3, "NoChange");
385385
}
386386

387-
388387
TEST(util_testing, test_remove_trailing_spaces)
389388
{
390389
// remove_trailing_spaces(char *p)
@@ -443,7 +442,6 @@ TEST(util_testing, test_mystrncpy)
443442
EXPECT_EQ(mystrncpy(NULL, source, 10), 0); // target is NULL
444443
}
445444

446-
447445
TEST(util_testing, test_inchi_memicmp) {
448446

449447
// inchi_memicmp(const void *p1, const void *p2, size_t length)
@@ -595,31 +593,288 @@ TEST(util_testing, test_is_ilist_inside) {
595593
EXPECT_TRUE(is_ilist_inside(pathAtom4, 0, pathAtom5, 0));
596594
}
597595

598-
599596
TEST(util_testing, test_nBondsValToMetal) {
600597

601598
// int nBondsValToMetal(inp_ATOM *at, int iat)
602599

603600
// EXPECT_EQ(nBondsValToMetal(NULL, 0), 0); SEG FAULT
601+
602+
inp_ATOM *atoms1 = CreateInpAtom(2);
603+
atoms1[0].el_number = get_periodic_table_number("C"); // Carbon 6 valence 4
604+
atoms1[1].el_number = get_periodic_table_number("Fe"); // Iron 26 valence 8
605+
606+
607+
atoms1[0].valence = static_cast<S_CHAR>(get_el_valence(atoms1[0].el_number, atoms1[0].charge, 0));
608+
atoms1[1].valence = static_cast<S_CHAR>(get_el_valence(atoms1[1].el_number, atoms1[1].charge, 0));
609+
610+
EXPECT_EQ(atoms1[0].valence, 4);
611+
EXPECT_EQ(atoms1[1].valence, 2);
612+
613+
atoms1[0].neighbor[0] = 1;
614+
atoms1[1].neighbor[0] = 0;
615+
616+
atoms1[0].bond_type[0] = 1;
617+
atoms1[1].bond_type[0] = 1;
618+
619+
EXPECT_EQ(nBondsValToMetal(atoms1, 0), 1);
620+
EXPECT_EQ(nBondsValToMetal(atoms1, 1), 0);
621+
622+
inp_ATOM *atoms2 = CreateInpAtom(3);
623+
atoms2[0].el_number = get_periodic_table_number("C"); // Carbon 6 valence 4
624+
atoms2[1].el_number = get_periodic_table_number("Fe"); // Iron 26 valence 8
625+
atoms2[2].el_number = get_periodic_table_number("Fe"); // Iron 26 valence 8
626+
627+
atoms2[0].valence = static_cast<S_CHAR>(get_el_valence(atoms2[0].el_number, atoms2[0].charge, 0));
628+
atoms2[1].valence = static_cast<S_CHAR>(get_el_valence(atoms2[1].el_number, atoms2[1].charge, 0));
629+
atoms2[2].valence = static_cast<S_CHAR>(get_el_valence(atoms2[2].el_number, atoms2[2].charge, 0));
630+
631+
EXPECT_EQ(atoms2[0].valence, 4);
632+
EXPECT_EQ(atoms2[1].valence, 2);
633+
EXPECT_EQ(atoms2[2].valence, 2);
634+
635+
atoms2[0].neighbor[0] = 1;
636+
atoms2[0].neighbor[1] = 2;
637+
atoms2[1].neighbor[0] = 0;
638+
atoms2[2].neighbor[0] = 0;
639+
640+
atoms2[0].bond_type[0] = 1;
641+
atoms2[0].bond_type[1] = 1; // dont forget to set bond types for each atom
642+
atoms2[1].bond_type[0] = 1;
643+
atoms2[2].bond_type[0] = 1;
644+
645+
EXPECT_EQ(nBondsValToMetal(atoms2, 0), 2);
646+
EXPECT_EQ(nBondsValToMetal(atoms2, 1), 0);
647+
EXPECT_EQ(nBondsValToMetal(atoms2, 2), 0);
648+
649+
FreeInpAtom(&atoms1);
650+
FreeInpAtom(&atoms2);
651+
}
652+
653+
TEST(util_testing, test_num_of_H) {
654+
655+
// int num_of_H(inp_ATOM *at, int iat)
656+
657+
658+
inp_ATOM *atoms1 = CreateInpAtom(5);
659+
atoms1[0].el_number = get_periodic_table_number("C");
660+
atoms1[1].el_number = get_periodic_table_number("H");
661+
atoms1[2].el_number = get_periodic_table_number("H");
662+
atoms1[3].el_number = get_periodic_table_number("H");
663+
atoms1[4].el_number = get_periodic_table_number("H");
664+
665+
atoms1[0].valence = static_cast<S_CHAR>(get_el_valence(atoms1[0].el_number, atoms1[0].charge, 0));
666+
atoms1[1].valence = static_cast<S_CHAR>(get_el_valence(atoms1[1].el_number, atoms1[1].charge, 0));
667+
atoms1[2].valence = static_cast<S_CHAR>(get_el_valence(atoms1[2].el_number, atoms1[2].charge, 0));
668+
atoms1[3].valence = static_cast<S_CHAR>(get_el_valence(atoms1[3].el_number, atoms1[3].charge, 0));
669+
atoms1[4].valence = static_cast<S_CHAR>(get_el_valence(atoms1[4].el_number, atoms1[4].charge, 0));
670+
671+
atoms1[0].neighbor[0] = 1;
672+
atoms1[0].neighbor[1] = 2;
673+
atoms1[0].neighbor[2] = 3;
674+
atoms1[0].neighbor[3] = 4;
675+
676+
atoms1[1].neighbor[0] = 0;
677+
atoms1[2].neighbor[0] = 0;
678+
atoms1[3].neighbor[0] = 0;
679+
atoms1[4].neighbor[0] = 0;
680+
681+
EXPECT_EQ(num_of_H(atoms1, 0), 4);
682+
683+
FreeInpAtom(&atoms1);
684+
685+
inp_ATOM *atoms2 = CreateInpAtom(8);
686+
687+
atoms2[0].el_number = get_periodic_table_number("C");
688+
atoms2[1].el_number = get_periodic_table_number("H");
689+
atoms2[2].el_number = get_periodic_table_number("H");
690+
atoms2[3].el_number = get_periodic_table_number("H");
691+
692+
atoms2[4].el_number = get_periodic_table_number("C");
693+
atoms2[5].el_number = get_periodic_table_number("H");
694+
atoms2[6].el_number = get_periodic_table_number("H");
695+
atoms2[7].el_number = get_periodic_table_number("H");
696+
697+
atoms2[0].valence = static_cast<S_CHAR>(get_el_valence(atoms2[0].el_number, atoms2[0].charge, 0));
698+
atoms2[1].valence = static_cast<S_CHAR>(get_el_valence(atoms2[1].el_number, atoms2[1].charge, 0));
699+
atoms2[2].valence = static_cast<S_CHAR>(get_el_valence(atoms2[2].el_number, atoms2[2].charge, 0));
700+
atoms2[3].valence = static_cast<S_CHAR>(get_el_valence(atoms2[3].el_number, atoms2[3].charge, 0));
701+
atoms2[4].valence = static_cast<S_CHAR>(get_el_valence(atoms2[4].el_number, atoms2[4].charge, 0));
702+
atoms2[5].valence = static_cast<S_CHAR>(get_el_valence(atoms2[5].el_number, atoms2[5].charge, 0));
703+
atoms2[6].valence = static_cast<S_CHAR>(get_el_valence(atoms2[6].el_number, atoms2[6].charge, 0));
704+
atoms2[7].valence = static_cast<S_CHAR>(get_el_valence(atoms2[7].el_number, atoms2[7].charge, 0));
705+
706+
atoms2[0].neighbor[0] = 1;
707+
atoms2[0].neighbor[1] = 2;
708+
atoms2[0].neighbor[2] = 3;
709+
atoms2[0].neighbor[3] = 4;
710+
711+
atoms2[1].neighbor[0] = 0;
712+
atoms2[2].neighbor[0] = 0;
713+
atoms2[3].neighbor[0] = 0;
714+
715+
atoms2[4].neighbor[0] = 0;
716+
atoms2[4].neighbor[1] = 5;
717+
atoms2[4].neighbor[2] = 6;
718+
atoms2[4].neighbor[3] = 7;
719+
720+
atoms2[5].neighbor[0] = 4;
721+
atoms2[6].neighbor[0] = 4;
722+
atoms2[7].neighbor[0] = 4;
723+
724+
EXPECT_EQ(num_of_H(atoms2, 0), 3);
725+
726+
EXPECT_EQ(num_of_H(atoms2, 4), 3);
727+
728+
729+
FreeInpAtom(&atoms2);
730+
}
731+
732+
TEST(util_testing, test_ion_el_group) {
733+
734+
// U_CHAR ion_el_group(int el)
735+
EXPECT_EQ(ion_el_group(get_periodic_table_number("C")), EL_NUMBER_C);
736+
EXPECT_EQ(ion_el_group(get_periodic_table_number("O")), EL_NUMBER_O);
737+
738+
EXPECT_EQ(ion_el_group(get_periodic_table_number("Mn")), 0);
739+
}
740+
741+
TEST(util_testing, test_has_other_ion_neigh) {
742+
743+
// int has_other_ion_neigh(inp_ATOM *at, int iat, int iat_ion_neigh)
744+
inp_ATOM *atoms1 = CreateInpAtom(2);
745+
746+
atoms1[0].el_number = get_periodic_table_number("C");
747+
atoms1[1].el_number = get_periodic_table_number("O");
748+
749+
atoms1[0].valence = static_cast<S_CHAR>(get_el_valence(atoms1[0].el_number, atoms1[0].charge, 0));
750+
atoms1[1].valence = static_cast<S_CHAR>(get_el_valence(atoms1[1].el_number, atoms1[1].charge, 0));
751+
752+
atoms1[0].neighbor[0] = 1;
753+
atoms1[1].neighbor[0] = 0;
754+
755+
EXPECT_EQ(has_other_ion_neigh(atoms1, 0, 1), 1);
756+
EXPECT_EQ(has_other_ion_neigh(atoms1, 1, 0), 0); // ??
757+
758+
FreeInpAtom(&atoms1);
759+
760+
}
761+
762+
TEST(util_testing, test_extract_charges_and_radicals) {
604763

605-
// Test with a valid atom
606-
inp_ATOM *atoms = CreateInpAtom(2);
607-
atoms[0].el_number = get_periodic_table_number("C"); // Carbon 6 valence 4
608-
atoms[1].el_number = get_periodic_table_number("Fe"); // Iron 26 valence 8
764+
// int extract_charges_and_radicals(char *elname, int *pnRadical, int *pnCharge)
609765

610-
atoms[0].valence = get_el_valence(atoms[0].el_number, atoms[0].charge, 0);
611-
atoms[1].valence = get_el_valence(atoms[1].el_number, atoms[1].charge, 0);
766+
int nRadical = 0;
767+
int nCharge = 0;
612768

613-
atoms[0].neighbor[0] = 1;
614-
atoms[1].neighbor[0] = 0;
769+
char el_name[10] = "";
770+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 0);
771+
EXPECT_EQ(nRadical, 0);
772+
EXPECT_EQ(nCharge, 0);
615773

616-
atoms[0].bond_type[0] = 1;
617-
atoms[1].bond_type[0] = 1;
774+
strcpy(el_name, "C");
775+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 0);
776+
EXPECT_EQ(nRadical, 0);
777+
EXPECT_EQ(nCharge, 0);
618778

619-
EXPECT_EQ(nBondsValToMetal(atoms, 0), 1);
779+
strcpy(el_name, ":CH2");
780+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 0);
781+
EXPECT_EQ(nRadical, 0);
782+
EXPECT_EQ(nCharge, 0);
783+
784+
strcpy(el_name, "Fe+2");
785+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
786+
EXPECT_EQ(nRadical, 0);
787+
EXPECT_EQ(nCharge, 2);
788+
789+
strcpy(el_name, "Cl+2");
790+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
791+
EXPECT_EQ(nRadical, 0);
792+
EXPECT_EQ(nCharge, 2);
620793

794+
strcpy(el_name, "Cl2+");
795+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
796+
EXPECT_EQ(nRadical, 0);
797+
EXPECT_EQ(nCharge, 1);
798+
799+
strcpy(el_name, "Cl++");
800+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
801+
EXPECT_EQ(nRadical, 0);
802+
EXPECT_EQ(nCharge, 2);
803+
804+
strcpy(el_name, "Cl+");
805+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
806+
EXPECT_EQ(nRadical, 0);
807+
EXPECT_EQ(nCharge, 1);
808+
809+
strcpy(el_name, "Cl+.");
810+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
811+
EXPECT_EQ(nRadical, 2);
812+
EXPECT_EQ(nCharge, 1);
813+
814+
strcpy(el_name, "Cl:");
815+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
816+
EXPECT_EQ(nRadical, 1);
817+
EXPECT_EQ(nCharge, 0);
818+
819+
strcpy(el_name, "Cl::");
820+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
821+
EXPECT_EQ(nRadical, 1);
822+
EXPECT_EQ(nCharge, 0);
823+
824+
strcpy(el_name, "Cl^");
825+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
826+
EXPECT_EQ(nRadical, 2);
827+
EXPECT_EQ(nCharge, 0);
828+
829+
strcpy(el_name, "Cl.");
830+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
831+
EXPECT_EQ(nRadical, 2);
832+
EXPECT_EQ(nCharge, 0);
833+
834+
strcpy(el_name, "Cl^^");
835+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
836+
EXPECT_EQ(nRadical, 3);
837+
EXPECT_EQ(nCharge, 0);
838+
839+
strcpy(el_name, "C^^");
840+
EXPECT_EQ(extract_charges_and_radicals(el_name, &nRadical, &nCharge), 1);
841+
EXPECT_EQ(nRadical, 3);
842+
EXPECT_EQ(nCharge, 0);
843+
844+
}
845+
846+
847+
TEST(util_testing, test_extract_inchi_substring) {
848+
849+
// void extract_inchi_substring(char **buf, const char *str, size_t slen)
850+
851+
// For example:
852+
// "InChI=1/Ar%"
853+
// "InChI=1/Ar\n"
854+
// "InChI=1/Ar\r\t"
855+
// all will be trimmed to
856+
// "InChI=1/Ar"
621857

622-
// EXPECT_EQ(nBondsValToMetal(atoms, 1), 1);
858+
char *buf1 = NULL;
859+
const char *str_inchi1 = "InChI=1/Ar%";
860+
size_t slen1 = strlen(str_inchi1);
861+
862+
extract_inchi_substring(&buf1, str_inchi1, slen1);
863+
864+
EXPECT_NE(buf1, nullptr);
865+
EXPECT_STREQ(buf1, "InChI=1/Ar");
866+
free(buf1);
867+
868+
char *buf2 = NULL;
869+
const char *str_inchi2 = "InChI=1/Ar\r\t";
870+
size_t slen2 = strlen(str_inchi2);
871+
872+
extract_inchi_substring(&buf2, str_inchi2, slen2);
873+
874+
EXPECT_NE(buf2, nullptr);
875+
EXPECT_STREQ(buf2, "InChI=1/Ar");
876+
free(buf2);
877+
878+
623879

624-
FreeInpAtom(&atoms);
625880
}

0 commit comments

Comments
 (0)