@@ -321,7 +321,7 @@ fn test_asset_from_reflector_asset() {
321321
322322 assert_eq ! ( btc_asset. contract, contract_address) ;
323323 assert_eq ! ( btc_asset. symbol, Symbol :: new( & env, "BTC" ) ) ;
324- assert_eq ! ( btc_asset. decimals( ) , 8 ) ;
324+ assert_eq ! ( btc_asset. decimals, 8 ) ;
325325}
326326
327327#[ test]
@@ -365,10 +365,10 @@ fn test_asset_name_methods() {
365365 decimals : 9 ,
366366 } ;
367367
368- assert_eq ! ( xlm_asset. name( ) . to_string( ) , "Stellar Lumens" ) ;
369- assert_eq ! ( btc_asset. name( ) . to_string( ) , "Bitcoin" ) ;
370- assert_eq ! ( usdc_asset. name( ) . to_string( ) , "USD Coin" ) ;
371- assert ! ( custom_asset. name( ) . to_string( ) . contains( "CUSTOM" ) ) ;
368+ assert_eq ! ( xlm_asset. name( & env ) . to_string( ) , "Stellar Lumens" ) ;
369+ assert_eq ! ( btc_asset. name( & env ) . to_string( ) , "Bitcoin" ) ;
370+ assert_eq ! ( usdc_asset. name( & env ) . to_string( ) , "USD Coin" ) ;
371+ assert ! ( custom_asset. name( & env ) . to_string( ) . contains( "CUSTOM" ) ) ;
372372}
373373
374374#[ test]
@@ -558,3 +558,84 @@ fn test_comprehensive_reflector_asset_matrix() {
558558 assert ! ( feed_id. contains( "/USD" ) ) ;
559559 }
560560}
561+
562+ // ===== SAC TOKEN INTEGRATION TESTS =====
563+
564+ #[ test]
565+ fn test_sac_token_operations ( ) {
566+ let env = Env :: default ( ) ;
567+ env. mock_all_auths ( ) ;
568+
569+ let admin = Address :: generate ( & env) ;
570+ let user1 = Address :: generate ( & env) ;
571+ let user2 = Address :: generate ( & env) ;
572+ let spender = Address :: generate ( & env) ;
573+
574+ // Register a dummy token contract to simulate SAC
575+ let token_id = env. register_stellar_asset_contract ( admin. clone ( ) ) ;
576+ let token_client = token:: Client :: new ( & env, & token_id) ;
577+ let asset = crate :: tokens:: Asset :: new ( token_id. clone ( ) , Symbol :: new ( & env, "TEST" ) , 7 ) ;
578+
579+ // 1. Test Mint & Balance (Setup)
580+ token_client. mint ( & user1, & 1000 ) ;
581+ assert_eq ! ( crate :: tokens:: get_token_balance( & env, & asset, & user1) , 1000 ) ;
582+
583+ // 2. Test Transfer
584+ crate :: tokens:: transfer_token ( & env, & asset, & user1, & user2, 400 ) ;
585+ assert_eq ! ( crate :: tokens:: get_token_balance( & env, & asset, & user1) , 600 ) ;
586+ assert_eq ! ( crate :: tokens:: get_token_balance( & env, & asset, & user2) , 400 ) ;
587+
588+ // 3. Test Approve & Allowance
589+ let expiration = env. ledger ( ) . sequence ( ) + 100 ;
590+ crate :: tokens:: approve_token ( & env, & asset, & user1, & spender, 200 , expiration) ;
591+ assert_eq ! ( crate :: tokens:: get_token_allowance( & env, & asset, & user1, & spender) , 200 ) ;
592+
593+ // 4. Test Transfer From
594+ crate :: tokens:: transfer_from_token ( & env, & asset, & spender, & user1, & user2, 100 ) ;
595+ assert_eq ! ( crate :: tokens:: get_token_balance( & env, & asset, & user1) , 500 ) ;
596+ assert_eq ! ( crate :: tokens:: get_token_balance( & env, & asset, & user2) , 500 ) ;
597+ assert_eq ! ( crate :: tokens:: get_token_allowance( & env, & asset, & user1, & spender) , 100 ) ;
598+ }
599+
600+ #[ test]
601+ fn test_sac_token_failure_modes ( ) {
602+ let env = Env :: default ( ) ;
603+ env. mock_all_auths ( ) ;
604+
605+ let admin = Address :: generate ( & env) ;
606+ let user = Address :: generate ( & env) ;
607+ let recipient = Address :: generate ( & env) ;
608+
609+ let token_id = env. register_stellar_asset_contract ( admin. clone ( ) ) ;
610+ let token_client = token:: Client :: new ( & env, & token_id) ;
611+ let asset = crate :: tokens:: Asset :: new ( token_id. clone ( ) , Symbol :: new ( & env, "TEST" ) , 7 ) ;
612+
613+ token_client. mint ( & user, & 100 ) ;
614+
615+ // 1. Test insufficient balance with check_token_balance
616+ assert ! ( crate :: tokens:: check_token_balance( & env, & asset, & user, 101 ) . is_err( ) ) ;
617+ assert ! ( crate :: tokens:: check_token_balance( & env, & asset, & user, 100 ) . is_ok( ) ) ;
618+
619+ // 2. Test transfer failing due to balance (panics in Soroban)
620+ let result = std:: panic:: catch_unwind ( || {
621+ crate :: tokens:: transfer_token ( & env, & asset, & user, & recipient, 101 ) ;
622+ } ) ;
623+ assert ! ( result. is_err( ) ) ;
624+
625+ // 3. Test validate_token_operation
626+ assert ! ( crate :: tokens:: validate_token_operation( & env, & asset, & user, 100 ) . is_ok( ) ) ;
627+ assert ! ( crate :: tokens:: validate_token_operation( & env, & asset, & user, 0 ) . is_err( ) ) ; // Invalid amount
628+ assert ! ( crate :: tokens:: validate_token_operation( & env, & asset, & user, 101 ) . is_err( ) ) ; // Insufficient balance
629+ }
630+
631+ #[ test]
632+ fn test_asset_native_xlm_detection ( ) {
633+ let env = Env :: default ( ) ;
634+
635+ // Our is_native_xlm heuristic currently checks the symbol "XLM".
636+ let asset = crate :: tokens:: Asset :: new ( Address :: generate ( & env) , Symbol :: new ( & env, "XLM" ) , 7 ) ;
637+ assert ! ( asset. is_native_xlm( & env) ) ;
638+
639+ let btc = crate :: tokens:: Asset :: new ( Address :: generate ( & env) , Symbol :: new ( & env, "BTC" ) , 8 ) ;
640+ assert ! ( !btc. is_native_xlm( & env) ) ;
641+ }
0 commit comments