Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lab-phelan/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
**/node_modules/*
**/vendor/*
**/*.min.js
**/coverage/*
**/build/*
26 changes: 26 additions & 0 deletions lab-phelan/.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"env": {
"browser": true,
"node": true,
"commonjs": true,
"jest": true,
"es6": true
},
"globals": {
"err": true,
"req": true,
"res": true,
"next": true
},
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module"
},
"rules": {
"no-console": "off",
"indent": [ "error", 2 ],
"quotes": ["error", "single", { "allowTemplateLiterals": true }],
"comma-dangle": ["error", "always-multiline"],
"semi": [ "error", "always" ]
}
}
80 changes: 80 additions & 0 deletions lab-phelan/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@

# Created by https://www.gitignore.io/api/node,linux

### Linux ###
*~

# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*

# KDE directory preferences
.directory

# Linux trash folder which might appear on any partition or disk
.Trash-*

# .nfs files are created when an open file is removed but is still being accessed
.nfs*

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Typescript v1 declaration files
typings/

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env


# End of https://www.gitignore.io/api/node,linux
17 changes: 17 additions & 0 deletions lab-phelan/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
I enumarate a commonJS-style Module in /lib/reader.js.

reader.js exports a single function, which in its home file is called (readTrio) (RT).

RT accepts <paths> and <callback>. The former is the Array of three string holding valid paths to text documents in our <../assets/> folder which we are <fs.readFile>ing in this Lab, and the latter is merely a wrapper function which exposes a function for jest to grab in order to evaluate the resolution of our <fs.readFile> calls - it serves no functional purpose in the meat of <readTrio()> in itself.

RT first sequentially runs a series of checks on the incoming parameters. It throws if <path> is not an array, doesn't have three elements, or if its elements are not strings. RT also errors out if <callback> is not a function.

Next, RT spins up three Event-listener-And-Call combos with <fs.readFile>.

One test cast checks that the value finally returned by RT (upon a positive resolution by the last callback) returns values as expected. This is the primary POSITIVE test case.

The final test case intentionally passes poor file paths to make the Asynchronous <fs.readFile> calls fail, and checks that at least one of the calls the callbacks pass returns a valid 'error' through their 'error' route.

I really kinda screwed myself by doing this in unconventional way.

Happy 9:39PM :crying-happy-face: :a-ok-sign: :gun:
96 changes: 96 additions & 0 deletions lab-phelan/__test__/reader.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
const reader = require(`../lib/reader`);

describe(`Testing suite for reader.js`, () => {

describe('Testing reader.readTrio()', () => {

test(`+ : "Return first 25 chars of each three files"`, (done) => {
reader(
[`${__dirname}/../assets/ani.txt`,
`${__dirname}/../assets/nqu.txt`,
`${__dirname}/../assets/zzq.txt`,
],
(error,data) => {
expect(data).toEqual([
'anianiani anianiani anian',
'nqu uqn nqu uqn nqu uqn n',
'zzq_zzq_qzz____zzq_zzq_qz',
]);
done();
});
});

test(`- : "<paths> is not an array."`, () => {
expect (
() => {
reader(
'break <paths> : Not array',
(error,data)=>{return error, data;}
);
}
).toThrow();
});

test(`- : "<paths> length is wrong."`, () => {
expect (
() => {
reader(
[null, 'one','two','three','four', 0, null],
(error,data)=>{return error, data;}
);
}
).toThrow();
});

test(`- : "<paths> is not populated with strings."`, () => {
expect (
() => {
reader(
[1, 2, 3],
(error,data)=>{return error, data;}
);
}
).toThrow();
});

test(`- : "<paths> is not populated with strings."`, () => {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this test is the same as line 45

expect (
() => {
reader(
[1, 2, 3],
(error,data)=>{return error, data;}
);
}
).toThrow();
});

test(`- : "Callback failure: error in ReadFile callback."`, (done) => {
reader(
//Placed broken filenames here
[`${__dirname}/../assets/ani1.md`,
`${__dirname}/../assets/nqua.txt`,
`${__dirname}/../assets/asfasdfe.txt`,
],
(error) => {
expect(error).toBeTruthy();
done();
});
});

test(`- : "<paths> is not populated with strings."`, () => {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you should change this test message, you already have a test message that is exactly the same as this.

expect (
() => {
reader(
[`${__dirname}/../assets/ani.txt`,
`${__dirname}/../assets/nqu.txt`,
`${__dirname}/../assets/zzq.txt`,
],
'Breaking - this should be a function.'
);
}
).toThrow();
});

});

});
1 change: 1 addition & 0 deletions lab-phelan/assets/ani.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani anianiani
1 change: 1 addition & 0 deletions lab-phelan/assets/nqu.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn nqu uqn
1 change: 1 addition & 0 deletions lab-phelan/assets/zzq.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____zzq_zzq_qzz____
64 changes: 64 additions & 0 deletions lab-phelan/lib/reader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
'use strict';

const fs = require('fs');

function readTrio (paths, callback) {

if (Array.isArray(paths)===false) {
throw new TypeError(`<paths> must be an Array.... is '${typeof paths}'`);
}

if (paths.length!==3) {
throw new Error(`<paths> must have exactly 3 elements.... has ${paths.length}`);
}

if (paths.filter(x=>typeof x === 'string').length!==3) {
throw new Error('All elements of <paths> must be strings!');
}

if (typeof callback !== 'function') {
throw new TypeError(`<callback> must be a function, in order to provide Jest with an endpoint to test this function! Is: ${typeof callback}`);
}

//Should add another <throw> block here with a regex for paths - too much work tho.

paths = paths.map(x=>{return{'path':x, 'text':null};});
// Map file array out into Object Array - each object has 'path' and 'text'. <text> defaults to null, <path> is the inputted path from the original array.

for (let i=0, len=paths.length; i<len; i++) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you need space between your operators


//console.log(`Main 'for' loop started - ${new Date().getTime()}`);//REMOVE-------
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

always delete commented out code and unnecessary console.logs


fs.readFile(paths[i].path, (error, data) => {

//console.log(`readFile callback's 'this': ${this}`);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

corpse

//console.log(`readFile callback's 'error': ${error}`);
//console.log(`readFile callback's 'data': ${data}`);
//console.log(`readFile callback's 'i': ${i}`);
//console.log(`readFile callback's 'element': ${paths[i]}`);


if (error) {
callback(error);
return; //First of two exit points for this function - remember, this function should return <undefined>, as this expression will.
}

//console.log(`File ${i} succesfully read! Characters returned: ${data.length}`);//REMOVE-------
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

corpse


paths[i].text = data.toString('UTF-8', 0, 25);

//console.log(`paths[${i}].text - ${paths[i].text}`);
//console.log(`paths: ${paths}`);

if (paths.filter(x=>{return x.text===null;}).length === 0) callback(null, paths.map(x=>{return x.text;}));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for readability purposes you should separate these onto different lines and add spaces between operators.


return; //Second of two exit points from this function - will also return 'undefined' as required.
});

//console.log(`Main 'for' loop completed - ${new Date().getTime()}`);//REMOVE-------

}

}

module.exports = readTrio;
Loading