aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Jon Brandvein <brandjon@google.com>2016-10-11 17:51:06 +0000
committerGravatar Yue Gan <yueg@google.com>2016-10-12 08:55:43 +0000
commit1171a7fb55ae9928cd976d4c3963f4874d58f60c (patch)
treea6a49c86b189798c7d28b6729583fd989daa3186 /src/test/java/com/google/devtools
parent7bbf70ba0029c9480d61633973d8c293157e9407 (diff)
Make EvalUtils.getDataTypeNameFromClass() look for @SkylarkModules in parent classes
This is needed to let subclasses of @SkylarkModules have the same type() string as their superclass, without requiring a second annotation for the subclass. -- MOS_MIGRATED_REVID=135814343
Diffstat (limited to 'src/test/java/com/google/devtools')
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java12
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java42
3 files changed, 54 insertions, 2 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
index 7ce40aa90c..65b175c015 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
@@ -19,6 +19,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
@@ -52,6 +53,15 @@ public class EvalUtilsTest extends EvaluationTestCase {
assertThat(EvalUtils.toIterable("abc", null)).hasSize(3);
}
+ /** MockClassA */
+ @SkylarkModule(name = "MockClassA", doc = "MockClassA")
+ public static class MockClassA {
+ }
+
+ /** MockClassB */
+ public static class MockClassB extends MockClassA {
+ }
+
@Test
public void testDataTypeNames() throws Exception {
assertEquals("string", EvalUtils.getDataTypeName("foo"));
@@ -60,6 +70,8 @@ public class EvalUtilsTest extends EvaluationTestCase {
assertEquals("list", EvalUtils.getDataTypeName(makeList(null)));
assertEquals("dict", EvalUtils.getDataTypeName(makeDict(null)));
assertEquals("NoneType", EvalUtils.getDataTypeName(Runtime.NONE));
+ assertEquals("MockClassA", EvalUtils.getDataTypeName(new MockClassA()));
+ assertEquals("MockClassA", EvalUtils.getDataTypeName(new MockClassB()));
}
@Test
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 97a3935d2a..2fee2c36fd 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
@@ -778,7 +778,7 @@ public class SkylarkEvaluationTest extends EvaluationTest {
new SkylarkTest()
.update("mock", new MockSubClass())
.testIfExactError(
- "Type MockSubClass has no function is_empty_class_not_annotated(string)",
+ "Type Mock has no function is_empty_class_not_annotated(string)",
"b = mock.is_empty_class_not_annotated('a')");
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java
index 4172024e2a..23fc0b39d3 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java
@@ -81,6 +81,41 @@ public class SkylarkInterfaceUtilsTest {
public void foo() {}
}
+ /** MockClassZ */
+ public static class MockClassZ {
+ }
+
+ @Test
+ public void testGetSkylarkModuleBasic() throws Exception {
+ // Normal case.
+ SkylarkModule ann = SkylarkInterfaceUtils.getSkylarkModule(MockClassA.class);
+ assertThat(ann).isNotNull();
+ assertThat(ann.doc()).isEqualTo("MockClassA");
+ }
+
+ @Test
+ public void testGetSkylarkModuleSubclass() throws Exception {
+ // Subclass's annotation is used.
+ SkylarkModule ann = SkylarkInterfaceUtils.getSkylarkModule(MockClassC.class);
+ assertThat(ann).isNotNull();
+ assertThat(ann.doc()).isEqualTo("MockClassC");
+ }
+
+ @Test
+ public void testGetSkylarkModuleSubclassNoSubannotation() throws Exception {
+ // Falls back on superclass's annotation.
+ SkylarkModule ann = SkylarkInterfaceUtils.getSkylarkModule(MockClassD.class);
+ assertThat(ann).isNotNull();
+ assertThat(ann.doc()).isEqualTo("MockClassC");
+ }
+
+ @Test
+ public void testGetSkylarkModuleNotFound() throws Exception {
+ // Doesn't exist.
+ SkylarkModule ann = SkylarkInterfaceUtils.getSkylarkModule(MockClassZ.class);
+ assertThat(ann).isNull();
+ }
+
@Test
public void testGetSkylarkCallableBasic() throws Exception {
// Normal case. Ensure two-arg form is consistent with one-arg form.
@@ -127,10 +162,15 @@ public class SkylarkInterfaceUtilsTest {
SkylarkCallable ann = SkylarkInterfaceUtils.getSkylarkCallable(method);
assertThat(ann).isNull();
- // ... including when it's only present in a subclass that was bypassed.
+ // ... including when it's only present in a subclass that was bypassed...
method = MockClassC.class.getMethod("baz");
ann = SkylarkInterfaceUtils.getSkylarkCallable(MockClassA.class, method);
assertThat(ann).isNull();
+
+ // ... or when the method itself is only in the subclass that was bypassed.
+ method = MockClassC.class.getMethod("qux");
+ ann = SkylarkInterfaceUtils.getSkylarkCallable(MockClassA.class, method);
+ assertThat(ann).isNull();
}
@Test