text: # -*- coding: utf-8 -*-
  # Copyright (C) 2010-2019 Martin Glueck All rights reserved
  # Langstrasse 4, A--2244 Spannberg, Austria. martin@mangari.org
  # ****************************************************************************
  # This module is part of the package GTW.__test__.
  #
  # This module is licensed under the terms of the BSD 3-Clause License
  # <http://www.c-tanzer.at/license/bsd_3c.html>.
  # ****************************************************************************
  #
  #++
  # Name
  #    GTW.__test__.MOM_SAW
  #
  # Purpose
  #    Proxy for the MOM.DBW.SAW.__doc__ tests
  #
  # Revision Dates
  #    12-Feb-2010 (MG) Creation
  #    16-Feb-2010 (MG) Test for database migration added
  #    27-Sep-2012 (CT) Move test code from `MOM.DBW.SAW.__doc__` in here
  #    24-Feb-2017 (CT) Import `MOM.Inspect`, not `MOM.inspect`
  #    19-Aug-2019 (CT) Use `print_prepr`
  #    ««revision-date»»···
  #--
  
  from   _GTW.__test__.MOM import \
      ( dt_form, MOM, BMT, show, NL, sos, last_change
      , portable_repr, print_prepr, prepr, pyk
      )
  from   _MOM.Inspect import show_children, show_ref_map, show_ref_maps
  
  from   _TFL.formatted_repr        import formatted_repr as formatted
  from   _TFL.Regexp                import Dict_Replacer, re
  
  filter_dbw_pat = re.compile \
      (  "\#\#\#\sDBW-specific\sstart.+?\#\#\#\sDBW-specific\sfinish"
      , re.DOTALL | re.X | re.MULTILINE
      )
  
  fixer = Dict_Replacer ({"__Hash" : "__SAW", "__HPS": "__SAW", "hps://" : "sqlite://"})
  
  __doc__ = fixer \
      ( filter_dbw_pat.sub ("", dt_form)
      % dict
          ( import_DBW = "from _MOM._DBW._SAW.Manager import Manager"
          , import_EMS = "from _MOM._EMS.SAW          import Manager"
          , db_path    = "'test.sqlite'"
          , db_scheme  = "'sqlite://'"
          )
      )
  
  _db_mig_test = """
  >>> from _MOM._DBW._HPS.Manager import Manager as DBW_HPS
  >>> from _MOM._EMS.Hash         import Manager as EMS_HPS
  >>> from _MOM._DBW._SAW.Manager import Manager as DBW_SAW
  >>> from _MOM._EMS.SAW          import Manager as EMS_SAW
  
  >>> apt_gen = MOM.App_Type    (u"BMT_DBM", BMT)
  >>> apt_sas = apt_gen.Derived (EMS_SAW, DBW_SAW)
  >>> apt_hps = apt_gen.Derived (EMS_HPS, DBW_HPS)
  >>> apt_sas is apt_hps
  False
  >>> apt_sas.parent is apt_hps.parent
  True
  >>> db_path_old  = "scope_old.sqlite"
  >>> db_path_new  = "scope_new.sqlite"
  >>> hps_filename = "scope_hps"
  >>> hps_path     = "%s.bmt" % (hps_filename, )
  >>> hps_url      = "hps:///%s" % (hps_path, )
  >>> remove (db_path_old)
  >>> remove (db_path_new)
  >>> remove (hps_path)
  >>> remove (hps_path + ".X", True)
  >>> scope_1 = MOM.Scope.new          (apt_sas, "sqlite:///%s" % (db_path_old, ))
  >>> m1 = scope_1.BMT.Mouse           ("Mouse_1")
  >>> m2 = scope_1.BMT.Mouse           ("Mouse_2")
  >>> m3 = scope_1.BMT.Mouse           ("Mouse_3")
  >>> r1 = scope_1.BMT.Rat             ("Rat_1")
  >>> t1 = scope_1.BMT.Trap            ("Brand", 1)
  >>> t2 = scope_1.BMT.Trap            ("Brand", 2)
  >>> t3 = scope_1.BMT.Trap            ("Brand", 3)
  >>> t4 = scope_1.BMT.Trap            ("Brand", 4)
  >>> rit = scope_1.BMT.Rodent_in_Trap (m1, t1)
  >>> rit = scope_1.BMT.Rodent_in_Trap (m2, t2)
  >>> rit = scope_1.BMT.Rodent_in_Trap (m3, t3)
  >>> rit = scope_1.BMT.Rodent_in_Trap (r1, t4)
  >>> scope_1.commit                   ()
  >>> scope_1.destroy                  ()
  
  Now, we load the `old` database and save it as a HPS
  >>> scope_1 = MOM.Scope.load         (apt_sas, "sqlite:///%s" % (db_path_old, ))
  >>> scope_2 = scope_1.copy           (apt_hps, hps_url)
  >>> scope_1.destroy                  ()
  >>> scope_2.destroy                  ()
  
  Here is the point where we upgrade the object model and load the HPS database
  again to perform the migration
  >>> scope_2 = MOM.Scope.load         (apt_hps, hps_url)
  >>> scope_3 = scope_2.copy           (apt_sas, "sqlite:///%s" % (db_path_new, ))
  >>> scope_2.destroy                  ()
  >>> scope_3.destroy                  ()
  
  Now we load the old and the new SAW based scopes and compare them
  >>> scope_1 = MOM.Scope.load         (apt_sas, "sqlite:///%s" % (db_path_old, ))
  >>> scope_3 = MOM.Scope.load         (apt_sas, "sqlite:///%s" % (db_path_new, ))
  >>> tuple (s.MOM.Id_Entity.count for s in (scope_1, scope_3))
  (12, 12)
  >>> sorted (pyk.iteritems (scope_1.user_diff (scope_3, ignore = ["last_cid"])))
  []
  >>> scope_1.destroy ()
  >>> scope_3.destroy ()
  
  >>> remove          (db_path_old)
  >>> remove          (db_path_new)
  >>> remove          (hps_filename + ".bak")
  >>> remove          (hps_path)
  >>> remove          (hps_path + ".X", True)
  
  """
  
  __test__ = dict (test_db_migration = _db_mig_test)
  
  def remove (file, is_dir = False) :
      if sos.path.exists (file) :
          if is_dir :
              sos.rmdir  (file, deletefiles = True)
          else :
              sos.unlink (file)
  # end def remove
  
  ### __END__ GTW.__test__.MOM_SAW
  