@@ -1463,3 +1463,187 @@ func TestNegationExpression(t *testing.T) {
14631463 })
14641464 }
14651465}
1466+
1467+ func TestUnionExpression (t * testing.T ) {
1468+ testCases := []struct {
1469+ name string
1470+ expr * expr.UnionExpression
1471+ want system.Collection
1472+ wantErr error
1473+ }{
1474+ {
1475+ name : "unions two distinct collections" ,
1476+ expr : & expr.UnionExpression {
1477+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1478+ Right : exprtest .Return (system .Integer (3 ), system .Integer (4 )),
1479+ },
1480+ want : system.Collection {system .Integer (1 ), system .Integer (2 ), system .Integer (3 ), system .Integer (4 )},
1481+ },
1482+ {
1483+ name : "unions two collections with overlap" ,
1484+ expr : & expr.UnionExpression {
1485+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1486+ Right : exprtest .Return (system .Integer (2 ), system .Integer (3 )),
1487+ },
1488+ want : system.Collection {system .Integer (1 ), system .Integer (2 ), system .Integer (3 )},
1489+ },
1490+ {
1491+ name : "unions with an empty collection" ,
1492+ expr : & expr.UnionExpression {
1493+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1494+ Right : exprtest .Return (),
1495+ },
1496+ want : system.Collection {system .Integer (1 ), system .Integer (2 )},
1497+ },
1498+ {
1499+ name : "unions two empty collections" ,
1500+ expr : & expr.UnionExpression {
1501+ Left : exprtest .Return (),
1502+ Right : exprtest .Return (),
1503+ },
1504+ want : system.Collection {},
1505+ },
1506+ {
1507+ name : "propagates error from left expression" ,
1508+ expr : & expr.UnionExpression {
1509+ Left : exprtest .Error (errMock ),
1510+ Right : exprtest .Return (system .Integer (1 )),
1511+ },
1512+ wantErr : errMock ,
1513+ },
1514+ {
1515+ name : "propagates error from right expression" ,
1516+ expr : & expr.UnionExpression {
1517+ Left : exprtest .Return (system .Integer (1 )),
1518+ Right : exprtest .Error (errMock ),
1519+ },
1520+ wantErr : errMock ,
1521+ },
1522+ }
1523+
1524+ for _ , tc := range testCases {
1525+ t .Run (tc .name , func (t * testing.T ) {
1526+ got , err := tc .expr .Evaluate (& expr.Context {}, system.Collection {})
1527+
1528+ if ! errors .Is (err , tc .wantErr ) {
1529+ t .Fatalf ("UnionExpression.Evaluate returned unexpected error: got %v, want %v" , err , tc .wantErr )
1530+ }
1531+ if diff := cmp .Diff (tc .want , got , protocmp .Transform ()); diff != "" {
1532+ t .Errorf ("UnionExpression.Evaluate returned unexpected diff: (-want, +got)\n %s" , diff )
1533+ }
1534+ })
1535+ }
1536+ }
1537+
1538+ func TestMembershipExpression (t * testing.T ) {
1539+ testCases := []struct {
1540+ name string
1541+ expr * expr.MembershipExpression
1542+ want system.Collection
1543+ wantErr error
1544+ }{
1545+ {
1546+ name : "item is in collection" ,
1547+ expr : & expr.MembershipExpression {
1548+ Left : exprtest .Return (system .Integer (1 )),
1549+ Right : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1550+ Operator : expr .In ,
1551+ },
1552+ want : system.Collection {system .Boolean (true )},
1553+ },
1554+ {
1555+ name : "item is not in collection" ,
1556+ expr : & expr.MembershipExpression {
1557+ Left : exprtest .Return (system .Integer (3 )),
1558+ Right : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1559+ Operator : expr .In ,
1560+ },
1561+ want : system.Collection {system .Boolean (false )},
1562+ },
1563+ {
1564+ name : "left operand is empty" ,
1565+ expr : & expr.MembershipExpression {
1566+ Left : exprtest .Return (),
1567+ Right : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1568+ Operator : expr .In ,
1569+ },
1570+ want : system.Collection {},
1571+ },
1572+ {
1573+ name : "left operand is not a singleton" ,
1574+ expr : & expr.MembershipExpression {
1575+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1576+ Right : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1577+ Operator : expr .In ,
1578+ },
1579+ wantErr : expr .ErrNotSingleton ,
1580+ },
1581+ {
1582+ name : "collection contains item" ,
1583+ expr : & expr.MembershipExpression {
1584+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1585+ Right : exprtest .Return (system .Integer (1 )),
1586+ Operator : expr .Contains ,
1587+ },
1588+ want : system.Collection {system .Boolean (true )},
1589+ },
1590+ {
1591+ name : "collection does not contain item" ,
1592+ expr : & expr.MembershipExpression {
1593+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1594+ Right : exprtest .Return (system .Integer (3 )),
1595+ Operator : expr .Contains ,
1596+ },
1597+ want : system.Collection {system .Boolean (false )},
1598+ },
1599+ {
1600+ name : "right operand is empty" ,
1601+ expr : & expr.MembershipExpression {
1602+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1603+ Right : exprtest .Return (),
1604+ Operator : expr .Contains ,
1605+ },
1606+ want : system.Collection {},
1607+ },
1608+ {
1609+ name : "right operand is not a singleton" ,
1610+ expr : & expr.MembershipExpression {
1611+ Left : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1612+ Right : exprtest .Return (system .Integer (1 ), system .Integer (2 )),
1613+ Operator : expr .Contains ,
1614+ },
1615+ wantErr : expr .ErrNotSingleton ,
1616+ },
1617+ {
1618+ name : "propagates error from left expression" ,
1619+ expr : & expr.MembershipExpression {
1620+ Left : exprtest .Error (errMock ),
1621+ Right : exprtest .Return (system .Integer (1 )),
1622+ Operator : expr .In ,
1623+ },
1624+ wantErr : errMock ,
1625+ },
1626+ {
1627+ name : "propagates error from right expression" ,
1628+ expr : & expr.MembershipExpression {
1629+ Left : exprtest .Return (system .Integer (1 )),
1630+ Right : exprtest .Error (errMock ),
1631+ Operator : expr .In ,
1632+ },
1633+ wantErr : errMock ,
1634+ },
1635+ }
1636+
1637+ for _ , tc := range testCases {
1638+ t .Run (tc .name , func (t * testing.T ) {
1639+ got , err := tc .expr .Evaluate (& expr.Context {}, system.Collection {})
1640+
1641+ if ! errors .Is (err , tc .wantErr ) {
1642+ t .Fatalf ("MembershipExpression.Evaluate returned unexpected error: got %v, want %v" , err , tc .wantErr )
1643+ }
1644+ if diff := cmp .Diff (tc .want , got ); diff != "" {
1645+ t .Errorf ("MembershipExpression.Evaluate returned unexpected diff: (-want, +got)\n %s" , diff )
1646+ }
1647+ })
1648+ }
1649+ }
0 commit comments