33 """Tests for pddm.py."""
41 class TestParsingMacros(unittest.TestCase):
46 self.assertEqual(
len(result._macros), 0)
49 f = io.StringIO(
u"""PDDM-DEFINE foo( )
52 self.assertEqual(
len(result._macros), 1)
53 macro = result._macros.get(
'foo')
54 self.assertIsNotNone(macro)
55 self.assertEquals(macro.name,
'foo')
56 self.assertEquals(macro.args, tuple())
57 self.assertEquals(macro.body,
'body')
68 PDDM-DEFINE oneArg(foo)
70 PDDM-DEFINE twoArgs( bar_ , baz )
74 self.assertEqual(
len(result._macros), 3)
75 macro = result._macros.get(
'noArgs')
76 self.assertIsNotNone(macro)
77 self.assertEquals(macro.name,
'noArgs')
78 self.assertEquals(macro.args, tuple())
79 self.assertEquals(macro.body,
'body1\nbody2\n')
80 macro = result._macros.get(
'oneArg')
81 self.assertIsNotNone(macro)
82 self.assertEquals(macro.name,
'oneArg')
83 self.assertEquals(macro.args, (
'foo',))
84 self.assertEquals(macro.body,
'body3')
85 macro = result._macros.get(
'twoArgs')
86 self.assertIsNotNone(macro)
87 self.assertEquals(macro.name,
'twoArgs')
88 self.assertEquals(macro.args, (
'bar_',
'baz'))
89 self.assertEquals(macro.body,
'body4\nbody5')
92 PDDM-DEFINE another(a,b,c)
96 self.assertEqual(
len(result._macros), 4)
97 macro = result._macros.get(
'another')
98 self.assertIsNotNone(macro)
99 self.assertEquals(macro.name,
'another')
100 self.assertEquals(macro.args, (
'a',
'b',
'c'))
101 self.assertEquals(macro.body,
'body1\nbody2')
106 (
u'PDDM-DEFINE foo()\nbody\nPDDM-DEFINED foo\nbaz',
107 'Hit a line with an unknown directive: '),
109 (
u'PDDM-DEFINE foo()\nbody\nPDDM-DEFINE-END\nPDDM-DEFINE-END\n',
110 'Got DEFINE-END directive without an active macro: '),
112 (
u'PDDM-DEFINE foo()\nbody\nPDDM-DEFINE-END\nmumble\n',
113 'Hit a line that wasn\'t a directive and no open macro definition: '),
115 (
u'PDDM-DEFINE foo()\nbody\nPDDM-DEFINE foo(a)\nmumble\n',
116 'Attempt to redefine macro: '),
118 for idx, (input_str, expected_prefix)
in enumerate(test_list, 1):
119 f = io.StringIO(input_str)
122 self.fail(
'Should throw exception, entry %d' % idx)
124 self.assertTrue(e.message.startswith(expected_prefix),
125 'Entry %d failed: %r' % (idx, e))
130 (
u'PDDM-DEFINE\nmumble',
131 'Failed to parse macro definition: '),
133 (
u'PDDM-DEFINE \nmumble',
134 'Failed to parse macro definition: '),
136 (
u'PDDM-DEFINE foo\nmumble',
137 'Failed to parse macro definition: '),
139 (
u'PDDM-DEFINE foo(\nmumble',
140 'Failed to parse macro definition: '),
142 (
u'PDDM-DEFINE foo(a, b\nmumble',
143 'Failed to parse macro definition: '),
145 (
u'PDDM-DEFINE (a, b)\nmumble',
146 'Failed to parse macro definition: '),
148 (
u'PDDM-DEFINE foo bar(a, b)\nmumble',
149 'Failed to parse macro definition: '),
151 (
u'PDDM-DEFINE foo(a, ,b)\nmumble',
152 'Empty arg name in macro definition: '),
153 (
u'PDDM-DEFINE foo(a,,b)\nmumble',
154 'Empty arg name in macro definition: '),
156 (
u'PDDM-DEFINE foo(a,b,a,c)\nmumble',
157 'Arg name "a" used more than once in macro definition: '),
159 (
u'PDDM-DEFINE foo(a b,c)\nmumble',
160 'Invalid arg name "a b" in macro definition: '),
161 (
u'PDDM-DEFINE foo(a.b,c)\nmumble',
162 'Invalid arg name "a.b" in macro definition: '),
163 (
u'PDDM-DEFINE foo(a-b,c)\nmumble',
164 'Invalid arg name "a-b" in macro definition: '),
165 (
u'PDDM-DEFINE foo(a,b,c.)\nmumble',
166 'Invalid arg name "c." in macro definition: '),
168 (
u'PDDM-DEFINE foo(a,c) foo\nmumble',
169 'Failed to parse macro definition: '),
170 (
u'PDDM-DEFINE foo(a,c) foo)\nmumble',
171 'Failed to parse macro definition: '),
173 for idx, (input_str, expected_prefix)
in enumerate(test_list, 1):
174 f = io.StringIO(input_str)
177 self.fail(
'Should throw exception, entry %d' % idx)
179 self.assertTrue(e.message.startswith(expected_prefix),
180 'Entry %d failed: %r' % (idx, e))
187 PDDM-DEFINE noArgs( )
193 PDDM-DEFINE oneArg(a)
198 PDDM-DEFINE twoArgs(b,c)
210 (
u'twoArgs(having some, fun)',
211 'body4 having some fun\nbody5'),
216 (
u'twoArgs(, empty)',
217 'body4 empty\nbody5'),
218 (
u'twoArgs(empty, )',
219 'body4 empty \nbody5'),
223 for idx, (input_str, expected)
in enumerate(test_list, 1):
224 result = mc.Expand(input_str)
225 self.assertEqual(result, expected,
226 'Entry %d --\n Result: %r\n Expected: %r' %
227 (idx, result, expected))
232 a-a$S-a$l-a$L-a$u-a$U
237 self.assertEqual(mc.Expand(
'bar(xYz)'),
'xYz- -xYz-xyz-XYz-XYZ')
238 self.assertEqual(mc.Expand(
'bar(MnoP)'),
'MnoP- -mnoP-mnop-MnoP-MNOP')
240 self.assertEqual(mc.Expand(
'bar()'),
'-----')
244 PDDM-DEFINE foo(a, b)
253 'No macro named "bar".'),
255 'No macro named "bar".'),
258 'Expected 2 args, got: "foo()".'),
260 'Expected 2 args, got: "foo(a b)".'),
262 'Expected 2 args, got: "foo(a,b,c)".'),
265 'Unknown arg option "a$z" while expanding "baz(mumble)".'),
267 for idx, (input_str, expected_err)
in enumerate(test_list, 1):
269 result = mc.Expand(input_str)
270 self.fail(
'Should throw exception, entry %d' % idx)
272 self.assertEqual(e.message, expected_err,
273 'Entry %d failed: %r' % (idx, e))
277 PDDM-DEFINE StartIt()
280 PDDM-DEFINE foo(a, b)
283 PDDM-DEFINE bar(n, t)
285 - (void)set##n$u##:(t)value;
289 expected =
"""- (int)abc;
290 - (void)setAbc:(int)value;
293 - (void)setDef:(NSString *)value;
296 - (void)setGhi:(int)value;
299 - (void)setJkl:(NSString *)value;
301 self.assertEqual(mc.Expand(
'StartIt()'), expected)
305 PDDM-DEFINE foo(a, b)
308 PDDM-DEFINE bar(x, y)
313 result = mc.Expand(
'foo(A,B)')
314 self.fail(
'Should throw exception! Test failed to catch recursion.')
316 self.assertEqual(e.message,
317 'Found macro recursion, invoking "foo(1, A)":\n...while expanding "bar(1, A)".\n...while expanding "foo(A,B)".')
328 (
u'a\n//%PDDM-DEFINE foo()\n//%body\nc',
331 (
u'a\n//%PDDM-DEFINE foo()\n//%body\n//%PDDM-DEFINE bar()\n//%body2\nc',
334 (
u'a\n//%PDDM-DEFINE foo()\n//%body\n//%PDDM-DEFINE-END\n'
335 u'//%PDDM-DEFINE bar()\n//%body2\n//%PDDM-DEFINE-END\nc',
338 (
u'a\n//%PDDM-EXPAND foo()\nbody\n//%PDDM-EXPAND-END\n'
339 u'//%PDDM-DEFINE bar()\n//%body2\n',
342 (
u'a\nb\n//%PDDM-DEFINE bar()\n//%body2\n'
343 u'//%PDDM-EXPAND bar()\nbody2\n//%PDDM-EXPAND-END\n',
346 (
u'a\n//%PDDM-EXPAND foo(1)\nbody\n//%PDDM-EXPAND foo(2)\nbody2\n//%PDDM-EXPAND-END\n'
347 u'//%PDDM-DEFINE foo()\n//%body2\n',
350 for idx, (input_str, line_counts)
in enumerate(test_list, 1):
351 f = io.StringIO(input_str)
354 self.assertEqual(
len(sf._sections),
len(line_counts),
355 'Entry %d -- %d != %d' %
356 (idx,
len(sf._sections),
len(line_counts)))
357 for idx2, (sec, expected)
in enumerate(zip(sf._sections, line_counts), 1):
358 self.assertEqual(sec.num_lines_captured, expected,
359 'Entry %d, section %d -- %d != %d' %
360 (idx, idx2, sec.num_lines_captured, expected))
365 (
u'//%PDDM-EXPAND a()\n//%PDDM-BOGUS',
366 'Ran into directive ("//%PDDM-BOGUS", line 2) while in "//%PDDM-EXPAND a()".'),
367 (
u'//%PDDM-EXPAND a()\n//%PDDM-DEFINE a()\n//%body\n',
368 'Ran into directive ("//%PDDM-DEFINE", line 2) while in "//%PDDM-EXPAND a()".'),
370 (
u'//%PDDM-EXPAND a()\na\nb\n',
371 'Hit the end of the file while in "//%PDDM-EXPAND a()".'),
373 (
u'//%PDDM-DEFINE a()\n//%body\n//%PDDM-BOGUS',
374 'Ran into directive ("//%PDDM-BOGUS", line 3) while in "//%PDDM-DEFINE a()".'),
375 (
u'//%PDDM-DEFINE a()\n//%body\n//%PDDM-EXPAND-END a()',
376 'Ran into directive ("//%PDDM-EXPAND-END", line 3) while in "//%PDDM-DEFINE a()".'),
378 (
u'a\n//%PDDM-DEFINE-END a()\n//a\n',
379 'Unexpected line 2: "//%PDDM-DEFINE-END a()".'),
380 (
u'a\n//%PDDM-EXPAND-END a()\n//a\n',
381 'Unexpected line 2: "//%PDDM-EXPAND-END a()".'),
382 (
u'//%PDDM-BOGUS\n//a\n',
383 'Unexpected line 1: "//%PDDM-BOGUS".'),
385 for idx, (input_str, expected_err)
in enumerate(test_list, 1):
386 f = io.StringIO(input_str)
389 self.fail(
'Should throw exception, entry %d' % idx)
391 self.assertEqual(e.message, expected_err,
392 'Entry %d failed: %r' % (idx, e))
399 //%PDDM-IMPORT-DEFINES ImportFile
401 //%PDDM-EXPAND mumble(abc)
404 //%PDDM-EXPAND mumble(def)
405 //%PDDM-EXPAND mumble(ghi)
408 //%PDDM-DEFINE mumble(a_)
412 //%PDDM-DEFINE getName(x_)
413 //%do##x_$u##(int x_);
417 //%PDDM-IMPORT-DEFINES ImportFile
419 //%PDDM-EXPAND mumble(abc)
420 // This block of code is generated, do not edit it directly.
425 //%PDDM-EXPAND-END mumble(abc)
427 //%PDDM-EXPAND mumble(def)
428 // This block of code is generated, do not edit it directly.
433 //%PDDM-EXPAND mumble(ghi)
434 // This block of code is generated, do not edit it directly.
439 //%PDDM-EXPAND-END (2 expansions)
441 //%PDDM-DEFINE mumble(a_)
444 expected_stripped =
u"""
445 //%PDDM-IMPORT-DEFINES ImportFile
447 //%PDDM-EXPAND mumble(abc)
448 //%PDDM-EXPAND-END mumble(abc)
450 //%PDDM-EXPAND mumble(def)
451 //%PDDM-EXPAND mumble(ghi)
452 //%PDDM-EXPAND-END (2 expansions)
454 //%PDDM-DEFINE mumble(a_)
458 self.assertEqual(name,
'ImportFile')
459 return io.StringIO(input_str2)
460 f = io.StringIO(input_str)
463 self.assertEqual(sf.processed_content, expected)
465 f2 = io.StringIO(sf.processed_content)
468 self.assertEqual(sf2.processed_content, expected)
469 self.assertEqual(sf2.processed_content, sf.processed_content)
471 f2 = io.StringIO(input_str)
473 sf2.ProcessContent(strip_expansion=
True)
474 self.assertEqual(sf2.processed_content, expected_stripped)
475 f2 = io.StringIO(sf.processed_content)
477 sf2.ProcessContent(strip_expansion=
True)
478 self.assertEqual(sf2.processed_content, expected_stripped)
483 //%PDDM-DEFINE mumble(a_)
485 //%PDDM-DEFINE mumble(x_)
489 f = io.StringIO(input_str)
493 self.fail(
'Should throw exception! Test failed to catch macro parsing error.')
495 self.assertEqual(e.message,
496 'Attempt to redefine macro: "PDDM-DEFINE mumble(x_)"\n'
497 '...while parsing section that started:\n'
498 ' Line 3: //%PDDM-DEFINE mumble(a_)')
503 //%PDDM-DEFINE mumble(a_)
505 //%PDDM-EXPAND foobar(x_)
509 f = io.StringIO(input_str)
513 self.fail(
'Should throw exception! Test failed to catch expand error.')
515 self.assertEqual(e.message,
516 'No macro named "foobar".\n'
517 '...while expanding "foobar(x_)" from the section that'
518 ' started:\n Line 5: //%PDDM-EXPAND foobar(x_)')
521 if __name__ ==
'__main__':