| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Test Report</title> |
| <link href="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/theme-chalk/index.css" rel="stylesheet" type="text/css"> |
| |
| <style> |
| #app { |
| font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
| } |
| |
| .import-type-title { |
| padding: 10px; |
| } |
| |
| .import-type-title div { |
| font-size: 14px; |
| font-family:'Courier New', Courier, monospace; |
| } |
| |
| .type-error-log { |
| padding: 10px; |
| color: red; |
| font-family:'Courier New', Courier, monospace; |
| } |
| .type-error-log pre { |
| margin: 5px 0; |
| padding: 0; |
| /* https://css-tricks.com/snippets/css/make-pre-text-wrap/ */ |
| white-space: pre-wrap; |
| } |
| .type-passed { |
| font-size: 14px; |
| color: green; |
| font-family:'Courier New', Courier, monospace; |
| padding: 10px; |
| } |
| </style> |
| |
| </head> |
| <body> |
| <div id="app"> |
| <el-tabs v-model="tab" type="border-card"> |
| <el-tab-pane label="Type Checking" name="typechecking"> |
| <div v-for="item in typeCheckingResult"> |
| <h3>{{ item.testName }}({{item.compileErrorsCount}})</h3> |
| <el-row :gutter="30"> |
| <el-col :span="12"> |
| <el-card :body-style="{ padding: '0px' }"> |
| <div class="import-type-title"> |
| <div>全量引入</div> |
| <div>Full Import</div> |
| </div> |
| <div class="type-error-log" v-if="item.compileErrors.full.length"> |
| <div v-for="compileError in item.compileErrors.full"> |
| <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre> |
| </div> |
| </div> |
| <div class="type-passed" v-else> |
| No Error |
| </div> |
| </el-card> |
| </el-col> |
| <el-col :span="12"> |
| <el-card :body-style="{ padding: '0px' }"> |
| <div class="import-type-title"> |
| <div>按需引入</div> |
| <div>Minimal Import </div> |
| </div> |
| <div class="type-error-log" v-if="item.compileErrors.minimal.length"> |
| <div v-for="compileError in item.compileErrors.minimal"> |
| <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre> |
| </div> |
| </div> |
| <div class="type-passed" v-else> |
| No Error |
| </div> |
| </el-card> |
| </el-col> |
| </el-row> |
| </div> |
| </el-tab-pane> |
| <el-tab-pane label="Screenshots Compare" name="screenshots"> |
| <div v-for="item in screenshotsCompareResult"> |
| <h3>{{ item.testName }}({{item.screenshotDiffRatio}})</h3> |
| <el-row :gutter="10"> |
| <el-col :span="4"> |
| <el-card :body-style="{ padding: '0px' }"> |
| <el-image :src="SCREENSHOT_ROOT + item.testName + '.png'"></el-image> |
| <div class="import-type-title"> |
| <div>全量引入</div> |
| <div>Full Import</div> |
| </div> |
| </el-card> |
| </el-col> |
| <el-col :span="4"> |
| <el-card :body-style="{ padding: '0px' }"> |
| <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.png'"></el-image> |
| <div class="import-type-title"> |
| <div>按需引入</div> |
| <div>Minimal Import </div> |
| </div> |
| </el-card> |
| </el-col> |
| <el-col :span="4"> |
| <el-card :body-style="{ padding: '0px' }"> |
| <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.png'"></el-image> |
| <div class="import-type-title"> |
| <div>自注册方式按需引入</div> |
| <div>Minimal Import with Self Registion</div> |
| </div> |
| </el-card> |
| </el-col> |
| <el-col :span="4"> |
| <el-card :body-style="{ padding: '0px' }"> |
| <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.diff.png'"></el-image> |
| <div class="import-type-title"> |
| <div>按需引入差异</div> |
| <div>Diff of Minimal Import </div> |
| </div> |
| </el-card> |
| </el-col> |
| <el-col :span="4"> |
| <el-card :body-style="{ padding: '0px' }"> |
| <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.diff.png'"></el-image> |
| <div class="import-type-title"> |
| <div>自注册方式按需引入差异</div> |
| <div>Diff of Minimal Import with Self Registion</div> |
| </div> |
| </el-card> |
| </el-col> |
| </el-row> |
| </div> |
| </el-tab-pane> |
| </el-tabs> |
| </div> |
| <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script> |
| <script src="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/index.js"></script> |
| |
| <script> |
| const app = new Vue({ |
| el: '#app', |
| data() { |
| return { |
| typeCheckingResult: [], |
| screenshotsCompareResult: [], |
| |
| SCREENSHOT_ROOT: './tmp/screenshots/', |
| |
| tab: 'screenshots', |
| splitterModel: 10 |
| }; |
| } |
| }); |
| |
| fetch('./tmp/result.json') |
| .then(response => response.json()) |
| .then(json => { |
| const result = []; |
| function getCompilerErrorsCount({ full, minimal, minimalLegacy }) { |
| return full.length + minimal.length + minimalLegacy.length; |
| } |
| function getScreenshotDiffRatio({ minimal, minimalLegacy }) { |
| return minimal.ratio + minimalLegacy.ratio; |
| } |
| |
| Object.keys(json).forEach(key => { |
| result.push({ |
| ...json[key], |
| compileErrorsCount: getCompilerErrorsCount(json[key].compileErrors), |
| screenshotDiffRatio: getScreenshotDiffRatio(json[key].screenshotDiff), |
| testName: key |
| }); |
| }); |
| app.typeCheckingResult = result.slice().sort((a, b) => { |
| return b.compileErrorsCount - a.compileErrorsCount; |
| }); |
| app.screenshotsCompareResult = result.slice().sort((a, b) => { |
| return b.screenshotDiffRatio - a.screenshotDiffRatio; |
| }); |
| }); |
| </script> |
| </body> |
| </html> |