@@ -593,6 +593,90 @@ FOSSIL_TEST(cpp_test_cstring_class_append) {
593593 ASSUME_ITS_EQUAL_CSTR (" Hello, World!" , str.str ());
594594}
595595
596+ FOSSIL_TEST (cpp_test_cstring_number_from_words_basic) {
597+ int value = 0 ;
598+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" zero" , &value));
599+ ASSUME_ITS_EQUAL_I32 (0 , value);
600+
601+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" one" , &value));
602+ ASSUME_ITS_EQUAL_I32 (1 , value);
603+
604+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" ten" , &value));
605+ ASSUME_ITS_EQUAL_I32 (10 , value);
606+
607+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" twenty-three" , &value));
608+ ASSUME_ITS_EQUAL_I32 (23 , value);
609+
610+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" one hundred" , &value));
611+ ASSUME_ITS_EQUAL_I32 (100 , value);
612+
613+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_from_words (" one thousand two hundred thirty-four" , &value));
614+ ASSUME_ITS_EQUAL_I32 (1234 , value);
615+ }
616+
617+ FOSSIL_TEST (cpp_test_cstring_number_from_words_invalid) {
618+ int value = 0 ;
619+ ASSUME_ITS_TRUE (fossil_io_cstring_number_from_words (" not-a-number" , &value) != 0 );
620+ ASSUME_ITS_TRUE (fossil_io_cstring_number_from_words (" " , &value) != 0 );
621+ ASSUME_ITS_TRUE (fossil_io_cstring_number_from_words (" twenty one hundred apples" , &value) != 0 );
622+ }
623+
624+ FOSSIL_TEST (cpp_test_cstring_number_to_words_basic) {
625+ char buffer[128 ];
626+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (0 , buffer, sizeof (buffer)));
627+ ASSUME_ITS_EQUAL_CSTR (" zero" , buffer);
628+
629+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (1 , buffer, sizeof (buffer)));
630+ ASSUME_ITS_EQUAL_CSTR (" one" , buffer);
631+
632+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (23 , buffer, sizeof (buffer)));
633+ ASSUME_ITS_EQUAL_CSTR (" twenty-three" , buffer);
634+
635+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (100 , buffer, sizeof (buffer)));
636+ ASSUME_ITS_EQUAL_CSTR (" one hundred" , buffer);
637+
638+ ASSUME_ITS_EQUAL_I32 (0 , fossil_io_cstring_number_to_words (1234 , buffer, sizeof (buffer)));
639+ ASSUME_ITS_EQUAL_CSTR (" one thousand two hundred thirty-four" , buffer);
640+ }
641+
642+ FOSSIL_TEST (cpp_test_cstring_number_to_words_buffer_too_small) {
643+ char buffer[8 ];
644+ ASSUME_ITS_TRUE (fossil_io_cstring_number_to_words (123456 , buffer, sizeof (buffer)) != 0 );
645+ }
646+
647+ FOSSIL_TEST (cpp_test_cstring_class_number_from_words_and_to_words) {
648+ using fossil::io::CString;
649+ ASSUME_ITS_EQUAL_I32 (23 , CString::number_from_words (" twenty-three" ));
650+ ASSUME_ITS_EQUAL_I32 (100 , CString::number_from_words (" one hundred" ));
651+ ASSUME_ITS_EQUAL_I32 (0 , CString::number_from_words (" zero" ));
652+
653+ ASSUME_ITS_EQUAL_CSTR (" twenty-three" , CString::number_to_words (23 ).c_str ());
654+ ASSUME_ITS_EQUAL_CSTR (" one hundred" , CString::number_to_words (100 ).c_str ());
655+ ASSUME_ITS_EQUAL_CSTR (" zero" , CString::number_to_words (0 ).c_str ());
656+ }
657+
658+ FOSSIL_TEST (cpp_test_cstring_class_number_from_words_exception) {
659+ using fossil::io::CString;
660+ bool thrown = false ;
661+ try {
662+ CString::number_from_words (" not-a-number" );
663+ } catch (const std::invalid_argument&) {
664+ thrown = true ;
665+ }
666+ ASSUME_ITS_TRUE (thrown);
667+ }
668+
669+ FOSSIL_TEST (cpp_test_cstring_class_number_to_words_exception) {
670+ using fossil::io::CString;
671+ bool thrown = false ;
672+ try {
673+ // Use a very large number that would overflow the buffer
674+ CString::number_to_words (1234567890 );
675+ } catch (const std::runtime_error&) {
676+ thrown = true ;
677+ }
678+ ASSUME_ITS_TRUE (thrown);
679+ }
596680
597681// * * * * * * * * * * * * * * * * * * * * * * * *
598682// * Fossil Logic Test Pool
@@ -668,6 +752,14 @@ FOSSIL_TEST_GROUP(cpp_string_tests) {
668752 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_strip_quotes);
669753 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_append);
670754
755+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_from_words_basic);
756+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_from_words_invalid);
757+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_to_words_basic);
758+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_number_to_words_buffer_too_small);
759+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_number_from_words_and_to_words);
760+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_number_from_words_exception);
761+ FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_class_number_to_words_exception);
762+
671763 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_stream_class_create_and_free);
672764 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_stream_class_write_and_read);
673765 FOSSIL_TEST_ADD (cpp_string_suite, cpp_test_cstring_stream_class_multiple_writes);
0 commit comments