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 compile_java.py""" 6 7import collections 8import unittest 9 10import compile_java 11 12 13def _CreateData(class_annotation='', 14 class_prefix='public ', 15 nested_annotation='', 16 suffix=''): 17 return f"""\ 18package pkg; 19 20import foo; 21import foo.Bar; 22import foo.Bar.Baz; 23 24{class_annotation} 25@SomeThing 26{class_prefix}class Foo {{ 27 {nested_annotation} 28 public static class Nested {{ }} 29}} 30""" + suffix 31 32 33class CompileJavaTests(unittest.TestCase): 34 35 def do_service_loader_test(self, **kwargs): 36 data = _CreateData(**kwargs) 37 services_map = collections.defaultdict(list) 38 compile_java.ParseJavaSource(data, services_map) 39 return dict(services_map) 40 41 def do_classes_test(self, **kwargs): 42 data = _CreateData(**kwargs) 43 services_map = collections.defaultdict(list) 44 _, class_names = compile_java.ParseJavaSource(data, services_map) 45 return class_names 46 47 def testServiceImpl_NoUses(self): 48 services_map = self.do_service_loader_test() 49 self.assertEqual({}, services_map) 50 51 def testServiceImpl_LocalType(self): 52 services_map = self.do_service_loader_test( 53 class_annotation='@ServiceImpl(Local.class)') 54 self.assertEqual({'pkg.Local': ['pkg.Foo']}, services_map) 55 56 def testServiceImpl_ImportedTopType(self): 57 services_map = self.do_service_loader_test( 58 class_annotation='@ServiceImpl(Bar.class)') 59 self.assertEqual({'foo.Bar': ['pkg.Foo']}, services_map) 60 61 def testServiceImpl_ImportedNestedType1(self): 62 services_map = self.do_service_loader_test( 63 class_annotation='@ServiceImpl(Baz.class)') 64 self.assertEqual({'foo.Bar$Baz': ['pkg.Foo']}, services_map) 65 66 def testServiceImpl_ImportedNestedType2(self): 67 services_map = self.do_service_loader_test( 68 class_annotation='@ServiceImpl(Bar.Baz.class)') 69 self.assertEqual({'foo.Bar$Baz': ['pkg.Foo']}, services_map) 70 71 def testServiceImpl_NestedImpl(self): 72 services_map = self.do_service_loader_test( 73 class_annotation='@ServiceImpl(Baz.class)', 74 nested_annotation='@ServiceImpl(Baz.class)') 75 self.assertEqual({'foo.Bar$Baz': ['pkg.Foo', 'pkg.Foo$Nested']}, 76 services_map) 77 78 def testParseClasses(self): 79 classes = self.do_classes_test(class_prefix='public final ', 80 suffix='\nprivate class Extra {}') 81 self.assertEqual(['Foo', 'Extra'], classes) 82 83 def testErrorOnNonPublic(self): 84 85 def inner(): 86 self.do_classes_test(class_annotation='@ServiceImpl(Local.class)', 87 class_prefix='') 88 89 self.assertRaises(Exception, inner) 90 91if __name__ == '__main__': 92 unittest.main() 93