@@ -132,6 +132,118 @@ FOSSIL_TEST(c_test_myshell_put_get_del) {
132132 remove (file_name );
133133}
134134
135+ FOSSIL_TEST (c_test_myshell_put_all_types ) {
136+ fossil_bluecrab_myshell_error_t err ;
137+ const char * file_name = "test_put_all_types.myshell" ;
138+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
139+ ASSUME_ITS_TRUE (db != NULL );
140+
141+ const char * types [] = {
142+ "null" , "bool" , "i8" , "i16" , "i32" , "i64" , "u8" , "u16" , "u32" , "u64" ,
143+ "f32" , "f64" , "oct" , "hex" , "bin" , "char" , "cstr" , "array" , "object" ,
144+ "enum" , "datetime" , "duration"
145+ };
146+ const char * values [] = {
147+ "" , "true" , "127" , "32767" , "2147483647" , "9223372036854775807" ,
148+ "255" , "65535" , "4294967295" , "18446744073709551615" ,
149+ "3.14" , "2.71828" , "0755" , "0xFF" , "0b1010" , "A" , "hello" , "[1,2]" , "{\"k\":1}" , "VAL" , "2024-06-01T12:00:00Z" , "1h30m"
150+ };
151+
152+ char value [128 ];
153+ for (size_t i = 0 ; i < sizeof (types )/sizeof (types [0 ]); ++ i ) {
154+ char key [32 ];
155+ snprintf (key , sizeof (key ), "key_%s" , types [i ]);
156+ err = fossil_myshell_put (db , key , types [i ], values [i ]);
157+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_SUCCESS );
158+
159+ err = fossil_myshell_get (db , key , value , sizeof (value ));
160+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_SUCCESS );
161+ ASSUME_ITS_EQUAL_CSTR (value , values [i ]);
162+ }
163+
164+ fossil_myshell_close (db );
165+ remove (file_name );
166+ }
167+
168+ FOSSIL_TEST (c_test_myshell_put_invalid_type ) {
169+ fossil_bluecrab_myshell_error_t err ;
170+ const char * file_name = "test_put_invalid_type.myshell" ;
171+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
172+ ASSUME_ITS_TRUE (db != NULL );
173+
174+ err = fossil_myshell_put (db , "badkey" , "notatype" , "value" );
175+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_TYPE );
176+
177+ fossil_myshell_close (db );
178+ remove (file_name );
179+ }
180+
181+ FOSSIL_TEST (c_test_myshell_get_not_found ) {
182+ fossil_bluecrab_myshell_error_t err ;
183+ const char * file_name = "test_get_not_found.myshell" ;
184+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
185+ ASSUME_ITS_TRUE (db != NULL );
186+
187+ char value [128 ];
188+ err = fossil_myshell_get (db , "nonexistent" , value , sizeof (value ));
189+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_NOT_FOUND );
190+
191+ fossil_myshell_close (db );
192+ remove (file_name );
193+ }
194+
195+ FOSSIL_TEST (c_test_myshell_get_buffer_too_small ) {
196+ fossil_bluecrab_myshell_error_t err ;
197+ const char * file_name = "test_get_buffer_small.myshell" ;
198+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
199+ ASSUME_ITS_TRUE (db != NULL );
200+
201+ err = fossil_myshell_put (db , "shortkey" , "cstr" , "longvalue" );
202+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_SUCCESS );
203+
204+ char value [4 ]; // too small for "longvalue"
205+ err = fossil_myshell_get (db , "shortkey" , value , sizeof (value ));
206+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_BUFFER_TOO_SMALL );
207+
208+ fossil_myshell_close (db );
209+ remove (file_name );
210+ }
211+
212+ FOSSIL_TEST (c_test_myshell_del_not_found ) {
213+ fossil_bluecrab_myshell_error_t err ;
214+ const char * file_name = "test_del_not_found.myshell" ;
215+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
216+ ASSUME_ITS_TRUE (db != NULL );
217+
218+ // Try to delete a key that does not exist
219+ err = fossil_myshell_del (db , "nonexistent_key" );
220+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_NOT_FOUND );
221+
222+ fossil_myshell_close (db );
223+ remove (file_name );
224+ }
225+
226+ FOSSIL_TEST (c_test_myshell_del_twice ) {
227+ fossil_bluecrab_myshell_error_t err ;
228+ const char * file_name = "test_del_twice.myshell" ;
229+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
230+ ASSUME_ITS_TRUE (db != NULL );
231+
232+ // Put a key and delete it
233+ err = fossil_myshell_put (db , "key" , "cstr" , "value" );
234+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_SUCCESS );
235+
236+ err = fossil_myshell_del (db , "key" );
237+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_SUCCESS );
238+
239+ // Try to delete again
240+ err = fossil_myshell_del (db , "key" );
241+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_NOT_FOUND );
242+
243+ fossil_myshell_close (db );
244+ remove (file_name );
245+ }
246+
135247FOSSIL_TEST (c_test_myshell_stage_unstage ) {
136248 fossil_bluecrab_myshell_error_t err ;
137249 const char * file_name = "test_stage_unstage.myshell" ;
@@ -185,6 +297,74 @@ FOSSIL_TEST(c_test_myshell_backup_restore) {
185297 remove (restore_file );
186298}
187299
300+ FOSSIL_TEST (c_test_myshell_open_invalid_path ) {
301+ fossil_bluecrab_myshell_error_t err ;
302+ fossil_bluecrab_myshell_t * db = fossil_myshell_open (NULL , & err );
303+ ASSUME_ITS_TRUE (db == NULL );
304+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
305+
306+ db = fossil_myshell_open ("not_a_myshell.txt" , & err );
307+ ASSUME_ITS_TRUE (db == NULL );
308+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
309+ }
310+
311+ FOSSIL_TEST (c_test_myshell_create_existing_file ) {
312+ fossil_bluecrab_myshell_error_t err ;
313+ const char * file_name = "test_existing.myshell" ;
314+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
315+ ASSUME_ITS_TRUE (db != NULL );
316+ fossil_myshell_close (db );
317+
318+ db = fossil_myshell_create (file_name , & err );
319+ ASSUME_ITS_TRUE (db == NULL );
320+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_ALREADY_EXISTS );
321+
322+ remove (file_name );
323+ }
324+
325+ FOSSIL_TEST (c_test_myshell_backup_restore_null_args ) {
326+ fossil_bluecrab_myshell_error_t err ;
327+ const char * file_name = "test_backup_restore_null.myshell" ;
328+ fossil_bluecrab_myshell_t * db = fossil_myshell_create (file_name , & err );
329+ ASSUME_ITS_TRUE (db != NULL );
330+
331+ err = fossil_myshell_backup (NULL , "backup.bak" );
332+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
333+
334+ err = fossil_myshell_backup (db , NULL );
335+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_CONFIG_INVALID );
336+
337+ err = fossil_myshell_backup (db , "" );
338+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_CONFIG_INVALID );
339+
340+ err = fossil_myshell_restore (NULL , "target.myshell" );
341+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
342+
343+ err = fossil_myshell_restore ("backup.bak" , NULL );
344+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
345+
346+ fossil_myshell_close (db );
347+ remove (file_name );
348+ }
349+
350+ FOSSIL_TEST (c_test_myshell_diff_null_args ) {
351+ fossil_bluecrab_myshell_error_t err ;
352+ char diff [128 ];
353+ err = fossil_myshell_diff (NULL , NULL , diff , sizeof (diff ));
354+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
355+
356+ err = fossil_myshell_diff (NULL , NULL , NULL , sizeof (diff ));
357+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
358+
359+ err = fossil_myshell_diff (NULL , NULL , diff , 0 );
360+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
361+ }
362+
363+ FOSSIL_TEST (c_test_myshell_check_integrity_null ) {
364+ fossil_bluecrab_myshell_error_t err = fossil_myshell_check_integrity (NULL );
365+ ASSUME_ITS_TRUE (err == FOSSIL_MYSHELL_ERROR_INVALID_FILE );
366+ }
367+
188368// * * * * * * * * * * * * * * * * * * * * * * * *
189369// * Fossil Logic Test Pool
190370// * * * * * * * * * * * * * * * * * * * * * * * *
@@ -193,8 +373,19 @@ FOSSIL_TEST_GROUP(c_myshell_database_tests) {
193373 FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_commit_branch_checkout );
194374 FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_errstr );
195375 FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_put_get_del );
376+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_put_all_types );
377+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_put_invalid_type );
378+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_get_not_found );
379+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_get_buffer_too_small );
380+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_del_not_found );
381+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_del_twice );
196382 FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_stage_unstage );
197383 FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_backup_restore );
384+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_open_invalid_path );
385+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_create_existing_file );
386+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_backup_restore_null_args );
387+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_diff_null_args );
388+ FOSSIL_TEST_ADD (c_myshell_fixture , c_test_myshell_check_integrity_null );
198389
199390 FOSSIL_TEST_REGISTER (c_myshell_fixture );
200391} // end of tests
0 commit comments