code: def test_column_matcher(
      warehouse_ctx: DataWarehouseInferenceContext,
  ) -> None:  # noqa: D
      class TestRule(ColumnMatcherRule):
          type_node = InferenceSignalType.DIMENSION.UNKNOWN
          confidence = InferenceSignalConfidence.MEDIUM
          match_reason = "test reason"
          only_applies_to_parent_signal = False
  
          def match_column(self, props: ColumnProperties) -> bool:
              return props.column.column_name.endswith("test_column")
  
      signals = TestRule().process(warehouse_ctx)
  
      assert len(signals) == 1
      assert signals[0].confidence == InferenceSignalConfidence.MEDIUM
      assert (
          signals[0].type_node == InferenceSignalType.DIMENSION.UNKNOWN
      )
      assert signals[0].column == SqlColumn.from_string(
          "db.schema.table.test_column"
      )
      assert signals[0].reason == "test reason"
      assert not signals[0].only_applies_to_parent
  
file_path: metricflow/metricflow/test/inference/rule/test_rules.py
imports: from __future__ import annotations
  from metricflow.dataflow.sql_column import SqlColumn
  from metricflow.dataflow.sql_table import SqlTable
  from metricflow.inference.context.data_warehouse import ColumnProperties, DataWarehouseInferenceContext, InferenceColumnType, TableProperties
  from metricflow.inference.models import InferenceSignalConfidence, InferenceSignalType
  from metricflow.inference.rule.rules import ColumnMatcherRule, LowCardinalityRatioRule
label_desc: Use image node_id 2 for calling a global function with example usage: test_column_matcher(warehouse_ctx) and returns: props