|  | #!/usr/bin/env python | 
|  | # Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | """Test resources processing, i.e. <if> and <include> tag handling.""" | 
|  |  | 
|  | import unittest | 
|  | from processor import FileCache, Processor, LineNumber | 
|  |  | 
|  |  | 
|  | class ProcessorTest(unittest.TestCase): | 
|  | """Test <include> tag processing logic.""" | 
|  |  | 
|  | def __init__(self, *args, **kwargs): | 
|  | unittest.TestCase.__init__(self, *args, **kwargs) | 
|  | self.maxDiff = None | 
|  |  | 
|  | def setUp(self): | 
|  | FileCache._cache["/debug.js"] = """ | 
|  | // Copyright 2002 Older Chromium Author dudes. | 
|  | function debug(msg) { if (window.DEBUG) alert(msg); } | 
|  | """.strip() | 
|  |  | 
|  | FileCache._cache["/global.js"] = """ | 
|  | // Copyright 2014 Old Chromium Author dudes. | 
|  | <include src="/debug.js"> | 
|  | var global = 'type checking!'; | 
|  | """.strip() | 
|  |  | 
|  | FileCache._cache["/checked.js"] = """ | 
|  | // Copyright 2028 Future Chromium Author dudes. | 
|  | /** | 
|  | * @fileoverview Coolest app ever. | 
|  | * @author Douglas Crockford (douglas@crockford.com) | 
|  | */ | 
|  | <include src="/global.js"> | 
|  | debug(global); | 
|  | // Here continues checked.js, a swell file. | 
|  | """.strip() | 
|  |  | 
|  | FileCache._cache["/double-debug.js"] = """ | 
|  | <include src="/debug.js"> | 
|  | <include src="/debug.js"> | 
|  | """.strip() | 
|  |  | 
|  | self._processor = Processor("/checked.js") | 
|  |  | 
|  | def testInline(self): | 
|  | self.assertMultiLineEqual(""" | 
|  | // Copyright 2028 Future Chromium Author dudes. | 
|  | /** | 
|  | * @fileoverview Coolest app ever. | 
|  | * @author Douglas Crockford (douglas@crockford.com) | 
|  | */ | 
|  | // Copyright 2014 Old Chromium Author dudes. | 
|  | // Copyright 2002 Older Chromium Author dudes. | 
|  | function debug(msg) { if (window.DEBUG) alert(msg); } | 
|  | var global = 'type checking!'; | 
|  | debug(global); | 
|  | // Here continues checked.js, a swell file. | 
|  | """.strip(), self._processor.contents) | 
|  |  | 
|  | def assertLineNumber(self, abs_line, expected_line): | 
|  | actual_line = self._processor.get_file_from_line(abs_line) | 
|  | self.assertEqual(expected_line.file, actual_line.file) | 
|  | self.assertEqual(expected_line.line_number, actual_line.line_number) | 
|  |  | 
|  | def testGetFileFromLine(self): | 
|  | """Verify that inlined files retain their original line info.""" | 
|  | self.assertLineNumber(1, LineNumber("/checked.js", 1)) | 
|  | self.assertLineNumber(5, LineNumber("/checked.js", 5)) | 
|  | self.assertLineNumber(6, LineNumber("/global.js", 1)) | 
|  | self.assertLineNumber(7, LineNumber("/debug.js", 1)) | 
|  | self.assertLineNumber(8, LineNumber("/debug.js", 2)) | 
|  | self.assertLineNumber(9, LineNumber("/global.js", 3)) | 
|  | self.assertLineNumber(10, LineNumber("/checked.js", 7)) | 
|  | self.assertLineNumber(11, LineNumber("/checked.js", 8)) | 
|  |  | 
|  | def testIncludedFiles(self): | 
|  | """Verify that files are tracked correctly as they're inlined.""" | 
|  | self.assertEquals(set(["/global.js", "/debug.js"]), | 
|  | self._processor.included_files) | 
|  |  | 
|  | def testDoubleIncludedSkipped(self): | 
|  | """Verify that doubly included files are skipped.""" | 
|  | processor = Processor("/double-debug.js") | 
|  | self.assertEquals(set(["/debug.js"]), processor.included_files) | 
|  | self.assertEquals(FileCache.read("/debug.js") + "\n", processor.contents) | 
|  |  | 
|  | class IfStrippingTest(unittest.TestCase): | 
|  | """Test that the contents of XML <if> blocks are stripped.""" | 
|  |  | 
|  | def __init__(self, *args, **kwargs): | 
|  | unittest.TestCase.__init__(self, *args, **kwargs) | 
|  | self.maxDiff = None | 
|  |  | 
|  | def setUp(self): | 
|  | FileCache._cache["/century.js"] = """ | 
|  | function getCurrentCentury() { | 
|  | <if expr="netscape_os"> | 
|  | alert("Oh wow!"); | 
|  | return "XX"; | 
|  | </if> | 
|  | return "XXI"; | 
|  | } | 
|  | """.strip() | 
|  |  | 
|  | self.processor_ = Processor("/century.js") | 
|  |  | 
|  | def testIfStripping(self): | 
|  | self.assertMultiLineEqual(""" | 
|  | function getCurrentCentury() { | 
|  |  | 
|  | alert("Oh wow!"); | 
|  | return "XX"; | 
|  |  | 
|  | return "XXI"; | 
|  | } | 
|  | """.strip(), self.processor_.contents) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | unittest.main() |