code: def test_properties(self):
      spec = VariableSpec(shape=(None, None, None))
      self.assertIsNone(spec.name)
      self.assertAllEqual(spec.shape.as_list(), [None, None, None])
      self.assertEqual(spec.dtype, dtypes.float32)
      self.assertTrue(spec.trainable)
      self.assertIs(
          spec.value_type, resource_variable_ops.ResourceVariable
      )
      self.assertAllEqual(
          spec._component_specs,
          [tensor_spec.TensorSpec([], dtypes.resource)],
      )
  
      spec2 = VariableSpec(
          shape=(1, 2, 3), dtype=dtypes.float64, trainable=False
      )
      self.assertEqual(spec2.shape.as_list(), [1, 2, 3])
      self.assertEqual(spec2.dtype, dtypes.float64)
      self.assertFalse(spec2.trainable)
      self.assertIs(
          spec2.value_type, resource_variable_ops.ResourceVariable
      )
      self.assertAllEqual(
          spec2._component_specs,
          [tensor_spec.TensorSpec([], dtypes.resource)],
      )
  
imports: from absl.testing import parameterized
  import numpy
  from tensorflow.python.eager import context
  from tensorflow.python.framework import constant_op
  from tensorflow.python.framework import dtypes
  from tensorflow.python.framework import ops
  from tensorflow.python.framework import tensor_spec
  from tensorflow.python.framework import test_util
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops import resource_variable_ops
  from tensorflow.python.platform import test
  from tensorflow.python.util import nest
label_desc: Use image node_id 1 for calling the VariableSpecTest obj's underlying member method code with example usage: obj.test_properties() without return types