# Copyright 2015 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """Tests for doc generator traversal.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import sys from tensorflow.python.platform import googletest from tensorflow.tools.docs import generate_lib from tensorflow.tools.docs import parser def test_function(): """Docstring for test_function.""" pass class TestClass(object): """Docstring for TestClass itself.""" class ChildClass(object): """Docstring for a child class.""" class GrandChildClass(object): """Docstring for a child of a child class.""" pass class DummyVisitor(object): def __init__(self, index, duplicate_of): self.index = index self.duplicate_of = duplicate_of class GenerateTest(googletest.TestCase): def get_test_objects(self): # These are all mutable objects, so rebuild them for each test. # Don't cache the objects. module = sys.modules[__name__] index = { 'tf': sys, # Can be any module, this test doesn't care about content. 'tf.TestModule': module, 'tf.test_function': test_function, 'tf.TestModule.test_function': test_function, 'tf.TestModule.TestClass': TestClass, 'tf.TestModule.TestClass.ChildClass': TestClass.ChildClass, 'tf.TestModule.TestClass.ChildClass.GrandChildClass': TestClass.ChildClass.GrandChildClass, } tree = { 'tf': ['TestModule', 'test_function'], 'tf.TestModule': ['test_function', 'TestClass'], 'tf.TestModule.TestClass': ['ChildClass'], 'tf.TestModule.TestClass.ChildClass': ['GrandChildClass'], 'tf.TestModule.TestClass.ChildClass.GrandChildClass': [] } duplicate_of = {'tf.test_function': 'tf.TestModule.test_function'} duplicates = { 'tf.TestModule.test_function': [ 'tf.test_function', 'tf.TestModule.test_function' ] } base_dir = os.path.dirname(__file__) visitor = DummyVisitor(index, duplicate_of) reference_resolver = parser.ReferenceResolver.from_visitor( visitor=visitor, doc_index={}, py_module_names=['tf']) parser_config = parser.ParserConfig( reference_resolver=reference_resolver, duplicates=duplicates, duplicate_of=duplicate_of, tree=tree, index=index, reverse_index={}, guide_index={}, base_dir=base_dir) return reference_resolver, parser_config def test_write(self): _, parser_config = self.get_test_objects() output_dir = googletest.GetTempDir() generate_lib.write_docs(output_dir, parser_config, yaml_toc=True, site_api_path='api_docs/python') # Check redirects redirects_file = os.path.join(output_dir, '_redirects.yaml') self.assertTrue(os.path.exists(redirects_file)) with open(redirects_file) as f: redirects = f.read() self.assertEqual(redirects.split(), [ 'redirects:', '-', 'from:', '/api_docs/python/tf/test_function', 'to:', '/api_docs/python/tf/TestModule/test_function' ]) # Make sure that the right files are written to disk. self.assertTrue(os.path.exists(os.path.join(output_dir, 'index.md'))) self.assertTrue(os.path.exists(os.path.join(output_dir, 'tf.md'))) self.assertTrue(os.path.exists(os.path.join(output_dir, '_toc.yaml'))) self.assertTrue( os.path.exists(os.path.join(output_dir, 'tf/TestModule.md'))) self.assertFalse( os.path.exists(os.path.join(output_dir, 'tf/test_function.md'))) self.assertTrue( os.path.exists( os.path.join(output_dir, 'tf/TestModule/TestClass.md'))) self.assertTrue( os.path.exists( os.path.join(output_dir, 'tf/TestModule/TestClass/ChildClass.md'))) self.assertTrue( os.path.exists( os.path.join( output_dir, 'tf/TestModule/TestClass/ChildClass/GrandChildClass.md'))) # Make sure that duplicates are not written self.assertTrue( os.path.exists( os.path.join(output_dir, 'tf/TestModule/test_function.md'))) def test_update_id_tags_inplace(self): test_dir = googletest.GetTempDir() test_sub_dir = os.path.join(test_dir, 'a/b') os.makedirs(test_sub_dir) test_path1 = os.path.join(test_dir, 'file1.md') test_path2 = os.path.join(test_sub_dir, 'file2.md') test_path3 = os.path.join(test_sub_dir, 'file3.notmd') with open(test_path1, 'w') as f: f.write('## abc&123') with open(test_path2, 'w') as f: f.write('# A Level 1 Heading\n') f.write('## A Level 2 Heading') with open(test_path3, 'w') as f: f.write("## don\'t change this") generate_lib.update_id_tags_inplace(test_dir) with open(test_path1) as f: content = f.read() self.assertEqual(content, '
tf.test_function
to test things.')
with open(os.path.join(test_out_dir, 'b/file2.md')) as f:
content = f.read()
self.assertEqual(
content,
'Use '
''
'tf.TestModule.TestClass.ChildClass
'
'to test things.\n'
'`tf.whatever` doesn\'t exist')
with open(os.path.join(test_out_dir, 'b/file3.notmd')) as f:
content = f.read()
self.assertEqual(content, file3_content)
with self.assertRaises(IOError):
# This should fail. The OWNERS file should not be copied
with open(os.path.join(test_out_dir, 'b/OWNERS')) as f:
content = f.read()
if __name__ == '__main__':
googletest.main()