1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik# Copyright (c) 2014 The Chromium Authors. All rights reserved.
2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik# Use of this source code is governed by a BSD-style license that can be
3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik# found in the LICENSE file.
4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport os
6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport re
7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport sys
8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport shutil
9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport tempfile
10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport unittest
11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom vinn import d8_runner
13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik@unittest.skipIf(sys.platform.startswith('win'),
16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                 'd8 not yet supported on Windows.')
17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass D8RunnerUnittest(unittest.TestCase):
18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  @classmethod
20b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def setUpClass(cls):
21b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    cls.test_data_dir = os.path.abspath(
22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        os.path.join(os.path.dirname(__file__), 'test_data'))
23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def GetTestFilePath(self, file_name):
25b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    return os.path.join(self.test_data_dir, file_name)
26b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
27b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def AssertHasNamedFrame(self, func_name, file_and_linum, exception_message):
28b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    m = re.search('at %s.+\(.*%s.*\)' % (func_name, file_and_linum),
29b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  exception_message)
30b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if not m:
31b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('\n=============================================\n')
32b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      msg = "Expected to find %s and %s" % (func_name, file_and_linum)
33b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('%s\n' % msg)
34b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('=========== Begin Exception Message =========\n')
35b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write(exception_message)
36b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('=========== End Exception Message =========\n\n')
37b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      self.fail(msg)
38b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
39b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def AssertHasFrame(self, file_and_linum, exception_message):
40b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    m = re.search('at .*%s.*' % file_and_linum, exception_message)
41b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if not m:
42b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('\n=============================================\n')
43b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      msg = "Expected to find %s" % file_and_linum
44b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('%s\n' % msg)
45b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('=========== Begin Exception Message =========\n')
46b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write(exception_message)
47b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      sys.stderr.write('=========== End Exception Message =========\n\n')
48b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      self.fail(msg)
49b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
50b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testExecuteJsStringStdoutPiping(self):
51b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    tmp_dir = tempfile.mkdtemp()
52b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
53b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      temp_file_name = os.path.join(tmp_dir, 'out_file')
54b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'w') as f:
55b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.ExcecuteJsString(
56b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            'print("Hello w0rld");\n', stdout=f)
57b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'r') as f:
58b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEquals(f.read(), 'Hello w0rld\n')
59b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
60b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      shutil.rmtree(tmp_dir)
61b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
62b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testRunJsStringStdoutPiping(self):
63b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    tmp_dir = tempfile.mkdtemp()
64b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
65b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      temp_file_name = os.path.join(tmp_dir, 'out_file')
66b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'w') as f:
67b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.RunJsString(
68b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            'print("Hello w0rld");\n', stdout=f)
69b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'r') as f:
70b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEquals(f.read(), 'Hello w0rld\n')
71b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
72b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      shutil.rmtree(tmp_dir)
73b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
74b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testExecuteFileStdoutPiping(self):
75b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('simple.js')
76b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    tmp_dir = tempfile.mkdtemp()
77b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
78b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      temp_file_name = os.path.join(tmp_dir, 'out_file')
79b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'w') as f:
80b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.ExecuteFile(file_path, stdout=f)
81b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'r') as f:
82b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEquals(f.read(), 'Hello W0rld from simple.js\n')
83b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
84b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      shutil.rmtree(tmp_dir)
85b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
86b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testRunFileStdoutPiping(self):
87b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('simple.js')
88b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    tmp_dir = tempfile.mkdtemp()
89b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
90b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      temp_file_name = os.path.join(tmp_dir, 'out_file')
91b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'w') as f:
92b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.RunFile(file_path, stdout=f)
93b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'r') as f:
94b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEquals(f.read(), 'Hello W0rld from simple.js\n')
95b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
96b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      shutil.rmtree(tmp_dir)
97b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
98b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testSimpleJsExecution(self):
99b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('print_file_content.js')
100b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    dummy_test_path = self.GetTestFilePath('dummy_test_file')
101b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    output = d8_runner.ExecuteFile(file_path, source_paths=[self.test_data_dir],
102b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                                   js_args=[dummy_test_path])
103b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertIn(
104b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'This is file contains only data for testing.\n1 2 3 4', output)
105b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
106b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testJsFileLoadHtmlFile(self):
107b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('load_simple_html.js')
108b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    output = d8_runner.ExecuteFile(file_path, source_paths=[self.test_data_dir])
109b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_output = ('File foo.html is loaded\n'
110b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'x = 1\n'
111b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       "File foo.html's second script is loaded\n"
112b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'x = 2\n'
113b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'load_simple_html.js is loaded\n')
114b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(output, expected_output)
115b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
116b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testJsFileLoadJsFile(self):
117b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('load_simple_js.js')
118b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    output = d8_runner.ExecuteFile(file_path, source_paths=[self.test_data_dir])
119b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_output = ('bar.js is loaded\n'
120b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'load_simple_js.js is loaded\n')
121b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(output, expected_output)
122b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
123b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testHTMLFileLoadHTMLFile(self):
124b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('load_simple_html.html')
125b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    output = d8_runner.ExecuteFile(
126b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        file_path, source_paths=[self.test_data_dir])
127b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_output = ('File foo.html is loaded\n'
128b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'x = 1\n'
129b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       "File foo.html's second script is loaded\n"
130b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'x = 2\n'
131b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'bar.js is loaded\n'
132b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                       'File load_simple_html.html is loaded\n')
133b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(output, expected_output)
134b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
135b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testQuit0Handling(self):
136b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('quit_0_test.js')
137b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    res = d8_runner.RunFile(file_path, source_paths=[self.test_data_dir])
138b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(res.returncode, 0)
139b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
140b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testQuit1Handling(self):
141b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('quit_1_test.js')
142b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    res = d8_runner.RunFile(file_path, source_paths=[self.test_data_dir])
143b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(res.returncode, 1)
144b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
145b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testQuit42Handling(self):
146b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('quit_42_test.js')
147b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    res = d8_runner.RunFile(file_path, source_paths=[self.test_data_dir])
148b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(res.returncode, 42)
149b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
150b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testQuit274Handling(self):
151b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('quit_274_test.js')
152b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    res = d8_runner.RunFile(file_path, source_paths=[self.test_data_dir])
153b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(res.returncode, 238)
154b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
155b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testErrorStackTraceJs(self):
156b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('error_stack_test.js')
157b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # error_stack_test.js imports load_simple_html.html
158b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # load_simple_html.html imports foo.html
159b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # foo.html imports error.js
160b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # error.js defines maybeRaiseException() method that can raise exception
161b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # foo.html defines maybeRaiseExceptionInFoo() method that calls
162b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # maybeRaiseException()
163b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Finally, we call maybeRaiseExceptionInFoo() error_stack_test.js
164b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Exception log should capture these method calls' stack trace.
165b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    with self.assertRaises(RuntimeError) as context:
166b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      d8_runner.ExecuteFile(file_path, source_paths=[self.test_data_dir])
167b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
168b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Assert error stack trace contain src files' info.
169b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    exception_message = context.exception.message
170b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertIn(
171b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        ('error.js:7: Error: Throw ERROR\n'
172b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik         "    throw new Error('Throw ERROR');"), exception_message)
173b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('maybeRaiseException', 'error.js:7',
174b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                             exception_message)
175b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('global.maybeRaiseExceptionInFoo', 'foo.html:34',
176b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                             exception_message)
177b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasFrame('error_stack_test.js:14', exception_message)
178b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
179b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testErrorStackTraceHTML(self):
180b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('error_stack_test.html')
181b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # error_stack_test.html imports error_stack_test.js
182b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # error_stack_test.js imports load_simple_html.html
183b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # load_simple_html.html imports foo.html
184b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # foo.html imports error.js
185b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # error.js defines maybeRaiseException() method that can raise exception
186b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # foo.html defines maybeRaiseExceptionInFoo() method that calls
187b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # maybeRaiseException()
188b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Finally, we call maybeRaiseExceptionInFoo() error_stack_test.js
189b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Exception log should capture these method calls' stack trace.
190b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    with self.assertRaises(RuntimeError) as context:
191b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      d8_runner.ExecuteFile(file_path, source_paths=[self.test_data_dir])
192b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
193b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Assert error stack trace contain src files' info.
194b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    exception_message = context.exception.message
195b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertIn(
196b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        ('error.js:7: Error: Throw ERROR\n'
197b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik         "    throw new Error('Throw ERROR');"), exception_message)
198b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
199b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('maybeRaiseException', 'error.js:7',
200b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                             exception_message)
201b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('global.maybeRaiseExceptionInFoo', 'foo.html:34',
202b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                             exception_message)
203b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasFrame('error_stack_test.js:14', exception_message)
204b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('eval', 'error_stack_test.html:22',
205b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                             exception_message)
206b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
207b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testStackTraceOfErroWhenLoadingHTML(self):
208b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('load_error.html')
209b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    with self.assertRaises(RuntimeError) as context:
210b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      d8_runner.ExecuteFile(file_path, source_paths=[self.test_data_dir])
211b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
212b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Assert error stack trace contain src files' info.
213b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    exception_message = context.exception.message
214b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
215b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertIn('Error: /does_not_exist.html not found', exception_message)
216b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('eval', 'load_error_2.html:21', exception_message)
217b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('eval', 'load_error.html:23', exception_message)
218b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
219b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testStackTraceOfErroWhenLoadingJS(self):
220b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    file_path = self.GetTestFilePath('load_js_error.html')
221b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    with self.assertRaises(RuntimeError) as context:
222b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      d8_runner.ExecuteFile(file_path, source_paths=[self.test_data_dir])
223b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
224b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    # Assert error stack trace contain src files' info.
225b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    exception_message = context.exception.message
226b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
227b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertIn('Error: /does_not_exist.js not found', exception_message)
228b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('eval', 'load_js_error_2.html:20',
229b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                             exception_message)
230b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertHasNamedFrame('eval', 'load_js_error.html:22',
231b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                             exception_message)
232b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
233b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testConsolePolyfill(self):
234b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(
235b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.ExcecuteJsString('console.log("hello", "world");'),
236b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'hello world\n')
237b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(
238b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.ExcecuteJsString('console.info("hello", "world");'),
239b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'Info: hello world\n')
240b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(
241b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.ExcecuteJsString('console.warn("hello", "world");'),
242b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'Warning: hello world\n')
243b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(
244b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        d8_runner.ExcecuteJsString('console.error("hello", "world");'),
245b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        'Error: hello world\n')
246b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
247b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
248b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik@unittest.skipIf(sys.platform.startswith('win'),
249b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                 'd8 not yet supported on Windows.')
250b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass PathUtilUnittest(unittest.TestCase):
251b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testPathUtil(self):
252b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    path_util_js_test = os.path.abspath(os.path.join(
253b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        os.path.dirname(__file__), 'path_utils_test.js'))
254b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    test_loading_js = """
255b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    load('%s');
256b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    load('%s');
257b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    runTests();
258b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    """ % (d8_runner._PATH_UTILS_JS_DIR, path_util_js_test)
259b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
260b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    res = d8_runner.RunJsString(test_loading_js)
261b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.assertEquals(res.returncode, 0)
262b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
263b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
264b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef _GetLineNumberOfSubstring(content, substring):
265b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  """ Return the line number of |substring| in |content|."""
266b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  index = content.index(substring)
267b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  return content[:index].count('\n') + 1
268b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
269b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
270b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikdef _GenerateLineByLineDiff(actual, expected):
271b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  results = []
272b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  expected_lines = expected.split('\n')
273b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  actual_lines = actual.split('\n')
274b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  max_num_lines = max(len(expected_lines), len(actual_lines))
275b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  results.append('**Actual    : num lines =  %i' % len(actual_lines))
276b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  results.append('**Expected  : num lines = %i' % len(expected_lines))
277b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
278b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  for i in xrange(0, max_num_lines):
279b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_current_line = expected_lines[i] if i < len(expected_lines) else ''
280b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    actual_current_line = actual_lines[i] if i < len(actual_lines) else ''
281b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if actual_current_line == expected_current_line:
282b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      continue
283b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    results.append('================= Line %s ======================' % (i + 1))
284b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    results.append('**Actual    : %s' % repr(actual_current_line))
285b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    results.append('**Expected  : %s' % repr(expected_current_line))
286b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  return '\n'.join(results)
287b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
288b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
289b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik@unittest.skipIf(sys.platform.startswith('win'),
290b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                 'd8 not yet supported on Windows.')
291b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass HTMLGeneratorTest(unittest.TestCase):
292b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
293b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def AssertStringEquals(self, actual, expected):
294b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    if actual != expected:
295b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      message = 'Expected %s but got %s.\n' % (repr(expected), repr(actual))
296b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      message += _GenerateLineByLineDiff(actual, expected)
297b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      self.fail(message)
298b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
299b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def GetGeneratedJs(self, html_text):
300b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    tmp_dir = tempfile.mkdtemp()
301b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    try:
302b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      temp_file_name = os.path.join(tmp_dir, 'test.html')
303b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      with open(temp_file_name, 'w') as f:
304b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        f.write(html_text)
305b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      return d8_runner.ExcecuteJsString(
306b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik          'write(generateJsFromHTML(read("%s")));' % temp_file_name)
307b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    finally:
308b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik      shutil.rmtree(tmp_dir)
309b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
310b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerSimpleHTMLImport(self):
311b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = '<link rel="import" href="/base/math.html">'
312b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = "loadHTML('/base/math.html');"
313b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html), expected_js)
314b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
315b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJSForD8RunnerImportMultilineHTMLImport(self):
316b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = """
317b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik          <link rel="import"
318b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik          href="/base/math.html">"""
319b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = "\nloadHTML('/base/math.html');"
320b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html),
321b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                            expected_js)
322b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
323b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerImportSimpleScriptWithSrc(self):
324b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = '<script src="/base/math.js"></script>'
325b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = "loadScript('/base/math.js');"
326b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html),
327b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                            expected_js)
328b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
329b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerImportMultilineScriptWithSrc(self):
330b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = """<script
331b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  type="text/javascript"
332b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  src="/base/math.js">
333b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  </script>"""
334b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = """loadScript('/base/math.js');
335b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
336b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
337b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  """
338b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html),
339b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                            expected_js)
340b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
341b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerWithMixedMultipleImport(self):
342b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = """
343b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik<link rel="import" href="/base.html"><link rel="import" href="/base64.html">
344b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik<link rel="import"
345b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            href="/base/math.html"><script
346b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            type="text/javascript"
347b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
348b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            src="/base/3d.js">
349b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            </script>
350b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
351b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik<script src="/base/math.js"></script>
352b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
353b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik <link rel="import"
354b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  href="/base/random.html">
355b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik"""
356b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = ("""
357b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadHTML('/base.html');loadHTML('/base64.html');
358b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadHTML('/base/math.html');
359b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadScript('/base/3d.js');
360b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
361b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
362b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
363b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            """ + """
364b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
365b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadScript('/base/math.js');
366b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
367b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadHTML('/base/random.html');""")
368b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html),
369b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                            expected_js)
370b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
371b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerImportWithSimpleContent(self):
372b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = """<script>
373b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik               var html_lines = [
374b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '<script>',
375b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '< /script>',
376b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik               ];
377b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    </script>
378b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    """
379b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = """
380b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik               var html_lines = [
381b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '<script>',
382b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '< /script>',
383b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik               ];
384b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    """
385b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html),
386b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                            expected_js)
387b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
388b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerImportWithEscapedScriptTag(self):
389b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = """<script>
390b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar s = ("<") + "<\/script>";
391b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar x = 100;
392b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    </script>
393b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    """
394b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = """
395b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar s = ("<") + "<\/script>";
396b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar x = 100;
397b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    """
398b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html),
399b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                            expected_js)
400b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
401b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerImportWithSrcAndSimpleContent(self):
402b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = """<script
403b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik               src="/base.js">var html_lines = [
404b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '<script>',
405b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '< /script>',
406b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik               ];
407b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    </script>
408b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    """
409b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = """loadScript('/base.js');
410b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikvar html_lines = [
411b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '<script>',
412b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '< /script>',
413b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik               ];
414b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    """
415b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(self.GetGeneratedJs(html),
416b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                            expected_js)
417b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
418b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik  def testGenerateJsForD8RunnerImportComplex(self):
419b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    html = """<!DOCTYPE html>
420b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik<!--
421b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikCopyright (c) 2014 The Chromium Authors. All rights reserved.
422b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikUse of this source code is governed by a BSD-style license that can be
423b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfound in the LICENSE file.
424b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik-->
425b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        <link rel="import" href="/base/math.html"><script>var x = 1;</script>
426b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        <script src="/base/computer.js">
427b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik          var linux = os.system;  // line number of this is 9
428b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        </script>
429b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        <link rel="import" href="/base/physics.html">
430b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
431b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        <script>
432b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              var html_lines = [
433b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '<script>',
434b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '< /script>',
435b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              ];
436b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              function foo() {
437b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                var y = [
438b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  1,
439b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  2,   // line number of this is 21
440b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  3,
441b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  4
442b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                ];
443b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              }
444b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        </script>
445b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
446b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik         <link rel="import" href="/base/this_is_line_28.html">
447b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik         <script>
448b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik          var i = '<link rel="import" href="/base/math.html">';
449b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik         </script>
450b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        """
451b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    expected_js = """
452b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
453b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
454b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
455b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
456b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
457b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadHTML('/base/math.html');var x = 1;
458b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadScript('/base/computer.js');
459b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik          var linux = os.system;  // line number of this is 9
460b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        """ + """
461b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadHTML('/base/physics.html');
462b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
463b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
464b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              var html_lines = [
465b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '<script>',
466b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                '< /script>',
467b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              ];
468b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              function foo() {
469b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                var y = [
470b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  1,
471b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  2,   // line number of this is 21
472b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  3,
473b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                  4
474b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                ];
475b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik              }
476b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        """ + """
477b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
478b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikloadHTML('/base/this_is_line_28.html');
479b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
480b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik          var i = '<link rel="import" href="/base/math.html">';
481b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik         """
482b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
483b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    generated_js = self.GetGeneratedJs(html)
484b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(
485b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        _GetLineNumberOfSubstring(generated_js, '// line number of this is 9'),
486b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        9)
487b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(
488b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        _GetLineNumberOfSubstring(generated_js, '// line number of this is 21'),
489b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        21)
490b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(
491b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        _GetLineNumberOfSubstring(generated_js, 'this_is_line_28.html'),
492b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        28)
493b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    self.AssertStringEquals(generated_js, expected_js)
494