@@ -106,6 +106,10 @@ public class ParserTest {
106
106
107
107
private static final String MODULE_LITERAL_NO_OUTPUT_WITH_NUM_ANSWER_SETS = "a(X) :- #something{4}[X]." ;
108
108
109
+ private static final String LIST_AGGREGATE = "stuff_list(LST) :- LST = #list{X : stuff(X)}." ;
110
+
111
+ private static final String LIST_AGGREGATE_TUPLE = "stuff_list(LST) :- LST = #list{stuff_tuple(X,Y) : stuff(X,Y)}." ;
112
+
109
113
private final ProgramParserImpl parser = new ProgramParserImpl ();
110
114
111
115
@ Test
@@ -499,4 +503,48 @@ public void moduleLiteralNoOutputWithNumAnswerSets() {
499
503
assertEquals (4 , moduleLiteral .getAtom ().getInstantiationMode ().requestedAnswerSets ().get ());
500
504
}
501
505
506
+ @ Test
507
+ public void listAggregate () {
508
+ InputProgram prog = parser .parse (LIST_AGGREGATE );
509
+ assertEquals (1 , prog .getRules ().size ());
510
+ Rule <?> rule = prog .getRules ().get (0 );
511
+ assertEquals (1 , rule .getBody ().size ());
512
+ assertEquals (1 , rule .getBody ().stream ().filter (lit -> lit instanceof AggregateLiteral ).count ());
513
+ AggregateLiteral aggregateLiteral = (AggregateLiteral ) rule .getBody ().stream ().filter (lit -> lit instanceof AggregateLiteral ).findFirst ().get ();
514
+ AggregateAtom aggregateAtom = aggregateLiteral .getAtom ();
515
+ assertEquals (ComparisonOperators .EQ , aggregateAtom .getLowerBoundOperator ());
516
+ assertEquals (Terms .newVariable ("LST" ), aggregateAtom .getLowerBoundTerm ());
517
+ assertEquals (AggregateAtom .AggregateFunctionSymbol .LIST , aggregateAtom .getAggregateFunction ());
518
+ assertEquals (1 , aggregateAtom .getAggregateElements ().size ());
519
+ AggregateAtom .AggregateElement aggregateElement = aggregateAtom .getAggregateElements ().get (0 );
520
+ assertEquals (1 , aggregateElement .getElementTerms ().size ());
521
+ Term elementTerm = aggregateElement .getElementTerms ().get (0 );
522
+ assertEquals (Terms .newVariable ("X" ), elementTerm );
523
+ assertEquals (1 , aggregateElement .getElementLiterals ().size ());
524
+ Literal elementLiteral = aggregateElement .getElementLiterals ().get (0 );
525
+ assertEquals (Atoms .newBasicAtom (Predicates .getPredicate ("stuff" , 1 ), Terms .newVariable ("X" )).toLiteral (), elementLiteral );
526
+ }
527
+
528
+ @ Test
529
+ public void listAggregateWithTuples () {
530
+ InputProgram prog = parser .parse (LIST_AGGREGATE_TUPLE );
531
+ assertEquals (1 , prog .getRules ().size ());
532
+ Rule <?> rule = prog .getRules ().get (0 );
533
+ assertEquals (1 , rule .getBody ().size ());
534
+ assertEquals (1 , rule .getBody ().stream ().filter (lit -> lit instanceof AggregateLiteral ).count ());
535
+ AggregateLiteral aggregateLiteral = (AggregateLiteral ) rule .getBody ().stream ().filter (lit -> lit instanceof AggregateLiteral ).findFirst ().get ();
536
+ AggregateAtom aggregateAtom = aggregateLiteral .getAtom ();
537
+ assertEquals (ComparisonOperators .EQ , aggregateAtom .getLowerBoundOperator ());
538
+ assertEquals (Terms .newVariable ("LST" ), aggregateAtom .getLowerBoundTerm ());
539
+ assertEquals (AggregateAtom .AggregateFunctionSymbol .LIST , aggregateAtom .getAggregateFunction ());
540
+ assertEquals (1 , aggregateAtom .getAggregateElements ().size ());
541
+ AggregateAtom .AggregateElement aggregateElement = aggregateAtom .getAggregateElements ().get (0 );
542
+ assertEquals (1 , aggregateElement .getElementTerms ().size ());
543
+ Term elementTerm = aggregateElement .getElementTerms ().get (0 );
544
+ assertEquals (Terms .newFunctionTerm ("stuff_tuple" , Terms .newVariable ("X" ), Terms .newVariable ("Y" )), elementTerm );
545
+ assertEquals (1 , aggregateElement .getElementLiterals ().size ());
546
+ Literal elementLiteral = aggregateElement .getElementLiterals ().get (0 );
547
+ assertEquals (Atoms .newBasicAtom (Predicates .getPredicate ("stuff" , 2 ), Terms .newVariable ("X" ), Terms .newVariable ("Y" )).toLiteral (), elementLiteral );
548
+ }
549
+
502
550
}
0 commit comments