code: def test_crossproduct(self):
      s = util.SFrameComparer()
  
      d = {"opt1": [1, 2, 3], "opt2": ["a", "b"]}
      actual = glutil.crossproduct(d)
      actual = actual.sort("opt1")
      expected = SFrame(
          {
              "opt1": [1, 1, 2, 2, 3, 3],
              "opt2": ["a", "b", "a", "b", "a", "b"],
          }
      )
      # Check columns individually since there is no
      # guaranteed ordering among columns.
      for k in d.keys():
          s._assert_sarray_equal(actual[k], expected[k])
  
imports: from __future__ import print_function
  from __future__ import division
  from __future__ import absolute_import
  import os
  import unittest
  import tempfile
  import shutil
  import uuid
  import sys
  from ..None import util
  from ..None import SFrame, SArray, SGraph
  from ..util import get_turicreate_object_type
  from ..config import get_runtime_config, set_runtime_config
  from .None import util
  import pytest
label_desc: Use image node_id 2 for calling the UtilTests obj's underlying member method code with example usage: obj.test_crossproduct() without return types