code: def test_generate_batches_random(self):
      data = [[i] * i for i in range(100, 0, -1)]
      random.shuffle(data)
      bucket_generator = BucketGenerator(
          lambda e: len(e),
          batch_size=2,
          buffer_size_batches=100,
          batches_to_bucket=10,
          shuffle=True,
          seed=42,
      )
      buckets_gen = bucket_generator(data)
      result = [el for el in buckets_gen]
  
      # check whether all elements are returned
      expected_elements = list(itertools.chain.from_iterable(data))
      expected_elements.sort()
      result_elements = list(itertools.chain.from_iterable(result))
      result_elements.sort()
      self.assertEqual(expected_elements, result_elements)
  
      # check whether sequences of similar length are bucketed together
      # -> compare sum of length difference within batches against non-bucketed data
      raw_total_length_diff = 0
      result_total_length_diff = 0
      for i in range(0, len(data), 2):
          first_seq_raw, second_seq_raw = data[i : i + 2]
          first_seq_bucket, second_seq_bucket = result[i : i + 2]
          raw_total_length_diff += abs(
              len(second_seq_raw) - len(first_seq_raw)
          )
          result_total_length_diff += abs(
              len(second_seq_bucket) - len(first_seq_bucket)
          )
      self.assertTrue(
          result_total_length_diff < raw_total_length_diff / 4
      )
  
imports: import itertools
  import random
  import unittest
  from headliner.preprocessing.bucket_generator import BucketGenerator
label_desc: Use image node_id 2 for calling the TestBucketGenerator obj's underlying member method code with example usage: obj.test_generate_batches_random() without return types