processor_test.py revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Test resources processing, i.e. <if> and <include> tag handling."""
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from processor import FileCache, Processor, LineNumber
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProcessorTest(unittest.TestCase):
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Test <include> tag processing logic."""
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, *args, **kwargs):
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unittest.TestCase.__init__(self, *args, **kwargs)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.maxDiff = None
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileCache._cache["/debug.js"] = """
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2002 Older Chromium Author dudes.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function debug(msg) { if (window.DEBUG) alert(msg); }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""".strip()
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileCache._cache["/global.js"] = """
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 Old Chromium Author dudes.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<include src="/debug.js">
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var global = 'type checking!';
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""".strip()
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileCache._cache["/checked.js"] = """
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2028 Future Chromium Author dudes.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fileoverview Coolest app ever.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @author Douglas Crockford (douglas@crockford.com)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<include src="/global.js">
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)debug(global);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Here continues checked.js, a swell file.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""".strip()
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42    self._processor = Processor("/checked.js")
43
44  def testInline(self):
45    self.assertMultiLineEqual("""
46// Copyright 2028 Future Chromium Author dudes.
47/**
48 * @fileoverview Coolest app ever.
49 * @author Douglas Crockford (douglas@crockford.com)
50 */
51// Copyright 2014 Old Chromium Author dudes.
52// Copyright 2002 Older Chromium Author dudes.
53function debug(msg) { if (window.DEBUG) alert(msg); }
54var global = 'type checking!';
55debug(global);
56// Here continues checked.js, a swell file.
57""".strip(), self._processor.contents)
58
59  def assertLineNumber(self, abs_line, expected_line):
60    actual_line = self._processor.get_file_from_line(abs_line)
61    self.assertEqual(expected_line.file, actual_line.file)
62    self.assertEqual(expected_line.line_number, actual_line.line_number)
63
64  def testGetFileFromLine(self):
65    """Verify that inlined files retain their original line info."""
66    self.assertLineNumber(1, LineNumber("/checked.js", 1))
67    self.assertLineNumber(5, LineNumber("/checked.js", 5))
68    self.assertLineNumber(6, LineNumber("/global.js", 1))
69    self.assertLineNumber(7, LineNumber("/debug.js", 1))
70    self.assertLineNumber(8, LineNumber("/debug.js", 2))
71    self.assertLineNumber(9, LineNumber("/global.js", 3))
72    self.assertLineNumber(10, LineNumber("/checked.js", 7))
73    self.assertLineNumber(11, LineNumber("/checked.js", 8))
74
75  def testIncludedFiles(self):
76    """Verify that files are tracked correctly as they're inlined."""
77    self.assertEquals(set(["/global.js", "/debug.js"]),
78                      self._processor.included_files)
79
80
81class IfStrippingTest(unittest.TestCase):
82  """Test that the contents of XML <if> blocks are stripped."""
83
84  def __init__(self, *args, **kwargs):
85    unittest.TestCase.__init__(self, *args, **kwargs)
86    self.maxDiff = None
87
88  def setUp(self):
89    FileCache._cache["/century.js"] = """
90  function getCurrentCentury() {
91<if expr="netscape_os">
92    alert("Oh wow!");
93    return "XX";
94</if>
95    return "XXI";
96  }
97""".strip()
98
99    self.processor_ = Processor("/century.js")
100
101  def testIfStripping(self):
102    self.assertMultiLineEqual("""
103  function getCurrentCentury() {
104
105    alert("Oh wow!");
106    return "XX";
107
108    return "XXI";
109  }
110""".strip(), self.processor_.contents)
111
112
113if __name__ == '__main__':
114  unittest.main()
115