diff options
author | 2016-10-11 17:51:06 +0000 | |
---|---|---|
committer | 2016-10-12 08:55:43 +0000 | |
commit | 1171a7fb55ae9928cd976d4c3963f4874d58f60c (patch) | |
tree | a6a49c86b189798c7d28b6729583fd989daa3186 /src/test/java/com/google/devtools | |
parent | 7bbf70ba0029c9480d61633973d8c293157e9407 (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')
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 |