code: def test_inheritance(msg):
      roger = m.Rabbit("Rabbit")
      assert (
          roger.name() + " is a " + roger.species()
          == "Rabbit is a parrot"
      )
      assert m.pet_name_species(roger) == "Rabbit is a parrot"
  
      polly = m.Pet("Polly", "parrot")
      assert (
          polly.name() + " is a " + polly.species()
          == "Polly is a parrot"
      )
      assert m.pet_name_species(polly) == "Polly is a parrot"
  
      molly = m.Dog("Molly")
      assert (
          molly.name() + " is a " + molly.species() == "Molly is a dog"
      )
      assert m.pet_name_species(molly) == "Molly is a dog"
  
      fred = m.Hamster("Fred")
      assert (
          fred.name() + " is a " + fred.species() == "Fred is a rodent"
      )
  
      assert m.dog_bark(molly) == "Woof!"
  
      with pytest.raises(TypeError) as excinfo:
          m.dog_bark(polly)
      assert (
          msg(excinfo.value)
          == """
          dog_bark(): incompatible function arguments. The following argument types are supported:
              1. (arg0: m.class_.Dog) -> str
  
          Invoked with: <m.class_.Pet object at 0>
      """
      )
  
      with pytest.raises(TypeError) as excinfo:
          m.Chimera("lion", "goat")
      assert "No constructor defined!" in str(excinfo.value)
  
imports: import pytest
  import env
  from pybind11_tests import ConstructorStats, UserType
  from pybind11_tests import class_
label_desc: Use image node_id 12 for calling a global function with example usage: test_inheritance(msg) without return types