input: 
  def test_hash_table():
      """ Test the HashTable class with insert, retrieve, and delete operations.
      >>> ht = HashTable()
      >>> ht.insert("key1", "value1")
      >>> ht.insert("key2", "value2")
      >>> ht.retrieve("key1")
      'value1'
      >>> ht.retrieve("key2")
      'value2'
      >>> ht.delete("key1")
      >>> ht.retrieve("key1")
      """
      ht = HashTable()
      ht.insert("key1", "value1")
      ht.insert("key2", "value2")
      ht.retrieve("key1")  # should return 'value1'
      ht.retrieve("key2")  # should return 'value2'
      ht.delete("key1")
      ht.retrieve("key1")  # should return None
  
output:     
  class HashTable:
      def __init__(self):
          self.size = 10
          self.table = [[] for _ in range(self.size)]
  
      def _hash(self, key):
          return hash(key) % self.size
  
      def insert(self, key, value):
          hash_key = self._hash(key)
          bucket = self.table[hash_key]
          for i, (k, v) in enumerate(bucket):
              if k == key:
                  bucket[i] = (key, value)
                  return
          bucket.append((key, value))
  
      def retrieve(self, key):
          hash_key = self._hash(key)
          bucket = self.table[hash_key]
          for k, v in bucket:
              if k == key:
                  return v
          return None
  
      def delete(self, key):
          hash_key = self._hash(key)
          bucket = self.table[hash_key]
          for i, (k, v) in enumerate(bucket):
              if k == key:
                  del bucket[i]
                  return
  