code: def test_config_bad_combiner():
      config = {
          "input_features": [
              category_feature(
                  encoder={"type": "dense", "vocab_size": 2},
                  reduce_input="sum",
              ),
              number_feature(),
          ],
          "output_features": [binary_feature()],
          "combiner": {
              "type": "tabnet",
          },
      }
  
      # config is valid at this point
      check_schema(config)
  
      # combiner without type
      del config["combiner"]["type"]
      with pytest.raises(ConfigValidationError):
          check_schema(config)
  
      # bad combiner type
      config["combiner"]["type"] = "fake"
      with pytest.raises(ConfigValidationError):
          check_schema(config)
  
      # bad combiner format (list instead of dict)
      config["combiner"] = [{"type": "tabnet"}]
      with pytest.raises(ConfigValidationError):
          check_schema(config)
  
      # bad combiner parameter types
      config["combiner"] = {
          "type": "tabtransformer",
          "num_layers": 10,
          "dropout": False,
      }
      with pytest.raises(ConfigValidationError):
          check_schema(config)
  
      # bad combiner parameter range
      config["combiner"] = {
          "type": "transformer",
          "dropout": -1,
      }
      with pytest.raises(ConfigValidationError):
          check_schema(config)
  
file_path: ludwig/tests/ludwig/config_validation/test_validate_config_combiner.py
imports: import pytest
  from ludwig.config_validation.validation import check_schema, get_schema
  from ludwig.constants import MODEL_ECD, TRAINER
  from ludwig.error import ConfigValidationError
  from tests.integration_tests.utils import binary_feature, category_feature, number_feature
label_desc: Use image node_id 3 for calling a global function with example usage: test_config_bad_combiner() without return types