Browse Source

* Testinsight demo

Michaël Van Canneyt 1 year ago
parent
commit
0240ac2c82

+ 6 - 0
demo/testinsight/TestInsightSettings.json

@@ -0,0 +1,6 @@
+{
+  "BaseUrl" : "http://127.0.0.1:6789/tests",
+  "ExecuteTests" : true,
+  "ShowProgress" : true,
+  "Suite" : ""
+}

+ 92 - 0
demo/testinsight/clienttest.lpi

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="12"/>
+    <General>
+      <Flags>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <MainUnitHasTitleStatement Value="False"/>
+        <MainUnitHasScaledStatement Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <Title Value="clienttest"/>
+      <UseAppBundle Value="False"/>
+      <ResourceType Value="res"/>
+    </General>
+    <CustomData Count="4">
+      <Item0 Name="MaintainHTML" Value="1"/>
+      <Item1 Name="Pas2JSProject" Value="1"/>
+      <Item2 Name="PasJSLocation" Value="$NameOnly($(ProjFile))"/>
+      <Item3 Name="PasJSWebBrowserProject" Value="1"/>
+    </CustomData>
+    <BuildModes>
+      <Item Name="Default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+      <UseFileFilters Value="True"/>
+    </PublishOptions>
+    <RunParams>
+      <FormatVersion Value="2"/>
+    </RunParams>
+    <Units>
+      <Unit>
+        <Filename Value="clienttest.lpr"/>
+        <IsPartOfProject Value="True"/>
+      </Unit>
+      <Unit>
+        <Filename Value="index.html"/>
+        <IsPartOfProject Value="True"/>
+        <CustomData Count="1">
+          <Item0 Name="PasJSIsProjectHTMLFile" Value="1"/>
+        </CustomData>
+      </Unit>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <Target>
+      <Filename Value="clienttest"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <UnitOutputDirectory Value="js"/>
+    </SearchPaths>
+    <Parsing>
+      <SyntaxOptions>
+        <AllowLabel Value="False"/>
+        <UseAnsiStrings Value="False"/>
+        <CPPInline Value="False"/>
+      </SyntaxOptions>
+    </Parsing>
+    <CodeGeneration>
+      <TargetOS Value="browser"/>
+    </CodeGeneration>
+    <Linking>
+      <Debugging>
+        <GenerateDebugInfo Value="False"/>
+        <UseLineInfoUnit Value="False"/>
+      </Debugging>
+    </Linking>
+    <Other>
+      <ConfigFile>
+        <WriteConfigFilePath Value=""/>
+      </ConfigFile>
+      <CustomOptions Value="-Jeutf-8 -Jirtl.js -Jc -Jminclude"/>
+      <CompilerPath Value="$(pas2js)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions>
+      <Item>
+        <Name Value="EAbort"/>
+      </Item>
+      <Item>
+        <Name Value="ECodetoolError"/>
+      </Item>
+      <Item>
+        <Name Value="EFOpenError"/>
+      </Item>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 37 - 0
demo/testinsight/clienttest.lpr

@@ -0,0 +1,37 @@
+program clienttest;
+
+{$mode objfpc}{$H+}
+
+uses
+  Classes, fpjsonjs, browserconsole, consoletestrunner, tcTests, testinsightclient, fpcunittestinsight;
+
+type
+  TMyTestRunner = class(TTestRunner)
+  protected
+  // override the protected methods of TTestRunner to customize its behavior
+  end;
+
+Procedure DoRunTests(aClient : TAbstractTestInsightClient);
+
+begin
+  RunRegisteredTests(aClient)
+end;
+
+
+Procedure DoRunText(aClient : TAbstractTestInsightClient);
+
+var
+  Application: TMyTestRunner;
+
+begin
+  Application := TMyTestRunner.Create(nil);
+  Application.Initialize;
+  Application.Title := 'FPCUnit Console test runner';
+  Application.Run;
+  Application.Free;
+end;
+
+
+begin
+  IsTestInsightListening(@DoRunTests,@DoRunText,'','');
+end.

+ 370 - 0
demo/testinsight/fpcunit.css

@@ -0,0 +1,370 @@
+@charset "utf-8";
+
+body {
+  margin:0;
+}
+
+#fpcunit {
+  font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif;
+  margin: 60px 50px;
+}
+
+#fpcunit ul,
+#fpcunit li {
+  margin: 0;
+  padding: 0;
+}
+
+#fpcunit ul {
+  list-style: none;
+}
+
+#fpcunit h1,
+#fpcunit h2 {
+  margin: 0;
+}
+
+#fpcunit h1 {
+  margin-top: 15px;
+  font-size: 1em;
+  font-weight: 200;
+}
+
+#fpcunit h1 a {
+  text-decoration: none;
+  color: inherit;
+}
+
+#fpcunit h1 a:hover {
+  text-decoration: underline;
+}
+
+#fpcunit .suite .suite h1 {
+  margin-top: 0;
+  font-size: .8em;
+}
+
+#fpcunit .suite .suite .suite h1 {
+  margin-top: 0;
+  font-size: .8em;
+}
+
+#fpcunit .suite h1 {
+  margin-top: 0;
+  font-size: .8em;
+}
+
+#fpcunit .hidden {
+  display: none;
+}
+
+#fpcunit h2 {
+  font-size: 12px;
+  font-weight: normal;
+  cursor: pointer;
+}
+
+#fpcunit .suite {
+  margin-left: 15px;
+}
+
+#fpcunit .test {
+  margin-left: 15px;
+  overflow: hidden;
+}
+
+#fpcunit .test.pending:hover h2::after {
+  content: '(pending)';
+  font-family: arial, sans-serif;
+}
+
+#fpcunit .test.pass.medium .duration {
+  background: #c09853;
+}
+
+#fpcunit .test.pass.slow .duration {
+  background: #b94a48;
+}
+
+#fpcunit .test.pass::before {
+  content: '✓';
+  font-size: 12px;
+  display: block;
+  float: left;
+  margin-right: 5px;
+  color: #00d6b2;
+}
+
+#fpcunit .test.pass .duration {
+  font-size: 9px;
+  margin-left: 5px;
+  padding: 2px 5px;
+  color: #fff;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
+  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+}
+
+#fpcunit .test.pass.fast .duration {
+  display: none;
+}
+
+#fpcunit .test.pending {
+  color: #0b97c4;
+}
+
+#fpcunit .test.pending::before {
+  content: '◦';
+  color: #0b97c4;
+}
+
+#fpcunit .test.fail {
+  color: #B00;
+}
+
+#fpcunit .test.fail pre {
+  color: black;
+}
+
+#fpcunit .test.fail::before {
+  content: '✖';
+  font-size: 12px;
+  display: block;
+  float: left;
+  margin-right: 5px;
+  color: #B00;
+}
+
+#fpcunit .test.ignore {
+  color:  #FF7F50;
+}
+
+#fpcunit .test.ignore pre {
+  color: #FF7F50;
+}
+
+#fpcunit .test.ignore::before {
+  content: '✖';
+  font-size: 12px;
+  display: block;
+  float: left;
+  margin-right: 5px;
+  color: #FF7F50;
+}
+
+#fpcunit .test.error {
+  color: #F00;
+}
+
+#fpcunit .test.error pre {
+  color: #F00;
+}
+
+#fpcunit .test.error::before {
+  content: '✖';
+  font-size: 12px;
+  display: block;
+  float: left;
+  margin-right: 5px;
+  color: #F00;
+}
+
+#fpcunit .test pre.error {
+  color: #c00;
+  max-height: 300px;
+  overflow: auto;
+}
+
+#fpcunit .test .html-error {
+  overflow: auto;
+  color: black;
+  line-height: 1.5;
+  display: block;
+  float: left;
+  clear: left;
+  font: 12px/1.5 monaco, monospace;
+  margin: 5px;
+  padding: 15px;
+  border: 1px solid #eee;
+  max-width: 85%; /*(1)*/
+  max-width: -webkit-calc(100% - 42px);
+  max-width: -moz-calc(100% - 42px);
+  max-width: calc(100% - 42px); /*(2)*/
+  max-height: 300px;
+  word-wrap: break-word;
+  border-bottom-color: #ddd;
+  -webkit-box-shadow: 0 1px 3px #eee;
+  -moz-box-shadow: 0 1px 3px #eee;
+  box-shadow: 0 1px 3px #eee;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+
+#fpcunit .test .html-error pre.error {
+  border: none;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  -webkit-box-shadow: 0;
+  -moz-box-shadow: 0;
+  box-shadow: 0;
+  padding: 0;
+  margin: 0;
+  margin-top: 18px;
+  max-height: none;
+}
+
+/**
+ * (1): approximate for browsers not supporting calc
+ * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border)
+ *      ^^ seriously
+ */
+#fpcunit .test pre {
+  display: block;
+  float: left;
+  clear: left;
+  font: 12px/1.5 monaco, monospace;
+  margin: 5px;
+  padding: 15px;
+  border: 1px solid #eee;
+  max-width: 85%; /*(1)*/
+  max-width: -webkit-calc(100% - 42px);
+  max-width: -moz-calc(100% - 42px);
+  max-width: calc(100% - 42px); /*(2)*/
+  word-wrap: break-word;
+  border-bottom-color: #ddd;
+  -webkit-box-shadow: 0 1px 3px #eee;
+  -moz-box-shadow: 0 1px 3px #eee;
+  box-shadow: 0 1px 3px #eee;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+
+#fpcunit .test h2 {
+  position: relative;
+}
+
+#fpcunit .test a.replay {
+  position: absolute;
+  top: 3px;
+  right: 0;
+  text-decoration: none;
+  vertical-align: middle;
+  display: block;
+  width: 15px;
+  height: 15px;
+  line-height: 15px;
+  text-align: center;
+  background: #eee;
+  font-size: 15px;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+  -webkit-transition:opacity 200ms;
+  -moz-transition:opacity 200ms;
+  -o-transition:opacity 200ms;
+  transition: opacity 200ms;
+  opacity: 0.3;
+  color: #888;
+}
+
+#fpcunit .test:hover a.replay {
+  opacity: 1;
+}
+
+#fpcunit-report.pass .test.fail {
+  display: none;
+}
+
+#fpcunit-report.fail .test.pass {
+  display: none;
+}
+
+#fpcunit-report.pending .test.pass,
+#fpcunit-report.pending .test.fail {
+  display: none;
+}
+#fpcunit-report.pending .test.pass.pending {
+  display: block;
+}
+
+#fpcunit-error {
+  color: #c00;
+  font-size: 1.5em;
+  font-weight: 100;
+  letter-spacing: 1px;
+}
+
+#fpcunit-stats {
+  position: fixed;
+  top: 15px;
+  right: 10px;
+  font-size: 12px;
+  margin: 0;
+  color: #888;
+  z-index: 1;
+}
+
+#fpcunit-stats .progress {
+  float: right;
+  padding-top: 0;
+
+  /**
+   * Set safe initial values, so mochas .progress does not inherit these
+   * properties from Bootstrap .progress (which causes .progress height to
+   * equal line height set in Bootstrap).
+   */
+  height: auto;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+  background-color: initial;
+}
+
+#fpcunit-stats em {
+  color: black;
+}
+
+#fpcunit-stats a {
+  text-decoration: none;
+  color: inherit;
+}
+
+#fpcunit-stats a:hover {
+  border-bottom: 1px solid #eee;
+}
+
+#fpcunit-stats li {
+  display: inline-block;
+  margin: 0 5px;
+  list-style: none;
+  padding-top: 11px;
+}
+
+#fpcunit-stats canvas {
+  width: 40px;
+  height: 40px;
+}
+
+#fpcunit code .comment { color: #ddd; }
+#fpcunit code .init { color: #2f6fad; }
+#fpcunit code .string { color: #5890ad; }
+#fpcunit code .keyword { color: #8a6343; }
+#fpcunit code .number { color: #2f6fad; }
+
+@media screen and (max-device-width: 480px) {
+  #fpcunit {
+    margin: 60px 0px;
+  }
+
+  #fpcunit #stats {
+    position: absolute;
+  }
+}

+ 9 - 0
demo/testinsight/index.html

@@ -0,0 +1,9 @@
+<HTML>
+<Title>FPCUnit Test demo</Title>
+<script SRC="clienttest.js" type="application/javascript"></script>
+<link href="fpcunit.css" rel="stylesheet">
+</body>
+<script>
+    rtl.run();
+</script>
+</HTML>

+ 61 - 0
demo/testinsight/tctests.pas

@@ -0,0 +1,61 @@
+unit tcTests;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, fpcunit,  testregistry;
+
+type
+  Suite1 = class(TTestCase)
+  published
+    procedure Test1;
+    procedure Test2;
+  end;
+
+  { Suite2 }
+
+  Suite2 = class(TTestCase)
+  published
+    procedure Test1;
+    procedure Test2;
+    procedure Test3;
+  end;
+
+implementation
+
+{ Suite2 }
+
+procedure Suite2.Test1;
+begin
+  Fail('Test 1 fails');
+end;
+
+procedure Suite2.Test2;
+begin
+  AssertTrue('Test 2 OK',True);
+end;
+
+procedure Suite2.Test3;
+begin
+  Raise Exception.Create('test 3 errors');
+end;
+
+
+procedure Suite1.Test1;
+begin
+  Fail('Test 1 fails');
+end;
+
+procedure Suite1.Test2;
+begin
+  AssertTrue('Test 2 OK',True);
+end;
+
+
+
+initialization
+  RegisterTests([Suite1,Suite2]);
+end.
+