From b4a555f852fdf44e0cf1c117d93dda4f6c4612a7 Mon Sep 17 00:00:00 2001
From: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Date: Tue, 7 Jul 2015 19:01:17 +0530
Subject: [PATCH] test: refactoring test-repl-tab-complete with common.mustCall

The original test uses a variable to explicitly count how many times
the callback is invoked. This patch uses `common.mustCall` to track
if the callback is called or not. This would make the test more robust
as we don't explicitly hardcode the number of times to be called.
---
 test/parallel/test-repl-tab-complete.js | 84 +++++++++++--------------
 1 file changed, 37 insertions(+), 47 deletions(-)

diff --git a/test/parallel/test-repl-tab-complete.js b/test/parallel/test-repl-tab-complete.js
index 1bf0c700eb2e54..a1b901f065eace 100644
--- a/test/parallel/test-repl-tab-complete.js
+++ b/test/parallel/test-repl-tab-complete.js
@@ -4,15 +4,17 @@ var assert = require('assert');
 var util = require('util');
 var repl = require('repl');
 var referenceErrors = 0;
-var completionCount = 0;
+var expectedReferenceErrors = 0;
 
-function doNotCall() {
-  assert(false);
+function getDoNotCallFunction() {
+  expectedReferenceErrors += 1;
+  return function() {
+    assert(false);
+  };
 }
 
 process.on('exit', function() {
-  assert.strictEqual(referenceErrors, 6);
-  assert.strictEqual(completionCount, 12);
+  assert.strictEqual(referenceErrors, expectedReferenceErrors);
 });
 
 // A stream to push an array into a REPL
@@ -51,19 +53,17 @@ putIn.run([
   'var inner = {',
   'one:1'
 ]);
-testMe.complete('inner.o', doNotCall);
+testMe.complete('inner.o', getDoNotCallFunction());
 
-testMe.complete('console.lo', function(error, data) {
-  completionCount++;
+testMe.complete('console.lo', common.mustCall(function(error, data) {
   assert.deepEqual(data, [['console.log'], 'console.lo']);
-});
+}));
 
 // Tab Complete will return globaly scoped variables
 putIn.run(['};']);
-testMe.complete('inner.o', function(error, data) {
-  completionCount++;
+testMe.complete('inner.o', common.mustCall(function(error, data) {
   assert.deepEqual(data, works);
-});
+}));
 
 putIn.run(['.clear']);
 
@@ -73,7 +73,7 @@ putIn.run([
   '?',
   '{one: 1} : '
 ]);
-testMe.complete('inner.o', doNotCall);
+testMe.complete('inner.o', getDoNotCallFunction());
 
 putIn.run(['.clear']);
 
@@ -82,15 +82,14 @@ putIn.run([
   'var top = function() {',
   'var inner = {one:1};'
 ]);
-testMe.complete('inner.o', function(error, data) {
-  completionCount++;
+testMe.complete('inner.o', common.mustCall(function(error, data) {
   assert.deepEqual(data, works);
-});
+}));
 
 // When you close the function scope tab complete will not return the
 // locally scoped variable
 putIn.run(['};']);
-testMe.complete('inner.o', doNotCall);
+testMe.complete('inner.o', getDoNotCallFunction());
 
 putIn.run(['.clear']);
 
@@ -101,10 +100,9 @@ putIn.run([
   ' one:1',
   '};'
 ]);
-testMe.complete('inner.o', function(error, data) {
-  completionCount++;
+testMe.complete('inner.o', common.mustCall(function(error, data) {
   assert.deepEqual(data, works);
-});
+}));
 
 putIn.run(['.clear']);
 
@@ -116,10 +114,9 @@ putIn.run([
   ' one:1',
   '};'
 ]);
-testMe.complete('inner.o', function(error, data) {
-  completionCount++;
+testMe.complete('inner.o', common.mustCall(function(error, data) {
   assert.deepEqual(data, works);
-});
+}));
 
 putIn.run(['.clear']);
 
@@ -132,10 +129,9 @@ putIn.run([
   ' one:1',
   '};'
 ]);
-testMe.complete('inner.o', function(error, data) {
-  completionCount++;
+testMe.complete('inner.o', common.mustCall(function(error, data) {
   assert.deepEqual(data, works);
-});
+}));
 
 putIn.run(['.clear']);
 
@@ -148,7 +144,7 @@ putIn.run([
   ' one:1',
   '};'
 ]);
-testMe.complete('inner.o', doNotCall);
+testMe.complete('inner.o', getDoNotCallFunction());
 
 putIn.run(['.clear']);
 
@@ -161,7 +157,7 @@ putIn.run([
   ' one:1',
   '};'
 ]);
-testMe.complete('inner.o', doNotCall);
+testMe.complete('inner.o', getDoNotCallFunction());
 
 putIn.run(['.clear']);
 
@@ -175,7 +171,7 @@ putIn.run([
   ' one:1',
   '};'
 ]);
-testMe.complete('inner.o', doNotCall);
+testMe.complete('inner.o', getDoNotCallFunction());
 
 putIn.run(['.clear']);
 
@@ -183,10 +179,9 @@ putIn.run(['.clear']);
 putIn.run([
   'var str = "test";'
 ]);
-testMe.complete('str.len', function(error, data) {
-  completionCount++;
+testMe.complete('str.len', common.mustCall(function(error, data) {
   assert.deepEqual(data, [['str.length'], 'str.len']);
-});
+}));
 
 putIn.run(['.clear']);
 
@@ -195,32 +190,28 @@ var spaceTimeout = setTimeout(function() {
   throw new Error('timeout');
 }, 1000);
 
-testMe.complete(' ', function(error, data) {
-  completionCount++;
+testMe.complete(' ', common.mustCall(function(error, data) {
   assert.deepEqual(data, [[], undefined]);
   clearTimeout(spaceTimeout);
-});
+}));
 
 // tab completion should pick up the global "toString" object, and
 // any other properties up the "global" object's prototype chain
-testMe.complete('toSt', function(error, data) {
-  completionCount++;
+testMe.complete('toSt', common.mustCall(function(error, data) {
   assert.deepEqual(data, [['toString'], 'toSt']);
-});
+}));
 
 // Tab complete provides built in libs for require()
 putIn.run(['.clear']);
 
-testMe.complete('require(\'', function(error, data) {
-  completionCount++;
+testMe.complete('require(\'', common.mustCall(function(error, data) {
   assert.strictEqual(error, null);
   repl._builtinLibs.forEach(function(lib) {
     assert.notStrictEqual(data[0].indexOf(lib), -1, lib + ' not found');
   });
-});
+}));
 
-testMe.complete('require(\'n', function(error, data) {
-  completionCount++;
+testMe.complete('require(\'n', common.mustCall(function(error, data) {
   assert.strictEqual(error, null);
   assert.strictEqual(data.length, 2);
   assert.strictEqual(data[1], 'n');
@@ -230,7 +221,7 @@ testMe.complete('require(\'n', function(error, data) {
     if (completion)
       assert(/^n/.test(completion));
   });
-});
+}));
 
 // Make sure tab completion works on context properties
 putIn.run(['.clear']);
@@ -238,7 +229,6 @@ putIn.run(['.clear']);
 putIn.run([
   'var custom = "test";'
 ]);
-testMe.complete('cus', function(error, data) {
-  completionCount++;
+testMe.complete('cus', common.mustCall(function(error, data) {
   assert.deepEqual(data, [['custom'], 'cus']);
-});
+}));