Skip to content

Commit

Permalink
Merge pull request #132 from maximilian-glumann/issue104-propositiona…
Browse files Browse the repository at this point in the history
…l-formula-parser-test

Add PropositionalFormulaParserTest
  • Loading branch information
pmbittner authored Mar 21, 2024
2 parents 0cb2cca + 4ab8d21 commit 56abb9c
Showing 1 changed file with 83 additions and 0 deletions.
83 changes: 83 additions & 0 deletions src/test/java/PropositionalFormulaParserTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.prop4j.And;
import org.prop4j.Literal;
import org.prop4j.Node;
import org.prop4j.Or;
import org.variantsync.diffdetective.feature.PropositionalFormulaParser;

import java.util.List;

import static org.variantsync.diffdetective.util.Assert.assertEquals;

/**
* Class containing tests of the parsing behaviour for the default implementation of PropositionalFormulaParser.
* Goal: Special characters that occur in the output of a DiffLineFormulaExtractor must not confuse the parsing process of the PropositionalFormulaParser.
* It is not designed to extensively test the functionality of the PropositionalFormulaParser itself as this is expected to be done by FeatureIDE already.
*
* @author Maximilian Glumann
*/
public class PropositionalFormulaParserTest {
private record TestCase(String formula, Node expected) {
}

/**
* These test cases are based on a subset of the CPPParserTest test cases.
* It is not necessary to keep all test cases from CPPParserTest as most of them result in a single but long Literal anyway.
*/
private static List<TestCase> testCases() {
return List.of(
new TestCase("A", new Literal("A")),
new TestCase("!(A)", new Literal("A", false)),
new TestCase("!A", new Literal("A", false)),

new TestCase("A&&B", new And(new Literal("A"), new Literal("B"))),
new TestCase("A||B", new Or(new Literal("A"), new Literal("B"))),
new TestCase("A&&(B||C)", new And(new Literal("A"), new Or(new Literal("B"), new Literal("C")))),
new TestCase("A&&B||C", new Or(new And(new Literal("A"), new Literal("B")), new Literal("C"))),

new TestCase("A__GEQ__B&&C__GT__D", new And(new Literal("A__GEQ__B"), new Literal("C__GT__D"))),
new TestCase("DEFINED___LB__A__RB__&&__LB__B__MUL__2__RB____GT__C", new And(new Literal("DEFINED___LB__A__RB__"), new Literal("__LB__B__MUL__2__RB____GT__C"))),
new TestCase("(STDC__EQ__1)&&(DEFINED___LB__LARGE__RB__||DEFINED___LB__COMPACT__RB__)", new And(new Literal("STDC__EQ__1"), new Or(new Literal("DEFINED___LB__LARGE__RB__"), new Literal("DEFINED___LB__COMPACT__RB__")))),
new TestCase("APR_CHARSET_EBCDIC&&!(__LB____SQUOTE__Z__SQUOTE____SUB____SQUOTE__A__SQUOTE____RB____EQ__25)", new And(new Literal("APR_CHARSET_EBCDIC"), new Literal("__LB____SQUOTE__Z__SQUOTE____SUB____SQUOTE__A__SQUOTE____RB____EQ__25", false))),
new TestCase("A&&(B__GT__C)", new And(new Literal("A"), new Literal("B__GT__C"))),
new TestCase("A&&(__LB__B__ADD__1__RB____GT____LB__C__L_OR__D__RB__)", new And(new Literal("A"), new Literal("__LB__B__ADD__1__RB____GT____LB__C__L_OR__D__RB__"))),
new TestCase("DEFINED_HAS_ATTRIBUTE_&&HAS_ATTRIBUTE___LB__nonnull__RB__", new And(new Literal("DEFINED_HAS_ATTRIBUTE_"), new Literal("HAS_ATTRIBUTE___LB__nonnull__RB__"))),
new TestCase("HAS_BUILTIN___LB__nonnull__RB__&&A", new And(new Literal("HAS_BUILTIN___LB__nonnull__RB__"), new Literal("A"))),
new TestCase("A||(DEFINED___LB__NAME__RB__&&(NAME__GEQ__199630))", new Or(new Literal("A"), new And(new Literal("DEFINED___LB__NAME__RB__"), new Literal("NAME__GEQ__199630")))),
new TestCase("(DEFINED___LB__NAME__RB__&&(NAME__GEQ__199905)&&(NAME__LT__1991011))||(NAME__GEQ__300000)||DEFINED___LB__NAME__RB__", new Or(new And(new Literal("DEFINED___LB__NAME__RB__"), new And(new Literal("NAME__GEQ__199905"), new Literal("NAME__LT__1991011"))), new Or(new Literal("NAME__GEQ__300000"), new Literal("DEFINED___LB__NAME__RB__")))),
new TestCase("1__GT____U_MINUS__42", new Literal("1__GT____U_MINUS__42")),
new TestCase("1__GT____U_PLUS__42", new Literal("1__GT____U_PLUS__42")),
new TestCase("42__GT____U_TILDE__A", new Literal("42__GT____U_TILDE__A")),
new TestCase("A__ADD__B__GT__42", new Literal("A__ADD__B__GT__42")),
new TestCase("A__LSHIFT__B", new Literal("A__LSHIFT__B")),
new TestCase("A__THEN__B__COLON__C", new Literal("A__THEN__B__COLON__C")),
new TestCase("A__MUL____LB__B__ADD__C__RB__", new Literal("A__MUL____LB__B__ADD__C__RB__")),
new TestCase("(__LB____SQUOTE__Z__SQUOTE____SUB____SQUOTE__A__SQUOTE____RB____EQ__25)", new Literal("__LB____SQUOTE__Z__SQUOTE____SUB____SQUOTE__A__SQUOTE____RB____EQ__25")),
new TestCase("(__LB__GNUTLS_VERSION_MAJOR__ADD____LB__GNUTLS_VERSION_MINOR__GT__0__L_OR__GNUTLS_VERSION_PATCH__GEQ__20__RB____RB____GT__3)", new Literal("__LB__GNUTLS_VERSION_MAJOR__ADD____LB__GNUTLS_VERSION_MINOR__GT__0__L_OR__GNUTLS_VERSION_PATCH__GEQ__20__RB____RB____GT__3")),
new TestCase("(__LB__A__L_AND__B__RB____GT__C)", new Literal("__LB__A__L_AND__B__RB____GT__C")),
new TestCase("A__EQ__B", new Literal("A__EQ__B")),
new TestCase("(DEFINED_A)", new Literal("DEFINED_A")),
new TestCase("MACRO___LB__A__B__RB____EQ__1", new Literal("MACRO___LB__A__B__RB____EQ__1")),
new TestCase("ifndef", new Literal("ifndef")),
new TestCase("__HAS_WARNING___LB____QUOTE____SUB__Wa__SUB__warning__QUOTE_____foo__RB__", new Literal("__HAS_WARNING___LB____QUOTE____SUB__Wa__SUB__warning__QUOTE_____foo__RB__"))
);
}

/**
* Each test case compares the output of the default PropositionalFormularParser to the expected output.
* This comparison is performed using the equivalence defined by org.prop4j.Node from FeatureIDE.
* Therefore, nodes describing equivalent propositional formulas in different tree structures are not considered equal.
* As long as FeatureIDE produces a deterministic and consistent tree structure in its output, these tests will succeed.
* Because DiffDetective desires not only a correct but also a deterministic and consistent parser output,
* it is intended that these tests also break, if FeatureIDE changes its parsing behaviour in the future.
*/
@ParameterizedTest
@MethodSource("testCases")
public void testCase(TestCase testCase) {
assertEquals(
testCase.expected,
PropositionalFormulaParser.Default.parse(testCase.formula)
);
}
}

0 comments on commit 56abb9c

Please sign in to comment.