code: def test_list_properties(self):
      env = deepmind_lab.Lab("tests/properties_test", [], config={})
      props = props_to_dictionary(env)
      expected_params = {
          "arg1": "true",
          "arg2": "19",
          "arg3": "hello",
          "arrArgs": {"1": "arr1", "2": "arr2", "3": "arr3"},
          "subArgs": {"sub1": "val1", "sub2": "val2", "sub3": "val3"},
      }
      self.assertEqual(props["params"], expected_params)
      env.write_property("params.arrArgs.1", "newarr1")
      props = props_to_dictionary(env)
      self.assertEqual(props["params"]["arrArgs"]["1"], "newarr1")
      env.write_property("params.arg1", "false")
  
      self.assertIsNotNone(props["func"])
      self.assertIsNotNone(props["func"]["times10"])
  
      for i in six.moves.range(10):
          self.assertEqual(
              env.read_property("func.times10." + str(i)), str(i * 10)
          )
  
file_path: lab/python/tests/properties_test.py
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import os
  from absl.testing import absltest
  import six
  import deepmind_lab
label_desc: Use image node_id 2 for calling the Properties obj's underlying member method code with example usage: obj.test_list_properties() without return types