@@ -515,18 +515,13 @@ def test_qb_computed_02(self):
515515 self .assertEqual (res .name , "Alice" )
516516 self .assertEqual (res .nickname , "Little Alice" )
517517
518- @tb .xfail_unimplemented ('''
519- Needs casts. Issue #672.
520- Medium priority.
521- (We might do different syntax and need to change the test.)
522- ''' )
523518 def test_qb_computed_03 (self ):
524519 from models .orm_qb import default , std
525520
526521 res = self .client .get (
527522 default .User .select (
528523 name = True ,
529- nickname = lambda u : u .name + std .str (std .len (u .name )),
524+ nickname = lambda u : u .name + std .str . cast (std .len (u .name )),
530525 ).filter (name = "Alice" )
531526 )
532527 self .assertEqual (res .name , "Alice" )
@@ -895,11 +890,8 @@ def test_qb_filter_13(self):
895890 dana = default .User .filter (name = "Dana" )
896891 res = self .client .get (
897892 default .UserGroup .filter (
898- lambda g : std .count (
899- std .distinct (
900- std .union (g .users , dana )
901- )
902- ) == 3
893+ lambda g : std .count (std .distinct (std .union (g .users , dana )))
894+ == 3
903895 )
904896 )
905897 self .assertEqual (res .name , "green" )
@@ -1423,9 +1415,9 @@ def test_qb_update_04(self):
14231415 # Add Alice to the group
14241416 self .client .query (
14251417 default .UserGroup .filter (name = "blue" ).update (
1426- users = lambda g : std .assert_distinct (std . union (
1427- g .users , default .User .filter (name = "Alice" )
1428- ))
1418+ users = lambda g : std .assert_distinct (
1419+ std . union ( g .users , default .User .filter (name = "Alice" ) )
1420+ )
14291421 )
14301422 )
14311423
@@ -1539,3 +1531,134 @@ def test_qb_enum_edit_02(self):
15391531
15401532 self .assertEqual (e .color , default .Color .Violet )
15411533 self .assertEqual (e .name , "red" )
1534+
1535+ def test_qb_cast_scalar_01 (self ):
1536+ # scalar to scalar
1537+ from models .orm import std
1538+
1539+ result = self .client .get (std .str .cast (std .int64 (1 )))
1540+ self .assertEqual (result , "1" )
1541+
1542+ def test_qb_cast_scalar_02 (self ):
1543+ # enum to scalar
1544+ from models .orm import default , std
1545+
1546+ result = self .client .get (std .str .cast (default .Color .Red ))
1547+ self .assertEqual (result , "Red" )
1548+
1549+ def test_qb_cast_scalar_03 (self ):
1550+ # scalar to enum
1551+ from models .orm import default , std
1552+
1553+ result = self .client .get (default .Color .cast (std .str ("Red" )))
1554+ self .assertEqual (result , default .Color .Red )
1555+
1556+ def test_qb_cast_array_01 (self ):
1557+ # array[scalar] to array[scalar]
1558+ from models .orm import std
1559+
1560+ result = self .client .get (
1561+ std .array [std .str ].cast (
1562+ std .array [std .int64 ](
1563+ [std .int64 (1 ), std .int64 (2 ), std .int64 (3 )]
1564+ )
1565+ )
1566+ )
1567+ self .assertEqual (result , ["1" , "2" , "3" ])
1568+
1569+ def test_qb_cast_array_02 (self ):
1570+ # array[enum] to array[scalar]
1571+ from models .orm import default , std
1572+
1573+ result = self .client .get (
1574+ std .array [std .str ].cast (
1575+ std .array [default .Color ](
1576+ [
1577+ default .Color .Red ,
1578+ default .Color .Green ,
1579+ default .Color .Blue ,
1580+ ]
1581+ )
1582+ )
1583+ )
1584+ self .assertEqual (result , ["Red" , "Green" , "Blue" ])
1585+
1586+ def test_qb_cast_array_03 (self ):
1587+ # array[scalar] to array[enum]
1588+ from models .orm import default , std
1589+
1590+ result = self .client .get (
1591+ std .array [default .Color ].cast (
1592+ std .array [std .str ](
1593+ [std .str ("Red" ), std .str ("Green" ), std .str ("Blue" )]
1594+ )
1595+ )
1596+ )
1597+ self .assertEqual (
1598+ result ,
1599+ [default .Color .Red , default .Color .Green , default .Color .Blue ],
1600+ )
1601+
1602+ def test_qb_cast_array_04 (self ):
1603+ # array[tuple] to array[tuple]
1604+ from models .orm import default , std
1605+
1606+ result = self .client .get (
1607+ std .array [std .tuple [std .int64 , default .Color ]].cast (
1608+ std .array [std .tuple [std .str , std .str ]](
1609+ [
1610+ std .tuple [std .str , std .str ](
1611+ [std .str ("1" ), std .str ("Red" )]
1612+ ),
1613+ std .tuple [std .str , std .str ](
1614+ [std .str ("2" ), std .str ("Green" )]
1615+ ),
1616+ std .tuple [std .str , std .str ](
1617+ [std .str ("3" ), std .str ("Blue" )]
1618+ ),
1619+ ]
1620+ )
1621+ )
1622+ )
1623+ self .assertEqual (
1624+ result ,
1625+ [
1626+ (1 , default .Color .Red ),
1627+ (2 , default .Color .Green ),
1628+ (3 , default .Color .Blue ),
1629+ ],
1630+ )
1631+
1632+ def test_qb_cast_tuple_01 (self ):
1633+ # unnamed tuple to unnamed tuple
1634+ from models .orm import default , std
1635+
1636+ result = self .client .get (
1637+ std .tuple [
1638+ std .int64 , default .Color , std .str , std .array [std .int64 ]
1639+ ].cast (
1640+ std .tuple [std .str , std .str , default .Color , std .array [std .str ]](
1641+ (
1642+ std .str ("1" ),
1643+ std .str ("Red" ),
1644+ default .Color .Green ,
1645+ std .array [std .str ](
1646+ [std .str ("2" ), std .str ("3" ), std .str ("4" )]
1647+ ),
1648+ )
1649+ )
1650+ )
1651+ )
1652+ self .assertEqual (result , (1 , default .Color .Red , "Green" , [2 , 3 , 4 ]))
1653+
1654+ def test_qb_cast_range_01 (self ):
1655+ # range to range
1656+ from gel .datatypes import range as _range
1657+ from models .orm import std
1658+
1659+ result = self .client .get (
1660+ std .range [std .int64 ].cast (
1661+ std .range [std .int32 ](std .int32 (1 ), std .int32 (9 ))
1662+ )
1663+ )
1664+ self .assertEqual (result , _range .Range (std .int64 (1 ), std .int64 (9 )))
0 commit comments