docstr: Assert that a dictionary has the specified properties, handling magic underscore
  notation
  
  For example
  
  self.assert_property_values(
      {'a': {'b': 23}, 'c': 42},
      {'a_b': 23, 'c': 42}
  )
  
  will pass this test
docstr_tok: ["Assert","that","a","dictionary","has","the","specified","properties",",","handling","magic","underscore","notation","For","example","self.assert_property_values","(","{","'","a","'",":","{","'","b","'",":","23","}",",","'","c","'",":","42","}",",","{","'a_b","'",":","23",",","'","c","'",":","42","}",")","will","pass","this","test"]
code: def assert_property_values(self, obj, props):
      """
      Assert that a dictionary has the specified properties, handling magic underscore
      notation
  
      For example
  
      self.assert_property_values(
          {'a': {'b': 23}, 'c': 42},
          {'a_b': 23, 'c': 42}
      )
  
      will pass this test
      """
  
      for prop, val in props.items():
          prop_parts = prop.split("_")
          prop_parent = obj
          for prop_part in prop_parts[:-1]:
              prop_parent = prop_parent.get(prop_part, {})
  
          self.assertEqual(val, prop_parent[prop_parts[-1]])
  
imports: import plotly.graph_objs
  import pyviz_comms
  from param import concrete_descendents
  from holoviews.core import Store
  from holoviews.element.comparison import ComparisonTestCase
  from holoviews.plotting.plotly.element import ElementPlot
  from holoviews.plotting.plotly.util import figure_grid
  from ..None import option_intersections
label_desc: Use image node_id 4 for calling the TestPlotlyPlot obj's underlying member method code with example usage: obj.assert_property_values(obj, props) without return types