- ref_line = ''
- src_lines = []
- if self.ref_dump is not None:
- ref = open(self.ref_dump, 'rt')
- ref_line = ref.readline().rstrip()
- for line in p.stdout:
- line = line.rstrip()
- print line
- mo = self.call_re.match(line)
- if mo:
- call_no = int(mo.group(1))
- function_name = mo.group(2)
- if function_name == 'glXSwapBuffers':
- swapbuffers += 1
- if function_name in ('glFlush', 'glFinish'):
- flushes += 1
- src_line = line[mo.start(2):]
- else:
- src_line = line
- if ref_line:
- if src_line == ref_line:
- sys.stdout.write(src_line + '\n')
- ref_line = ref.readline().rstrip()
- src_lines = []
- else:
- src_lines.append(src_line)
+ def checkImage(self, callNo, refImageFileName):
+ try:
+ from PIL import Image
+ except ImportError:
+ return
+
+ srcImage = self.getImage(callNo)
+ refImage = Image.open(refImageFileName)
+
+ from snapdiff import Comparer
+ comparer = Comparer(refImage, srcImage)
+ precision = comparer.precision(filter=True)
+ sys.stdout.write('precision of %f bits against %s\n' % (precision, refImageFileName))
+ if precision < self.threshold_precision:
+ prefix = '%s.%u' % (self.getNamePrefix(), callNo)
+ srcImageFileName = prefix + '.src.png'
+ srcImage.save(srcImageFileName)
+ diffImageFileName = prefix + '.diff.png'
+ comparer.write_diff(diffImageFileName)
+ fail('snapshot from call %u does not match %s' % (callNo, refImageFileName))
+
+ def checkState(self, callNo, refStateFileName):
+ srcState = self.getState(callNo)
+ refState = self.getRefState(refStateFileName)
+
+ from jsondiff import Comparer, Differ
+ comparer = Comparer(ignore_added = True)
+ match = comparer.visit(refState, srcState)
+ if not match:
+ prefix = '%s.%u' % (self.getNamePrefix(), callNo)
+ srcStateFileName = prefix + '.src.json'
+ diffStateFileName = prefix + '.diff.json'
+ self.saveState(srcState, srcStateFileName)
+ #diffStateFile = open(diffStateFileName, 'wt')
+ diffStateFile = sys.stdout
+ differ = Differ(diffStateFile, ignore_added = True)
+ differ.visit(refState, srcState)
+ fail('state from call %u does not match %s' % (callNo, refStateFileName))
+
+ def getRefState(self, refStateFileName):
+ stream = open(refStateFileName, 'rt')
+ from jsondiff import load
+ state = load(stream)
+ self.adjustRefState(state)
+ return state
+
+ def getNamePrefix(self):
+ name = os.path.basename(self.ref_dump)
+ try:
+ index = name.index('.')
+ except ValueError:
+ pass
+ else:
+ name = name[:index]
+ return name
+
+ def saveState(self, state, filename):
+ s = json.dumps(state, sort_keys=True, indent=2)
+ open(filename, 'wt').write(s)