@@ -168,6 +168,63 @@ FOSSIL_TEST_CASE(c_test_jellyfish_reason_fuzzy) {
168168 ASSUME_ITS_EQUAL_CSTR (out4 , "Unknown" );
169169}
170170
171+ FOSSIL_TEST_CASE (c_test_jellyfish_reason_chain ) {
172+ fossil_jellyfish_chain chain ;
173+ fossil_jellyfish_init (& chain );
174+
175+ fossil_jellyfish_learn (& chain , "a" , "b" );
176+ fossil_jellyfish_learn (& chain , "b" , "c" );
177+ fossil_jellyfish_learn (& chain , "c" , "d" );
178+
179+ // Depth 0 returns input
180+ const char * out0 = fossil_jellyfish_reason_chain (& chain , "a" , 0 );
181+ ASSUME_ITS_EQUAL_CSTR (out0 , "a" );
182+
183+ // Depth 1 returns first reasoning
184+ const char * out1 = fossil_jellyfish_reason_chain (& chain , "a" , 1 );
185+ ASSUME_ITS_EQUAL_CSTR (out1 , "b" );
186+
187+ // Depth 2 returns second reasoning
188+ const char * out2 = fossil_jellyfish_reason_chain (& chain , "a" , 2 );
189+ ASSUME_ITS_EQUAL_CSTR (out2 , "c" );
190+
191+ // Depth 3 returns third reasoning
192+ const char * out3 = fossil_jellyfish_reason_chain (& chain , "a" , 3 );
193+ ASSUME_ITS_EQUAL_CSTR (out3 , "d" );
194+
195+ // Depth greater than chain returns last found
196+ const char * out4 = fossil_jellyfish_reason_chain (& chain , "a" , 10 );
197+ ASSUME_ITS_EQUAL_CSTR (out4 , "d" );
198+
199+ // Unknown input returns "Unknown"
200+ const char * out5 = fossil_jellyfish_reason_chain (& chain , "z" , 2 );
201+ ASSUME_ITS_EQUAL_CSTR (out5 , "Unknown" );
202+ }
203+
204+ FOSSIL_TEST_CASE (c_test_jellyfish_decay_confidence ) {
205+ fossil_jellyfish_chain chain ;
206+ fossil_jellyfish_init (& chain );
207+
208+ fossil_jellyfish_learn (& chain , "x" , "y" );
209+ fossil_jellyfish_learn (& chain , "foo" , "bar" );
210+
211+ // Set confidence to a known value
212+ chain .memory [0 ].confidence = 0.5f ;
213+ chain .memory [1 ].confidence = 0.1f ;
214+
215+ fossil_jellyfish_decay_confidence (& chain , 0.2f );
216+
217+ // First block should have confidence 0.3
218+ ASSUME_ITS_TRUE (chain .memory [0 ].confidence > 0.29f && chain .memory [0 ].confidence < 0.31f );
219+ // Second block should be marked invalid (confidence < 0.05)
220+ ASSUME_ITS_TRUE (chain .memory [1 ].valid == 0 );
221+
222+ // After cleanup, only valid blocks remain
223+ fossil_jellyfish_cleanup (& chain );
224+ ASSUME_ITS_EQUAL_SIZE (chain .count , 1 );
225+ ASSUME_ITS_EQUAL_CSTR (chain .memory [0 ].input , "x" );
226+ }
227+
171228// * * * * * * * * * * * * * * * * * * * * * * * *
172229// * Fossil Logic Test Pool
173230// * * * * * * * * * * * * * * * * * * * * * * * *
@@ -182,6 +239,8 @@ FOSSIL_TEST_GROUP(c_jellyfish_tests) {
182239 FOSSIL_TEST_ADD (c_jellyfish_fixture , c_test_jellyfish_chain_save_fail );
183240 FOSSIL_TEST_ADD (c_jellyfish_fixture , c_test_jellyfish_chain_load_fail );
184241 FOSSIL_TEST_ADD (c_jellyfish_fixture , c_test_jellyfish_reason_fuzzy );
242+ FOSSIL_TEST_ADD (c_jellyfish_fixture , c_test_jellyfish_reason_chain );
243+ FOSSIL_TEST_ADD (c_jellyfish_fixture , c_test_jellyfish_decay_confidence );
185244
186245 FOSSIL_TEST_REGISTER (c_jellyfish_fixture );
187246} // end of tests
0 commit comments