import li_boost_shared_ptr
import gc

debug = False

# simple shared_ptr usage - created in C++
class li_boost_shared_ptr_runme:
  def main(self):
    if (debug):
      print "Started"

    li_boost_shared_ptr.cvar.debug_shared = debug

    # Change loop count to run for a long time to monitor memory
    loopCount = 1 #5000
    for i in range (0,loopCount):
      self.runtest()

    # Expect 1 instance - the one global variable (GlobalValue)
    if (li_boost_shared_ptr.Klass.getTotal_count() != 1):
      raise RuntimeError("Klass.total_count=%s" % li_boost_shared_ptr.Klass.getTotal_count())

    wrapper_count = li_boost_shared_ptr.shared_ptr_wrapper_count() 
    if (wrapper_count != li_boost_shared_ptr.NOT_COUNTING):
      # Expect 1 instance - the one global variable (GlobalSmartValue)
      if (wrapper_count != 1):
        raise RuntimeError("shared_ptr wrapper count=%s" % wrapper_count)

    if (debug):
      print "Finished"

  def runtest(self):
    # simple shared_ptr usage - created in C++
    k = li_boost_shared_ptr.Klass("me oh my")
    val = k.getValue()
    self.verifyValue("me oh my", val)
    self.verifyCount(1, k)

    # simple shared_ptr usage - not created in C++
    k = li_boost_shared_ptr.factorycreate()
    val = k.getValue()
    self.verifyValue("factorycreate", val)
    self.verifyCount(1, k)

    # pass by shared_ptr
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.smartpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointertest", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by shared_ptr pointer
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.smartpointerpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointerpointertest", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by shared_ptr reference
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.smartpointerreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointerreftest", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by shared_ptr pointer reference
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.smartpointerpointerreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointerpointerreftest", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # const pass by shared_ptr
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.constsmartpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # const pass by shared_ptr pointer
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.constsmartpointerpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # const pass by shared_ptr reference
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.constsmartpointerreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by value
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.valuetest(k)
    val = kret.getValue()
    self.verifyValue("me oh my valuetest", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # pass by pointer
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.pointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my pointertest", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # pass by reference
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.reftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my reftest", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # pass by pointer reference
    k = li_boost_shared_ptr.Klass("me oh my")
    kret = li_boost_shared_ptr.pointerreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my pointerreftest", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # null tests
    k = None

    if (li_boost_shared_ptr.smartpointertest(k) != None):
      raise RuntimeError("return was not null")

    if (li_boost_shared_ptr.smartpointerpointertest(k) != None):
      raise RuntimeError("return was not null")

    if (li_boost_shared_ptr.smartpointerreftest(k) != None):
      raise RuntimeError("return was not null")

    if (li_boost_shared_ptr.smartpointerpointerreftest(k) != None):
      raise RuntimeError("return was not null")

    if (li_boost_shared_ptr.nullsmartpointerpointertest(None) != "null pointer"):
      raise RuntimeError("not null smartpointer pointer")

    try:
      li_boost_shared_ptr.valuetest(k)
      raise RuntimeError("Failed to catch null pointer")
    except ValueError:
      pass

    if (li_boost_shared_ptr.pointertest(k) != None):
      raise RuntimeError("return was not null")

    try:
      li_boost_shared_ptr.reftest(k)
      raise RuntimeError("Failed to catch null pointer")
    except ValueError:
      pass

    # $owner
    k = li_boost_shared_ptr.pointerownertest()
    val = k.getValue()
    self.verifyValue("pointerownertest", val)
    self.verifyCount(1, k)
    k = li_boost_shared_ptr.smartpointerpointerownertest()
    val = k.getValue()
    self.verifyValue("smartpointerpointerownertest", val)
    self.verifyCount(1, k)

    # //////////////////////////////// Derived class ////////////////////////////////////////
    # derived pass by shared_ptr
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.derivedsmartptrtest(k)
    val = kret.getValue()
    self.verifyValue("me oh my derivedsmartptrtest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # derived pass by shared_ptr pointer
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.derivedsmartptrpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my derivedsmartptrpointertest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # derived pass by shared_ptr ref
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.derivedsmartptrreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my derivedsmartptrreftest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # derived pass by shared_ptr pointer ref
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.derivedsmartptrpointerreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my derivedsmartptrpointerreftest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # derived pass by pointer
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.derivedpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my derivedpointertest-Derived", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # derived pass by ref
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.derivedreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my derivedreftest-Derived", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # //////////////////////////////// Derived and base class mixed ////////////////////////////////////////
    # pass by shared_ptr (mixed)
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.smartpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointertest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by shared_ptr pointer (mixed)
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.smartpointerpointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointerpointertest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by shared_ptr reference (mixed)
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.smartpointerreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointerreftest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by shared_ptr pointer reference (mixed)
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.smartpointerpointerreftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my smartpointerpointerreftest-Derived", val)
    self.verifyCount(2, k)
    self.verifyCount(2, kret)

    # pass by value (mixed)
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.valuetest(k)
    val = kret.getValue()
    self.verifyValue("me oh my valuetest", val) # note slicing
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # pass by pointer (mixed)
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.pointertest(k)
    val = kret.getValue()
    self.verifyValue("me oh my pointertest-Derived", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # pass by ref (mixed)
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    kret = li_boost_shared_ptr.reftest(k)
    val = kret.getValue()
    self.verifyValue("me oh my reftest-Derived", val)
    self.verifyCount(1, k)
    self.verifyCount(1, kret)

    # //////////////////////////////// Overloading tests ////////////////////////////////////////
    # Base class
    k = li_boost_shared_ptr.Klass("me oh my")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyval(k), "rawbyval")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyref(k), "rawbyref")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyptr(k), "rawbyptr")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyptrref(k), "rawbyptrref")

    self.verifyValue(li_boost_shared_ptr.overload_smartbyval(k), "smartbyval")
    self.verifyValue(li_boost_shared_ptr.overload_smartbyref(k), "smartbyref")
    self.verifyValue(li_boost_shared_ptr.overload_smartbyptr(k), "smartbyptr")
    self.verifyValue(li_boost_shared_ptr.overload_smartbyptrref(k), "smartbyptrref")

    # Derived class
    k = li_boost_shared_ptr.KlassDerived("me oh my")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyval(k), "rawbyval")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyref(k), "rawbyref")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyptr(k), "rawbyptr")
    self.verifyValue(li_boost_shared_ptr.overload_rawbyptrref(k), "rawbyptrref")

    self.verifyValue(li_boost_shared_ptr.overload_smartbyval(k), "smartbyval")
    self.verifyValue(li_boost_shared_ptr.overload_smartbyref(k), "smartbyref")
    self.verifyValue(li_boost_shared_ptr.overload_smartbyptr(k), "smartbyptr")
    self.verifyValue(li_boost_shared_ptr.overload_smartbyptrref(k), "smartbyptrref")

    # 3rd derived class
    k = li_boost_shared_ptr.Klass3rdDerived("me oh my")
    val = k.getValue()
    self.verifyValue("me oh my-3rdDerived", val)
    self.verifyCount(1, k)
    val = li_boost_shared_ptr.test3rdupcast(k)
    self.verifyValue("me oh my-3rdDerived", val)
    self.verifyCount(1, k)

    # //////////////////////////////// Member variables ////////////////////////////////////////
    # smart pointer by value
    m = li_boost_shared_ptr.MemberVariables()
    k = li_boost_shared_ptr.Klass("smart member value")
    m.SmartMemberValue = k
    val = k.getValue()
    self.verifyValue("smart member value", val)
    self.verifyCount(2, k)

    kmember = m.SmartMemberValue
    val = kmember.getValue()
    self.verifyValue("smart member value", val)
    self.verifyCount(3, kmember)
    self.verifyCount(3, k)

    del m
    self.verifyCount(2, kmember)
    self.verifyCount(2, k)

    # smart pointer by pointer
    m = li_boost_shared_ptr.MemberVariables()
    k = li_boost_shared_ptr.Klass("smart member pointer")
    m.SmartMemberPointer = k
    val = k.getValue()
    self.verifyValue("smart member pointer", val)
    self.verifyCount(1, k)

    kmember = m.SmartMemberPointer
    val = kmember.getValue()
    self.verifyValue("smart member pointer", val)
    self.verifyCount(2, kmember)
    self.verifyCount(2, k)

    del m
    self.verifyCount(2, kmember)
    self.verifyCount(2, k)

    # smart pointer by reference
    m = li_boost_shared_ptr.MemberVariables()
    k = li_boost_shared_ptr.Klass("smart member reference")
    m.SmartMemberReference = k
    val = k.getValue()
    self.verifyValue("smart member reference", val)
    self.verifyCount(2, k)

    kmember = m.SmartMemberReference
    val = kmember.getValue()
    self.verifyValue("smart member reference", val)
    self.verifyCount(3, kmember)
    self.verifyCount(3, k)

    # The C++ reference refers to SmartMemberValue...
    kmemberVal = m.SmartMemberValue
    val = kmember.getValue()
    self.verifyValue("smart member reference", val)
    self.verifyCount(4, kmemberVal)
    self.verifyCount(4, kmember)
    self.verifyCount(4, k)

    del m
    self.verifyCount(3, kmemberVal)
    self.verifyCount(3, kmember)
    self.verifyCount(3, k)

    # plain by value
    m = li_boost_shared_ptr.MemberVariables()
    k = li_boost_shared_ptr.Klass("plain member value")
    m.MemberValue = k
    val = k.getValue()
    self.verifyValue("plain member value", val)
    self.verifyCount(1, k)

    kmember = m.MemberValue
    val = kmember.getValue()
    self.verifyValue("plain member value", val)
    self.verifyCount(1, kmember)
    self.verifyCount(1, k)

    del m
    self.verifyCount(1, kmember)
    self.verifyCount(1, k)

    # plain by pointer
    m = li_boost_shared_ptr.MemberVariables()
    k = li_boost_shared_ptr.Klass("plain member pointer")
    m.MemberPointer = k
    val = k.getValue()
    self.verifyValue("plain member pointer", val)
    self.verifyCount(1, k)

    kmember = m.MemberPointer
    val = kmember.getValue()
    self.verifyValue("plain member pointer", val)
    self.verifyCount(1, kmember)
    self.verifyCount(1, k)

    del m
    self.verifyCount(1, kmember)
    self.verifyCount(1, k)

    # plain by reference
    m = li_boost_shared_ptr.MemberVariables()
    k = li_boost_shared_ptr.Klass("plain member reference")
    m.MemberReference = k
    val = k.getValue()
    self.verifyValue("plain member reference", val)
    self.verifyCount(1, k)

    kmember = m.MemberReference
    val = kmember.getValue()
    self.verifyValue("plain member reference", val)
    self.verifyCount(1, kmember)
    self.verifyCount(1, k)

    del m
    self.verifyCount(1, kmember)
    self.verifyCount(1, k)

    # null member variables
    m = li_boost_shared_ptr.MemberVariables()

    # shared_ptr by value
    k = m.SmartMemberValue
    if (k != None):
      raise RuntimeError("expected null")
    m.SmartMemberValue = None
    k = m.SmartMemberValue
    if (k != None):
      raise RuntimeError("expected null")
    self.verifyCount(0, k)

    # plain by value
    try:
      m.MemberValue = None
      raise RuntimeError("Failed to catch null pointer")
    except ValueError:
      pass

    # ////////////////////////////////// Global variables ////////////////////////////////////////
    # smart pointer
    kglobal = li_boost_shared_ptr.cvar.GlobalSmartValue
    if (kglobal != None):
      raise RuntimeError("expected null")

    k = li_boost_shared_ptr.Klass("smart global value")
    li_boost_shared_ptr.cvar.GlobalSmartValue = k
    self.verifyCount(2, k)

    kglobal = li_boost_shared_ptr.cvar.GlobalSmartValue
    val = kglobal.getValue()
    self.verifyValue("smart global value", val)
    self.verifyCount(3, kglobal)
    self.verifyCount(3, k)
    self.verifyValue("smart global value", li_boost_shared_ptr.cvar.GlobalSmartValue.getValue())
    li_boost_shared_ptr.cvar.GlobalSmartValue = None

    # plain value
    k = li_boost_shared_ptr.Klass("global value")
    li_boost_shared_ptr.cvar.GlobalValue = k
    self.verifyCount(1, k)

    kglobal = li_boost_shared_ptr.cvar.GlobalValue
    val = kglobal.getValue()
    self.verifyValue("global value", val)
    self.verifyCount(1, kglobal)
    self.verifyCount(1, k)
    self.verifyValue("global value", li_boost_shared_ptr.cvar.GlobalValue.getValue())

    try:
      li_boost_shared_ptr.cvar.GlobalValue = None
      raise RuntimeError("Failed to catch null pointer")
    except ValueError:
      pass

    # plain pointer
    kglobal = li_boost_shared_ptr.cvar.GlobalPointer
    if (kglobal != None):
      raise RuntimeError("expected null")

    k = li_boost_shared_ptr.Klass("global pointer")
    li_boost_shared_ptr.cvar.GlobalPointer = k
    self.verifyCount(1, k)

    kglobal = li_boost_shared_ptr.cvar.GlobalPointer
    val = kglobal.getValue()
    self.verifyValue("global pointer", val)
    self.verifyCount(1, kglobal)
    self.verifyCount(1, k)
    li_boost_shared_ptr.cvar.GlobalPointer = None

    # plain reference
    kglobal

    k = li_boost_shared_ptr.Klass("global reference")
    li_boost_shared_ptr.cvar.GlobalReference = k
    self.verifyCount(1, k)

    kglobal = li_boost_shared_ptr.cvar.GlobalReference
    val = kglobal.getValue()
    self.verifyValue("global reference", val)
    self.verifyCount(1, kglobal)
    self.verifyCount(1, k)

    try:
      li_boost_shared_ptr.cvar.GlobalReference = None 
      raise RuntimeError("Failed to catch null pointer")
    except ValueError:
      pass

    # ////////////////////////////////// Templates ////////////////////////////////////////
    pid = li_boost_shared_ptr.PairIntDouble(10, 20.2)
    if (pid.baseVal1 != 20 or pid.baseVal2 != 40.4):
      raise RuntimeError("Base values wrong")
    if (pid.val1 != 10 or pid.val2 != 20.2):
      raise RuntimeError("Derived Values wrong")

  def verifyValue(self, expected, got):
    if (expected != got):
      raise RuntimeError("verify value failed. Expected: ", expected, " Got: ", got)

  def verifyCount(self, expected, k):
    got = li_boost_shared_ptr.use_count(k)
    if (expected != got):
      raise RuntimeError("verify use_count failed. Expected: ", expected, " Got: ", got)


runme = li_boost_shared_ptr_runme()
runme.main()

