@@ -384,7 +384,6 @@ TEST(util_testing, test_dotify_non_printable_chars)
384384 EXPECT_STREQ (test_string3, " NoChange" );
385385}
386386
387-
388387TEST (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-
447445TEST (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-
599596TEST (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