class_docstr: Test individual steps for 2-hop
class_docstr_tok: ["Test","individual","steps","for","2-hop"]
code: def test_hop_chain_2_end(self):
      g = chain_graph()
  
      g_out_nodes_hop = []
      g_out_nodes = []
      g_out_edges = []
  
      g3_forward = g.hop(
          nodes=pd.DataFrame({"n": ["d"]}),
          hops=2,
          to_fixed_point=False,
          direction="forward",
          source_node_match=None,
          edge_match=None,
          destination_node_match=None,
          return_as_wave_front=True,
      )
      compare_graphs(g3_forward, g_out_nodes_hop, g_out_edges)
  
      # source _node_match would require each hop to start with {'n': 'd'}
      # g3_forward_triple = g.chain([
      #    e_forward({}, source_node_match={'n': 'd'}, hops=2)
      # ])
      # compare_graphs(g3_forward_triple, g_out_nodes, g_out_edges)
  
      g3_forward_chain = g.chain([n({"n": "d"}), e_forward({}, hops=2)])
      compare_graphs(g3_forward_chain, g_out_nodes, g_out_edges)
  
      g3_forward_chain_closed = g.chain(
          [n({"n": "d"}), e_forward({}, hops=2), n({})]
      )
      compare_graphs(g3_forward_chain_closed, g_out_nodes, g_out_edges)
  
imports: from functools import lru_cache
  from typing import Dict, List
  import logging
  import pandas
  from common import NoAuthTestCase
  from graphistry.compute.ast import n, e_forward, e_reverse, e_undirected, is_in
  from graphistry.tests.test_compute import CGFull
  from graphistry.tests.test_compute_hops import hops_graph
  from graphistry.util import setup_logger
label_desc: Use image node_id 4 for calling the TestComputeChainWavefront2Mixin obj's underlying member method code with example usage: obj.test_hop_chain_2_end() without return types