Implement ConditionalExpression
Also add tests.
--
MOS_MIGRATED_REVID=88474801
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index 342f34e..3fd5508 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -200,6 +200,19 @@
}
@Test
+ public void testConditionalExpressions() throws Exception {
+ assertEquals(1, eval("1 if True else 2"));
+ assertEquals(2, eval("1 if False else 2"));
+ assertEquals(3, eval("1 + 2 if 3 + 4 else 5 + 6"));
+
+ syntaxEvents.setFailFast(false);
+ parseExpr("1 if 2");
+ syntaxEvents.assertContainsEvent(
+ "missing else clause in conditional expression or semicolon before if");
+ syntaxEvents.collector().clear();
+ }
+
+ @Test
public void testCompareStringInt() throws Exception {
checkEvalError("'a' >= 1", "Cannot compare string with int");
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 3e0b0f3..b0735ae 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -877,4 +877,28 @@
@Override
@Test
public void testKeywordArgs() {}
+
+ @Test
+ public void testConditionalExpressionAtToplevel() throws Exception {
+ exec(parseFileForSkylark("x = 1 if 2 else 3"), env);
+ assertEquals(1, env.lookup("x"));
+ }
+
+ @Test
+ public void testConditionalExpressionInFunction() throws Exception {
+ exec(parseFileForSkylark(
+ "def foo(a, b, c):\n"
+ + " return a+b if c else a-b\n"
+ + "x = foo(23, 5, 0)"), env);
+ assertEquals(18, env.lookup("x"));
+ }
+
+ @Test
+ public void testBadConditionalExpressionInFunction() throws Exception {
+ syntaxEvents.setFailFast(false);
+ parseFileForSkylark("def foo(a): return [] if a else 0\n");
+ syntaxEvents.assertContainsEvent(
+ "bad else case: int is incompatible with list at /some/file.txt:1:33");
+ syntaxEvents.collector().clear();
+ }
}