Son CV dans un terminal web en Javascript!
https://terminal-cv.gregandev.fr
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.7 KiB
99 lines
2.7 KiB
var fs = require('graceful-fs');
|
|
var test = require('tap').test;
|
|
var path = require('path');
|
|
var writeStream = require('../index.js');
|
|
|
|
var rename = fs.rename;
|
|
fs.rename = function(from, to, cb) {
|
|
setTimeout(function() {
|
|
rename(from, to, cb);
|
|
}, 100);
|
|
};
|
|
|
|
test('basic', function(t) {
|
|
// open 10 write streams to the same file.
|
|
// then write to each of them, and to the target
|
|
// and verify at the end that each of them does their thing
|
|
var target = path.resolve(__dirname, 'test.txt');
|
|
var n = 10;
|
|
|
|
// We run all of our assertions twice:
|
|
// once for finish, once for close
|
|
// There are 6 assertions, two fixed, plus 4 lines in the file.
|
|
t.plan(n * 2 * 6);
|
|
|
|
var streams = [];
|
|
for (var i = 0; i < n; i++) {
|
|
var s = writeStream(target);
|
|
s.on('finish', verifier('finish', i));
|
|
s.on('close', verifier('close', i));
|
|
streams.push(s);
|
|
}
|
|
|
|
function verifier(ev, num) {
|
|
return function() {
|
|
if (ev === 'close') {
|
|
t.equal(this.__emittedFinish, true, num + '. closed only after finish');
|
|
} else {
|
|
this.__emittedFinish = true;
|
|
t.equal(ev, 'finish', num + '. finished');
|
|
}
|
|
|
|
// make sure that one of the atomic streams won.
|
|
var res = fs.readFileSync(target, 'utf8');
|
|
var lines = res.trim().split(/\n/);
|
|
lines.forEach(function(line, lineno) {
|
|
var first = lines[0].match(/\d+$/)[0];
|
|
var cur = line.match(/\d+$/)[0];
|
|
t.equal(cur, first, num + '. line ' + lineno + ' matches');
|
|
});
|
|
|
|
var resExpr = /^first write \d+\nsecond write \d+\nthird write \d+\nfinal write \d+\n$/;
|
|
t.similar(res, resExpr, num + '. content matches');
|
|
};
|
|
}
|
|
|
|
// now write something to each stream.
|
|
streams.forEach(function(stream, i) {
|
|
stream.write('first write ' + i + '\n');
|
|
});
|
|
|
|
// wait a sec for those writes to go out.
|
|
setTimeout(function() {
|
|
// write something else to the target.
|
|
fs.writeFileSync(target, 'brutality!\n');
|
|
|
|
// write some more stuff.
|
|
streams.forEach(function(stream, i) {
|
|
stream.write('second write ' + i + '\n');
|
|
});
|
|
|
|
setTimeout(function() {
|
|
// Oops! Deleted the file!
|
|
fs.unlinkSync(target);
|
|
|
|
// write some more stuff.
|
|
streams.forEach(function(stream, i) {
|
|
stream.write('third write ' + i + '\n');
|
|
});
|
|
|
|
setTimeout(function() {
|
|
fs.writeFileSync(target, 'brutality TWO!\n');
|
|
streams.forEach(function(stream, i) {
|
|
stream.end('final write ' + i + '\n');
|
|
});
|
|
}, 50);
|
|
}, 50);
|
|
}, 50);
|
|
});
|
|
|
|
test('cleanup', function(t) {
|
|
fs.readdirSync(__dirname)
|
|
.filter(function(f) {
|
|
return f.match(/^test.txt/);
|
|
})
|
|
.forEach(function(file) {
|
|
fs.unlinkSync(path.resolve(__dirname, file));
|
|
});
|
|
t.end();
|
|
});
|
|
|