        labels = output.get('labels', {})
        table = '<table><thead><tr><th id="group" colspan="3">演示支出</th></tr><tr>'+''.join('<th id="'+k+'" scope="col">'+html.escape(labels.get(k, ''))+'</th>' for k in ['date', 'item', 'amount'])+'</tr></thead><tbody>'
        for row in case['input']['rows']:
            table += '<tr>'+''.join('<td headers="group '+k+'">'+html.escape(v)+'</td>' for k, v in zip(['date', 'item', 'amount'], row))+'</tr>'
        table += '</tbody></table>'
        soup = BeautifulSoup(table, 'html.parser');ids = {x['id'] for x in soup.select('th[id]')}
        check('每个单元格引用存在的表头', all(set(x['headers']).issubset(ids) for x in soup.select('td')))
        check('列标题含原始金额单位', labels.get('amount') == '金额（元）')
        check('两行原数据完整保留', len(soup.select('tbody tr')) == 2 and '18.50' in soup.text)
        (folder / 'preview.html').write_text(_shell(case['title'], table));artifacts.append('preview.html')
        result = {'labels': labels, 'headerIds': sorted(ids), 'dataCells': len(soup.select('td'))}
