/config/tests/unit-Preprocessor.py

https://github.com/diogogmt/mozilla-central · Python · 494 lines · 445 code · 43 blank · 6 comment · 3 complexity · b4992bbfb2e83692748aa118c37826fc MD5 · raw file

  1. import unittest
  2. from StringIO import StringIO
  3. import os
  4. import sys
  5. import os.path
  6. sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
  7. from Preprocessor import Preprocessor
  8. class NamedIO(StringIO):
  9. def __init__(self, name, content):
  10. self.name = name
  11. StringIO.__init__(self, content)
  12. class TestPreprocessor(unittest.TestCase):
  13. """
  14. Unit tests for the Context class
  15. """
  16. def setUp(self):
  17. self.pp = Preprocessor()
  18. self.pp.out = StringIO()
  19. def test_conditional_if_0(self):
  20. f = NamedIO("conditional_if_0.in", """#if 0
  21. FAIL
  22. #else
  23. PASS
  24. #endif
  25. """)
  26. self.pp.do_include(f)
  27. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  28. def test_string_value(self):
  29. f = NamedIO("string_value.in", """#define FOO STRING
  30. #if FOO
  31. string value is true
  32. #else
  33. string value is false
  34. #endif
  35. """)
  36. self.pp.do_include(f)
  37. self.assertEqual(self.pp.out.getvalue(), "string value is false\n")
  38. def test_number_value(self):
  39. f = NamedIO("string_value.in", """#define FOO 1
  40. #if FOO
  41. number value is true
  42. #else
  43. number value is false
  44. #endif
  45. """)
  46. self.pp.do_include(f)
  47. self.assertEqual(self.pp.out.getvalue(), "number value is true\n")
  48. def test_conditional_if_0_elif_1(self):
  49. f = NamedIO('conditional_if_0_elif_1.in', '''#if 0
  50. #elif 1
  51. PASS
  52. #else
  53. FAIL
  54. #endif
  55. ''')
  56. self.pp.do_include(f)
  57. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  58. def test_conditional_if_1(self):
  59. f = NamedIO('conditional_if_1.in', '''#if 1
  60. PASS
  61. #else
  62. FAILE
  63. #endif
  64. ''')
  65. self.pp.do_include(f)
  66. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  67. def test_conditional_if_1_elif_1_else(self):
  68. f = NamedIO('conditional_if_1_elif_1_else.in', '''#if 1
  69. PASS
  70. #elif 1
  71. FAIL
  72. #else
  73. FAIL
  74. #endif
  75. ''')
  76. self.pp.do_include(f)
  77. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  78. def test_conditional_if_1_if_1(self):
  79. f = NamedIO('conditional_if_1_if_1.in', '''#if 1
  80. #if 1
  81. PASS
  82. #else
  83. FAIL
  84. #endif
  85. #else
  86. FAIL
  87. #endif
  88. ''')
  89. self.pp.do_include(f)
  90. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  91. def test_conditional_not_0(self):
  92. f = NamedIO('conditional_not_0.in', '''#if !0
  93. PASS
  94. #else
  95. FAIL
  96. #endif
  97. ''')
  98. self.pp.do_include(f)
  99. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  100. def test_conditional_not_1(self):
  101. f = NamedIO('conditional_not_1.in', '''#if !1
  102. FAIL
  103. #else
  104. PASS
  105. #endif
  106. ''')
  107. self.pp.do_include(f)
  108. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  109. def test_conditional_not_emptyval(self):
  110. f = NamedIO('conditional_not_emptyval.in', '''#define EMPTYVAL
  111. #if !EMPTYVAL
  112. FAIL
  113. #else
  114. PASS
  115. #endif
  116. #if EMPTYVAL
  117. PASS
  118. #else
  119. FAIL
  120. #endif
  121. ''')
  122. self.pp.do_include(f)
  123. self.assertEqual(self.pp.out.getvalue(), "PASS\nPASS\n")
  124. def test_conditional_not_nullval(self):
  125. f = NamedIO('conditional_not_nullval.in', '''#define NULLVAL 0
  126. #if !NULLVAL
  127. PASS
  128. #else
  129. FAIL
  130. #endif
  131. ''')
  132. self.pp.do_include(f)
  133. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  134. def test_expand(self):
  135. f = NamedIO('expand.in', '''#define ASVAR AS
  136. #expand P__ASVAR__S
  137. ''')
  138. self.pp.do_include(f)
  139. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  140. def test_undef_defined(self):
  141. f = NamedIO('undef_defined.in', '''#define BAR
  142. #undef BAR
  143. BAR
  144. ''')
  145. self.pp.do_include(f)
  146. self.assertEqual(self.pp.out.getvalue(), "BAR\n")
  147. def test_undef_undefined(self):
  148. f = NamedIO('undef_undefined.in', '''#undef VAR
  149. ''')
  150. self.pp.do_include(f)
  151. self.assertEqual(self.pp.out.getvalue(), "")
  152. def test_filter_attemptSubstitution(self):
  153. f = NamedIO('filter_attemptSubstitution.in', '''#filter attemptSubstitution
  154. P@VAR@ASS
  155. #unfilter attemptSubstitution
  156. ''')
  157. self.pp.do_include(f)
  158. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  159. def test_filter_emptyLines(self):
  160. f = NamedIO('filter_emptyLines.in', '''lines with a
  161. blank line
  162. #filter emptyLines
  163. lines with
  164. no blank lines
  165. #unfilter emptyLines
  166. yet more lines with
  167. blank lines
  168. ''')
  169. self.pp.do_include(f)
  170. self.assertEqual(self.pp.out.getvalue(), '''lines with a
  171. blank line
  172. lines with
  173. no blank lines
  174. yet more lines with
  175. blank lines
  176. ''')
  177. def test_filter_slashslash(self):
  178. f = NamedIO('filter_slashslash.in', '''#filter slashslash
  179. PASS//FAIL // FAIL
  180. #unfilter slashslash
  181. PASS // PASS
  182. ''')
  183. self.pp.do_include(f)
  184. self.assertEqual(self.pp.out.getvalue(), "PASS\nPASS // PASS\n")
  185. def test_filter_spaces(self):
  186. f = NamedIO('filter_spaces.in', '''#filter spaces
  187. You should see two nice ascii tables
  188. +-+-+-+
  189. | | | |
  190. +-+-+-+
  191. #unfilter spaces
  192. +-+---+
  193. | | |
  194. +-+---+
  195. ''')
  196. self.pp.do_include(f)
  197. self.assertEqual(self.pp.out.getvalue(), """You should see two nice ascii tables
  198. +-+-+-+
  199. | | | |
  200. +-+-+-+
  201. +-+---+
  202. | | |
  203. +-+---+
  204. """)
  205. def test_filter_substitution(self):
  206. f = NamedIO('filter_substitution.in', '''#define VAR ASS
  207. #filter substitution
  208. P@VAR@
  209. #unfilter substitution
  210. ''')
  211. self.pp.do_include(f)
  212. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  213. def test_error(self):
  214. f = NamedIO('error.in', '''#error spit this message out
  215. ''')
  216. caught_msg = None
  217. try:
  218. self.pp.do_include(f)
  219. except Preprocessor.Error, e:
  220. caught_msg = e.args[0][-1]
  221. self.assertEqual(caught_msg, 'spit this message out')
  222. def test_javascript_line(self):
  223. f = NamedIO('javascript_line.js.in', '''// Line 1
  224. #if 0
  225. // line 3
  226. #endif
  227. // line 5
  228. # comment
  229. // line 7
  230. // line 8
  231. // line 9
  232. # another comment
  233. // line 11
  234. #define LINE 1
  235. // line 13, given line number overwritten with 2
  236. ''')
  237. self.pp.do_include(f)
  238. out = """// Line 1
  239. //@line 5 "CWDjavascript_line.js.in"
  240. // line 5
  241. //@line 7 "CWDjavascript_line.js.in"
  242. // line 7
  243. // line 8
  244. // line 9
  245. //@line 11 "CWDjavascript_line.js.in"
  246. // line 11
  247. //@line 2 "CWDjavascript_line.js.in"
  248. // line 13, given line number overwritten with 2
  249. """
  250. out = out.replace('CWD', os.getcwd() + os.path.sep)
  251. self.assertEqual(self.pp.out.getvalue(), out)
  252. def test_literal(self):
  253. f = NamedIO('literal.in', '''#literal PASS
  254. ''')
  255. self.pp.do_include(f)
  256. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  257. def test_var_directory(self):
  258. f = NamedIO('var_directory.in', '''#ifdef DIRECTORY
  259. PASS
  260. #else
  261. FAIL
  262. #endif
  263. ''')
  264. self.pp.do_include(f)
  265. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  266. def test_var_file(self):
  267. f = NamedIO('var_file.in', '''#ifdef FILE
  268. PASS
  269. #else
  270. FAIL
  271. #endif
  272. ''')
  273. self.pp.do_include(f)
  274. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  275. def test_var_if_0(self):
  276. f = NamedIO('var_if_0.in', '''#define VAR 0
  277. #if VAR
  278. FAIL
  279. #else
  280. PASS
  281. #endif
  282. ''')
  283. self.pp.do_include(f)
  284. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  285. def test_var_if_0_elifdef(self):
  286. f = NamedIO('var_if_0_elifdef.in', '''#if 0
  287. #elifdef FILE
  288. PASS
  289. #else
  290. FAIL
  291. #endif
  292. ''')
  293. self.pp.do_include(f)
  294. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  295. def test_var_if_0_elifndef(self):
  296. f = NamedIO('var_if_0_elifndef.in', '''#if 0
  297. #elifndef VAR
  298. PASS
  299. #else
  300. FAIL
  301. #endif
  302. ''')
  303. self.pp.do_include(f)
  304. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  305. def test_var_ifdef_0(self):
  306. f = NamedIO('var_ifdef_0.in', '''#define VAR 0
  307. #ifdef VAR
  308. PASS
  309. #else
  310. FAIL
  311. #endif
  312. ''')
  313. self.pp.do_include(f)
  314. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  315. def test_var_ifdef_undef(self):
  316. f = NamedIO('var_ifdef_undef.in', '''#define VAR 0
  317. #undef VAR
  318. #ifdef VAR
  319. FAIL
  320. #else
  321. PASS
  322. #endif
  323. ''')
  324. self.pp.do_include(f)
  325. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  326. def test_var_ifndef_0(self):
  327. f = NamedIO('var_ifndef_0.in', '''#define VAR 0
  328. #ifndef VAR
  329. FAIL
  330. #else
  331. PASS
  332. #endif
  333. ''')
  334. self.pp.do_include(f)
  335. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  336. def test_var_ifndef_undef(self):
  337. f = NamedIO('var_ifndef_undef.in', '''#define VAR 0
  338. #undef VAR
  339. #ifndef VAR
  340. PASS
  341. #else
  342. FAIL
  343. #endif
  344. ''')
  345. self.pp.do_include(f)
  346. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  347. def test_var_line(self):
  348. f = NamedIO('var_line.in', '''#ifdef LINE
  349. PASS
  350. #else
  351. FAIL
  352. #endif
  353. ''')
  354. self.pp.do_include(f)
  355. self.assertEqual(self.pp.out.getvalue(), "PASS\n")
  356. def test_lineEndings(self):
  357. f = NamedIO('lineEndings.in', '''first
  358. #literal second
  359. ''')
  360. self.pp.setLineEndings('cr')
  361. self.pp.do_include(f)
  362. self.assertEqual(self.pp.out.getvalue(), "first\rsecond\r")
  363. def test_number_value_equals(self):
  364. f = NamedIO("number_value_equals.in", """#define FOO 1000
  365. #if FOO == 1000
  366. number value is equal
  367. #else
  368. number value is not equal
  369. #endif
  370. """)
  371. self.pp.do_include(f)
  372. self.assertEqual(self.pp.out.getvalue(), "number value is equal\n")
  373. def test_number_value_equals_defines(self):
  374. f = NamedIO("number_value_equals_defines.in", """#if FOO == 1000
  375. number value is equal
  376. #else
  377. number value is not equal
  378. #endif
  379. """)
  380. self.pp.handleCommandLine(["-DFOO=1000"])
  381. self.pp.do_include(f)
  382. self.assertEqual(self.pp.out.getvalue(), "number value is equal\n")
  383. def test_octal_value_equals(self):
  384. f = NamedIO("octal_value_equals.in", """#define FOO 0100
  385. #if FOO == 0100
  386. octal value is equal
  387. #else
  388. octal value is not equal
  389. #endif
  390. """)
  391. self.pp.do_include(f)
  392. self.assertEqual(self.pp.out.getvalue(), "octal value is equal\n")
  393. def test_octal_value_equals_defines(self):
  394. f = NamedIO("octal_value_equals_defines.in", """#if FOO == 0100
  395. octal value is equal
  396. #else
  397. octal value is not equal
  398. #endif
  399. """)
  400. self.pp.handleCommandLine(["-DFOO=0100"])
  401. self.pp.do_include(f)
  402. self.assertEqual(self.pp.out.getvalue(), "octal value is equal\n")
  403. def test_value_quoted_expansion(self):
  404. """
  405. Quoted values on the commandline don't currently have quotes stripped.
  406. Pike says this is for compat reasons.
  407. """
  408. f = NamedIO("value_quoted_expansion.in", """#filter substitution
  409. @FOO@
  410. """)
  411. self.pp.handleCommandLine(['-DFOO="ABCD"'])
  412. self.pp.do_include(f)
  413. self.assertEqual(self.pp.out.getvalue(), '"ABCD"\n')
  414. def test_octal_value_quoted_expansion(self):
  415. f = NamedIO("value_quoted_expansion.in", """#filter substitution
  416. @FOO@
  417. """)
  418. self.pp.handleCommandLine(['-DFOO="0100"'])
  419. self.pp.do_include(f)
  420. self.assertEqual(self.pp.out.getvalue(), '"0100"\n')
  421. def test_number_value_not_equals_quoted_defines(self):
  422. f = NamedIO("number_value_not_equals_quoted_defines.in", """#if FOO == 1000
  423. number value is equal
  424. #else
  425. number value is not equal
  426. #endif
  427. """)
  428. self.pp.handleCommandLine(['-DFOO="1000"'])
  429. self.pp.do_include(f)
  430. self.assertEqual(self.pp.out.getvalue(), "number value is not equal\n")
  431. def test_octal_value_not_equals_quoted_defines(self):
  432. f = NamedIO("octal_value_not_equals_quoted_defines.in", """#if FOO == 0100
  433. octal value is equal
  434. #else
  435. octal value is not equal
  436. #endif
  437. """)
  438. self.pp.handleCommandLine(['-DFOO="0100"'])
  439. self.pp.do_include(f)
  440. self.assertEqual(self.pp.out.getvalue(), "octal value is not equal\n")
  441. if __name__ == '__main__':
  442. unittest.main()