newtests/codeformatter.py
Go to the documentation of this file.00001
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