From 44feb46f6973f88ed0021e004bd6f6835c8d8531 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Mon, 1 Apr 2024 10:50:37 -0400 Subject: [PATCH] fix: Cleanup dogfood tests. --- src/TAP.mjs | 5 ++- tests/01_tap.t.js | 86 ++++++++++++++++++++++++++--------------------- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/src/TAP.mjs b/src/TAP.mjs index f5f90df..aa3bb83 100644 --- a/src/TAP.mjs +++ b/src/TAP.mjs @@ -64,8 +64,8 @@ class Tap { * Construct a new Tap Suite with a renderLine function. * @param {TapRenderer} */ - constructor(renderFunc) { - this.#renderer = renderFunc; + constructor(renderer) { + this.#renderer = renderer; } @@ -383,6 +383,5 @@ function runBrowserTap(testName, test) { return runTest(t, testName, test); } -// TODO(zaphar): The runner interface as well. export { Tap, runNodeTap, runBrowserTap }; diff --git a/tests/01_tap.t.js b/tests/01_tap.t.js index 39fdcdb..1fc5c2f 100644 --- a/tests/01_tap.t.js +++ b/tests/01_tap.t.js @@ -1,16 +1,29 @@ +/** @implements TapRenderer */ +class FakeRenderer { + output = "nothing yet"; + diagnostic = ""; + + out(text) { + this.output = text; + } + + diag(lines) { + for (var line of lines) { + this.diagnostic += line; + } + } +} + import('../src/TAP.mjs').then(m => { var runNodeTap = m.runNodeTap; function tapSuite(t) { - var out = "nothing yet"; - var diag = ""; - t.plan(17); + t.plan(23); + var renderer = new FakeRenderer(); var testCan = function () { // setup fake test object - var f = new m.Tap(function(newout) { out = newout }); // the TAP thats failing - f.out = function(newout) { out = newout }; - f.diag = function(newdiag) { diag += newdiag }; + var f = new m.Tap(renderer); // the TAP thats failing f.plan(4); //mock a fake object to run test against @@ -20,10 +33,10 @@ import('../src/TAP.mjs').then(m => { // begin real tests! f.can_ok(obj, 'not_there'); - t.like(out, /not ok 1 - object can \[ not_there \]/, 'can_ok failed'); + t.like(renderer.output, /not ok 1 - object can \[ not_there \]/, 'can_ok failed'); f.can_ok(obj, method); diag = ''; - t.like(out, /ok 2 - object can \[ run \]/, 'can_ok passed'); + t.like(renderer.output, /ok 2 - object can \[ run \]/, 'can_ok passed'); //Now we need to test the whole prototype method assignment thing @@ -34,67 +47,67 @@ import('../src/TAP.mjs').then(m => { MockObj.prototype.fakeme = function () {}; f.can_ok(MockObj, 'fakeme'); - diag = ''; - t.like(out, /^ok .* \[ fakeme \]/, + renderer.diagnostic = ''; + t.like(renderer.output, /^ok .* \[ fakeme \]/, 'can_ok recognized prototype methods'); f.can_ok(MockObj, 'fakeme2'); - diag = ''; - t.like(out, /^not ok .* \[ fakeme2 \]/, + renderer.diagnostic = ''; + t.like(renderer.output, /^not ok .* \[ fakeme2 \]/, 'can_ok prototype recognization doesnt break methods'); }; + testCan(); var testLike = function() { // setup fake test object - var f = new m.Tap(function(newout) { out = newout }); // the TAP that's failing - f.out = function(newout) { out = newout }; + var f = new m.Tap(renderer); // the TAP that's failing f.plan(1); // begin real tests! f.like("hello", /hello/, "hello matches hello"); - t.like(out, /ok 1 - hello matches hello/, 'got description in TAP output'); + t.like(renderer.output, /ok 1 - hello matches hello/, 'got description in TAP output'); }; + testLike() var testDiag = function() { // setup fake test object - var f = new m.Tap(function(newout) { out = newout }); // the TAP that's failing - f.out = function(newout) { out = newout }; + var f = new m.Tap(renderer); // the TAP that's failing f.plan(10); // begin real tests! f.diag("hello"); - t.like(out, /# hello/, 'got hello'); + t.diag(renderer.diagnostic); + t.like(renderer.diagnostic, /hello/, 'got hello'); }; + testDiag(); var testException = function() { // setup fake test object - var f = new m.Tap(function(newout) { out = newout }); // the TAP that's failing - f.out = function(newout) { out = newout }; + var f = new m.Tap(renderer); // the TAP that's failing f.plan(2); // begin real tests! f.throws_ok(function() {throw new Error('I made a boo boo')}, 'I made a boo boo'); - //t.diag(out); - t.like(out, /ok 1 - code threw \[Error: I made a boo boo\]/, 'uncaught exception'); + //t.diag(renderer.output); + t.like(renderer.output, /ok 1 - code threw \[Error: I made a boo boo\]/, 'uncaught exception'); f.throws_ok(function() {}, 'I made a boo boo'); - //t.diag(out); - t.like(out, /not ok 2 - code threw \[ \]/, 'false failed'); + //t.diag(renderer.output); + t.like(renderer.output, /not ok 2 - code threw \[ \]/, 'false failed'); }; testException(); var testFails = function() { // setup fake test object - var f = new m.Tap(function(newout) { out = newout }); // the TAP that's failing - f.out = function(newout) { out = newout }; + var f = new m.Tap(renderer); // the TAP that's failing f.plan(3); // begin real tests! f.ok(false, 'false fails'); - t.like(out, /not ok 1 - false fails/, 'false failed'); + t.like(renderer.output, /not ok 1 - false fails/, 'false failed'); f.ok(0, 'zero fails'); - t.like(out, /not ok 2 - zero fails/, '0 failed'); + t.like(renderer.output, /not ok 2 - zero fails/, '0 failed'); f.is(0, 1, 'zero is one'); - t.like(out, /not ok 3 - zero is one/, '0 != 1'); + t.like(renderer.output, /not ok 3 - zero is one/, '0 != 1'); }; testFails(); @@ -109,8 +122,7 @@ import('../src/TAP.mjs').then(m => { var testPlan = function() { // setup fake test object - var f = new m.Tap(function(newout) { out = newout }); // the TAP that's failing - f.out = function(newout) { out = newout }; + var f = new m.Tap(renderer); // the TAP that's failing f.plan(2); // begin real tests! @@ -121,29 +133,27 @@ import('../src/TAP.mjs').then(m => { testPlan(); var testTodoSkip = function() { - var out; t.can_ok(m.Tap, 'todo', 'skip'); - var f = new m.Tap(); // the TAP that's failing - f.out = function(newout) { out = newout }; + var f = new m.Tap(renderer); // the TAP that's failing f.plan(4); f.todo(function() { f.ok(true, 'true is true'); }); - t.like(out, /ok 1 - # TODO: true is true/g, + t.like(renderer.output, /ok 1 - # TODO: true is true/g, 'the non todo output is suitably formatted'); f.ok(!false, 'not false is true'); - t.like(out, /ok 2 -/g, 'the regular output is suitably formatted'); + t.like(renderer.output, /ok 2 -/g, 'the regular output is suitably formatted'); f.skip(true, 'because I said so', 1, function() { f.is(1, 2, 'one is two'); } ); - t.like(out, /^not ok 3 - # SKIP because I said so$/, + t.like(renderer.output, /^not ok 3 - # SKIP because I said so$/, 'the skipped output is suitably formatted'); f.is(1, 1, 'one is one'); - t.like(out, /ok 4 - one is one/, + t.like(renderer.output, /ok 4 - one is one/, 'the non skipped output is suitable formatted'); }; testTodoSkip();