text: from typing import (
      Iterable,
      List,
      Optional
  )
  import unittest
  
  from dataladmetadatamodel.modifiableobject import ModifiableObject
  
  
  destination = "/tmp/t"
  
  
  class SUTModifiableObject(ModifiableObject):
      def __init__(self, saved_on: Optional[str] = None):
          super().__init__()
          if saved_on is not None:
              self.set_saved_on(saved_on)
          self.something = "Something " * 100
  
      @property
      def modifiable_sub_objects(self) -> Iterable:
          return []
  
  
  class TestModifiableObject(unittest.TestCase):
  
      def test_new_clean(self):
          mo = SUTModifiableObject()
          self.assertFalse(mo.is_saved_on(destination))
  
      def test_touching_cleaning(self):
          mo = SUTModifiableObject()
          self.assertFalse(mo.is_saved_on(destination))
          mo.set_saved_on(destination)
          self.assertTrue(mo.is_saved_on(destination))
  
      def test_sub_object_modification(self):
          class Bag(ModifiableObject):
              def __init__(self, _sub_objects: List[ModifiableObject]):
                  super().__init__()
                  self.sub_objects = _sub_objects
  
              @property
              def modifiable_sub_objects(self) -> Iterable[ModifiableObject]:
                  return self.sub_objects
  
          sub_objects = [SUTModifiableObject(destination) for _ in range(3)]
  
          bag = Bag(sub_objects)
          bag.set_saved_on(destination)
  
          self.assertTrue(bag.is_saved_on(destination), f"Expected complete bag is saved on {destination}")
  
          sub_objects[0].touch()
          self.assertFalse(bag.is_saved_on(destination), f"Expected modified bag is not saved on {destination}")
  
  
  if __name__ == '__main__':
      unittest.main()
  