<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Measure Testing Dashboard </title>

    <!-- Bootstrap core CSS -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="css/dashboard.css" rel="stylesheet">
  </head>

  <body>
    <nav class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0">
      <a class="navbar-brand col-sm-5 col-md-4 mr-0" href="#">OpenStudio Measure Testing Dashboard</a>
    </nav>

    <div class="container-fluid">
      <div class="row">
        <main role="main" class="col-md-12 ml-sm-auto col-lg-12 pt-3 px-4">
          <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pb-2 mb-3 border-bottom">
            <h1 class="h2">Overview</h1>
          </div>
          <div class="row">
            <div class="col-sm">
              <div class="card">
                <div class="card-block">
                  <div class="card-body">
                    <h5 class="card-title">Tests</h5>
                      <div class="row pt-5">
                        <div class="col-sm-4 offset-sm-1 badge-height badge badge-success"><span class='large-text'>0</span></div>
                        <div class="col-sm-4 offset-sm-2 badge-height badge badge-success"><span class='large-text'>0</span></div>
                      </div>
                      <div class="row">
                        <div class="col-sm-4 offset-sm-1 center-text"><span class="badge-text">Failures</span></div>
                        <div class="col-sm-4 offset-sm-2 center-text"><span class="badge-text">Errors</span></div>
                      </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="col-sm">
              <div class="card">
                <div class="card-block">
                  <div class="card-body">
                    <h5 class="card-title">OpenStudio Style</h5>
                    <div>
                        <div class="row pt-5">
                          <div class="col-sm-4 offset-sm-4 badge-height badge badge-danger"><span class='large-text'>34</span></div>
                        </div>
                        <div class="row">
                          <div class="col-sm-4 offset-sm-4 center-text"><span class="badge-text">Errors</span></div>
                        </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="col-sm">
              <div class="card">
                <div class="card-block">
                  <div class="card-body">
                    <h5 class="card-title">RuboCop</h5>
                  </div>
                </div>
              </div>
            </div>
            <div class="col-sm">
              <div class="card donut">
                <div class="card-block">
                  <div class="card-body">
                    <h5 class="card-title">Coverage</h5>
                    <div class="canvas-container">
                      <canvas id="cov"></canvas>
                      <span id="covPercent" class="status">%</span>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="py-5">
            <h2>Measures</h2>
            <div class="table-responsive">
              <table class="table table-striped table-sm table-text">
                <thead>
                  <tr>
                    <th>Measure Name</th>
                    <th>Tests</th>
                    <th>OS Style Errors</th>
                    <th>RuboCop</th>
                    <th>Coverage</th>
                  </tr>
                </thead>
                <tbody>
                  
                  <tr>
                    <td>ChangeBuildingLocation</td>
                    <td>  
                        <span class="badge badge-danger">0</span>
                        <span class="badge badge-warning">0</span> 
                    </td>
                    <td>
                        <span class="badge badge-danger">6</span>
                    </td>
                    <td></td>
                    <td>79.69 %</td>
                  </tr>
                  
                  <tr>
                    <td>RotateBuilding</td>
                    <td>  
                      
                        <span class="badge badge-danger">0</span>
                        <span class="badge badge-warning">0</span> 
                      
                    </td>
                    <td>
                          
                            <span class="badge badge-danger">7</span>
                          
                          
                    </td>
                    <td></td>
                    <td>91.67 %</td>
                  </tr>
                  
                  <tr>
                    <td>SetGasBurnerEfficiency</td>
                    <td>  
                      
                        <span class="badge badge-danger">0</span>
                        <span class="badge badge-warning">0</span> 
                      
                    </td>
                    <td>
                          
                            <span class="badge badge-danger">21</span>
                          
                          
                    </td>
                    <td></td>
                    <td>81.55 %</td>
                  </tr>
                  
                  <tr>
                    <td>Pristine</td>
                    <td>  
                      
                        <span class="badge badge-danger">0</span>
                        <span class="badge badge-warning">0</span> 
                      
                    </td>
                    <td>
                          
                            <span class="badge badge-success">0</span>
                          
                          
                    </td>
                    <td></td>
                    <td>86.21 %</td>
                  </tr>
                  
                </tbody>
              </table>
            </div>
          </div>
        </main>
      </div>
    </div>

    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="js/jquery-3.3.1.min.js"></script>
    <script src="js/bootstrap.min.js"></script>

    <!-- Icons -->
    <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script>
    <script>
      feather.replace()
    </script>

    <!-- Graphs -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script>
    <script>
      (function(){
      var t;

      function size(animate){
        if (animate == undefined){
          animate = false;
        }
        clearTimeout(t);
        t = setTimeout(function(){
          $("canvas").each(function(i,el){
            $(el).attr({
              "width":$(el).parent().width(),
              "height":$(el).parent().outerHeight()
            });
          });
          redraw(animate);
          var m = 0;
          $(".card").height("");
          $(".card").each(function(i,el){ m = Math.max(m,$(el).height()); });
          $(".card").height(m);
        }, 30);
      }
      $(window).on('resize', function(){ size(false); });


      function redraw(animation){
        var data =  {
  "repo_name": null,
  "current_branch": "master",
  "coverage": {
    "total_percent_coverage": 82.27,
    "total_lines": 678,
    "total_relevant_lines": 361,
    "total_covered_lines": 297,
    "total_missed_lines": 64,
    "by_measure": {
      "ChangeBuildingLocation": {
        "name": "ChangeBuildingLocation",
        "total_lines": 210,
        "percent_coverage": 79.69,
        "missed_lines": 26,
        "relevant_lines": 128,
        "covered_lines": 102
      },
      "RotateBuilding": {
        "name": "RotateBuilding",
        "total_lines": 80,
        "percent_coverage": 91.67,
        "missed_lines": 3,
        "relevant_lines": 36,
        "covered_lines": 33
      },
      "SetGasBurnerEfficiency": {
        "name": "SetGasBurnerEfficiency",
        "total_lines": 314,
        "percent_coverage": 81.55,
        "missed_lines": 31,
        "relevant_lines": 168,
        "covered_lines": 137
      },
      "Pristine": {
        "name": "Pristine",
        "total_lines": 74,
        "percent_coverage": 86.21,
        "missed_lines": 4,
        "relevant_lines": 29,
        "covered_lines": 25
      }
    }
  },
  "minitest": {
    "test_directory": "/Users/kflemin/repos/OpenStudio-measure-tester-gem/test_results/minitest",
    "total_tests": 11,
    "total_assertions": 79,
    "total_errors": 0,
    "total_failures": 0,
    "total_skipped": 0,
    "by_measure": {
      "ChangeBuildingLocation": {
        "tested_class": "ChangeBuildingLocation",
        "measure_tests": 4,
        "measure_assertions": 13,
        "measure_errors": 0,
        "measure_failures": 0,
        "measure_skipped": 0
      },
      "Pristine": {
        "tested_class": "Pristine",
        "measure_tests": 3,
        "measure_assertions": 10,
        "measure_errors": 0,
        "measure_failures": 0,
        "measure_skipped": 0
      },
      "RotateBuilding": {
        "tested_class": "RotateBuilding",
        "measure_tests": 2,
        "measure_assertions": 10,
        "measure_errors": 0,
        "measure_failures": 0,
        "measure_skipped": 0
      },
      "SetGasBurnerEfficiency": {
        "tested_class": "SetGasBurnerEfficiency",
        "measure_tests": 2,
        "measure_assertions": 46,
        "measure_errors": 0,
        "measure_failures": 0,
        "measure_skipped": 0
      }
    }
  },
  "openstudio_style": {
    "by_measure": {
      "ChangeBuildingLocation": {
        "errors": 6,
        "issues": [
          {
            "message": "OpenStudio::Ruleset::ModelUserScript is deprecated, use OpenStudio::Measure::ModelMeasure instead.",
            "type": "deprecated",
            "severity": "error"
          },
          {
            "message": "OpenStudio::Ruleset::OSArgumentVector is deprecated, use OpenStudio::Measure::OSArgumentVector instead.",
            "type": "deprecated",
            "severity": "error"
          },
          {
            "message": "'def description' is missing.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "'def modeler_description' is missing.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Measure directory name 'ChangeBuildingLocation' is not snake_case.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Climate Zone.' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          }
        ]
      },
      "Pristine": {
        "errors": 0,
        "issues": [

        ]
      },
      "RotateBuilding": {
        "errors": 7,
        "issues": [
          {
            "message": "OpenStudio::Ruleset::ModelUserScript is deprecated, use OpenStudio::Measure::ModelMeasure instead.",
            "type": "deprecated",
            "severity": "error"
          },
          {
            "message": "OpenStudio::Ruleset::OSArgumentVector is deprecated, use OpenStudio::Measure::OSArgumentVector instead.",
            "type": "deprecated",
            "severity": "error"
          },
          {
            "message": "'def description' is missing.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "'def modeler_description' is missing.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Measure directory name 'RotateBuilding' is not snake_case.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Number of Degrees to Rotate Building (positive value is clockwise).' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'Number of Degrees to Rotate Building (positive value is clockwise).' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          }
        ]
      },
      "SetGasBurnerEfficiency": {
        "errors": 21,
        "issues": [
          {
            "message": "OpenStudio::Ruleset::ModelUserScript is deprecated, use OpenStudio::Measure::ModelMeasure instead.",
            "type": "deprecated",
            "severity": "error"
          },
          {
            "message": "OpenStudio::Ruleset::OSArgumentVector is deprecated, use OpenStudio::Measure::OSArgumentVector instead.",
            "type": "deprecated",
            "severity": "error"
          },
          {
            "message": "'def description' is missing.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "'def modeler_description' is missing.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Measure directory name 'SetGasBurnerEfficiency' is not snake_case.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Choose an Air Loop with a two speed DX Cooling Unit to Alter.' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Burner Efficiency (fractional)' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'Remove Baseline Costs From Effected Cooling Coil DX Two Speed Units?' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Material and Installation Costs per Cooling Coil DX Two Speed Unit ($).' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'Material and Installation Costs per Cooling Coil DX Two Speed Unit ($).' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Demolition Costs per Cooling Coil DX Two Speed Unit ($).' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'Demolition Costs per Cooling Coil DX Two Speed Unit ($).' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Years Until Costs Start (whole years).' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'Years Until Costs Start (whole years).' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Demolition Costs Occur During Initial Construction?' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'Expected Life (whole years).' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'Expected Life (whole years).' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'O & M Costs per Cooling Coil DX Two Speed Unit ($).' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'O & M Costs per Cooling Coil DX Two Speed Unit ($).' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          },
          {
            "message": "Argument display name 'O & M Frequency (whole years).' appears to have units. Set units in the setUnits method.",
            "type": "syntax",
            "severity": "info"
          },
          {
            "message": "Argument display name 'O & M Frequency (whole years).' cannot contain ?#.[] characters.",
            "type": "syntax",
            "severity": "error"
          }
        ]
      }
    },
    "total_errors": 34
  }
};
        console.log('DATA: ', data);
        var covData = data['coverage'];
        // set % coverage
        document.getElementById("covPercent").innerHTML = covData['total_percent_coverage'] + '%';

        var options = {animation:{}};
        if (!animation){
          options.animation.animateRotate = false;
        } else {
          options.animation.animateRotate = true;
        }
        var data = {
          datasets:[{
            data: [
            covData['total_covered_lines'],
            covData['total_missed_lines'],
            ],
            backgroundColor: [
            "#50AE54",
            "#F2453D"
            ]
          }],
          labels: [
            "lines covered", 
            "lines missed",
          ]
        };

        var config = {type: 'doughnut', data: data, options: options};
        var canvas = document.getElementById("cov");
        var ctx = canvas.getContext("2d");
        var doughnut = new Chart(ctx, config);
      }
      size(true);

      }());
    </script>
  </body>
</html>