#!/usr/bin/env python3 # Copyright 2024 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Tests for gcc_preprocess.py This test suite contains various tests for the 'java_cpp_template' build rule, which uses the gcc preprocessor to turn a template into Java code. """ import unittest import tempfile import gcc_preprocess class TestPreprocess(unittest.TestCase): def testParsePackageName(self): with tempfile.NamedTemporaryFile(mode='w') as f: template = f.name f.file.write(""" package org.chromium.fake; public class Empty { } """) f.file.flush() package_name, data = gcc_preprocess.ProcessJavaFile(template, [], []) self.assertEqual('org.chromium.fake', package_name) self.assertEqual( """ package org.chromium.fake; public class Empty { } """.strip(), data.strip()) def testMissingPackageName(self): with tempfile.NamedTemporaryFile(mode='w') as f: template = f.name f.file.write(""" public class Empty { } """) f.file.flush() with self.assertRaisesRegex(Exception, r'Could not find java package of.*'): gcc_preprocess.ProcessJavaFile(template, [], []) def testSinglePreprocessorEvaluation(self): with tempfile.NamedTemporaryFile(mode='w') as f: template = f.name f.file.write(""" package org.chromium.fake; public class Sample { #if defined(_ENABLE_ASSERTS) public boolean ENABLE_ASSERTS = true; #else public boolean ENABLE_ASSERTS = false; #endif } """) f.file.flush() defines = [ '_ENABLE_ASSERTS', ] package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, []) self.assertEqual('org.chromium.fake', package_name) self.assertEqual( """ package org.chromium.fake; public class Sample { public boolean ENABLE_ASSERTS = true; } """.strip(), data.strip()) def testNestedPreprocessorEvaluation(self): with tempfile.NamedTemporaryFile(mode='w') as f: template = f.name f.file.write(""" package org.chromium.fake; #if defined(USE_FINAL) #define MAYBE_FINAL final #else #define MAYBE_FINAL #endif public class Sample { #if defined(_ENABLE_ASSERTS) public MAYBE_FINAL boolean ENABLE_ASSERTS = true; #else public MAYBE_FINAL boolean ENABLE_ASSERTS = false; #endif } """) f.file.flush() defines = [ '_ENABLE_ASSERTS', 'USE_FINAL', ] package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, []) self.assertEqual('org.chromium.fake', package_name) self.assertEqual( """ package org.chromium.fake; public class Sample { public final boolean ENABLE_ASSERTS = true; } """.strip(), data.strip()) def testPreserveComments(self): with tempfile.NamedTemporaryFile(mode='w') as f: template = f.name f.file.write(""" // Copyright header ... package org.chromium.fake; /** * Some javadoc. */ public class Sample { // This is a comment outside the #if block. #if defined(_ENABLE_ASSERTS) // Inside the #if block. public boolean ENABLE_ASSERTS = true; #else // Inside the #else block. public boolean ENABLE_ASSERTS = false; #endif } """) f.file.flush() defines = [ '_ENABLE_ASSERTS', ] package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, []) self.assertEqual('org.chromium.fake', package_name) self.assertEqual( """ // Copyright header ... package org.chromium.fake; /** * Some javadoc. */ public class Sample { // This is a comment outside the #if block. // Inside the #if block. public boolean ENABLE_ASSERTS = true; } """.strip(), data.strip()) if __name__ == '__main__': unittest.main()