def test_var_dims(self): self.assertEqual(parse('var * bool', self.sym), ct.DataShape(ct.Var(), ct.bool_)) self.assertEqual(parse('var * var * bool', self.sym), ct.DataShape(ct.Var(), ct.Var(), ct.bool_)) self.assertEqual(parse('M * 5 * var * bool', self.sym), ct.DataShape(ct.TypeVar('M'), ct.Fixed(5), ct.Var(), ct.bool_))
def test_typevar_dims(self): self.assertEqual(parse('M * bool', self.sym), ct.DataShape(ct.TypeVar('M'), ct.bool_)) self.assertEqual(parse('A * B * bool', self.sym), ct.DataShape(ct.TypeVar('A'), ct.TypeVar('B'), ct.bool_)) self.assertEqual(parse('A... * X * 3 * bool', self.sym), ct.DataShape(ct.Ellipsis(ct.TypeVar('A')), ct.TypeVar('X'), ct.Fixed(3), ct.bool_))
def test_ellipses(self): self.assertEqual(parse('... * bool', self.sym), ct.DataShape(ct.Ellipsis(), ct.bool_)) self.assertEqual(parse('M * ... * bool', self.sym), ct.DataShape(ct.TypeVar('M'), ct.Ellipsis(), ct.bool_)) self.assertEqual(parse('M * ... * 3 * bool', self.sym), ct.DataShape(ct.TypeVar('M'), ct.Ellipsis(), ct.Fixed(3), ct.bool_))
def test_unsigned_integers(self): self.assertEqual(parse('uint8', self.sym), ct.DataShape(ct.uint8)) self.assertEqual(parse('uint16', self.sym), ct.DataShape(ct.uint16)) self.assertEqual(parse('uint32', self.sym), ct.DataShape(ct.uint32)) self.assertEqual(parse('uint64', self.sym), ct.DataShape(ct.uint64)) #self.assertEqual(parse('uint128', self.sym), # ct.DataShape(ct.uint128)) self.assertEqual(parse('uintptr', self.sym), ct.DataShape(ct.uintptr))
def test_complex(self): self.assertEqual(parse('complex[float32]', self.sym), ct.DataShape(ct.complex_float32)) self.assertEqual(parse('complex[float64]', self.sym), ct.DataShape(ct.complex_float64)) self.assertEqual(parse('complex', self.sym), ct.DataShape(ct.complex_)) # 'complex' is an alias for 'complex[float64]' self.assertEqual(parse('complex', self.sym), parse('complex[float64]', self.sym))
def test_float(self): self.assertEqual(parse('float16', self.sym), ct.DataShape(ct.float16)) self.assertEqual(parse('float32', self.sym), ct.DataShape(ct.float32)) self.assertEqual(parse('float64', self.sym), ct.DataShape(ct.float64)) # self.assertEqual(parse('float128', self.sym), # ct.DataShape(ct.float128)) self.assertEqual(parse('real', self.sym), ct.DataShape(ct.real)) # 'real' is an alias for 'float64' self.assertEqual(parse('real', self.sym), parse('float64', self.sym))
def test_fixed_dims(self): self.assertEqual(parse('3 * bool', self.sym), ct.DataShape(ct.Fixed(3), ct.bool_)) self.assertEqual(parse('7 * 3 * bool', self.sym), ct.DataShape(ct.Fixed(7), ct.Fixed(3), ct.bool_)) self.assertEqual(parse('5 * 3 * 12 * bool', self.sym), ct.DataShape(ct.Fixed(5), ct.Fixed(3), ct.Fixed(12), ct.bool_)) self.assertEqual(parse('2 * 3 * 4 * 5 * bool', self.sym), ct.DataShape(ct.Fixed(2), ct.Fixed(3), ct.Fixed(4), ct.Fixed(5), ct.bool_))
def test_tuple(self): # Simple tuple self.assertEqual(parse('(float32)', self.sym), ct.DataShape(ct.Tuple([ct.DataShape(ct.float32)]))) self.assertEqual(parse('(int16, int32)', self.sym), ct.DataShape(ct.Tuple([ct.DataShape(ct.int16), ct.DataShape(ct.int32)]))) # A trailing comma is ok self.assertEqual(parse('(float32,)', self.sym), ct.DataShape(ct.Tuple([ct.DataShape(ct.float32)]))) self.assertEqual(parse('(int16, int32,)', self.sym), ct.DataShape(ct.Tuple([ct.DataShape(ct.int16), ct.DataShape(ct.int32)])))
def assertExpectedParse(ds_str, expected): # Set the expected value, and call the parser expected_blah[0] = expected self.assertEqual(parse(ds_str, sym), ct.DataShape(ct.float32)) # Make sure the expected value was actually run by # check that it reset the expected value to None self.assertEqual(expected_blah[0], None, 'The test unary type constructor did not run')
def test_binary_dtype_constr(self): # Create a symbol table with no types in it, so we can # make some isolated type constructors for testing sym = datashape.TypeSymbolTable(bare=True) # A limited set of dtypes for testing sym.dtype['int8'] = ct.int8 sym.dtype['uint16'] = ct.uint16 sym.dtype['float64'] = ct.float64 # TypeVar type constructor sym.dtype_constr['typevar'] = ct.TypeVar # Binary dtype constructor that asserts on the argument values expected_arg = [None, None] def _binary_type_constr(a, b): self.assertEqual(a, expected_arg[0]) self.assertEqual(b, expected_arg[1]) expected_arg[0] = None expected_arg[1] = None return ct.float32 sym.dtype_constr['binary'] = _binary_type_constr def assertExpectedParse(ds_str, expected_a, expected_b): # Set the expected value, and call the parser expected_arg[0] = expected_a expected_arg[1] = expected_b self.assertEqual(parse(ds_str, sym), ct.DataShape(ct.float32)) # Make sure the expected value was actually run by # check that it reset the expected value to None self.assertEqual(expected_arg, [None, None], 'The test binary type constructor did not run') # Positional args assertExpectedParse('binary[1, 0]', 1, 0) assertExpectedParse('binary[0, "test"]', 0, 'test') assertExpectedParse('binary[int8, "test"]', ct.DataShape(ct.int8), 'test') assertExpectedParse('binary[[1,3,5], "test"]', [1, 3, 5], 'test') # Positional and keyword args assertExpectedParse('binary[0, b=1]', 0, 1) assertExpectedParse('binary["test", b=A]', 'test', ct.DataShape(ct.TypeVar('A'))) assertExpectedParse('binary[[3, 6], b=int8]', [3, 6], ct.DataShape(ct.int8)) assertExpectedParse('binary[Arg, b=["x", "test"]]', ct.DataShape(ct.TypeVar('Arg')), ['x', 'test']) # Keyword args assertExpectedParse('binary[a=1, b=0]', 1, 0) assertExpectedParse('binary[a=[int8, A, uint16], b="x"]', [ ct.DataShape(ct.int8), ct.DataShape(ct.TypeVar('A')), ct.DataShape(ct.uint16) ], 'x')
def test_signed_integers(self): self.assertEqual(parse('int8', self.sym), ct.DataShape(ct.int8)) self.assertEqual(parse('int16', self.sym), ct.DataShape(ct.int16)) self.assertEqual(parse('int32', self.sym), ct.DataShape(ct.int32)) self.assertEqual(parse('int64', self.sym), ct.DataShape(ct.int64)) #self.assertEqual(parse('int128', self.sym), # ct.DataShape(ct.int128)) self.assertEqual(parse('int', self.sym), ct.DataShape(ct.int_)) # 'int' is an alias for 'int32' self.assertEqual(parse('int', self.sym), parse('int32', self.sym)) self.assertEqual(parse('intptr', self.sym), ct.DataShape(ct.intptr))
def test_option(self): self.assertEqual(parse('option[int32]', self.sym), ct.DataShape(ct.Option(ct.int32))) self.assertEqual(parse('?int32', self.sym), ct.DataShape(ct.Option(ct.int32))) self.assertEqual( parse('2 * 3 * option[int32]', self.sym), ct.DataShape(ct.Fixed(2), ct.Fixed(3), ct.Option(ct.int32))) self.assertEqual( parse('2 * 3 * ?int32', self.sym), ct.DataShape(ct.Fixed(2), ct.Fixed(3), ct.Option(ct.int32))) self.assertEqual( parse('2 * option[3 * int32]', self.sym), ct.DataShape(ct.Fixed(2), ct.Option(ct.DataShape(ct.Fixed(3), ct.int32)))) self.assertEqual( parse('2 * ?3 * int32', self.sym), ct.DataShape(ct.Fixed(2), ct.Option(ct.DataShape(ct.Fixed(3), ct.int32))))
def test_null(self): self.assertEqual(parse('null', self.sym), ct.DataShape(ct.null))
def test_struct(self): # Simple struct self.assertEqual( parse('{x: int16, y: int32}', self.sym), ct.DataShape( ct.Record([('x', ct.DataShape(ct.int16)), ('y', ct.DataShape(ct.int32))]))) # A trailing comma is ok self.assertEqual( parse('{x: int16, y: int32,}', self.sym), ct.DataShape( ct.Record([('x', ct.DataShape(ct.int16)), ('y', ct.DataShape(ct.int32))]))) # Field names starting with _ and caps self.assertEqual( parse('{_x: int16, Zed: int32,}', self.sym), ct.DataShape( ct.Record([('_x', ct.DataShape(ct.int16)), ('Zed', ct.DataShape(ct.int32))]))) # A slightly bigger example ds_str = """3 * var * { id : int32, name : string, description : { language : string, text : string }, entries : var * { date : date, text : string } }""" int32 = ct.DataShape(ct.int32) string = ct.DataShape(ct.string) date = ct.DataShape(ct.date_) ds = (ct.Fixed(3), ct.Var(), ct.Record([ ('id', int32), ('name', string), ('description', ct.DataShape( ct.Record([('language', string), ('text', string)]))), ('entries', ct.DataShape(ct.Var(), ct.Record([('date', date), ('text', string)]))) ])) self.assertEqual(parse(ds_str, self.sym), ct.DataShape(*ds))
def test_bool(self): self.assertEqual(parse('bool', self.sym), ct.DataShape(ct.bool_))
def test_funcproto(sym): # Simple funcproto assert (parse('(float32) -> float64', sym) == ct.DataShape( ct.Function(ct.DataShape(ct.float32), ct.DataShape(ct.float64)))) assert (parse('(int16, int32) -> bool', sym) == ct.DataShape( ct.Function(ct.DataShape(ct.int16), ct.DataShape(ct.int32), ct.DataShape(ct.bool_)))) # A trailing comma is ok assert (parse('(float32,) -> float64', sym) == ct.DataShape( ct.Function(ct.DataShape(ct.float32), ct.DataShape(ct.float64)))) assert_dshape_equal( parse('(int16, int32,) -> bool', sym), ct.DataShape( ct.Function(ct.DataShape(ct.int16), ct.DataShape(ct.int32), ct.DataShape(ct.bool_)))) # Empty argument signature. assert_dshape_equal(parse('() -> bool', sym), ct.DataShape(ct.Function(ct.DataShape(ct.bool_), )))
def test_funcproto(sym): # Simple funcproto assert (parse('(float32) -> float64', sym) == ct.DataShape( ct.Function(ct.DataShape(ct.float32), ct.DataShape(ct.float64)))) assert (parse('(int16, int32) -> bool', sym) == ct.DataShape( ct.Function(ct.DataShape(ct.int16), ct.DataShape(ct.int32), ct.DataShape(ct.bool_)))) # A trailing comma is ok assert (parse('(float32,) -> float64', sym) == ct.DataShape( ct.Function(ct.DataShape(ct.float32), ct.DataShape(ct.float64)))) assert (parse('(int16, int32,) -> bool', sym) == ct.DataShape( ct.Function(ct.DataShape(ct.int16), ct.DataShape(ct.int32), ct.DataShape(ct.bool_))))
def test_funcproto(self): # Simple funcproto self.assertEqual( parse('(float32) -> float64', self.sym), ct.DataShape( ct.Function(ct.DataShape(ct.float32), ct.DataShape(ct.float64)))) self.assertEqual( parse('(int16, int32) -> bool', self.sym), ct.DataShape( ct.Function(ct.DataShape(ct.int16), ct.DataShape(ct.int32), ct.DataShape(ct.bool_)))) # A trailing comma is ok self.assertEqual( parse('(float32,) -> float64', self.sym), ct.DataShape( ct.Function(ct.DataShape(ct.float32), ct.DataShape(ct.float64)))) self.assertEqual( parse('(int16, int32,) -> bool', self.sym), ct.DataShape( ct.Function(ct.DataShape(ct.int16), ct.DataShape(ct.int32), ct.DataShape(ct.bool_))))
def test_void(self): self.assertEqual(parse('void', self.sym), ct.DataShape(ct.void))
def test_unary_dtype_constr(self): # Create a symbol table with no types in it, so we can # make some isolated type constructors for testing sym = datashape.TypeSymbolTable(bare=True) # A limited set of dtypes for testing sym.dtype['int8'] = ct.int8 sym.dtype['uint16'] = ct.uint16 sym.dtype['float64'] = ct.float64 # TypeVar type constructor sym.dtype_constr['typevar'] = ct.TypeVar # Unary dtype constructor that asserts on the argument value expected_blah = [None] def _unary_type_constr(blah): self.assertEqual(blah, expected_blah[0]) expected_blah[0] = None return ct.float32 sym.dtype_constr['unary'] = _unary_type_constr def assertExpectedParse(ds_str, expected): # Set the expected value, and call the parser expected_blah[0] = expected self.assertEqual(parse(ds_str, sym), ct.DataShape(ct.float32)) # Make sure the expected value was actually run by # check that it reset the expected value to None self.assertEqual(expected_blah[0], None, 'The test unary type constructor did not run') # Integer parameter (positional) assertExpectedParse('unary[0]', 0) assertExpectedParse('unary[100000]', 100000) # String parameter (positional) assertExpectedParse('unary["test"]', 'test') assertExpectedParse("unary['test']", 'test') assertExpectedParse('unary["\\uc548\\ub155"]', u'\uc548\ub155') assertExpectedParse(u'unary["\uc548\ub155"]', u'\uc548\ub155') # DataShape parameter (positional) assertExpectedParse('unary[int8]', ct.DataShape(ct.int8)) assertExpectedParse('unary[X]', ct.DataShape(ct.TypeVar('X'))) # Empty list parameter (positional) assertExpectedParse('unary[[]]', []) # List of integers parameter (positional) assertExpectedParse('unary[[0, 3, 12]]', [0, 3, 12]) # List of strings parameter (positional) assertExpectedParse('unary[["test", "one", "two"]]', ["test", "one", "two"]) # List of datashapes parameter (positional) assertExpectedParse('unary[[float64, int8, uint16]]', [ ct.DataShape(ct.float64), ct.DataShape(ct.int8), ct.DataShape(ct.uint16) ]) # Integer parameter (keyword) assertExpectedParse('unary[blah=0]', 0) assertExpectedParse('unary[blah=100000]', 100000) # String parameter (keyword) assertExpectedParse('unary[blah="test"]', 'test') assertExpectedParse("unary[blah='test']", 'test') assertExpectedParse('unary[blah="\\uc548\\ub155"]', u'\uc548\ub155') assertExpectedParse(u'unary[blah="\uc548\ub155"]', u'\uc548\ub155') # DataShape parameter (keyword) assertExpectedParse('unary[blah=int8]', ct.DataShape(ct.int8)) assertExpectedParse('unary[blah=X]', ct.DataShape(ct.TypeVar('X'))) # Empty list parameter (keyword) assertExpectedParse('unary[blah=[]]', []) # List of integers parameter (keyword) assertExpectedParse('unary[blah=[0, 3, 12]]', [0, 3, 12]) # List of strings parameter (keyword) assertExpectedParse('unary[blah=["test", "one", "two"]]', ["test", "one", "two"]) # List of datashapes parameter (keyword) assertExpectedParse('unary[blah=[float64, int8, uint16]]', [ ct.DataShape(ct.float64), ct.DataShape(ct.int8), ct.DataShape(ct.uint16) ])
def test_object(self): self.assertEqual(parse('object', self.sym), ct.DataShape(ct.object_))