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