#!/usr/bin/env python3
# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for dependency_analysis.class_dependency."""
import unittest
import unittest.mock
import class_dependency
class TestHelperFunctions(unittest.TestCase):
"""Unit tests for module-level helper functions."""
def test_java_class_params_to_key(self):
"""Tests that the helper concatenates, separated with a dot."""
result = class_dependency.java_class_params_to_key('pkg.name', 'class')
self.assertEqual(result, 'pkg.name.class')
def test_split_nested_class_from_key(self):
"""Tests that the helper correctly splits out a nested class."""
part1, part2 = class_dependency.split_nested_class_from_key(
'pkg.name.class$nested')
self.assertEqual(part1, 'pkg.name.class')
self.assertEqual(part2, 'nested')
def test_split_nested_class_from_key_no_nested(self):
"""Tests that the helper works when there is no nested class."""
part1, part2 = class_dependency.split_nested_class_from_key(
'pkg.name.class')
self.assertEqual(part1, 'pkg.name.class')
self.assertIsNone(part2)
def test_split_nested_class_from_key_lambda(self):
"""Tests that the helper works for jdeps' formatting of lambdas."""
part1, part2 = class_dependency.split_nested_class_from_key(
'pkg.name.class$$Lambda$1')
self.assertEqual(part1, 'pkg.name.class')
self.assertEqual(part2, '$Lambda$1')
def test_split_nested_class_from_key_numeric(self):
"""Tests that the helper works for jdeps' formatting of nested classes.
Specifically, jdeps uses a numeric name for private nested classes.
"""
part1, part2 = class_dependency.split_nested_class_from_key(
'pkg.name.class$1')
self.assertEqual(part1, 'pkg.name.class')
self.assertEqual(part2, '1')
class TestJavaClass(unittest.TestCase):
"""Unit tests for dependency_analysis.class_dependency.JavaClass."""
TEST_PKG = 'package'
TEST_CLS = 'class'
UNIQUE_KEY_1 = 'abc'
UNIQUE_KEY_2 = 'def'
def test_initialization(self):
"""Tests that JavaClass is initialized correctly."""
test_node = class_dependency.JavaClass(self.TEST_PKG, self.TEST_CLS)
self.assertEqual(test_node.name, f'{self.TEST_PKG}.{self.TEST_CLS}')
self.assertEqual(test_node.package, self.TEST_PKG)
self.assertEqual(test_node.class_name, self.TEST_CLS)
def test_equality(self):
"""Tests that two JavaClasses with the same package+class are equal."""
test_node = class_dependency.JavaClass(self.TEST_PKG, self.TEST_CLS)
equal_node = class_dependency.JavaClass(self.TEST_PKG, self.TEST_CLS)
self.assertEqual(test_node, equal_node)
def test_add_nested_class(self):
"""Tests adding a single nested class to this class."""
test_node = class_dependency.JavaClass(self.TEST_PKG, self.TEST_CLS)
test_node.add_nested_class(self.UNIQUE_KEY_1)
self.assertEqual(test_node.nested_classes, {self.UNIQUE_KEY_1})
def test_add_nested_class_multiple(self):
"""Tests adding multiple nested classes to this class."""
test_node = class_dependency.JavaClass(self.TEST_PKG, self.TEST_CLS)
test_node.add_nested_class(self.UNIQUE_KEY_1)
test_node.add_nested_class(self.UNIQUE_KEY_2)
self.assertEqual(test_node.nested_classes,
{self.UNIQUE_KEY_1, self.UNIQUE_KEY_2})
def test_add_nested_class_duplicate(self):
"""Tests that adding the same nested class twice will not dupe."""
test_node = class_dependency.JavaClass(self.TEST_PKG, self.TEST_CLS)
test_node.add_nested_class(self.UNIQUE_KEY_1)
test_node.add_nested_class(self.UNIQUE_KEY_1)
self.assertEqual(test_node.nested_classes, {self.UNIQUE_KEY_1})
class TestJavaClassDependencyGraph(unittest.TestCase):
"""Unit tests for JavaClassDependencyGraph.
Full name: dependency_analysis.class_dependency.JavaClassDependencyGraph.
"""
def setUp(self):
"""Sets up a new JavaClassDependencyGraph."""
self.test_graph = class_dependency.JavaClassDependencyGraph()
def test_create_node_from_key(self):
"""Tests that a jdeps name is correctly parsed into package + class."""
created_node = self.test_graph.create_node_from_key(
'package.class$nested')
self.assertEqual(created_node.package, 'package')
self.assertEqual(created_node.class_name, 'class')
self.assertEqual(created_node.name, 'package.class')
if __name__ == '__main__':
unittest.main()