code: def test_subscripts(self):
      a = QN("a")
      b = QN("b")
      a_sub_b = QN(a, subscript=b)
      self.assertEqual(a_sub_b.qn, (a, b))
      self.assertEqual(str(a_sub_b), "a[b]")
      self.assertEqual(a_sub_b.ssf(), "a_sub_b")
      self.assertEqual(a_sub_b.ast().value.id, "a")
      self.assertEqual(a_sub_b.ast().slice.id, "b")
      self.assertTrue(a_sub_b.is_composite())
      self.assertTrue(a_sub_b.has_subscript())
      self.assertEqual(a_sub_b.parent.qn, ("a",))
  
      c = QN("c")
      b_sub_c = QN(b, subscript=c)
      a_sub_b_sub_c = QN(a, subscript=b_sub_c)
      self.assertEqual(a_sub_b_sub_c.qn, (a, b_sub_c))
      self.assertTrue(a_sub_b_sub_c.is_composite())
      self.assertTrue(a_sub_b_sub_c.has_subscript())
      self.assertEqual(b_sub_c.qn, (b, c))
      self.assertEqual(str(a_sub_b_sub_c), "a[b[c]]")
      self.assertEqual(a_sub_b_sub_c.ssf(), "a_sub_b_sub_c")
      self.assertEqual(a_sub_b_sub_c.ast().value.id, "a")
      self.assertEqual(a_sub_b_sub_c.ast().slice.value.id, "b")
      self.assertEqual(a_sub_b_sub_c.ast().slice.slice.id, "c")
      self.assertEqual(b_sub_c.ast().slice.id, "c")
      self.assertEqual(a_sub_b_sub_c.parent.qn, ("a",))
      with self.assertRaises(ValueError):
          QN("a", "b")
  
imports: import textwrap
  import unittest
  from nvidia.dali._autograph.pyct import anno
  from nvidia.dali._autograph.pyct import parser
  from nvidia.dali._autograph.pyct import qual_names
  from nvidia.dali._autograph.pyct.qual_names import QN
  from nvidia.dali._autograph.pyct.qual_names import resolve
label_desc: Use image node_id 3 for calling the QNTest obj's underlying member method code with example usage: obj.test_subscripts() without return types