from director_protected import *



class FooBar(Bar):
  def ping(self):
    return "FooBar::ping();"

class FooBar2(Bar):
  def ping(self):
    return "FooBar2::ping();"
  def pang(self):
    return "FooBar2::pang();"

class FooBar3(Bar):
  def cheer(self):
    return "FooBar3::cheer();"


b  = Bar()
f  = b.create()
fb = FooBar()
fb2 = FooBar2()
fb3 = FooBar3()


try:
  s = fb.used()
  if s != "Foo::pang();Bar::pong();Foo::pong();FooBar::ping();":
    raise RuntimeError
  pass
except:
  raise RuntimeError, "bad FooBar::used"

try:
  s = fb2.used()
  if s != "FooBar2::pang();Bar::pong();Foo::pong();FooBar2::ping();":
    raise RuntimeError
  pass
except:
  raise RuntimeError, "bad FooBar2::used"

try:
  s = b.pong()
  if s != "Bar::pong();Foo::pong();Bar::ping();":
    raise RuntimeError
  pass
except:
  raise RuntimeError, "bad Bar::pong"

try:
  s = f.pong()
  if s != "Bar::pong();Foo::pong();Bar::ping();":
    raise RuntimeError
  pass
except:
  raise RuntimeError," bad Foo::pong"
  
try:
  s = fb.pong()
  if s != "Bar::pong();Foo::pong();FooBar::ping();":
    raise RuntimeError
  pass
except:
  raise RuntimeError," bad FooBar::pong"

protected=1  
try:
  b.ping()
  protected=0
except:
  pass
if not protected:
  raise  RuntimeError,"Foo::ping is protected"
  
protected=1  
try:
  f.ping()
  protected=0
except:
  pass
if not protected:
  raise  RuntimeError,"Foo::ping is protected"


protected=1  
try:
  f.pang()
  protected=0
except:
  pass
if not protected:
  raise  RuntimeError,"FooBar::pang is protected"


protected=1  
try:
  b.cheer()
  protected=0
except:
  pass
if not protected:
  raise  RuntimeError,"Bar::cheer is protected"

protected=1  
try:
  f.cheer()
  protected=0
except:
  pass
if not protected:
  raise  RuntimeError,"Foo::cheer is protected"

if fb3.cheer() != "FooBar3::cheer();":
  raise RuntimeError, "bad fb3::cheer"

if fb2.callping() != "FooBar2::ping();":
  raise RuntimeError, "bad fb2.callping"

if fb2.callcheer() != "FooBar2::pang();Bar::pong();Foo::pong();FooBar2::ping();":
  raise RuntimeError, "bad fb2.callcheer"

if fb3.callping() != "Bar::ping();":
  raise RuntimeError, "bad fb3.callping"

if fb3.callcheer() != "FooBar3::cheer();":
  raise RuntimeError, "bad fb3.callcheer"


