SyFi
0.3
|
00001 #!/usr/bin/env python 00002 00003 __authors__ = "Martin Sandve Alnes" 00004 __date__ = "2008-09-04 -- 2008-09-04" 00005 00006 import unittest 00007 00008 from sfc.codegeneration.codeformatting import CodeFormatter, gen_token_declarations, gen_token_definitions 00009 00010 test_switch_result = """switch(facet) 00011 { 00012 case 0: 00013 dofs[0] = 2; 00014 dofs[1] = 0; 00015 dofs[2] = 1; 00016 break; 00017 case 1: 00018 dofs[0] = 5; 00019 dofs[1] = 3; 00020 dofs[2] = 4; 00021 break; 00022 case 2: 00023 dofs[0] = 6; 00024 dofs[1] = 7; 00025 dofs[2] = 8; 00026 break; 00027 default: 00028 throw std::runtime_error("Invalid facet number."); 00029 }""" 00030 00031 gen_tokens_result = """{ 00032 double s1; 00033 double s2; 00034 } 00035 double s1 = e1; 00036 double s2 = e2; 00037 double s1 = e1; 00038 double s2 = e2;""" 00039 00040 functions_result = """inline void c(double a[3], double b[3], double c[3]) const; 00041 00042 inline void c(double a[3], double b[3], double c[3]) const 00043 { 00044 // Empty body! 00045 } 00046 00047 c(a, b, c); 00048 """ 00049 00050 class CodeFormattingTest(unittest.TestCase): 00051 00052 def setUp(self): 00053 pass 00054 00055 def _compare_codes(self, code, correct): 00056 "Compare codes and print codes if this fails." 00057 if code != correct: 00058 print "Failure, got code:" 00059 print '"""%s"""' % code 00060 print "but expecting:" 00061 print '"""%s"""' % correct 00062 self.assertTrue(code == correct) 00063 00064 def test_switch(self): 00065 code = CodeFormatter() 00066 code.begin_switch("facet") 00067 facet_dofs = [(2, 0, 1), (5, 3, 4), (6, 7, 8)] 00068 for i, dofs in enumerate(facet_dofs): 00069 code.begin_case(i) 00070 for j, d in enumerate(dofs): 00071 code += "dofs[%d] = %d;" % (j, d) 00072 code.end_case() 00073 code += "default:" 00074 code.indent() 00075 code += 'throw std::runtime_error("Invalid facet number.");' 00076 code.dedent() 00077 code.end_switch() 00078 code = str(code) 00079 00080 self._compare_codes(code, test_switch_result) 00081 00082 def test_gen_tokens(self): 00083 code = CodeFormatter() 00084 class MockObject: 00085 def __init__(self, text): 00086 self._text = text 00087 def printc(self): 00088 return self._text 00089 def __str__(self): 00090 return self._text 00091 s1 = MockObject("s1") 00092 e1 = MockObject("e1") 00093 s2 = MockObject("s2") 00094 e2 = MockObject("e2") 00095 tokens = [(s1, e1), (s2, e2)] 00096 code.begin_block() 00097 code += gen_token_declarations(tokens) 00098 code.end_block() 00099 code.indent() 00100 code.indent() 00101 code += gen_token_definitions(tokens) 00102 code.dedent() 00103 code += gen_token_definitions(tokens) 00104 code.dedent() 00105 code = str(code) 00106 00107 self._compare_codes(code, gen_tokens_result) 00108 00109 def test_functions(self): 00110 code = CodeFormatter() 00111 00112 name = "myfunction" 00113 00114 argnames = ["a", "b", "c"] 00115 args = [("double", name, "[3]") for name in argnames] 00116 00117 code.declare_function(name, args=args, const=True, inline=True) 00118 code.new_line("") 00119 00120 body = "// Empty body!" 00121 code.define_function(name, args=args, const=True, inline=True, body=body) 00122 code.new_line("") 00123 00124 code.call_function(name, args=argnames) 00125 code.new_line("") 00126 00127 code = str(code) 00128 00129 self._compare_codes(code, functions_result) 00130 00131 tests = [CodeFormattingTest] 00132 00133 if __name__ == "__main__": 00134 unittest.main() 00135