code: def test_empty_extra_dims(self):
      msg = (
          "DataSetFamily must be defined with non-empty extra_dims,"
          " or with `_abstract = True`"
      )
      with assert_raises_str(ValueError, msg):
  
          class NoExtraDims(DataSetFamily):
              pass
  
      with assert_raises_str(ValueError, msg):
  
          class EmptyExtraDims(DataSetFamily):
              extra_dims = []
  
      class AbstractParent(DataSetFamily):
          _abstract = True
  
      with assert_raises_str(ValueError, msg):
  
          class NoExtraDimsChild(AbstractParent):
              pass
  
      with assert_raises_str(ValueError, msg):
  
          class EmptyExtraDimsChild(AbstractParent):
              extra_dims = []
  
      class AbstractChild(AbstractParent):
          _abstract = True
  
      class Child(AbstractParent):
          extra_dims = [
              ("dim_0", {"a", "b", "c"}),
              ("dim_1", {"d", "e", "f"}),
          ]
  
file_path: zipline/tests/pipeline/test_multidimensional_dataset.py
imports: from collections import OrderedDict
  import itertools
  from textwrap import dedent
  from nose_parameterized import parameterized
  import numpy
  from zipline.pipeline.data import Column, DataSetFamily, DataSetFamilySlice
  from zipline.testing import ZiplineTestCase
  from zipline.testing.predicates import assert_equal, assert_is, assert_is_not, assert_is_subclass, assert_raises_str
label_desc: Use image node_id 3 for calling the TestDataSetFamily obj's underlying member method code with example usage: obj.test_empty_extra_dims() without return types