18b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# Copyright 2011 the V8 project authors. All rights reserved.
28b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# Redistribution and use in source and binary forms, with or without
38b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# modification, are permitted provided that the following conditions are
48b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# met:
58b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#
68b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#     * Redistributions of source code must retain the above copyright
78b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#       notice, this list of conditions and the following disclaimer.
88b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#     * Redistributions in binary form must reproduce the above
98b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#       copyright notice, this list of conditions and the following
108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#       disclaimer in the documentation and/or other materials provided
118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#       with the distribution.
128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#     * Neither the name of Google Inc. nor the names of its
138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#       contributors may be used to endorse or promote products derived
148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#       from this software without specific prior written permission.
158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#
168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochimport os
30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochimport re
318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.local import testsuite
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.local import utils
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom testrunner.objects import testcase
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PreparserTestSuite(testsuite.TestSuite):
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def __init__(self, name, root):
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    super(PreparserTestSuite, self).__init__(name, root)
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def shell(self):
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return "d8"
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def _GetExpectations(self):
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expects_file = os.path.join(self.root, "preparser.expectation")
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expectations_map = {}
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not os.path.exists(expects_file): return expectations_map
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    rule_regex = re.compile("^([\w\-]+)(?::([\w\-]+))?(?::(\d+),(\d+))?$")
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for line in utils.ReadLinesFrom(expects_file):
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      rule_match = rule_regex.match(line)
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if not rule_match: continue
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expects = []
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (rule_match.group(2)):
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expects += [rule_match.group(2)]
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (rule_match.group(3)):
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          expects += [rule_match.group(3), rule_match.group(4)]
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expectations_map[rule_match.group(1)] = " ".join(expects)
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return expectations_map
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def _ParsePythonTestTemplates(self, result, filename):
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    pathname = os.path.join(self.root, filename + ".pyt")
62257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    def Test(name, source, expectation):
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      source = source.replace("\n", " ")
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      testname = os.path.join(filename, name)
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      flags = ["-e", source]
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if expectation:
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        flags += ["--throws"]
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      test = testcase.TestCase(self, testname, flags=flags)
69257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      result.append(test)
70257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    def Template(name, source):
71257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      def MkTest(replacement, expectation):
72257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        testname = name
73257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        testsource = source
74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        for key in replacement.keys():
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          testname = testname.replace("$" + key, replacement[key]);
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          testsource = testsource.replace("$" + key, replacement[key]);
77257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        Test(testname, testsource, expectation)
78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return MkTest
79589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    execfile(pathname, {"Test": Test, "Template": Template})
80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def ListTests(self, context):
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expectations = self._GetExpectations()
83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    result = []
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Find all .js files in this directory.
868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    filenames = [f[:-3] for f in os.listdir(self.root) if f.endswith(".js")]
878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    filenames.sort()
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for f in filenames:
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throws = expectations.get(f, None)
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      flags = [f + ".js"]
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if throws:
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        flags += ["--throws"]
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      test = testcase.TestCase(self, f, flags=flags)
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      result.append(test)
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Find all .pyt files in this directory.
97257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    filenames = [f[:-4] for f in os.listdir(self.root) if f.endswith(".pyt")]
98257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    filenames.sort()
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for f in filenames:
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self._ParsePythonTestTemplates(result, f)
1018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return result
1028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def GetFlagsForTestCase(self, testcase, context):
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    first = testcase.flags[0]
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if first != "-e":
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      testcase.flags[0] = os.path.join(self.root, first)
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return testcase.flags
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def GetSourceForTest(self, testcase):
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if testcase.flags[0] == "-e":
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return testcase.flags[1]
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    with open(testcase.flags[0]) as f:
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return f.read()
1148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def VariantFlags(self, testcase, default_flags):
116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return [[]];
117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef GetSuite(name, root):
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return PreparserTestSuite(name, root)
121