@@ -649,6 +649,91 @@ FOSSIL_TEST(cpp_test_cstring_class_zalgo) {
649649 ASSUME_ITS_TRUE (zalgo.length () >= str.length ());
650650}
651651
652+ FOSSIL_TEST (cpp_test_cstring_number_from_words_basic) {
653+ int value = 0 ;
654+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" zero" , &value));
655+ ASSUME_ITS_EQUAL_I32 (0 , value);
656+
657+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" one" , &value));
658+ ASSUME_ITS_EQUAL_I32 (1 , value);
659+
660+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" ten" , &value));
661+ ASSUME_ITS_EQUAL_I32 (10 , value);
662+
663+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" twenty-three" , &value));
664+ ASSUME_ITS_EQUAL_I32 (23 , value);
665+
666+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" one hundred" , &value));
667+ ASSUME_ITS_EQUAL_I32 (100 , value);
668+
669+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" one thousand two hundred thirty-four" , &value));
670+ ASSUME_ITS_EQUAL_I32 (1234 , value);
671+ }
672+
673+ FOSSIL_TEST (cpp_test_cstring_number_from_words_invalid) {
674+ int value = 0 ;
675+ ASSUME_ITS_TRUE (fossil_io_cstring_number_from_words (" not-a-number" , &value) != 0 );
676+ ASSUME_ITS_TRUE (fossil_io_cstring_number_from_words (" " , &value) != 0 );
677+ ASSUME_ITS_TRUE (fossil_io_cstring_number_from_words (" twenty one hundred apples" , &value) != 0 );
678+ }
679+
680+ FOSSIL_TEST (cpp_test_cstring_number_to_words_basic) {
681+ char buffer[128 ];
682+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (0 , buffer, sizeof (buffer)));
683+ ASSUME_ITS_EQUAL_CSTR (" zero" , buffer);
684+
685+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (1 , buffer, sizeof (buffer)));
686+ ASSUME_ITS_EQUAL_CSTR (" one" , buffer);
687+
688+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (23 , buffer, sizeof (buffer)));
689+ ASSUME_ITS_EQUAL_CSTR (" twenty-three" , buffer);
690+
691+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (100 , buffer, sizeof (buffer)));
692+ ASSUME_ITS_EQUAL_CSTR (" one hundred" , buffer);
693+
694+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (1234 , buffer, sizeof (buffer)));
695+ ASSUME_ITS_EQUAL_CSTR (" one thousand two hundred thirty-four" , buffer);
696+ }
697+
698+ FOSSIL_TEST (cpp_test_cstring_number_to_words_buffer_too_small) {
699+ char buffer[8 ];
700+ ASSUME_ITS_TRUE (fossil_io_cstring_number_to_words (123456 , buffer, sizeof (buffer)) != 0 );
701+ }
702+
703+ FOSSIL_TEST (cpp_test_cstring_class_number_from_words_and_to_words) {
704+ using fossil::io::CString;
705+ ASSUME_ITS_EQUAL_I32 (23 , CString::number_from_words (" twenty-three" ));
706+ ASSUME_ITS_EQUAL_I32 (100 , CString::number_from_words (" one hundred" ));
707+ ASSUME_ITS_EQUAL_I32 (0 , CString::number_from_words (" zero" ));
708+
709+ ASSUME_ITS_EQUAL_CSTR (" twenty-three" , CString::number_to_words (23 ).c_str ());
710+ ASSUME_ITS_EQUAL_CSTR (" one hundred" , CString::number_to_words (100 ).c_str ());
711+ ASSUME_ITS_EQUAL_CSTR (" zero" , CString::number_to_words (0 ).c_str ());
712+ }
713+
714+ FOSSIL_TEST (cpp_test_cstring_class_number_from_words_exception) {
715+ using fossil::io::CString;
716+ bool thrown = false ;
717+ try {
718+ CString::number_from_words (" not-a-number" );
719+ } catch (const std::invalid_argument&) {
720+ thrown = true ;
721+ }
722+ ASSUME_ITS_TRUE (thrown);
723+ }
724+
725+ FOSSIL_TEST (cpp_test_cstring_class_number_to_words_exception) {
726+ using fossil::io::CString;
727+ bool thrown = false ;
728+ try {
729+ // Use a very large number that would overflow the buffer
730+ CString::number_to_words (1234567890 );
731+ } catch (const std::runtime_error&) {
732+ thrown = true ;
733+ }
734+ ASSUME_ITS_TRUE (thrown);
735+ }
736+
652737// * * * * * * * * * * * * * * * * * * * * * * * *
653738// * Fossil Logic Test Pool
654739// * * * * * * * * * * * * * * * * * * * * * * * *
@@ -732,6 +817,14 @@ FOSSIL_TEST_GROUP(cpp_string_tests) {
732817 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_strip_quotes);
733818 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_append);
734819
820+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_from_words_basic);
821+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_from_words_invalid);
822+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_to_words_basic);
823+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_to_words_buffer_too_small);
824+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_number_from_words_and_to_words);
825+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_number_from_words_exception);
826+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_number_to_words_exception);
827+
735828 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_stream_class_create_and_free);
736829 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_stream_class_write_and_read);
737830 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_stream_class_multiple_writes);
0 commit comments