code: def test_search(self):
      g = hl.Graph()
      a = hl.Node(uid="a", name="a", op="a")
      b = hl.Node(uid="b", name="b", op="b")
      c = hl.Node(uid="c", name="c", op="c")
      d = hl.Node(uid="d", name="d", op="d")
      g.add_node(a)
      g.add_node(b)
      g.add_node(c)
      g.add_node(d)
      g.add_edge(a, b)
      g.add_edge(b, c)
      g.add_edge(b, d)
  
      pattern = ge.GEParser("a > b").parse()
      match, following = g.search(pattern)
      self.assertCountEqual(match, [a, b])
      self.assertCountEqual(following, [c, d])
  
      pattern = ge.GEParser("b > (c | d)").parse()
      match, following = g.search(pattern)
      self.assertCountEqual(match, [b, c, d])
      self.assertEqual(following, [])
  
      pattern = ge.GEParser("c|d").parse()
      match, following = g.search(pattern)
      self.assertCountEqual(match, [c, d])
      self.assertEqual(following, [])
  
imports: import unittest
  import hiddenlayer
  import hiddenlayer.ge
  import hiddenlayer.transforms
label_desc: Use image node_id 2 for calling the TestPatterns obj's underlying member method code with example usage: obj.test_search() without return types