• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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