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