gcc_preprocess_tests.py (3826B)
1 #!/usr/bin/env python3 2 # Copyright 2024 The Chromium Authors 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 """Tests for gcc_preprocess.py 6 7 This test suite contains various tests for the 'java_cpp_template' build rule, 8 which uses the gcc preprocessor to turn a template into Java code. 9 """ 10 11 import unittest 12 import tempfile 13 14 import gcc_preprocess 15 16 17 class TestPreprocess(unittest.TestCase): 18 19 def testParsePackageName(self): 20 with tempfile.NamedTemporaryFile(mode='w') as f: 21 template = f.name 22 f.file.write(""" 23 package org.chromium.fake; 24 public class Empty { 25 } 26 """) 27 f.file.flush() 28 package_name, data = gcc_preprocess.ProcessJavaFile(template, [], []) 29 self.assertEqual('org.chromium.fake', package_name) 30 self.assertEqual( 31 """ 32 package org.chromium.fake; 33 public class Empty { 34 } 35 """.strip(), data.strip()) 36 37 def testMissingPackageName(self): 38 with tempfile.NamedTemporaryFile(mode='w') as f: 39 template = f.name 40 f.file.write(""" 41 public class Empty { 42 } 43 """) 44 f.file.flush() 45 with self.assertRaisesRegex(Exception, 46 r'Could not find java package of.*'): 47 gcc_preprocess.ProcessJavaFile(template, [], []) 48 49 def testSinglePreprocessorEvaluation(self): 50 with tempfile.NamedTemporaryFile(mode='w') as f: 51 template = f.name 52 f.file.write(""" 53 package org.chromium.fake; 54 public class Sample { 55 #if defined(_ENABLE_ASSERTS) 56 public boolean ENABLE_ASSERTS = true; 57 #else 58 public boolean ENABLE_ASSERTS = false; 59 #endif 60 } 61 """) 62 f.file.flush() 63 defines = [ 64 '_ENABLE_ASSERTS', 65 ] 66 package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, []) 67 self.assertEqual('org.chromium.fake', package_name) 68 self.assertEqual( 69 """ 70 package org.chromium.fake; 71 public class Sample { 72 public boolean ENABLE_ASSERTS = true; 73 } 74 """.strip(), data.strip()) 75 76 def testNestedPreprocessorEvaluation(self): 77 with tempfile.NamedTemporaryFile(mode='w') as f: 78 template = f.name 79 f.file.write(""" 80 package org.chromium.fake; 81 #if defined(USE_FINAL) 82 #define MAYBE_FINAL final 83 #else 84 #define MAYBE_FINAL 85 #endif 86 public class Sample { 87 #if defined(_ENABLE_ASSERTS) 88 public MAYBE_FINAL boolean ENABLE_ASSERTS = true; 89 #else 90 public MAYBE_FINAL boolean ENABLE_ASSERTS = false; 91 #endif 92 } 93 """) 94 f.file.flush() 95 defines = [ 96 '_ENABLE_ASSERTS', 97 'USE_FINAL', 98 ] 99 package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, []) 100 self.assertEqual('org.chromium.fake', package_name) 101 self.assertEqual( 102 """ 103 package org.chromium.fake; 104 public class Sample { 105 public final boolean ENABLE_ASSERTS = true; 106 } 107 """.strip(), data.strip()) 108 109 def testPreserveComments(self): 110 with tempfile.NamedTemporaryFile(mode='w') as f: 111 template = f.name 112 f.file.write(""" 113 // Copyright header ... 114 package org.chromium.fake; 115 /** 116 * Some javadoc. 117 */ 118 public class Sample { 119 // This is a comment outside the #if block. 120 #if defined(_ENABLE_ASSERTS) 121 // Inside the #if block. 122 public boolean ENABLE_ASSERTS = true; 123 #else 124 // Inside the #else block. 125 public boolean ENABLE_ASSERTS = false; 126 #endif 127 } 128 """) 129 f.file.flush() 130 defines = [ 131 '_ENABLE_ASSERTS', 132 ] 133 package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, []) 134 self.assertEqual('org.chromium.fake', package_name) 135 self.assertEqual( 136 """ 137 // Copyright header ... 138 package org.chromium.fake; 139 /** 140 * Some javadoc. 141 */ 142 public class Sample { 143 // This is a comment outside the #if block. 144 // Inside the #if block. 145 public boolean ENABLE_ASSERTS = true; 146 } 147 """.strip(), data.strip()) 148 149 150 if __name__ == '__main__': 151 unittest.main()