code: def check_properties_existence(
      model: HasProps, *props: list[str]
  ) -> None:
      expected = set(chain(PROPS, *props))
      found = set(model.properties())
      missing = expected.difference(found)
      extra = found.difference(expected)
      assert (
          len(missing) == 0
      ), f"Properties missing: {', '.join(sorted(missing))}"
      assert (
          len(extra) == 0
      ), f"Extra properties: {', '.join(sorted(extra))}"
  
file_path: bokeh/tests/unit/bokeh/models/_util_models.py
imports: from __future__ import annotations
  import pytest
  from itertools import chain
  from typing import TYPE_CHECKING
  from bokeh.core.enums import LineCap, LineJoin, NamedColor
  from bokeh.core.property.vectorization import value
label_desc: Use image node_id 2 for calling a global function with example usage: check_properties_existence(model) without return types