@@ -553,6 +553,144 @@ void main() {
553553 expect (customHolder.key, 'test___user' );
554554 });
555555 });
556+
557+ group ('ItemHolder caching' , () {
558+ test ('itemHolder returns same instance for same key' , () {
559+ final holder1 = container.itemHolder <String >('cache-test' );
560+ final holder2 = container.itemHolder <String >('cache-test' );
561+ expect (identical (holder1, holder2), true );
562+ });
563+
564+ test ('itemHolder throws ArgumentError for type mismatch' , () {
565+ // Create a holder with String type
566+ container.itemHolder <String >('type-mismatch' );
567+
568+ // Attempt to create another holder with same key but different type
569+ expect (
570+ () => container.itemHolder <int >('type-mismatch' ),
571+ throwsA (
572+ isA <ArgumentError >().having (
573+ (e) => e.message,
574+ 'message' ,
575+ contains ('An ItemHolder with key "type-mismatch" already exists with a different type' ),
576+ ),
577+ ),
578+ );
579+ });
580+
581+ test ('jsonItemHolder returns same instance for same key' , () {
582+ final holder1 = container.jsonItemHolder <User >(
583+ 'user-cache' ,
584+ fromJson: User .fromJson,
585+ toJson: (user) => user.toJson (),
586+ );
587+ final holder2 = container.jsonItemHolder <User >(
588+ 'user-cache' ,
589+ fromJson: User .fromJson,
590+ toJson: (user) => user.toJson (),
591+ );
592+ expect (identical (holder1, holder2), true );
593+ });
594+
595+ test ('jsonItemHolder throws ArgumentError for type mismatch' , () {
596+ // Create a JsonItemHolder with User type
597+ container.jsonItemHolder <User >(
598+ 'json-mismatch' ,
599+ fromJson: User .fromJson,
600+ toJson: (user) => user.toJson (),
601+ );
602+
603+ // Attempt to create another JsonItemHolder with same key but different type
604+ expect (
605+ () => container.jsonItemHolder <Map <String , dynamic >>(
606+ 'json-mismatch' ,
607+ fromJson: (json) => json,
608+ toJson: (data) => data,
609+ ),
610+ throwsA (
611+ isA <ArgumentError >().having (
612+ (e) => e.message,
613+ 'message' ,
614+ contains ('An ItemHolder with key "json-mismatch" already exists with a different type' ),
615+ ),
616+ ),
617+ );
618+ });
619+
620+ test ('serializableItemHolder returns same instance for same key' , () {
621+ final holder1 = container.serializableItemHolder <User >(
622+ 'serializable-cache' ,
623+ serialize: (user) => user.serialize (),
624+ deserialize: User .deserialize,
625+ );
626+ final holder2 = container.serializableItemHolder <User >(
627+ 'serializable-cache' ,
628+ serialize: (user) => user.serialize (),
629+ deserialize: User .deserialize,
630+ );
631+ expect (identical (holder1, holder2), true );
632+ });
633+
634+ test ('serializableItemHolder throws ArgumentError for type mismatch' , () {
635+ // Create a SerializableItemHolder with User type
636+ container.serializableItemHolder <User >(
637+ 'serializable-mismatch' ,
638+ serialize: (user) => user.serialize (),
639+ deserialize: User .deserialize,
640+ );
641+
642+ // Attempt to create another SerializableItemHolder with same key but different type
643+ expect (
644+ () => container.serializableItemHolder <String >(
645+ 'serializable-mismatch' ,
646+ serialize: (s) => s,
647+ deserialize: (s) => s,
648+ ),
649+ throwsA (
650+ isA <ArgumentError >().having (
651+ (e) => e.message,
652+ 'message' ,
653+ contains ('An ItemHolder with key "serializable-mismatch" already exists with a different type' ),
654+ ),
655+ ),
656+ );
657+ });
658+
659+ test ('customItemHolder returns same instance for same key' , () {
660+ final holder1 = container.customItemHolder <CustomUserHolder , User >(
661+ 'custom-cache' ,
662+ create: (backend, key) => CustomUserHolder (container, backend, key),
663+ );
664+ final holder2 = container.customItemHolder <CustomUserHolder , User >(
665+ 'custom-cache' ,
666+ create: (backend, key) => CustomUserHolder (container, backend, key),
667+ );
668+ expect (identical (holder1, holder2), true );
669+ });
670+
671+ test ('customItemHolder throws ArgumentError for type mismatch' , () {
672+ // Create a CustomItemHolder
673+ container.customItemHolder <CustomUserHolder , User >(
674+ 'custom-mismatch' ,
675+ create: (backend, key) => CustomUserHolder (container, backend, key),
676+ );
677+
678+ // Attempt to create another CustomItemHolder with same key but different holder type
679+ expect (
680+ () => container.customItemHolder <AnotherCustomHolder , String >(
681+ 'custom-mismatch' ,
682+ create: (backend, key) => AnotherCustomHolder (container, backend, key),
683+ ),
684+ throwsA (
685+ isA <ArgumentError >().having (
686+ (e) => e.message,
687+ 'message' ,
688+ contains ('An ItemHolder with key "custom-mismatch" already exists with a different type' ),
689+ ),
690+ ),
691+ );
692+ });
693+ });
556694 });
557695}
558696
@@ -574,3 +712,14 @@ class CustomUserHolder extends ItemHolder<User> {
574712
575713 String get key => _encodedKey;
576714}
715+
716+ // Another custom ItemHolder for testing type mismatch
717+ class AnotherCustomHolder extends ItemHolder <String > {
718+ AnotherCustomHolder (HyperStorageContainer parent, StorageBackend backend, String encodedKey)
719+ : super (
720+ parent,
721+ encodedKey,
722+ getter: (backend, key) => backend.getString (key),
723+ setter: (backend, key, value) => backend.setString (key, value),
724+ );
725+ }
0 commit comments