code: def test_message_fingerprint_includes_data_and_features(
      whitespace_tokenizer: WhitespaceTokenizer,
  ):
      message = Message(data={TEXT: "This is a test sentence."})
      fp1 = message.fingerprint()
      whitespace_tokenizer.process([message])
      fp2 = message.fingerprint()
  
      assert fp1 != fp2
  
      message.add_features(
          Features(
              scipy.sparse.csr_matrix([1, 1, 0]),
              FEATURE_TYPE_SEQUENCE,
              TEXT,
              "c2",
          )
      )
  
      fp3 = message.fingerprint()
      assert fp2 != fp3
  
      message.add_features(
          Features(
              np.ndarray([1, 2, 2]), FEATURE_TYPE_SEQUENCE, TEXT, "c1"
          )
      )
  
      fp4 = message.fingerprint()
  
      assert fp3 != fp4
  
      assert len({fp1, fp2, fp3, fp4}) == 4
  
file_path: rasa/tests/shared/nlu/training_data/test_message.py
imports: from typing import Optional, Text, List
  import pytest
  import numpy
  import scipy.sparse
  from rasa.shared.nlu.training_data.features import Features
  from rasa.shared.nlu.constants import TEXT, FEATURE_TYPE_SENTENCE, FEATURE_TYPE_SEQUENCE, ACTION_TEXT, ACTION_NAME, INTENT, RESPONSE
  from rasa.shared.nlu.training_data.message import Message
  from rasa.nlu.tokenizers.whitespace_tokenizer import WhitespaceTokenizer
label_desc: Use image node_id 7 for calling a global function with example usage: test_message_fingerprint_includes_data_and_features(whitespace_tokenizer) without return types