<!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>
