test262/tools/generation/lib/expander.py

61 lines
2.0 KiB
Python
Raw Normal View History

2016-03-16 18:58:10 +01:00
# Copyright (C) 2016 the V8 project authors. All rights reserved.
# This code is governed by the BSD license found in the LICENSE file.
import re, os
from .case import Case
from .template import Template
2016-03-16 18:58:10 +01:00
caseFilenamePattern = re.compile(r'^[^\.].*\.case$')
templateFilenamePattern = re.compile(r'^[^\.].*\.template$')
class Expander:
def __init__(self, case_dir):
self.templates = dict()
self.case_dir = case_dir
def _load_templates(self, template_class, encoding):
2016-03-16 18:58:10 +01:00
directory = os.path.join(self.case_dir, template_class)
file_names = map(
lambda x: os.path.join(directory, x),
filter(self.is_template_file, os.listdir(directory))
)
self.templates[template_class] = [
Template(x, encoding) for x in file_names
]
2016-03-16 18:58:10 +01:00
def _get_templates(self, template_class, encoding):
2016-03-16 18:58:10 +01:00
if not template_class in self.templates:
self._load_templates(template_class, encoding)
2016-03-16 18:58:10 +01:00
return self.templates[template_class]
def is_template_file(self, filename):
return re.match(templateFilenamePattern, filename)
def list_cases(self):
for name in os.listdir(self.case_dir):
full = os.path.join(self.case_dir, name)
if os.path.isfile(full) and caseFilenamePattern.match(name):
yield full
def expand(self, encoding, case_file = None):
if case_file:
case_files = [case_file]
else:
case_files = self.list_cases()
for case_file in case_files:
for test in self.expand_case(case_file, encoding):
yield test
def expand_case(self, file_name, encoding):
case = Case(file_name, encoding)
2016-03-16 18:58:10 +01:00
template_class = case.attribs['meta']['template']
templates = self.templates.get(template_class)
for template in self._get_templates(template_class, encoding):
2016-03-16 18:58:10 +01:00
yield template.expand(file_name, os.path.basename(file_name[:-5]), case.attribs, encoding)