newtests/codeformatter.py

Go to the documentation of this file.
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 

Generated on Mon Aug 31 16:16:45 2009 for SyFi by  doxygen 1.5.9