2 # Copyright 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5 """Tests for the module module, which contains Module and related classes."""
9 from tvcm import fake_fs
10 from tvcm import module
11 from tvcm import strip_js_comments
12 from tvcm import resource_loader
13 from tvcm import project as project_module
15 class ModuleIntegrationTests(unittest.TestCase):
16 def test_module(self):
18 fs.AddFile('/src/x.js', """
22 tvcm.exportTo('xyz', function() { });
24 fs.AddFile('/src/y.js', """
27 tvcm.exportTo('xyz', function() { });
29 fs.AddFile('/src/z.js', """
31 tvcm.exportTo('xyz', function() { });
34 project = project_module.Project(['/src/'],
35 include_tvcm_paths=False)
36 loader = resource_loader.ResourceLoader(project)
37 x_module = loader.load_module('x')
39 self.assertEquals([loader.loaded_modules['y'],
40 loader.loaded_modules['z']],
41 x_module.dependent_modules)
43 already_loaded_set = set()
45 x_module.compute_load_sequence_recursive(load_sequence, already_loaded_set)
47 self.assertEquals([loader.loaded_modules['z'],
48 loader.loaded_modules['y'],
54 fs.AddFile('/x/src/my_module.js', """
56 tvcm.require('tvcm.foo');
57 tvcm.exportTo('foo', function() {
60 fs.AddFile('/x/tvcm/foo.js', """
62 tvcm.require('tvcm.foo');
63 tvcm.exportTo('foo', function() {
66 project = project_module.Project(['/x'],
67 include_tvcm_paths=False)
68 loader = resource_loader.ResourceLoader(project)
70 my_module = loader.load_module(module_name = 'src.my_module')
71 assert [x.name for x in my_module.dependent_modules] == ['tvcm.foo']
72 assert my_module.dependent_modules[0].name == 'tvcm.foo'
74 def testDepsExceptionContext(self):
76 fs.AddFile('/x/src/my_module.js', """
78 tvcm.require('tvcm.foo');
79 tvcm.exportTo('foo', function() {
82 fs.AddFile('/x/tvcm/foo.js', """
84 tvcm.require('missing');
85 tvcm.exportTo('foo', function() {
88 project = project_module.Project(['/x'],
89 include_tvcm_paths=False)
90 loader = resource_loader.ResourceLoader(project)
94 my_module = loader.load_module(module_name = 'src.my_module')
95 assertFalse('Expected an exception')
96 except module.DepsException, e:
99 ['src.my_module', 'tvcm.foo'],
102 def testRawScript(self):
103 fs = fake_fs.FakeFS()
104 fs.AddFile('/x/y/z/foo.js', """
106 tvcm.requireRawScript('bar.js');
108 fs.AddFile('/x/raw/bar.js', 'hello');
109 project = project_module.Project(['/x/y', '/x/raw/'],
110 include_tvcm_paths=False)
111 loader = resource_loader.ResourceLoader(project)
113 my_module = loader.load_module(module_name='z.foo')
114 self.assertEquals(1, len(my_module.dependent_raw_scripts))
116 rs = my_module.dependent_raw_scripts[0]
117 self.assertEquals('hello', rs.contents)
118 self.assertEquals('/x/raw/bar.js', rs.filename)
121 def testModulesThatAreDirectores(self):
122 fs = fake_fs.FakeFS()
123 fs.AddFile('/x/foo/__init__.js', """'use strict'; tvcm.exportTo('foo', function(){});""")
125 project = project_module.Project(['/x'], include_tvcm_paths=False)
126 loader = resource_loader.ResourceLoader(project)
128 foo_module = loader.load_module(module_name = 'foo')
129 self.assertEquals('foo', foo_module.name)
130 self.assertEquals('/x/foo/__init__.js', foo_module.filename)
132 def testModulesThatAreDirectoresLoadedWithAbsoluteName(self):
133 fs = fake_fs.FakeFS()
134 fs.AddFile('/x/foo/__init__.js', """'use strict'; tvcm.exportTo('foo', function(){});""")
136 project = project_module.Project(['/x'], include_tvcm_paths=False)
137 loader = resource_loader.ResourceLoader(project)
139 foo_module = loader.load_module(module_filename = '/x/foo/__init__.js')
140 self.assertEquals('foo', foo_module.name)
141 self.assertEquals('/x/foo/__init__.js', foo_module.filename)
143 def testExceptionRaisedWhenOldStyleModuleRootExists(self):
144 fs = fake_fs.FakeFS()
145 fs.AddFile('/x/foo/__init__.js', """'use strict';""")
146 fs.AddFile('/x/foo.js', """'use strict';""")
148 project = project_module.Project(['/x'], include_tvcm_paths=False)
149 loader = resource_loader.ResourceLoader(project)
151 self.assertRaises(module.DepsException,
152 lambda: loader.load_module(module_name = 'foo'))
153 self.assertRaises(module.DepsException,
154 lambda: loader.load_module(module_filename = '/x/foo/__init__.js'))