1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2015 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport re
24e5c31af7Sopenharmony_ciimport sys
25e5c31af7Sopenharmony_cifrom fnmatch import fnmatch
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_cidef fail (msg):
28e5c31af7Sopenharmony_ci	print("ERROR: " + msg)
29e5c31af7Sopenharmony_ci	sys.exit(-1)
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_ci# filename -> [case name]
32e5c31af7Sopenharmony_cidef readCaseList (filename):
33e5c31af7Sopenharmony_ci	f = open(filename, 'rb')
34e5c31af7Sopenharmony_ci	cases = []
35e5c31af7Sopenharmony_ci	for line in f:
36e5c31af7Sopenharmony_ci		if line[0:6] == "TEST: ":
37e5c31af7Sopenharmony_ci			cases.append(line[6:].strip())
38e5c31af7Sopenharmony_ci	f.close()
39e5c31af7Sopenharmony_ci	return cases
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_ci# filename -> [(filter, min, recommended)]
42e5c31af7Sopenharmony_cidef readResolutionList (filename):
43e5c31af7Sopenharmony_ci	f = open(filename, 'rb')
44e5c31af7Sopenharmony_ci	resList = []
45e5c31af7Sopenharmony_ci	for line in f:
46e5c31af7Sopenharmony_ci		line = line.strip()
47e5c31af7Sopenharmony_ci		params = line.split('\t')
48e5c31af7Sopenharmony_ci		if len(params) == 3:
49e5c31af7Sopenharmony_ci			resList.append((params[0], params[1], params[2]))
50e5c31af7Sopenharmony_ci		elif len(params) != 0:
51e5c31af7Sopenharmony_ci			fail("Invalid line in resolution list: '%s'" % line)
52e5c31af7Sopenharmony_ci	f.close()
53e5c31af7Sopenharmony_ci	return resList
54e5c31af7Sopenharmony_ci
55e5c31af7Sopenharmony_cidef getMatchingCases (cases, pattern):
56e5c31af7Sopenharmony_ci	matching = []
57e5c31af7Sopenharmony_ci	for case in cases:
58e5c31af7Sopenharmony_ci		if fnmatch(case, pattern):
59e5c31af7Sopenharmony_ci			matching.append(case)
60e5c31af7Sopenharmony_ci	return matching
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_cidef isResolutionOk (res):
63e5c31af7Sopenharmony_ci	return re.match('^[1-9][0-9]*x[1-9][0-9]*$', res) != None
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ciif __name__ == "__main__":
66e5c31af7Sopenharmony_ci	if len(sys.argv) != 3:
67e5c31af7Sopenharmony_ci		print("%s: [caselist] [resolution list]" % sys.argv[0])
68e5c31af7Sopenharmony_ci		sys.exit(-1)
69e5c31af7Sopenharmony_ci
70e5c31af7Sopenharmony_ci	caseList	= readCaseList(sys.argv[1])
71e5c31af7Sopenharmony_ci	resList		= readResolutionList(sys.argv[2])
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_ci	# Pass 1: quick check for resolution values
74e5c31af7Sopenharmony_ci	for pattern, minRes, recRes in resList:
75e5c31af7Sopenharmony_ci		if not isResolutionOk(minRes) or not isResolutionOk(recRes):
76e5c31af7Sopenharmony_ci			fail("Invalid resolution: '%s %s %s'" % (pattern, minRes, recRes))
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_ci	# Pass 2: check that each case is specified by one rule
79e5c31af7Sopenharmony_ci	markedCases = set()
80e5c31af7Sopenharmony_ci	for pattern, minRes, recRes in resList:
81e5c31af7Sopenharmony_ci		matchingCases = getMatchingCases(caseList, pattern)
82e5c31af7Sopenharmony_ci
83e5c31af7Sopenharmony_ci		if len(matchingCases) == 0:
84e5c31af7Sopenharmony_ci			fail("Pattern '%s' does not match any cases" % pattern)
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci		for case in matchingCases:
87e5c31af7Sopenharmony_ci			if case in markedCases:
88e5c31af7Sopenharmony_ci				fail("Case '%s' specified multiple times (when processing '%s')" % (case, pattern))
89e5c31af7Sopenharmony_ci			markedCases.add(case)
90e5c31af7Sopenharmony_ci
91e5c31af7Sopenharmony_ci	for case in caseList:
92e5c31af7Sopenharmony_ci		if not case in markedCases:
93e5c31af7Sopenharmony_ci			fail("Case '%s' not specified by any rule" % case)
94