xref: /aosp_15_r20/external/deqp/scripts/check_resolution_list.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
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: quick 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