607 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			607 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Python
		
	
	
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								GTSAM Copyright 2010-2020, Georgia Tech Research Corporation,
							 | 
						||
| 
								 | 
							
								Atlanta, Georgia 30332-0415
							 | 
						||
| 
								 | 
							
								All Rights Reserved
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								See LICENSE for the license information
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Tests for template_instantiator.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Author: Varun Agrawal
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# pylint: disable=import-error,wrong-import-position
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from gtwrap.interface_parser import (Argument, ArgumentList, Class,
							 | 
						||
| 
								 | 
							
								                                     Constructor, ForwardDeclaration,
							 | 
						||
| 
								 | 
							
								                                     GlobalFunction, Include, Method,
							 | 
						||
| 
								 | 
							
								                                     Namespace, ReturnType, StaticMethod,
							 | 
						||
| 
								 | 
							
								                                     Typename)
							 | 
						||
| 
								 | 
							
								from gtwrap.template_instantiator import (
							 | 
						||
| 
								 | 
							
								    InstantiatedClass, InstantiatedConstructor, InstantiatedDeclaration,
							 | 
						||
| 
								 | 
							
								    InstantiatedGlobalFunction, InstantiatedMethod, InstantiatedStaticMethod,
							 | 
						||
| 
								 | 
							
								    InstantiationHelper, instantiate_args_list, instantiate_name,
							 | 
						||
| 
								 | 
							
								    instantiate_namespace, instantiate_return_type, instantiate_type,
							 | 
						||
| 
								 | 
							
								    is_scoped_template)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestInstantiationHelper(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """Tests for the InstantiationHelper class."""
							 | 
						||
| 
								 | 
							
								    def test_constructor(self):
							 | 
						||
| 
								 | 
							
								        """Test constructor."""
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedClass)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(helper.instantiation_type, InstantiatedClass)
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedConstructor)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(helper.instantiation_type, InstantiatedConstructor)
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedDeclaration)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(helper.instantiation_type, InstantiatedDeclaration)
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedGlobalFunction)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(helper.instantiation_type, InstantiatedGlobalFunction)
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedMethod)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(helper.instantiation_type, InstantiatedMethod)
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedStaticMethod)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(helper.instantiation_type, InstantiatedStaticMethod)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate(self):
							 | 
						||
| 
								 | 
							
								        """Test instantiate method."""
							 | 
						||
| 
								 | 
							
								        method = Method.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<U={double}>
							 | 
						||
| 
								 | 
							
								            double method(const T x, const U& param);
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        cls = Class.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<T={string}>
							 | 
						||
| 
								 | 
							
								            class Foo {};
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								        typenames = ['T', 'U']
							 | 
						||
| 
								 | 
							
								        class_instantiations = [Typename.rule.parseString("string")[0]]
							 | 
						||
| 
								 | 
							
								        method_instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        parent = InstantiatedClass(cls, class_instantiations)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedMethod)
							 | 
						||
| 
								 | 
							
								        instantiated_methods = helper.instantiate([], method, typenames,
							 | 
						||
| 
								 | 
							
								                                                  class_instantiations,
							 | 
						||
| 
								 | 
							
								                                                  method_instantiations,
							 | 
						||
| 
								 | 
							
								                                                  parent)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(instantiated_methods), 1)
							 | 
						||
| 
								 | 
							
								        args_list = instantiated_methods[0].args.list()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(args_list[0].ctype.get_typename(), 'string')
							 | 
						||
| 
								 | 
							
								        self.assertEqual(args_list[1].ctype.get_typename(), 'double')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_multilevel_instantiation(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Test method for multilevel instantiation
							 | 
						||
| 
								 | 
							
								        i.e. instantiation at both the class and method level.
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        cls = Class.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<T={string}>
							 | 
						||
| 
								 | 
							
								            class Foo {
							 | 
						||
| 
								 | 
							
								                template<U={double}>
							 | 
						||
| 
								 | 
							
								                double method1(const T x, const U& param);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                template<V={int}>
							 | 
						||
| 
								 | 
							
								                V method2(const T x);
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typenames = ['T']
							 | 
						||
| 
								 | 
							
								        class_instantiations = [Typename.rule.parseString("string")[0]]
							 | 
						||
| 
								 | 
							
								        parent = InstantiatedClass(cls, class_instantiations)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        helper = InstantiationHelper(InstantiatedMethod)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        instantiated_methods = helper.multilevel_instantiation(
							 | 
						||
| 
								 | 
							
								            cls.methods, typenames, parent)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(instantiated_methods), 2)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_methods[0].args.list()[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								            'string')
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_methods[0].args.list()[1].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								            'double')
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_methods[1].args.list()[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								            'string')
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_methods[1].return_type.type1.get_typename(), 'int')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestInstantiatedGlobalFunction(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """Tests for the InstantiatedGlobalFunction class."""
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        original = GlobalFunction.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<T={int}, R={double}>
							 | 
						||
| 
								 | 
							
								            R function(const T& x);
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								        instantiations = [
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("int")[0],
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("double")[0]
							 | 
						||
| 
								 | 
							
								        ]
							 | 
						||
| 
								 | 
							
								        self.func = InstantiatedGlobalFunction(original, instantiations)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_constructor(self):
							 | 
						||
| 
								 | 
							
								        """Test constructor."""
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.func, InstantiatedGlobalFunction)
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.func.original, GlobalFunction)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.func.name, "functionIntDouble")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(self.func.args.list()), 1)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.func.args.list()[0].ctype.get_typename(), "int")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.func.return_type.type1.get_typename(), "double")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_to_cpp(self):
							 | 
						||
| 
								 | 
							
								        """Test to_cpp method."""
							 | 
						||
| 
								 | 
							
								        actual = self.func.to_cpp()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(actual, "function<int,double>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestInstantiatedConstructor(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """Tests for the InstantiatedConstructor class."""
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        constructor = Constructor.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<U={double}>
							 | 
						||
| 
								 | 
							
								            Class(C x, const U& param);
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        instantiations = [
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("double")[0],
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("string")[0]
							 | 
						||
| 
								 | 
							
								        ]
							 | 
						||
| 
								 | 
							
								        self.constructor = InstantiatedConstructor(constructor, instantiations)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_constructor(self):
							 | 
						||
| 
								 | 
							
								        """Test constructor."""
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.constructor, InstantiatedConstructor)
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.constructor.original, Constructor)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_construct(self):
							 | 
						||
| 
								 | 
							
								        """Test the construct classmethod."""
							 | 
						||
| 
								 | 
							
								        constructor = Constructor.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<U={double}>
							 | 
						||
| 
								 | 
							
								            Class(C x, const U& param);
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        c = Class.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<C={string}>
							 | 
						||
| 
								 | 
							
								            class Class {};
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								        class_instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        method_instantiations = [Typename.rule.parseString("string")[0]]
							 | 
						||
| 
								 | 
							
								        typenames = ['C', 'U']
							 | 
						||
| 
								 | 
							
								        parent = InstantiatedClass(c, class_instantiations)
							 | 
						||
| 
								 | 
							
								        instantiated_args = instantiate_args_list(
							 | 
						||
| 
								 | 
							
								            constructor.args.list(),
							 | 
						||
| 
								 | 
							
								            typenames, class_instantiations + method_instantiations,
							 | 
						||
| 
								 | 
							
								            parent.cpp_typename())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        instantiated_constructor = InstantiatedConstructor.construct(
							 | 
						||
| 
								 | 
							
								            constructor, typenames, class_instantiations,
							 | 
						||
| 
								 | 
							
								            method_instantiations, instantiated_args, parent)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_constructor.name, "ClassDouble")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_constructor.args.list()[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								            "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_constructor.args.list()[1].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								            "string")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_to_cpp(self):
							 | 
						||
| 
								 | 
							
								        """Test the to_cpp method."""
							 | 
						||
| 
								 | 
							
								        actual = self.constructor.to_cpp()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(actual, "Class<double,string>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestInstantiatedMethod(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """Tests for the InstantiatedMethod class."""
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        method = Method.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<U={double}>
							 | 
						||
| 
								 | 
							
								            double method(const U& param);
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        self.method = InstantiatedMethod(method, instantiations)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_constructor(self):
							 | 
						||
| 
								 | 
							
								        """Test constructor."""
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.method, InstantiatedMethod)
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.method.original, Method)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.method.name, "methodDouble")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_construct(self):
							 | 
						||
| 
								 | 
							
								        """Test the construct classmethod."""
							 | 
						||
| 
								 | 
							
								        method = Method.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<U={double}>
							 | 
						||
| 
								 | 
							
								            T method(U& param);
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        method_instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        c = Class.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<T={string}>
							 | 
						||
| 
								 | 
							
								            class Class {};
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								        class_instantiations = [Typename.rule.parseString("string")[0]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typenames = ['T', 'U']
							 | 
						||
| 
								 | 
							
								        parent = InstantiatedClass(c, class_instantiations)
							 | 
						||
| 
								 | 
							
								        instantiated_args = instantiate_args_list(
							 | 
						||
| 
								 | 
							
								            method.args.list(),
							 | 
						||
| 
								 | 
							
								            typenames, class_instantiations + method_instantiations,
							 | 
						||
| 
								 | 
							
								            parent.cpp_typename())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        instantiated_method = InstantiatedMethod.construct(
							 | 
						||
| 
								 | 
							
								            method, typenames, class_instantiations, method_instantiations,
							 | 
						||
| 
								 | 
							
								            instantiated_args, parent)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_method.name, "methodDouble")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_method.args.list()[0].ctype.get_typename(), "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_method.return_type.type1.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "string")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_to_cpp(self):
							 | 
						||
| 
								 | 
							
								        """Test the to_cpp method."""
							 | 
						||
| 
								 | 
							
								        actual = self.method.to_cpp()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(actual, "method<double>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestInstantiatedStaticMethod(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """Tests for the InstantiatedStaticMethod class."""
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        static_method = StaticMethod.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<U={double}>
							 | 
						||
| 
								 | 
							
								            static T staticMethod(const U& param);
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        self.static_method = InstantiatedStaticMethod(static_method,
							 | 
						||
| 
								 | 
							
								                                                      instantiations)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_constructor(self):
							 | 
						||
| 
								 | 
							
								        """Test constructor."""
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.static_method, InstantiatedStaticMethod)
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.static_method.original, StaticMethod)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.static_method.name, "staticMethodDouble")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_construct(self):
							 | 
						||
| 
								 | 
							
								        """Test the construct classmethod."""
							 | 
						||
| 
								 | 
							
								        static_method = StaticMethod.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<U={double}>
							 | 
						||
| 
								 | 
							
								            static T staticMethod(U& param);
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        method_instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        c = Class.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<T={string}>
							 | 
						||
| 
								 | 
							
								            class Class {};
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								        class_instantiations = [Typename.rule.parseString("string")[0]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typenames = ['T', 'U']
							 | 
						||
| 
								 | 
							
								        parent = InstantiatedClass(c, class_instantiations)
							 | 
						||
| 
								 | 
							
								        instantiated_args = instantiate_args_list(
							 | 
						||
| 
								 | 
							
								            static_method.args.list(),
							 | 
						||
| 
								 | 
							
								            typenames, class_instantiations + method_instantiations,
							 | 
						||
| 
								 | 
							
								            parent.cpp_typename())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        instantiated_static_method = InstantiatedStaticMethod.construct(
							 | 
						||
| 
								 | 
							
								            static_method, typenames, class_instantiations,
							 | 
						||
| 
								 | 
							
								            method_instantiations, instantiated_args, parent)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_static_method.name, "staticMethodDouble")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_static_method.args.list()[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								            "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_static_method.return_type.type1.get_typename(),
							 | 
						||
| 
								 | 
							
								            "string")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_to_cpp(self):
							 | 
						||
| 
								 | 
							
								        """Test the to_cpp method."""
							 | 
						||
| 
								 | 
							
								        actual = self.static_method.to_cpp()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(actual, "staticMethod<double>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestInstantiatedClass(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """Tests for the InstantiatedClass class."""
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        cl = Class.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            template<T={string}>
							 | 
						||
| 
								 | 
							
								            class Foo {
							 | 
						||
| 
								 | 
							
								                template<C={int}>
							 | 
						||
| 
								 | 
							
								                Foo(C& c);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                template<S={char}>
							 | 
						||
| 
								 | 
							
								                static T staticMethod(const S& s);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                template<M={double}>
							 | 
						||
| 
								 | 
							
								                T method(const M& m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                T operator*(T other) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                T prop;
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								        class_instantiations = [Typename.rule.parseString('string')[0]]
							 | 
						||
| 
								 | 
							
								        self.member_instantiations = [
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString('int')[0],
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString('char')[0],
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString('double')[0],
							 | 
						||
| 
								 | 
							
								        ]
							 | 
						||
| 
								 | 
							
								        self.cl = InstantiatedClass(cl, class_instantiations)
							 | 
						||
| 
								 | 
							
								        self.typenames = self.cl.original.template.typenames
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_constructor(self):
							 | 
						||
| 
								 | 
							
								        """Test constructor."""
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.cl, InstantiatedClass)
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.cl.original, Class)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.cl.name, "FooString")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_ctors(self):
							 | 
						||
| 
								 | 
							
								        """Test instantiate_ctors method."""
							 | 
						||
| 
								 | 
							
								        ctors = self.cl.instantiate_ctors(self.typenames)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(ctors), 1)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(ctors[0].name, "FooString")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(ctors[0].args.list()[0].ctype.get_typename(), "int")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_static_methods(self):
							 | 
						||
| 
								 | 
							
								        """Test instantiate_static_methods method."""
							 | 
						||
| 
								 | 
							
								        static_methods = self.cl.instantiate_static_methods(self.typenames)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(static_methods), 1)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(static_methods[0].name, "staticMethodChar")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(static_methods[0].args.list()[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "char")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(static_methods[0].return_type.type1.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "string")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_methods(self):
							 | 
						||
| 
								 | 
							
								        """Test instantiate_methods method."""
							 | 
						||
| 
								 | 
							
								        methods = self.cl.instantiate_methods(self.typenames)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(methods), 1)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(methods[0].name, "methodDouble")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(methods[0].args.list()[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(methods[0].return_type.type1.get_typename(), "string")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_operators(self):
							 | 
						||
| 
								 | 
							
								        """Test instantiate_operators method."""
							 | 
						||
| 
								 | 
							
								        operators = self.cl.instantiate_operators(self.typenames)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(operators), 1)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(operators[0].operator, "*")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(operators[0].args.list()[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "string")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(operators[0].return_type.type1.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "string")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_properties(self):
							 | 
						||
| 
								 | 
							
								        """Test instantiate_properties method."""
							 | 
						||
| 
								 | 
							
								        properties = self.cl.instantiate_properties(self.typenames)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(properties), 1)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(properties[0].name, "prop")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(properties[0].ctype.get_typename(), "string")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_cpp_typename(self):
							 | 
						||
| 
								 | 
							
								        """Test cpp_typename method."""
							 | 
						||
| 
								 | 
							
								        actual = self.cl.cpp_typename()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(actual.name, "Foo<string>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_to_cpp(self):
							 | 
						||
| 
								 | 
							
								        """Test to_cpp method."""
							 | 
						||
| 
								 | 
							
								        actual = self.cl.to_cpp()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(actual, "Foo<string>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestInstantiatedDeclaration(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """Tests for the InstantiatedDeclaration class."""
							 | 
						||
| 
								 | 
							
								    def setUp(self):
							 | 
						||
| 
								 | 
							
								        #TODO(Varun) Need to support templated class forward declaration.
							 | 
						||
| 
								 | 
							
								        forward_declaration = ForwardDeclaration.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            class FooBar;
							 | 
						||
| 
								 | 
							
								            """)[0]
							 | 
						||
| 
								 | 
							
								        instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        self.declaration = InstantiatedDeclaration(
							 | 
						||
| 
								 | 
							
								            forward_declaration, instantiations=instantiations)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_constructor(self):
							 | 
						||
| 
								 | 
							
								        """Test constructor."""
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.declaration, InstantiatedDeclaration)
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(self.declaration.original, ForwardDeclaration)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(self.declaration.instantiations[0].name, "double")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_to_cpp(self):
							 | 
						||
| 
								 | 
							
								        """Test to_cpp method."""
							 | 
						||
| 
								 | 
							
								        cpp = self.declaration.to_cpp()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(cpp, "FooBar<double>")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestTemplateInstantiator(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Test overall template instantiation and the functions in the module.
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    def test_scoped_template(self):
							 | 
						||
| 
								 | 
							
								        """Test is_scoped_template."""
							 | 
						||
| 
								 | 
							
								        # Test if not scoped template.
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T']
							 | 
						||
| 
								 | 
							
								        str_arg_typename = "double"
							 | 
						||
| 
								 | 
							
								        scoped_template, scoped_idx = is_scoped_template(
							 | 
						||
| 
								 | 
							
								            template_typenames, str_arg_typename)
							 | 
						||
| 
								 | 
							
								        self.assertFalse(scoped_template)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(scoped_idx, -1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Check for correct template match.
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T']
							 | 
						||
| 
								 | 
							
								        str_arg_typename = "gtsam::Matrix"
							 | 
						||
| 
								 | 
							
								        scoped_template, scoped_idx = is_scoped_template(
							 | 
						||
| 
								 | 
							
								            template_typenames, str_arg_typename)
							 | 
						||
| 
								 | 
							
								        self.assertFalse(scoped_template)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(scoped_idx, -1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Test scoped templatte
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T']
							 | 
						||
| 
								 | 
							
								        str_arg_typename = "T::Value"
							 | 
						||
| 
								 | 
							
								        scoped_template, scoped_idx = is_scoped_template(
							 | 
						||
| 
								 | 
							
								            template_typenames, str_arg_typename)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(scoped_template, "T")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(scoped_idx, 0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template_typenames = ['U', 'T']
							 | 
						||
| 
								 | 
							
								        str_arg_typename = "T::Value"
							 | 
						||
| 
								 | 
							
								        scoped_template, scoped_idx = is_scoped_template(
							 | 
						||
| 
								 | 
							
								            template_typenames, str_arg_typename)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(scoped_template, "T")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(scoped_idx, 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_type(self):
							 | 
						||
| 
								 | 
							
								        """Test for instantiate_type."""
							 | 
						||
| 
								 | 
							
								        arg = Argument.rule.parseString("const T x")[0]
							 | 
						||
| 
								 | 
							
								        template_typenames = ["T"]
							 | 
						||
| 
								 | 
							
								        instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        cpp_typename = "ExampleClass"
							 | 
						||
| 
								 | 
							
								        new_type = instantiate_type(arg.ctype,
							 | 
						||
| 
								 | 
							
								                                    template_typenames,
							 | 
						||
| 
								 | 
							
								                                    instantiations=instantiations,
							 | 
						||
| 
								 | 
							
								                                    cpp_typename=cpp_typename,
							 | 
						||
| 
								 | 
							
								                                    instantiated_class=None)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        new_typename = new_type.typename
							 | 
						||
| 
								 | 
							
								        self.assertEqual(new_typename.name, "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(new_typename.instantiated_name(), "double")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_args_list(self):
							 | 
						||
| 
								 | 
							
								        """Test for instantiate_args_list."""
							 | 
						||
| 
								 | 
							
								        args = ArgumentList.rule.parseString("T x, double y, string z")[0]
							 | 
						||
| 
								 | 
							
								        args_list = args.list()
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T']
							 | 
						||
| 
								 | 
							
								        instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        instantiated_args_list = instantiate_args_list(
							 | 
						||
| 
								 | 
							
								            args_list,
							 | 
						||
| 
								 | 
							
								            template_typenames,
							 | 
						||
| 
								 | 
							
								            instantiations,
							 | 
						||
| 
								 | 
							
								            cpp_typename="ExampleClass")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_args_list[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "double")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        args = ArgumentList.rule.parseString("T x, U y, string z")[0]
							 | 
						||
| 
								 | 
							
								        args_list = args.list()
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T', 'U']
							 | 
						||
| 
								 | 
							
								        instantiations = [
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("double")[0],
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("Matrix")[0]
							 | 
						||
| 
								 | 
							
								        ]
							 | 
						||
| 
								 | 
							
								        instantiated_args_list = instantiate_args_list(
							 | 
						||
| 
								 | 
							
								            args_list,
							 | 
						||
| 
								 | 
							
								            template_typenames,
							 | 
						||
| 
								 | 
							
								            instantiations,
							 | 
						||
| 
								 | 
							
								            cpp_typename="ExampleClass")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_args_list[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_args_list[1].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "Matrix")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        args = ArgumentList.rule.parseString("T x, U y, T z")[0]
							 | 
						||
| 
								 | 
							
								        args_list = args.list()
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T', 'U']
							 | 
						||
| 
								 | 
							
								        instantiations = [
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("double")[0],
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("Matrix")[0]
							 | 
						||
| 
								 | 
							
								        ]
							 | 
						||
| 
								 | 
							
								        instantiated_args_list = instantiate_args_list(
							 | 
						||
| 
								 | 
							
								            args_list,
							 | 
						||
| 
								 | 
							
								            template_typenames,
							 | 
						||
| 
								 | 
							
								            instantiations,
							 | 
						||
| 
								 | 
							
								            cpp_typename="ExampleClass")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_args_list[0].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_args_list[1].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "Matrix")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_args_list[2].ctype.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "double")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_return_type(self):
							 | 
						||
| 
								 | 
							
								        """Test for instantiate_return_type."""
							 | 
						||
| 
								 | 
							
								        return_type = ReturnType.rule.parseString("T")[0]
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T']
							 | 
						||
| 
								 | 
							
								        instantiations = [Typename.rule.parseString("double")[0]]
							 | 
						||
| 
								 | 
							
								        instantiated_return_type = instantiate_return_type(
							 | 
						||
| 
								 | 
							
								            return_type,
							 | 
						||
| 
								 | 
							
								            template_typenames,
							 | 
						||
| 
								 | 
							
								            instantiations,
							 | 
						||
| 
								 | 
							
								            cpp_typename="ExampleClass")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_return_type.type1.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "double")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return_type = ReturnType.rule.parseString("pair<T, U>")[0]
							 | 
						||
| 
								 | 
							
								        template_typenames = ['T', 'U']
							 | 
						||
| 
								 | 
							
								        instantiations = [
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("double")[0],
							 | 
						||
| 
								 | 
							
								            Typename.rule.parseString("char")[0],
							 | 
						||
| 
								 | 
							
								        ]
							 | 
						||
| 
								 | 
							
								        instantiated_return_type = instantiate_return_type(
							 | 
						||
| 
								 | 
							
								            return_type,
							 | 
						||
| 
								 | 
							
								            template_typenames,
							 | 
						||
| 
								 | 
							
								            instantiations,
							 | 
						||
| 
								 | 
							
								            cpp_typename="ExampleClass")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_return_type.type1.get_typename(),
							 | 
						||
| 
								 | 
							
								                         "double")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_return_type.type2.get_typename(), "char")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_name(self):
							 | 
						||
| 
								 | 
							
								        """Test for instantiate_name."""
							 | 
						||
| 
								 | 
							
								        instantiations = [Typename.rule.parseString("Man")[0]]
							 | 
						||
| 
								 | 
							
								        instantiated_name = instantiate_name("Iron", instantiations)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_name, "IronMan")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_instantiate_namespace(self):
							 | 
						||
| 
								 | 
							
								        """Test for instantiate_namespace."""
							 | 
						||
| 
								 | 
							
								        namespace = Namespace.rule.parseString("""
							 | 
						||
| 
								 | 
							
								            namespace gtsam {
							 | 
						||
| 
								 | 
							
								                #include <gtsam/nonlinear/Values.h>
							 | 
						||
| 
								 | 
							
								                template<T={gtsam::Basis}>
							 | 
						||
| 
								 | 
							
								                class Values {
							 | 
						||
| 
								 | 
							
								                    Values(const T& other);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    template<V={Vector, Matrix}>
							 | 
						||
| 
								 | 
							
								                    void insert(size_t j, V x);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    template<S={double}>
							 | 
						||
| 
								 | 
							
								                    static S staticMethod(const S& s);
							 | 
						||
| 
								 | 
							
								                };
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        """)[0]
							 | 
						||
| 
								 | 
							
								        instantiated_namespace = instantiate_namespace(namespace)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_namespace.name, "gtsam")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_namespace.parent, "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_namespace.content[0].header,
							 | 
						||
| 
								 | 
							
								                         "gtsam/nonlinear/Values.h")
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(instantiated_namespace.content[0], Include)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_namespace.content[1].name, "ValuesBasis")
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(instantiated_namespace.content[1], Class)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(instantiated_namespace.content[1].ctors[0],
							 | 
						||
| 
								 | 
							
								                              Constructor)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_namespace.content[1].ctors[0].name,
							 | 
						||
| 
								 | 
							
								                         "ValuesBasis")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(instantiated_namespace.content[1].methods[0],
							 | 
						||
| 
								 | 
							
								                              Method)
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(instantiated_namespace.content[1].methods[1],
							 | 
						||
| 
								 | 
							
								                              Method)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_namespace.content[1].methods[0].name,
							 | 
						||
| 
								 | 
							
								                         "insertVector")
							 | 
						||
| 
								 | 
							
								        self.assertEqual(instantiated_namespace.content[1].methods[1].name,
							 | 
						||
| 
								 | 
							
								                         "insertMatrix")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertIsInstance(
							 | 
						||
| 
								 | 
							
								            instantiated_namespace.content[1].static_methods[0], StaticMethod)
							 | 
						||
| 
								 | 
							
								        self.assertEqual(
							 | 
						||
| 
								 | 
							
								            instantiated_namespace.content[1].static_methods[0].name,
							 | 
						||
| 
								 | 
							
								            "staticMethodDouble")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == '__main__':
							 | 
						||
| 
								 | 
							
								    unittest.main()
							 |